Subversion Repositories Kolibri OS

Rev

Rev 8932 | Rev 8984 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
180 heavyiron 1
use32
2
        db      'MENUET01'
3
        dd      1
4
        dd      start
5
        dd      i_end
6
memsize dd      mem
7
        dd      stacktop
474 diamond 8
        dd      0, app_path
180 heavyiron 9
 
1122 diamond 10
version equ '0.65'
11
version_dword equ 0*10000h + 65
589 diamond 12
 
814 diamond 13
min_width = 54
14
max_width = 255
15
min_height = 8
16
max_height = 255
17
 
8932 IgorA 18
include '../../../KOSfuncs.inc'
8960 IgorA 19
include '../../../macros.inc'
180 heavyiron 20
include 'lang.inc'
21
include 'font.inc'
22
include 'sort.inc'
23
include 'kglobals.inc'
24
include 'dialogs.inc'
997 diamond 25
include 'search.inc'
180 heavyiron 26
include 'viewer.inc'
814 diamond 27
include 'editor.inc'
314 diamond 28
include 'tools.inc'
474 diamond 29
include 'filetool.inc'
180 heavyiron 30
 
8960 IgorA 31
struct PanelData
32
left     dd      ?
33
top      dd      ?
34
width    dd      ?
35
height   dd      ?
36
index    dd      ?
37
start    dd      ?
38
colsz    dd      ?
39
colst    dd      ?
40
sortmode db      ?
41
                rb      3
42
nfa      dd      ?
43
numfiles dd      ?
44
files    dd      ?
45
hPlugin  dd      ?
46
hFile    dd      ?
47
parents          dd      ?
48
parents_sz       dd      ?
49
parents_alloc    dd      ?
50
colmode          dd      ?
51
colwidths        rd      16+1
52
total_num        dd      ?
53
total_size       dq      ?
54
selected_num     dd      ?
55
selected_size    dq      ?
56
;plugin_info:
57
plugin_flags     dd      ?
58
dir      rb      1024
59
ends
60
 
814 diamond 61
cursor_normal_size = (font_height*15+50)/100
62
cursor_big_size = font_height
63
 
180 heavyiron 64
start:
8932 IgorA 65
        mov     eax,SF_SET_EVENTS_MASK
66
		mov     ebx,(11b shl 30) or 100111b
67
		int     0x40
68
		mov     edi, identical_table
997 diamond 69
        mov     ecx, 0x100
474 diamond 70
        xor     eax, eax
71
@@:
72
        stosb
73
        inc     eax
74
        loop    @b
997 diamond 75
        mov     cl, 'A'
76
@@:
77
        stosb
78
        inc     eax
79
        loop    @b
474 diamond 80
        add     al, 0x20
81
        mov     cl, 'Z'-'A'+1
82
@@:
83
        stosb
84
        inc     eax
85
        loop    @b
86
        sub     al, 0x20
87
        mov     cl, 'А'-'Z'-1
88
@@:
89
        stosb
90
        inc     eax
91
        loop    @b
92
        add     al, 0x20
93
        mov     cl, 'Р'-'А'
94
@@:
95
        stosb
96
        inc     eax
97
        loop    @b
98
        add     al, 0x30
99
        mov     cl, 'Я'-'Р'+1
100
@@:
101
        stosb
102
        inc     eax
103
        loop    @b
104
        sub     al, 0x50
105
        mov     cl, 256-'Я'-1
106
@@:
107
        stosb
108
        inc     eax
109
        loop    @b
110
        mov     byte [edi-256+'Ё'], 'ё'
997 diamond 111
        mov     cl, 'A'
112
        inc     eax
113
        rep     stosb
114
        mov     cl, 'Z'-'A'+1
115
        dec     eax
116
        rep     stosb
117
        mov     cl, 'a'-'Z'-1
118
        inc     eax
119
        rep     stosb
120
        mov     byte [edi-'a'+'_'], 0
121
        mov     cl, 'z'-'a'+1
122
        dec     eax
123
        rep     stosb
124
        mov     cl, 'А'-'z'-1
125
        inc     eax
126
        rep     stosb
127
        mov     cl, 'п'-'А'+1
128
        dec     eax
129
        rep     stosb
130
        mov     cl, 'р'-'п'-1
131
        inc     eax
132
        rep     stosb
133
        mov     cl, 'ё'-'р'+1
134
        dec     eax
135
        rep     stosb
136
        mov     cl, 256-'ё'-1
137
        inc     eax
138
        rep     stosb
139
        mov     edi, SearchStringEditBuf
140
        mov     eax, SearchStringEditBuf.length
141
        stosd
142
        xor     eax, eax
143
        stosd
144
        stosd
145
        stosb
8932 IgorA 146
        push    SF_SYS_MISC
474 diamond 147
        pop     eax
8932 IgorA 148
        push    SSF_HEAP_INIT
474 diamond 149
        pop     ebx
517 diamond 150
        int     0x40
283 diamond 151
        call    init_console
180 heavyiron 152
        call    draw_window
8932 IgorA 153
        push    SF_KEYBOARD
180 heavyiron 154
        pop     eax
8932 IgorA 155
        push    SSF_SET_INPUT_MODE
180 heavyiron 156
        pop     ebx
157
        mov     ecx, ebx
517 diamond 158
        int     40h     ; set keyboard mode to scancodes
283 diamond 159
        mov     eax, 200
8960 IgorA 160
        mov     [panel1.nfa], eax
161
        mov     [panel2.nfa], eax
474 diamond 162
        mov     ecx, 200*4 + 32 + 200*304
163
        call    pgalloc
8960 IgorA 164
        mov     [panel1.files], eax
474 diamond 165
        call    pgalloc
8960 IgorA 166
        mov     [panel2.files], eax
283 diamond 167
        test    eax, eax
168
        jz      exit
814 diamond 169
        xor     eax, eax
8960 IgorA 170
        cmp     [panel1.files], eax
283 diamond 171
        jz      exit
8960 IgorA 172
        mov     [panel1.hPlugin], eax
173
        mov     [panel1.parents], eax
174
        mov     [panel1.parents_sz], eax
175
        mov     [panel1.parents_alloc], eax
176
        mov     [panel2.hPlugin], eax
177
        mov     [panel2.parents], eax
178
        mov     [panel2.parents_sz], eax
179
        mov     [panel2.parents_alloc], eax
180
        mov     [panel1.sortmode], al   ; sort by name
181
        mov     [panel2.sortmode], al
589 diamond 182
        mov     al, 2                   ; "средний" формат
8960 IgorA 183
        mov     [panel1.colmode], eax
184
        mov     [panel2.colmode], eax
180 heavyiron 185
        mov     [num_screens], 1
474 diamond 186
        mov     ecx, 0x1000
187
        call    pgalloc
180 heavyiron 188
        mov     [screens], eax
314 diamond 189
        test    eax, eax
190
        jz      exit
180 heavyiron 191
        mov     ecx, panels_vtable
192
        mov     [eax], ecx
193
        mov     [active_screen_vtable], ecx
997 diamond 194
        mov     [active_screen_keybar], keybar_panels
474 diamond 195
; load libini.obj and kfar.ini
196
        mov     eax, libini_name
197
        mov     esi, ini_import
1102 diamond 198
        push    8
199
        pop     ebp     ; we use version 8 of libini
474 diamond 200
        call    load_dll_and_import
201
        test    eax, eax
202
        jnz     .noini
203
        mov     edi, app_path
204
        or      ecx, -1
205
        repnz   scasb
206
        mov     dword [edi-1], '.ini'
207
        mov     byte [edi+3], 0
208
        push    1
209
        push    dword aConfirmDelete
210
        push    dword aConfirmations
211
        push    dword app_path
212
        call    [ini.get_int]
213
        mov     [bConfirmDelete], al
214
        push    0
215
        push    dword aConfirmDeleteIncomplete
216
        push    dword aConfirmations
217
        push    dword app_path
218
        call    [ini.get_int]
219
        mov     [bConfirmDeleteIncomplete], al
589 diamond 220
        push    2
221
        push    aLeftViewMode
222
        push    aPanels
223
        push    app_path
224
        call    [ini.get_int]
225
        cmp     eax, 1
226
        jb      @f
227
        cmp     eax, 4
228
        ja      @f
8960 IgorA 229
        mov     [panel1.colmode], eax
589 diamond 230
@@:
231
        push    2
232
        push    aRightViewMode
233
        push    aPanels
234
        push    app_path
235
        call    [ini.get_int]
236
        cmp     eax, 1
237
        jb      @f
238
        cmp     eax, 4
239
        ja      @f
8960 IgorA 240
        mov     [panel2.colmode], eax
589 diamond 241
@@:
1045 diamond 242
        push    0
243
        push    aLeftSortMode
244
        push    aPanels
245
        push    app_path
246
        call    [ini.get_int]
247
        cmp     eax, 14
248
        jae     @f
8960 IgorA 249
        mov     [panel1.sortmode], al
1045 diamond 250
@@:
251
        push    0
252
        push    aRightSortMode
253
        push    aPanels
254
        push    app_path
255
        call    [ini.get_int]
256
        cmp     eax, 14
257
        jae     @f
8960 IgorA 258
        mov     [panel2.sortmode], al
1045 diamond 259
@@:
814 diamond 260
        push    nullstr
261
        push    512
262
        push    saved_file_name
263
        push    aEolStyle
264
        push    aEditor
265
        push    app_path
266
        call    [ini.get_str]
267
        mov     cl, edit.eol_dos
268
        mov     al, [saved_file_name]
269
        or      al, 20h
270
        cmp     al, 'd'
271
        jz      @f
272
        mov     cl, edit.eol_mac
273
        cmp     al, 'm'
274
        jz      @f
275
        mov     cl, edit.eol_unix
276
@@:
277
        mov     [EditEOLStyle], cl
474 diamond 278
        mov     ecx, 0x1000
279
        call    xpgalloc
280
        test    eax, eax
281
        jz      .skip_assoc
517 diamond 282
        mov     [associations], eax
283
        push    enum_associations_callback
284
        push    aAssociations
285
        push    app_path
286
        call    [ini.enum_keys]
287
.skip_assoc:
474 diamond 288
        xor     ebp, ebp
289
        xor     esi, esi
522 diamond 290
.shortcut_loop:
474 diamond 291
        mov     edi, saved_file_name
292
        push    dword nullstr
293
        push    512
294
        push    edi
295
        push    dword aShortcut
296
        push    dword aFolderShortcuts
297
        push    dword app_path
298
        call    [ini.get_str]
299
        cmp     byte [edi], 0
300
        jz      .shortcut_cont
301
        or      ecx, -1
302
        xor     eax, eax
303
        repnz   scasb
304
        not     ecx
305
        cmp     ecx, 2
306
        jz      @f
307
        cmp     byte [edi-2], '/'
308
        jnz     @f
309
        mov     byte [edi-2], 0
310
        dec     ecx
311
@@:
312
        mov     al, [aShortcut.d]
313
        push    esi
314
        inc     esi
315
        mov     [FolderShortcuts+(eax-'0')*4], esi
316
        lea     esi, [esi+ecx-1]
317
        push    esi
318
        and     esi, 0xFFF
319
        cmp     esi, ecx
320
        pop     esi
321
        ja      .norealloc
322
        mov     edx, ebp
323
        mov     ecx, esi
324
        call    xpgrealloc
325
        test    eax, eax
326
        jnz     @f
522 diamond 327
        pop     esi
474 diamond 328
        mov     edi, FolderShortcuts
329
        mov     ecx, 10
330
        rep     stosd
331
        jmp     .skip_shortcuts
332
@@:
333
        mov     ebp, eax
334
.norealloc:
335
        pop     edi
336
        add     edi, ebp
337
        mov     ecx, saved_file_name
338
@@:
339
        mov     al, [ecx]
340
        inc     ecx
341
        stosb
342
        test    al, al
343
        jnz     @b
344
.shortcut_cont:
345
        inc     [aShortcut.d]
346
        cmp     [aShortcut.d], '9'
522 diamond 347
        jbe     .shortcut_loop
474 diamond 348
        mov     esi, FolderShortcuts
349
        mov     ecx, 10
350
        dec     ebp
351
.l3:
352
        lodsd
353
        test    eax, eax
354
        jz      @f
355
        add     [esi-4], ebp
356
@@:
357
        loop    .l3
358
.skip_shortcuts:
589 diamond 359
; load plugins
360
        push    enum_plugins_callback
361
        push    aPlugins
362
        push    app_path
363
        call    [ini.enum_keys]
814 diamond 364
; calculate info for editor
365
        xor     ebx, ebx
366
        mov     ecx, [num_plugins]
367
        mov     esi, [plugins]
368
@@:
369
        dec     ecx
370
        js      @f
371
        mov     [esi+PluginInfo.EditInfoOffs], ebx
372
        add     ebx, [esi+PluginInfo.EditInfoSize]
373
        jnc     @f
374
        sbb     ebx, ebx
375
@@:
376
; поскольку размер блока в редакторе ограничен, то и размер памяти, резервируемой для плагинов, ограничен
377
; 512 - грубая верхняя оценка, гарантирующая работу редактора, реально плагины должны требовать меньше
378
        cmp     ebx, 512
379
        jb      @f
380
        or      ebx, -1
381
        mov     [EditPlugInfo], ebx     ; disable plugins for editor
382
        push    ContinueBtn
383
        push    1
384
        push    EditConfigErr_ptr
385
        push    2
386
        call    SayErr
387
@@:
388
        add     ebx, 3
389
        and     ebx, not 3
390
        mov     [EditPlugInfo], ebx
474 diamond 391
.noini:
997 diamond 392
        mov     eax, [EditPlugInfo]
393
        add     eax, editor_line.plugdata
394
        imul    eax, max_height
395
        add     eax, editor_data.basesize + 0xFFF
396
        shr     eax, 12
397
        mov     [EditDataSize], eax
474 diamond 398
        mov     esi, def_left_dir
8960 IgorA 399
        mov     edi, panel1.dir
474 diamond 400
@@:
401
        lodsb
402
        stosb
403
        test    al, al
404
        jnz     @b
405
        mov     esi, def_right_dir
8960 IgorA 406
        mov     edi, panel2.dir
474 diamond 407
@@:
408
        lodsb
409
        stosb
410
        test    al, al
411
        jnz     @b
180 heavyiron 412
        call    draw_keybar
413
        call    draw_cmdbar
314 diamond 414
        mov     [prev_dir], 0
8960 IgorA 415
        mov     ebp, panel1
474 diamond 416
        call    calc_colwidths
180 heavyiron 417
        call    read_folder
418
        call    draw_panel
314 diamond 419
        mov     [bSilentFolderMode], 1
8960 IgorA 420
        mov     ebp, panel2
474 diamond 421
        call    calc_colwidths
180 heavyiron 422
        call    read_folder
423
        call    draw_panel
424
event:
997 diamond 425
        call    get_event
180 heavyiron 426
        dec     eax
427
        jz      redraw
428
        dec     eax
429
        jz      key
8932 IgorA 430
        sub     eax,4
431
        jz      mouse
180 heavyiron 432
; button - we have only one button, close
433
exit:
589 diamond 434
; close all screens
435
@@:
436
        mov     ecx, [num_screens]
437
        mov     eax, [screens]
438
        mov     ebp, [eax+ecx*8-4]
439
        mov     eax, [eax+ecx*8-8]
440
        push    ebp
441
        call    [eax+screen_vtable.OnExit]
442
        pop     ecx
443
        call    pgfree
444
        dec     [num_screens]
445
        jnz     @b
446
; unload all plugins
447
        mov     ecx, [num_plugins]
448
        imul    esi, ecx, PluginInfo.size
449
        add     esi, [plugins]
450
.unload:
451
        dec     ecx
452
        js      .unload_done
453
        sub     esi, PluginInfo.size
454
        push    ecx esi
455
        call    [esi+PluginInfo.unload]
456
        pop     esi ecx
457
        jmp     .unload
458
.unload_done:
459
        cmp     [ini.set_int], aIniSetInt
460
        jz      .nosave
8960 IgorA 461
        push    [panel1.colmode]
589 diamond 462
        push    aLeftViewMode
463
        push    aPanels
464
        push    app_path
465
        call    [ini.set_int]
8960 IgorA 466
        push    [panel2.colmode]
589 diamond 467
        push    aRightViewMode
468
        push    aPanels
469
        push    app_path
470
        call    [ini.set_int]
8960 IgorA 471
        movzx   eax, [panel1.sortmode]
1045 diamond 472
        push    eax
473
        push    aLeftSortMode
474
        push    aPanels
475
        push    app_path
476
        call    [ini.set_int]
8960 IgorA 477
        movzx   eax, [panel2.sortmode]
1045 diamond 478
        push    eax
479
        push    aRightSortMode
480
        push    aPanels
481
        push    app_path
482
        call    [ini.set_int]
589 diamond 483
.nosave:
484
if CHECK_FOR_LEAKS
8960 IgorA 485
        mov     ecx, [panel1.files]
589 diamond 486
        call    pgfree
8960 IgorA 487
        mov     ecx, [panel2.files]
589 diamond 488
        call    pgfree
489
        mov     ecx, [screens]
490
        call    pgfree
491
        mov     ecx, [associations]
492
        call    pgfree
493
        mov     ecx, [console_data_ptr]
494
        call    pgfree
495
        mov     ecx, [MemForImage]
496
        call    pgfree
497
        mov     esi, FolderShortcuts
498
        push    10
499
        pop     ecx
500
@@:
501
        lodsd
502
        test    eax, eax
503
        jnz     @f
504
        loop    @b
505
        jmp     .nofreefs
506
@@:
507
        mov     ecx, eax
508
        call    pgfree
509
        mov     ecx, [plugins]
510
        call    pgfree
8960 IgorA 511
        mov     ecx, [panel1.parents]
589 diamond 512
        call    pgfree
8960 IgorA 513
        mov     ecx, [panel2.parents]
589 diamond 514
        call    pgfree
515
.nofreefs:
516
        mov     eax, [numallocatedregions]
517
        test    eax, eax
518
        jz      @f
519
        mov     edi, allocatedregions
520
        int3
521
        jmp     $
522
@@:
523
end if
180 heavyiron 524
        or      eax, -1
517 diamond 525
        int     40h
997 diamond 526
 
527
get_event:
528
        push    ebx
529
        mov     ebx, [idle_interval]
530
        cmp     ebx, -1
531
        jz      .infinite
8932 IgorA 532
        push    SF_WAIT_EVENT_TIMEOUT
997 diamond 533
        pop     eax
534
        int     40h
535
        pop     ebx
536
        test    eax, eax
537
        jnz     .ret
538
        mov     ebp, [active_screen_data]
539
        mov     eax, [active_screen_vtable]
540
        mov     eax, [eax+screen_vtable.OnIdle]
541
        test    eax, eax
542
        jz      get_event
543
        call    eax
544
        jmp     get_event
545
.infinite:
546
        pop     ebx
8932 IgorA 547
        push    SF_WAIT_EVENT
997 diamond 548
        pop     eax
549
        int     40h
550
.ret:
551
        ret
552
 
180 heavyiron 553
redraw:
283 diamond 554
; query kbd state from OS
8932 IgorA 555
        mov     al, SF_KEYBOARD
556
        push    SSF_GET_CONTROL_KEYS
283 diamond 557
        pop     ebx
517 diamond 558
        int     0x40
283 diamond 559
        and     eax, 0x3F
560
        cmp     al, [ctrlstate]
561
        mov     [ctrlstate], al
562
        jz      @f
563
        call    draw_keybar
564
@@:
8932 IgorA 565
        mov     al, SF_THREAD_INFO
180 heavyiron 566
        mov     ebx, procinfo
567
        or      ecx, -1
517 diamond 568
        int     40h
180 heavyiron 569
; test if rolled up
570
; height of rolled up window is [skinh]+3
571
        mov     eax, [ebx+46]
572
        sub     eax, [skinh]
573
        cmp     eax, 5
574
        ja      @f
8932 IgorA 575
        mov     al, SF_REDRAW
576
        push    SSF_BEGIN_DRAW
180 heavyiron 577
        pop     ebx
517 diamond 578
        int     0x40
180 heavyiron 579
        xor     eax, eax
580
; ebx, ecx, edi are ignored by function 0 after first redraw
314 diamond 581
        mov     edx, 0x53000000
517 diamond 582
        int     0x40
8932 IgorA 583
        mov     al, SF_REDRAW
180 heavyiron 584
        inc     ebx
517 diamond 585
        int     0x40
180 heavyiron 586
        jmp     event
587
@@:
588
        xor     ecx, ecx
589
        mov     eax, [ebx+42]
314 diamond 590
        mov     [wnd_width], eax
283 diamond 591
        sub     eax, 5*2-1
180 heavyiron 592
        jae     @f
593
        xor     eax, eax
594
@@:
595
        cdq
596
        mov     esi, font_width
597
        div     esi
814 diamond 598
        cmp     eax, min_width
180 heavyiron 599
        jae     @f
814 diamond 600
        mov     al, min_width
180 heavyiron 601
        mov     ch, 1
602
@@:
814 diamond 603
        cmp     eax, max_width
180 heavyiron 604
        jbe     @f
814 diamond 605
        mov     eax, max_width
180 heavyiron 606
        mov     ch, 1
607
@@:
608
        cmp     eax, [cur_width]
609
        mov     [cur_width], eax
610
        setnz   cl
611
        or      cl, ch
612
        test    edx, edx
314 diamond 613
        mov     [fill_width], edx
180 heavyiron 614
        setnz   ch
615
        mov     eax, [ebx+46]
314 diamond 616
        mov     [wnd_height], eax
180 heavyiron 617
        sub     eax, [skinh]
283 diamond 618
        sub     eax, 5-1
180 heavyiron 619
        jns     @f
620
        xor     eax, eax
621
@@:
622
        cdq
623
        mov     esi, font_height
624
        div     esi
814 diamond 625
        cmp     eax, min_height
180 heavyiron 626
        jae     @f
814 diamond 627
        mov     al, min_height
180 heavyiron 628
        mov     cl, 1
629
@@:
814 diamond 630
        cmp     eax, max_height
180 heavyiron 631
        jbe     @f
814 diamond 632
        mov     eax, max_height
180 heavyiron 633
        mov     cl, 1
634
@@:
314 diamond 635
        mov     [fill_height], edx
180 heavyiron 636
        cmp     eax, [cur_height]
637
        mov     [cur_height], eax
283 diamond 638
        jnz     .resize
639
        test    cl, cl
640
        jnz     .resize
641
        test    edx, edx
642
        setnz   cl
180 heavyiron 643
        or      cl, ch
644
        jz      @f
283 diamond 645
        test    byte [ebx+70], 1
646
        jnz     @f
647
.resize:
8932 IgorA 648
        push    SF_CHANGE_WINDOW
180 heavyiron 649
        pop     eax
650
        or      ebx, -1
651
        or      ecx, -1
652
        mov     edx, [cur_width]
653
        imul    edx, font_width
283 diamond 654
        add     edx, 5*2-1
180 heavyiron 655
        mov     esi, [cur_height]
656
        imul    esi, font_height
657
        add     esi, [skinh]
283 diamond 658
        add     esi, 5-1
517 diamond 659
        int     40h
283 diamond 660
.resize_draw:
474 diamond 661
        mov     ecx, [MemForImage]
662
        call    pgfree
663
        and     [MemForImage], 0
283 diamond 664
        call    init_console
665
;        call    draw_window
180 heavyiron 666
        call    draw_keybar
667
        mov     ebp, [active_screen_data]
668
        mov     eax, [active_screen_vtable]
814 diamond 669
        mov     [cursor_size], cursor_normal_size
180 heavyiron 670
        call    dword [eax+screen_vtable.OnRedraw]
671
        jmp     event
672
@@:
673
        call    draw_window
674
        jmp     event
283 diamond 675
alt_f9:
676
        cmp     [saved_width], -1
677
        jz      @f
678
        mov     eax, [saved_width]
679
        mov     [cur_width], eax
680
        or      [saved_width], -1
681
        mov     eax, [saved_height]
682
        mov     [cur_height], eax
683
        or      [saved_height], -1
684
        jmp     redraw.resize
685
@@:
8932 IgorA 686
        push    SF_STYLE_SETTINGS
283 diamond 687
        pop     eax
8932 IgorA 688
        push    SSF_GET_SCREEN_AREA
283 diamond 689
        pop     ebx
517 diamond 690
        int     0x40
283 diamond 691
        push    eax
692
        sub     eax, [esp+2]
693
        inc     eax
694
        movzx   eax, ax
695
        sub     eax, 10
696
        xor     edx, edx
697
        mov     ecx, font_width
698
        div     ecx
699
        xchg    [cur_width], eax
700
        mov     [saved_width], eax
701
        mov     eax, ebx
702
        shr     ebx, 16
703
        sub     eax, ebx
704
        sub     eax, 5-1
705
        sub     eax, [skinh]
706
        xor     edx, edx
707
        mov     ecx, font_height
708
        div     ecx
709
        xchg    [cur_height], eax
710
        mov     [saved_height], eax
711
        mov     ecx, ebx
712
        pop     ebx
713
        shr     ebx, 16
714
        mov     edx, [cur_width]
715
        imul    edx, font_width
716
        add     edx, 5*2-1
717
        mov     esi, [cur_height]
718
        imul    esi, font_height
719
        add     esi, [skinh]
720
        add     esi, 4
8932 IgorA 721
        push    SF_CHANGE_WINDOW
283 diamond 722
        pop     eax
517 diamond 723
        int     0x40
283 diamond 724
        jmp     redraw.resize_draw
180 heavyiron 725
key:
8932 IgorA 726
        mov     al, SF_GET_KEY
517 diamond 727
        int     40h
180 heavyiron 728
        test    al, al
729
        jnz     event
730
        xchg    al, ah
731
        cmp     al, 0xE0
732
        jnz     @f
733
        mov     [bWasE0], 1
734
        jmp     event
735
@@:
736
        xchg    ah, [bWasE0]
737
        mov     ebp, [active_screen_data]
738
        mov     edx, [active_screen_vtable]
739
        cmp     al, 0x1D
740
        jz      .ctrl_down
741
        cmp     al, 0x9D
742
        jz      .ctrl_up
743
        cmp     al, 0x2A
744
        jz      .lshift_down
745
        cmp     al, 0xAA
746
        jz      .lshift_up
747
        cmp     al, 0x36
748
        jz      .rshift_down
749
        cmp     al, 0xB6
750
        jz      .rshift_up
751
        cmp     al, 0x38
752
        jz      .alt_down
753
        cmp     al, 0xB8
754
        jz      .alt_up
755
        call    [edx+screen_vtable.OnKey]
756
        jmp     event
757
.ctrl_down:
758
        test    ah, ah
759
        jnz     .rctrl_down
760
        or      [ctrlstate], 4
761
        jmp     .keybar
762
.rctrl_down:
763
        or      [ctrlstate], 8
764
        jmp     .keybar
765
.ctrl_up:
766
        test    ah, ah
767
        jnz     .rctrl_up
768
        and     [ctrlstate], not 4
769
        jmp     .keybar
770
.rctrl_up:
771
        and     [ctrlstate], not 8
772
.keybar:
773
        call    draw_keybar
774
        call    draw_image
775
@@:     jmp     event
776
.lshift_down:
777
; ignore E0 2A sequence
778
; e.g. arrow keys with NumLock on generate sequence E0 2A E0 xx / E0 xx+80 E0 AA
779
; where xx is scancode, so we can safely ignore E0 2A
780
        test    ah, ah
781
        jnz     @b
782
        or      [ctrlstate], 1
783
        jmp     .keybar
784
.lshift_up:
785
; ignore E0 AA sequence
786
        test    ah, ah
787
        jnz     @b
788
        and     [ctrlstate], not 1
789
        jmp     .keybar
790
.rshift_down:
791
        or      [ctrlstate], 2
792
        jmp     .keybar
793
.rshift_up:
794
        and     [ctrlstate], not 2
795
        jmp     .keybar
796
.alt_down:
797
        test    ah, ah
798
        jnz     .ralt_down
799
        or      [ctrlstate], 0x10
800
        jmp     .keybar
801
.ralt_down:
802
        or      [ctrlstate], 0x20
803
        jmp     .keybar
804
.alt_up:
805
        test    ah, ah
806
        jnz     .ralt_up
807
        and     [ctrlstate], not 0x10
808
        jmp     .keybar
809
.ralt_up:
810
        and     [ctrlstate], not 0x20
811
        jmp     .keybar
812
 
8932 IgorA 813
align 16
814
mouse:
8960 IgorA 815
        cmp     dword[num_screens],1
816
		jg      event
817
		mov     eax,SF_MOUSE_GET
8932 IgorA 818
        mov     ebx,SSF_BUTTON_EXT
819
        int     0x40
820
        bt      eax,8
821
        jnc     event
822
 
823
        mov     eax,SF_MOUSE_GET
824
        mov     ebx,SSF_WINDOW_POSITION
825
        int     0x40
826
		cmp     ax, word[skinh]
827
		jl      event
8960 IgorA 828
		sub     ax, word[skinh]
829
		xor     dx,dx
830
		mov     bx, font_height
831
		div     bx
832
		movzx   edx,ax
833
		dec     edx ;верхняя рамка
834
		dec     edx ;заголовки
835
		shr     eax,16
836
 
837
        cmp     edx, 0
838
		jl      .no_ch_pos
839
		mov     ebx, [cur_height]
840
		sub     ebx, 7
841
		cmp     edx, ebx
842
		jge     .no_ch_pos
843
 
844
		push    edx eax
845
        mov     ecx, [cur_width]
846
        imul    ecx, font_width/4
847
		xor     dx,dx
848
		sub     ax, 5 ;window border
849
		div     cx
850
		bt      ax, 0
851
		jnc     @f
852
		add     [esp+4], ebx ;если 2-й столбец
853
@@:
854
		pop     eax ;edx in stack
855
		jmp @f
856
.no_ch_pos:
857
		push    -1 ;edx = -1 - no change position
858
@@:
859
 
8932 IgorA 860
        mov     ebx, [cur_width]
861
        imul    ebx, font_width/2
862
		add     ebx, 5 ;window border
863
		cmp     eax,ebx
864
		jg      @f
8960 IgorA 865
		cmp     [active_panel], panel1
866
		je      .move
8932 IgorA 867
		jmp     .tab
868
@@:
8960 IgorA 869
		cmp     [active_panel], panel2
870
		je      .move
8932 IgorA 871
.tab:
8960 IgorA 872
        xor     [active_panel], panel1 xor panel2
8932 IgorA 873
        call    draw_cmdbar
874
        mov     ebp, [active_panel]
8960 IgorA 875
        xor     ebp, panel1 xor panel2
8932 IgorA 876
        call    draw_panel
8960 IgorA 877
.move:
8932 IgorA 878
        mov     ebp, [active_panel]
8960 IgorA 879
		pop     edx
880
		mov     eax, [ebp + PanelData.numfiles]
881
		add     edx, [ebp + PanelData.start] ;число прокрученых файлов
882
		dec     eax
883
		cmp     edx, eax
884
		jle     @f
885
		mov     edx, eax
886
@@:
887
        cmp     edx, 0
888
		jl      @f
889
		mov     [ebp + PanelData.index], edx
890
@@:
891
		call    draw_panel
8932 IgorA 892
        jmp     event
893
 
894
align 16
180 heavyiron 895
process_ctrl_keys:
896
        cmp     byte [esi], 0
897
        jz      .done
898
        push    ecx
899
        cmp     al, [esi]
900
        jz      .check
901
.cont:
902
        pop     ecx
903
        add     esi, 8
904
        jmp     process_ctrl_keys
905
.done:
906
        stc
907
        ret
908
.check:
909
        mov     cl, 0
910
        call    .check_ctrlkey
911
        jc      .cont
912
        mov     cl, 2
913
        call    .check_ctrlkey
914
        jc      .cont
915
        mov     cl, 4
916
        call    .check_ctrlkey
917
        jc      .cont
918
        pop     ecx
919
        call    dword [esi+4]
920
        clc
921
        ret
922
.check_ctrlkey:
923
        push    eax edx
924
        movzx   edx, [ctrlstate]
925
        shr     edx, cl
926
        add     cl, cl
927
        movzx   eax, word [esi+2]
928
        shr     eax, cl
929
        and     eax, 15
930
        cmp     al, ctrlkey_tests_num
931
        jae     .fail
932
        xchg    eax, edx
933
        and     al, 3
934
        call    [ctrlkey_tests + edx*4]
935
        cmp     al, 1
936
        pop     edx eax
937
        ret
938
.fail:
939
        stc
940
        pop     edx eax
941
        ret
942
 
943
ctrlkey_test0:
944
        test    al, al
945
        setz    al
946
        ret
947
ctrlkey_test1:
948
        test    al, al
949
        setnp   al
950
        ret
951
ctrlkey_test2:
952
        cmp     al, 3
953
        setz    al
954
        ret
955
ctrlkey_test3:
956
        cmp     al, 1
957
        setz    al
958
        ret
959
ctrlkey_test4:
960
        cmp     al, 2
961
        setz    al
962
        ret
963
 
517 diamond 964
enum_associations_callback:
1000 diamond 965
; LongBool __stdcall callback(f_name,sec_name,key_name,key_value);
966
; [esp+4] = f_name, [esp+8] = sec_name, [esp+12] = key_name, [esp+16] = key_value
517 diamond 967
        mov     esi, [esp+12]
968
        mov     edi, esi
969
@@:
970
        lodsb
971
        test    al, al
972
        jnz     @b
973
        sub     esi, edi        ; esi = size of key name
1000 diamond 974
        mov     eax, [esp+16]
517 diamond 975
@@:
976
        inc     esi
977
        inc     eax
978
        cmp     byte [eax-1], 0
979
        jnz     @b
980
; esi = total size of entry
981
        push    esi
982
        add     esi, [associations_size]
983
        mov     ecx, [associations_allocated]
984
@@:
985
        cmp     esi, ecx
986
        jbe     @f
987
        add     ecx, ecx
988
        jmp     @b
989
@@:
990
        pop     esi
991
        cmp     [associations_allocated], ecx
992
        jz      @f
993
        mov     [associations_allocated], ecx
994
        mov     edx, [associations]
995
        call    xpgrealloc
996
        mov     [associations], eax
997
        test    eax, eax
998
        jz      .err
999
@@:
1000
        mov     eax, esi
1001
        mov     esi, edi
1002
        mov     edi, [associations]
1003
        add     edi, [associations_size]
1004
        dec     edi
1005
        add     [associations_size], eax
1006
@@:
1007
        lodsb
1008
        stosb
1009
        test    al, al
1010
        jnz     @b
1000 diamond 1011
        mov     esi, [esp+16]
517 diamond 1012
@@:
1013
        lodsb
1014
        stosb
1015
        test    al, al
1016
        jnz     @b
1017
.ret:
1018
        mov     al, 1
1000 diamond 1019
        ret     16
517 diamond 1020
.err:
1021
        mov     ecx, edx
1022
        call    pgfree
1023
        xor     eax, eax
1000 diamond 1024
        ret     16
517 diamond 1025
 
589 diamond 1026
enum_plugins_callback:
1000 diamond 1027
; LongBool __stdcall callback(f_name,sec_name,key_name,key_value);
1028
; [esp+4] = f_name, [esp+8] = sec_name, [esp+12] = key_name, [esp+16] = key_value
1029
        mov     esi, [esp+16]
589 diamond 1030
        cmp     byte [esi], '/'
1031
        jz      .absolute
1032
; convert path to absolute
1033
        mov     edi, execdata
1034
@@:
1000 diamond 1035
        cmp     edi, execdata+1024
1036
        jae     .overflow
589 diamond 1037
        lodsb
1038
        stosb
1039
        test    al, al
1040
        jnz     @b
1000 diamond 1041
        mov     edi, saved_file_name
1042
        mov     [esp+16], edi
589 diamond 1043
        mov     esi, app_path
1044
        push    esi
1045
        xor     ecx, ecx
1046
@@:
1047
        lodsb
1048
        test    al, al
1049
        jz      @f
1050
        cmp     al, '/'
1051
        jnz     @b
1052
        mov     ecx, esi
1053
        jmp     @b
1054
@@:
1055
        pop     esi
1056
        sub     ecx, esi
1000 diamond 1057
        push    edi
1058
        add     edi, ecx
1059
        cmp     edi, saved_file_name+1024
1060
        pop     edi
1061
        ja      .overflow
589 diamond 1062
        rep     movsb
1063
        mov     esi, execdata
1064
.z:
1065
        cmp     word [esi], '.'
1066
        jz      .ret
1067
        cmp     word [esi], './'
1068
        jnz     @f
1069
        add     esi, 2
1070
        jmp     .z
1071
@@:
1072
        cmp     word [esi], '..'
1073
        jnz     .c
1074
        cmp     byte [esi+2], 0
1075
        jz      .ret
1076
        cmp     byte [esi+2], '/'
1077
        jnz     .c
1078
        add     esi, 3
1079
@@:
1080
        dec     edi
1081
        cmp     edi, saved_file_name
1082
        jbe     .ret
1083
        cmp     byte [edi-1], '/'
1084
        jnz     @b
1085
        jmp     .z
1086
.c:
1000 diamond 1087
        cmp     edi, saved_file_name+1024
1088
        jae     .overflow
589 diamond 1089
        lodsb
1090
        stosb
1091
        test    al, al
1000 diamond 1092
        jnz     .c
1093
        jmp     .absolute
1094
.overflow:
589 diamond 1095
        mov     esi, execdata
1000 diamond 1096
        mov     byte [esi+1023], 0
589 diamond 1097
        call    load_dll_and_import.big
1098
.ret:
1099
        mov     al, 1
1046 diamond 1100
        ret     16
589 diamond 1101
.absolute:
1102
; allocate space for plugin info
1103
        mov     eax, [num_plugins]
1104
        inc     eax
1105
        mov     [num_plugins], eax
1106
        imul    ecx, eax, PluginInfo.size
1107
        cmp     ecx, [alloc_plugins]
1108
        jbe     .norealloc
1109
        mov     edx, [plugins]
1110
        call    xpgrealloc
1111
        test    eax, eax
1112
        jnz     @f
1113
.dec_ret:
1114
        dec     [num_plugins]
1115
        jmp     .ret
1116
@@:
1117
        mov     [plugins], eax
1118
        lea     eax, [ecx+0xFFF]
1119
        and     eax, not 0xFFF
1120
        mov     [alloc_plugins], eax
1121
.norealloc:
1122
        mov     esi, [plugins]
1123
        lea     esi, [esi+ecx-PluginInfo.size]
1124
; load plugin DLL
1125
        or      ebp, -1
1000 diamond 1126
        mov     eax, [esp+16]
589 diamond 1127
        call    load_dll_and_import.do
1128
        test    eax, eax
1129
        jnz     .dec_ret
1130
; find exported functions
1131
        mov     eax, aVersion
1132
        call    load_dll_and_import.find_exported_function
1133
        jnc     @f
1134
        xor     eax, eax
1135
@@:
814 diamond 1136
MIN_INTERFACE_VER = 3
1137
MAX_INTERFACE_VER = 3
589 diamond 1138
        cmp     eax, MIN_INTERFACE_VER
631 diamond 1139
        jb      @f
589 diamond 1140
        cmp     eax, MAX_INTERFACE_VER
631 diamond 1141
        jbe     .version_ok
1142
@@:
589 diamond 1143
        push    aIncompatibleVersion
1144
.cantload:
1000 diamond 1145
        push    dword [esp+4+16]
589 diamond 1146
        push    aCannotLoadPlugin
1147
        mov     eax, esp
1148
        push    ContinueBtn
1149
        push    1
1150
        push    eax
1151
        push    3
1152
        call    SayErr
1153
        add     esp, 12
1154
        jmp     .dec_ret
631 diamond 1155
.version_ok:
589 diamond 1156
        mov     edi, esi
1157
        mov     esi, plugin_exported
1158
.import:
1159
        lodsd
1160
        test    eax, eax
1161
        jz      .import_done
1162
        call    load_dll_and_import.find_exported_function
1163
        jnc     @f
1164
        mov     eax, [esi-4+plugin_exported_default-plugin_exported]
1165
@@:
1166
        stosd
1167
        jmp     .import
1168
.import_done:
1169
; initialize plugin
1170
        mov     eax, aPluginLoad
1171
        call    load_dll_and_import.find_exported_function
1172
        jc      .ok
1173
        push    kfar_info
1174
        call    eax
1175
        cmp     eax, 1
1176
        jb      .ok
1177
        ja      .dec_ret
1178
        push    aInitFailed
1179
        jmp     .cantload
1180
.ok:
1181
        mov     al, 1
1000 diamond 1182
        ret     16
589 diamond 1183
 
1184
plugin_unload_default:
1185
        ret
1186
 
1187
OpenFilePlugin_default:
631 diamond 1188
        xor     eax, eax
1189
        ret     28
589 diamond 1190
GetFiles_default:
1191
        xor     eax, eax
1192
        ret     20
1193
 
1194
ClosePlugin_default:
1195
        ret     4
1196
 
1197
GetOpenPluginInfo_default:
1198
        ret     8
1199
 
1200
SetFolder_default:
1201
open_default:
1202
        xor     eax, eax
1203
        ret     12
1204
 
180 heavyiron 1205
new_screen:
474 diamond 1206
; in: ecx=sizeof(screen data), edx->vtable
1207
; out: ebp=pointer or NULL, eax!=0 if successful
1208
; destroys ebx,ecx
1209
        call    xpgalloc
180 heavyiron 1210
        test    eax, eax
1211
        jnz     @f
1212
        ret
1213
@@:
1214
        mov     ebp, eax
1215
        mov     eax, [screens]
474 diamond 1216
        mov     ecx, [num_screens]
1217
        inc     ecx
1218
        shl     ecx, 3
1219
        test    ecx, 0xFFF
1220
        jnz     .norealloc
1221
        push    edx
1222
        mov     edx, eax
1223
        call    xpgrealloc
1224
        pop     edx
180 heavyiron 1225
        test    eax, eax
1226
        jnz     @f
474 diamond 1227
        mov     ecx, ebp
1228
        call    pgfree
180 heavyiron 1229
        xor     eax, eax
1230
        ret
1231
@@:
1232
        mov     [screens], eax
474 diamond 1233
.norealloc:
180 heavyiron 1234
        inc     [num_screens]
474 diamond 1235
        mov     [eax+ecx-8], edx
1236
        mov     [eax+ecx-4], ebp
180 heavyiron 1237
        mov     eax, [num_screens]
1238
        dec     eax
1239
        mov     [active_screen], eax
1240
        mov     [active_screen_vtable], edx
1241
        mov     [active_screen_data], ebp
997 diamond 1242
        or      [idle_interval], -1
1243
        mov     edx, [edx+screen_vtable.keybar]
1244
        test    edx, edx
1245
        jz      @f
1246
        mov     [active_screen_keybar], edx
1247
@@:
180 heavyiron 1248
        jmp     draw_keybar
1249
 
1250
next_screen:
1251
        mov     eax, [active_screen]
1252
        inc     eax
1253
        cmp     eax, [num_screens]
1254
        jnz     @f
1255
        xor     eax, eax
1256
@@:     mov     [active_screen], eax
1257
        jmp     change_screen
1258
 
1259
delete_active_screen:
1260
        mov     edi, [screens]
1261
        mov     eax, [active_screen]
1262
        shl     eax, 3
1263
        add     edi, eax
1264
        push    dword [edi+4]
1265
        lea     esi, [edi+8]
1266
        mov     ecx, [num_screens]
1267
        sub     ecx, [active_screen]
1268
        dec     ecx
1269
        add     ecx, ecx
1270
        rep     movsd
1271
        dec     [num_screens]
474 diamond 1272
        mov     ecx, [num_screens]
1273
        shl     ecx, 3
1274
        test    ecx, 0xFFF
1275
        jnz     .norealloc
1276
        mov     edx, [screens]
1277
        call    pgrealloc               ; must succeed, because we decrease size
1278
        mov     [screens], eax
1279
.norealloc:
1280
        pop     ecx
1281
        call    pgfree
997 diamond 1282
        dec     [active_screen]
180 heavyiron 1283
 
1284
change_screen:
1285
        pusha
997 diamond 1286
        or      [idle_interval], -1
180 heavyiron 1287
        mov     eax, [active_screen]
1288
        mov     esi, [screens]
1289
        mov     ebp, [esi+eax*8+4]
1290
        mov     eax, [esi+eax*8]
997 diamond 1291
        push    eax ebp
1292
        mov     eax, [eax+screen_vtable.OnActivate]
1293
        test    eax, eax
1294
        jz      @f
1295
        call    eax
1296
@@:
1297
        pop     ebp eax
180 heavyiron 1298
        mov     [active_screen_vtable], eax
1299
        mov     [active_screen_data], ebp
997 diamond 1300
        mov     edx, [eax+screen_vtable.keybar]
1301
        test    edx, edx
1302
        jz      @f
1303
        mov     [active_screen_keybar], edx
1304
@@:
180 heavyiron 1305
        call    draw_keybar
814 diamond 1306
        mov     [cursor_size], cursor_normal_size
180 heavyiron 1307
        call    [eax+screen_vtable.OnRedraw]
1308
        popa
1309
        ret
1310
 
1311
F12:
1312
        mov     eax, [cur_width]
1313
        add     eax, 8
1314
        mov     esi, eax
1315
        mul     [num_screens]
474 diamond 1316
        mov     ecx, eax
1317
        call    xpgalloc
180 heavyiron 1318
        test    eax, eax
1319
        jnz     @f
1320
        ret
1321
@@:
1322
        mov     ebx, eax
1323
        mov     edi, eax
1324
        xor     ecx, ecx
1325
.next:
1326
        xor     eax, eax
1327
        stosd
1328
        inc     ecx
1329
        cmp     ecx, [num_screens]
1330
        jz      @f
1331
        lea     eax, [edi+esi-4]
1332
        mov     dword [edi-4], eax
1333
@@:
1334
        xor     eax, eax
1335
        stosd
1336
        dec     ecx
1337
        jz      @f
1338
        lea     eax, [edi-8]
1339
        sub     eax, esi
1340
        mov     dword [edi-4], eax
1341
@@:
1342
        mov     al, '&'
1343
        stosb
1344
        cmp     ecx, 36
1345
        jae     .noletter
1346
        lea     eax, [ecx+'0']
1347
        cmp     al, '9'
1348
        jbe     @f
1349
        add     al, 7
1350
@@:
1351
        stosb
1352
        mov     al, '.'
1353
        stosb
1354
        jmp     .letter_done
1355
.noletter:
1356
        mov     al, ' '
1357
        stosb
1358
        stosb
1359
.letter_done:
1360
        mov     al, ' '
1361
        stosb
1362
        pushad
1363
        mov     eax, [screens]
1364
        mov     ebp, [eax+ecx*8+4]
1365
        mov     eax, [eax+ecx*8]
1366
        mov     ecx, [cur_width]
1367
        sub     ecx, 12
1368
        call    [eax + screen_vtable.getname]
1369
        popad
1370
        sub     edi, 4
1371
        add     edi, [cur_width]
1372
        inc     ecx
1373
        cmp     ecx, [num_screens]
1374
        jb      .next
1375
        mov     eax, [active_screen]
1376
        mul     esi
1377
        add     eax, ebx
1378
        push    1
474 diamond 1379
        push    dword aScreens
180 heavyiron 1380
        push    eax
1381
        call    menu
1382
        cmp     eax, -1
1383
        jz      @f
1384
        sub     eax, ebx
1385
        div     esi
1386
        mov     [active_screen], eax
1387
@@:
474 diamond 1388
        mov     ecx, ebx
1389
        call    pgfree
180 heavyiron 1390
        jmp     change_screen
1391
 
1392
panels_OnKey:
814 diamond 1393
; restore screen hidden by quick search box
1394
        cmp     [bDisplayQuickSearch], 0
1395
        jz      @f
1396
        mov     [bDisplayQuickSearch], 0
1397
        push    0
1398
        push    QuickSearchDlg
1399
        call    HideDialogBox
1400
@@:
180 heavyiron 1401
        mov     ebp, [active_panel]
8960 IgorA 1402
        mov     ecx, [ebp + PanelData.index]
1403
        mov     edx, [ebp + PanelData.start]
1404
        mov     ebx, [ebp + PanelData.colst]
180 heavyiron 1405
        add     ebx, edx
1406
        mov     esi, panels_ctrlkeys
814 diamond 1407
        call    process_ctrl_keys
1408
        jc      .nostdkey
1409
        mov     [bQuickSearchMode], 0
1410
        ret
1411
.leaveqsmode:
1412
        mov     [bQuickSearchMode], 0
1413
        call    draw_image
1414
        ret
1415
.keepqsmode:
1416
        push    QuickSearchDlg
1417
        call    ShowDialogBox
1418
        mov     [bDisplayQuickSearch], 1
1419
        ret
1420
.nostdkey:
1421
        cmp     [bQuickSearchMode], 0
1422
        jz      .noqsmode
1423
        test    al, al
1424
        js      .keepqsmode
1425
        cmp     al, 40h
1426
        jae     .leaveqsmode
1427
        cmp     al, 0Eh
1428
        jz      .qsbackspace
1429
        cmp     al, 1Ch
1430
        jz      .test_enter
1431
        movzx   eax, al
1432
        cmp     byte [scan2ascii+eax], 0
1433
        jz      .leaveqsmode
1434
        call    get_ascii_char
1435
        mov     ecx, dword [quick_search_buf + 4]
1436
        cmp     ecx, quicksearch_maxlen
1437
        jae     .keepqsmode
1438
        mov     byte [quick_search_buf + 12 + ecx], al
1439
        mov     byte [quick_search_buf + 12 + ecx + 1], 0
1440
        push    ecx
1441
        call    quick_find
1442
        pop     ecx
1443
        jnc     @f
1444
        mov     byte [quick_search_buf + 12 + ecx], 0
1445
        jmp     .keepqsmode
1446
@@:
1447
        inc     dword [quick_search_buf + 4]
1448
        sub     ecx, 16
1449
        jae     @f
1450
        xor     ecx, ecx
1451
@@:
1452
        mov     dword [quick_search_buf + 8], ecx
1453
        jmp     .keepqsmode
1454
.qsbackspace:
1455
        mov     ecx, dword [quick_search_buf + 4]
1456
        jecxz   .keepqsmode2
1457
        dec     ecx
1458
        mov     byte [quick_search_buf + 12 + ecx], 0
1459
        dec     dword [quick_search_buf + 4]
1460
.keepqsmode2:
1461
        jmp     .keepqsmode
1462
.test_enter:
1463
        test    [ctrlstate], 0Ch        ; LCtrl or RCtrl pressed?
1464
        jz      .keepqsmode2
1465
        test    [ctrlstate], 3          ; Shift pressed?
1466
        jnz     @f
1467
        call    quick_find_next
1468
        jmp     .keepqsmode2
1469
@@:
1470
        call    quick_find_prev
1471
        jmp     .keepqsmode2
1472
.noqsmode:
1473
; handle Alt+ combinations for quick search
1474
        test    [ctrlstate], 30h        ; LAlt or RAlt pressed?
1475
        jz      .noalt                  ; no => skip
1476
        test    [ctrlstate], 0Ch        ; LCtrl or RCtrl pressed?
1477
        jnz     .noalt                  ; yes => skip
1478
        cmp     al, 40h
1479
        jae     .noalt
1480
        movzx   eax, al
1481
        cmp     byte [scan2ascii+eax], 0
1482
        jz      .noalt
1483
        call    get_ascii_char
1484
        mov     edi, quick_search_buf + 12
1485
        mov     dword [edi-12], quicksearch_maxlen-1
1486
        mov     dword [edi-8], 1
1487
        and     dword [edi-4], 0
1488
        stosb
1489
        mov     byte [edi], 0
1490
        call    quick_find
1491
        jnc     @f
1492
        mov     byte [quick_search_buf + 12], 0
1493
        and     dword [quick_search_buf + 4], 0
1494
@@:
1495
        mov     ebx, QuickSearchDlg
8960 IgorA 1496
        mov     eax, [ebp + PanelData.left]
814 diamond 1497
        add     eax, 10
1498
        mov     edx, [cur_width]
1499
        sub     edx, 21
1500
        cmp     eax, edx
1501
        jb      @f
1502
        mov     eax, edx
1503
@@:
1504
        mov     [ebx + dlgtemplate.x], eax
8960 IgorA 1505
        mov     eax, [ebp + PanelData.top]
1506
        add     eax, [ebp + PanelData.height]
814 diamond 1507
        mov     edx, [cur_height]
1508
        sub     edx, 2
1509
        cmp     eax, edx
1510
        jb      @f
1511
        mov     eax, edx
1512
@@:
1513
        mov     [ebx + dlgtemplate.y], eax
1514
        push    ebx
1515
        call    ShowDialogBox
1516
        mov     [bQuickSearchMode], 1
1517
        mov     [bDisplayQuickSearch], 1
1518
.find_letter_done:
1519
.noalt:
180 heavyiron 1520
.ret:
1521
        ret
1522
.up:
1523
        jecxz   .ret
1524
        dec     ecx
8960 IgorA 1525
        mov     [ebp + PanelData.index], ecx
180 heavyiron 1526
        cmp     ecx, edx
1527
        jae     .done_redraw
8960 IgorA 1528
        mov     [ebp + PanelData.start], ecx
180 heavyiron 1529
.done_redraw:
1530
;        call    draw_panel
1531
;        ret
1532
        jmp     draw_panel
474 diamond 1533
.insert:
1534
        lea     eax, [ecx*4]
8960 IgorA 1535
        add     eax, [ebp + PanelData.files]
474 diamond 1536
        mov     eax, [eax]
1537
        cmp     word [eax+40], '..'
1538
        jnz     @f
1539
        cmp     byte [eax+42], 0
1540
        jz      .insert.down
1541
@@:
1542
        xor     byte [eax+303], 1
1543
        mov     edx, [eax+32]
1544
        test    byte [eax+303], 1
1545
        mov     eax, [eax+36]
1546
        jnz     .insert.increase
8960 IgorA 1547
        sub     dword [ebp + PanelData.selected_size], edx
1548
        sbb     dword [ebp + PanelData.selected_size+4], eax
1549
        dec     [ebp + PanelData.selected_num]
474 diamond 1550
        jmp     .insert.down
1551
.insert.increase:
8960 IgorA 1552
        add     dword [ebp + PanelData.selected_size], edx
1553
        adc     dword [ebp + PanelData.selected_size+4], eax
1554
        inc     [ebp + PanelData.selected_num]
474 diamond 1555
.insert.down:
1556
        inc     ecx
8960 IgorA 1557
        cmp     ecx, [ebp + PanelData.numfiles]
474 diamond 1558
        jae     .done_redraw
1559
        jmp     @f
180 heavyiron 1560
.down:
1561
        inc     ecx
8960 IgorA 1562
        cmp     ecx, [ebp + PanelData.numfiles]
180 heavyiron 1563
        jae     .ret
474 diamond 1564
@@:
8960 IgorA 1565
        mov     [ebp + PanelData.index], ecx
180 heavyiron 1566
        cmp     ecx, ebx
1567
        jb      .done_redraw
8960 IgorA 1568
        sub     ecx, [ebp + PanelData.colst]
180 heavyiron 1569
        inc     ecx
8960 IgorA 1570
        mov     [ebp + PanelData.start], ecx
180 heavyiron 1571
        jmp     .done_redraw
1572
.left:
474 diamond 1573
        test    ecx, ecx
1574
        jnz     @f
1575
        ret
1576
@@:
8960 IgorA 1577
        mov     eax, [ebp + PanelData.colsz]
474 diamond 1578
        sub     ecx, eax
180 heavyiron 1579
        jae     @f
1580
        xor     ecx, ecx
1581
@@:
8960 IgorA 1582
        mov     [ebp + PanelData.index], ecx
474 diamond 1583
.finalize_left:
180 heavyiron 1584
        cmp     ecx, edx
1585
        jae     .done_redraw
474 diamond 1586
        sub     edx, eax
180 heavyiron 1587
        jae     @f
1588
        xor     edx, edx
1589
@@:
8960 IgorA 1590
        mov     [ebp + PanelData.start], edx
180 heavyiron 1591
        jmp     .done_redraw
474 diamond 1592
.pgup:
8960 IgorA 1593
        mov     eax, [ebp + PanelData.colst]
474 diamond 1594
        dec     eax
1595
        jnz     @f
1596
        inc     eax
1597
@@:
1598
        test    ecx, ecx
1599
        jnz     @f
1600
        ret
1601
@@:
1602
        sub     ecx, eax
1603
        jae     @f
1604
        xor     ecx, ecx
1605
@@:
8960 IgorA 1606
        mov     [ebp + PanelData.index], ecx
474 diamond 1607
        dec     ecx
1608
        jmp     .finalize_left
180 heavyiron 1609
.right:
8960 IgorA 1610
        mov     eax, [ebp + PanelData.colsz]
474 diamond 1611
        add     ecx, eax
8960 IgorA 1612
        cmp     ecx, [ebp + PanelData.numfiles]
180 heavyiron 1613
        jb      @f
8960 IgorA 1614
        mov     ecx, [ebp + PanelData.numfiles]
180 heavyiron 1615
        dec     ecx
1616
@@:
8960 IgorA 1617
        mov     [ebp + PanelData.index], ecx
474 diamond 1618
.finalize_right:
180 heavyiron 1619
        cmp     ecx, ebx
1620
        jb      .done_redraw
474 diamond 1621
        add     ebx, eax
8960 IgorA 1622
        cmp     ebx, [ebp + PanelData.numfiles]
180 heavyiron 1623
        jbe     @f
8960 IgorA 1624
        mov     ebx, [ebp + PanelData.numfiles]
180 heavyiron 1625
@@:
8960 IgorA 1626
        sub     ebx, [ebp + PanelData.colst]
180 heavyiron 1627
        jae     @f
1628
        xor     ebx, ebx
1629
@@:
8960 IgorA 1630
        mov     [ebp + PanelData.start], ebx
180 heavyiron 1631
        jmp     .done_redraw
474 diamond 1632
.pgdn:
8960 IgorA 1633
        mov     eax, [ebp + PanelData.colst]
474 diamond 1634
        dec     eax
1635
        jnz     @f
1636
        inc     eax
1637
@@:
1638
        add     ecx, eax
8960 IgorA 1639
        cmp     ecx, [ebp + PanelData.numfiles]
474 diamond 1640
        jb      @f
8960 IgorA 1641
        mov     ecx, [ebp + PanelData.numfiles]
474 diamond 1642
        dec     ecx
1643
@@:
8960 IgorA 1644
        mov     [ebp + PanelData.index], ecx
474 diamond 1645
        inc     ecx
1646
        jmp     .finalize_right
180 heavyiron 1647
.tab:
8960 IgorA 1648
        xor     [active_panel], panel1 xor panel2
180 heavyiron 1649
        call    draw_cmdbar
1650
        call    draw_panel
1651
        mov     ebp, [active_panel]
1652
        jmp     .done_redraw
1653
.home:
8960 IgorA 1654
        and     [ebp + PanelData.start], 0
1655
        and     [ebp + PanelData.index], 0
180 heavyiron 1656
        jmp     .done_redraw
1657
.end:
8960 IgorA 1658
        mov     eax, [ebp + PanelData.numfiles]
180 heavyiron 1659
        dec     eax
8960 IgorA 1660
        mov     [ebp + PanelData.index], eax
180 heavyiron 1661
        inc     eax
8960 IgorA 1662
        sub     eax, [ebp + PanelData.colst]
180 heavyiron 1663
        jae     @f
1664
        xor     eax, eax
1665
@@:
8960 IgorA 1666
        mov     [ebp + PanelData.start], eax
180 heavyiron 1667
        jmp     .done_redraw
1668
.enter:
814 diamond 1669
        cmp     [bQuickSearchMode], 0
1670
        jz      @f
1671
        call    draw_image
1672
@@:
183 diamond 1673
        call    get_curfile_folder_entry
180 heavyiron 1674
        test    byte [ecx], 10h
1675
        jnz     .enter_folder
589 diamond 1676
; todo: add  handling on plugin panel
8960 IgorA 1677
        cmp     [ebp + PanelData.hPlugin], 0
589 diamond 1678
        jnz     .ret
1679
; generate full file name
8960 IgorA 1680
        lea     esi, [ebp + PanelData.dir]
589 diamond 1681
        mov     edi, execdata
1682
@@:
1683
        lodsb
1684
        test    al, al
1685
        jz      @f
1686
        stosb
1687
        cmp     edi, execdataend-1
1688
        jae     .bigfilename
1689
        jmp     @b
1690
@@:
1691
        lea     esi, [ecx+40]
1692
        mov     al, '/'
1693
        stosb
1694
@@:
1695
        lodsb
1696
        stosb
1697
        cmp     edi, execdataend
1698
        ja      .bigfilename
1699
        test    al, al
1700
        jnz     @b
1701
; try to open file and look for all plugins
1702
        push    O_READ
1703
        push    execdata
1704
        call    open
1705
        test    eax, eax
1706
        jz      .noplugins      ; if can't open, just try to execute
1707
        mov     esi, eax        ; save handle
1708
        push    filedata_buffer_size
1709
        push    filedata_buffer
1710
        push    esi
1711
        call    read
1712
        mov     edi, eax        ; save size of read data
1713
; test for Kolibri executable
1714
        cmp     eax, 24h
1715
        jb      .enter.noexec
1716
        cmp     dword [filedata_buffer], 'MENU'
1717
        jnz     @f
1718
        cmp     word [filedata_buffer+4], 'ET'
1719
        jnz     @f
1720
.close_run:
1721
        push    esi
1722
        call    close
1723
        jmp     .run_app
1724
@@:
1725
        cmp     dword [filedata_buffer], 'KPCK'
1726
        jnz     @f
1727
        cmp     dword [filedata_buffer+12], 0x26914601
1728
        jz      .close_run
1729
@@:
1730
.enter.noexec:
1731
        mov     ecx, [num_plugins]
1732
        mov     edx, [plugins]
1733
        sub     edx, PluginInfo.size
1734
.plugloop:
1735
        add     edx, PluginInfo.size
1736
        dec     ecx
1737
        js      .plugdone
1738
        pushad
631 diamond 1739
        push    execdata
8960 IgorA 1740
        push    [ebp+ PanelData.hFile]
1741
        push    [ebp+ PanelData.hPlugin]
589 diamond 1742
        push    edi
1743
        push    filedata_buffer
1744
        call    get_curfile_folder_entry
1745
        push    ecx
1746
        push    esi
1747
        call    [edx+PluginInfo.OpenFilePlugin]
1748
        mov     [esp+28], eax
1749
        popad
1750
        test    eax, eax
1751
        jz      .plugloop
1752
        cmp     eax, -1
1753
        jnz     .pluginok
1754
        push    esi
1755
        call    close
1756
        ret
1757
.pluginok:
1758
; save current directory and set root directory of hPlugin
1759
        mov     edi, eax        ; save handle
1760
        mov     esi, execdata
1761
@@:
1762
        lodsb
1763
        test    al, al
1764
        jnz     @b
1765
        sub     esi, execdata-9
1766
; allocate esi bytes in buffer 'parents'
8960 IgorA 1767
        mov     ecx, [ebp + PanelData.parents_sz]
589 diamond 1768
        add     ecx, esi
8960 IgorA 1769
        cmp     ecx, [ebp + PanelData.parents_alloc]
589 diamond 1770
        jbe     .enter.norealloc
1771
        push    edx
8960 IgorA 1772
        mov     edx, [ebp + PanelData.parents]
589 diamond 1773
        call    xpgrealloc
1774
        pop     edx
1775
        test    eax, eax
1776
        jnz     @f
1777
        push    edi
1778
        call    [edx+PluginInfo.ClosePlugin]
1779
        ret
1780
@@:
8960 IgorA 1781
        mov     [ebp + PanelData.parents], eax
589 diamond 1782
.enter.norealloc:
8960 IgorA 1783
        mov     [ebp + PanelData.parents_sz], ecx
589 diamond 1784
; save current state to the end of buffer
1785
        sub     ecx, esi
8960 IgorA 1786
        add     ecx, [ebp + PanelData.parents]
1787
        xchg    edx, [ebp + PanelData.hPlugin]
589 diamond 1788
        mov     [ecx], edx
8960 IgorA 1789
        xchg    edi, [ebp + PanelData.hFile]
589 diamond 1790
        mov     [ecx+4], edi
1791
        mov     byte [ecx+8], 0
1792
        lea     edi, [ecx+9]
1793
        lea     ecx, [esi-9]
1794
        mov     esi, execdata
1795
        rep     movsb
8960 IgorA 1796
        mov     word [ebp + PanelData.dir], '/'
1797
        mov     eax, [ebp + PanelData.hPlugin]
1798
        lea     ebx, [ebp + PanelData.plugin_flags] ;plugin_info
589 diamond 1799
        and     dword [ebx], 0
1800
        push    ebp
1801
        push    ebx
8960 IgorA 1802
        push    [ebp + PanelData.hFile]
589 diamond 1803
        call    [eax+PluginInfo.GetOpenPluginInfo]
1804
        pop     ebp
1805
        call    get_curfile_folder_entry
1806
        mov     esi, ecx
1807
        mov     edi, left_dotdot_entry
8960 IgorA 1808
        cmp     ebp, panel1
589 diamond 1809
        jz      @f
1810
        add     edi, right_dotdot_entry-left_dotdot_entry
1811
@@:
1812
        mov     ecx, 10
1813
        rep     movsd
1814
        mov     byte [edi-40], 10h      ; attributes: folder
1815
        mov     eax, '..'
1816
        stosd
1817
        jmp     .reread
1818
.plugdone:
1819
        push    esi
1820
        call    close
1821
.noplugins:
1822
; run program or association
1823
        call    get_curfile_folder_entry
283 diamond 1824
        call    find_extension
1825
        jc      .run_app
180 heavyiron 1826
.run_association:
474 diamond 1827
        cmp     byte [edi], 0
1828
        jz      .l1
1829
        cmp     byte [edi], ';'
1830
        jnz     @f
1831
.l1:
1832
        ret
1833
@@:
1834
        mov     esi, edi
1835
@@:
1836
        lodsb
1837
        test    al, al
1838
        jz      @f
1839
        cmp     al, ';'
1840
        jnz     @b
1841
        dec     esi
1842
        mov     byte [esi], 0
1843
        mov     [restore_semicolon], esi
1844
@@:
283 diamond 1845
.run_association2:
180 heavyiron 1846
        mov     [execparams], execdata
474 diamond 1847
        mov     [execptr], edi
180 heavyiron 1848
        jmp     .dorun
1849
.run_app:
1850
        mov     [execptr], execdata
1851
        and     [execparams], 0
1852
.dorun:
8960 IgorA 1853
        lea     esi, [ebp + PanelData.dir]
814 diamond 1854
        mov     edi, execdata
1855
@@:
1856
        lodsb
1857
        test    al, al
1858
        jz      @f
1859
        stosb
1860
        cmp     edi, execdataend-1
1861
        jae     .bigfilename
1862
        jmp     @b
1863
@@:
1864
        lea     esi, [ecx+40]
1865
        mov     al, '/'
1866
        stosb
1867
@@:
1868
        lodsb
1869
        stosb
1870
        cmp     edi, execdataend
1871
        ja      .bigfilename
1872
        test    al, al
1873
        jnz     @b
283 diamond 1874
; for fasm call - special handling, because
1875
; 1) fasm command line convention is different : fasm infile,outfile[,path] rather than tinypad infile
1876
; 2) fasm will probably create new file in directory, so we want to reload panel data
1877
        xor     edx, edx
1878
        cmp     [execparams], edx
1879
        jz      .nofasm
474 diamond 1880
        mov     esi, [execptr]
1881
@@:
1882
        lodsb
1883
        test    al, al
1884
        jnz     @b
1885
        mov     eax, [esi-5]
1886
        or      eax, 0x20202020
1887
        cmp     eax, 'fasm'
283 diamond 1888
        jnz     .nofasm
321 diamond 1889
        cmp     edi, execdata+(execdataend-execdata)/2
1890
        ja      .bigfilename
283 diamond 1891
        mov     esi, execdata
1892
@@:
1893
        lodsb
1894
        stosb
1895
        test    al, al
1896
        jnz     @b
1897
        mov     byte [esi-1], ','
1898
        inc     edx
1899
; output file: no extension if input file has extension, '.bin' otherwise
1900
        push    edi
1901
@@:
1902
        dec     edi
1903
        cmp     byte [edi], '.'
1904
        jz      .ptfound
1905
        cmp     byte [edi], '/'
1906
        jnz     @b
1907
        pop     edi
321 diamond 1908
        cmp     edi, execdataend-4
1909
        ja      .bigfilename
283 diamond 1910
        mov     dword [edi-1], '.bin'
1911
        mov     byte [edi+3], 0
1912
        jmp     .nofasm
1913
.ptfound:
1914
        mov     byte [edi], 0
1915
        pop     edi
1916
.nofasm:
321 diamond 1917
        mov     ebx, execinfo
1918
; if command line is more than 256 symbols, the kernel will truncate it
517 diamond 1919
; we do not want this!
321 diamond 1920
; N.B. We know that command line is either NULL or execdata, which is always ASCIIZ string,
1921
;      but can be up to 1023 symbols
1922
        mov     esi, [ebx+8]
1923
        test    esi, esi
1924
        jz      .cmdlinelenok
1925
@@:
1926
        lodsb
1927
        test    al, al
1928
        jnz     @b
1929
        sub     esi, [ebx+8]
1930
        dec     esi
1931
        cmp     esi, 256
1932
        ja      .bigcmdline
1933
.cmdlinelenok:
8932 IgorA 1934
        push    SF_FILE
180 heavyiron 1935
        pop     eax
517 diamond 1936
        int     40h
474 diamond 1937
        xor     esi, esi
1938
        xchg    esi, [restore_semicolon]
1939
        test    esi, esi
1940
        jz      @f
1941
        mov     byte [esi], ';'
1942
@@:
321 diamond 1943
        neg     eax
1944
        js      @f
1945
        call    get_error_msg
1946
        push    eax
474 diamond 1947
        push    dword aRunError
321 diamond 1948
        mov     eax, esp
517 diamond 1949
        push    ContinueBtn
321 diamond 1950
        push    1
1951
        push    eax
1952
        push    2
1953
        call    SayErr
517 diamond 1954
        pop     eax
1955
        pop     eax
321 diamond 1956
        ret
1957
@@:
283 diamond 1958
        test    edx, edx
1959
        jz      @f
8932 IgorA 1960
        push    SF_SLEEP
283 diamond 1961
        pop     eax
1962
        push    20
1963
        pop     ebx
517 diamond 1964
        int     0x40
283 diamond 1965
        jmp     .ctrl_r
1966
@@:
180 heavyiron 1967
        ret
321 diamond 1968
.bigfilename3:
1969
        pop     esi
1970
.bigfilename2:
1971
        pop     esi
1972
.bigfilename:
1973
        mov     eax, aFileNameTooBig
474 diamond 1974
.l2:
1975
        xor     esi, esi
1976
        xchg    esi, [restore_semicolon]
1977
        test    esi, esi
1978
        jz      @f
1979
        mov     byte [esi], ';'
321 diamond 1980
@@:
1981
        push    eax
1982
        mov     eax, esp
517 diamond 1983
        push    ContinueBtn
321 diamond 1984
        push    1
1985
        push    eax
1986
        push    1
1987
        call    SayErr
517 diamond 1988
        pop     eax
321 diamond 1989
        ret
1990
.bigcmdline:
1991
        mov     eax, aCmdLineTooBig
474 diamond 1992
        jmp     .l2
321 diamond 1993
.bigfoldername2:
589 diamond 1994
        mov     esi, prev_dir
8960 IgorA 1995
        lea     edi, [ebp + PanelData.dir]
589 diamond 1996
@@:
1997
        lodsb
1998
        stosb
1999
        test    al, al
2000
        jnz     @b
321 diamond 2001
.bigfoldername:
2002
        mov     eax, aFolderNameTooBig
474 diamond 2003
        jmp     .l2
180 heavyiron 2004
.enter_folder:
2005
        lea     esi, [ecx+40]
2006
        cmp     word [esi], '..'
2007
        jnz     @f
2008
        cmp     byte [esi+2], 0
2009
        jz      .dotdot
2010
@@:
314 diamond 2011
        push    esi
8960 IgorA 2012
        lea     esi, [ebp + PanelData.dir]
314 diamond 2013
        mov     edi, prev_dir
2014
@@:
2015
        lodsb
2016
        stosb
2017
        test    al, al
2018
        jnz     @b
2019
        lea     edi, [esi-1]
8960 IgorA 2020
        lea     edx, [ebp + PanelData.dir + 1024]
321 diamond 2021
        cmp     esi, edx
314 diamond 2022
        pop     esi
321 diamond 2023
        jae     .bigfoldername
180 heavyiron 2024
        mov     al, '/'
2025
        cmp     [edi-1], al
2026
        jz      @f
2027
        stosb
2028
@@:
2029
        lodsb
321 diamond 2030
        cmp     edi, edx
2031
        jae     .bigfoldername2
180 heavyiron 2032
        stosb
2033
        test    al, al
2034
        jnz     @b
8960 IgorA 2035
        mov     eax, [ebp + PanelData.hPlugin]
589 diamond 2036
        test    eax, eax
2037
        jz      .reread
2038
        push    ebp
8960 IgorA 2039
        lea     esi, [ebp + PanelData.dir]
589 diamond 2040
        push    esi
2041
        add     ecx, 40
2042
        push    ecx
8960 IgorA 2043
        push    [ebp + PanelData.hFile]
589 diamond 2044
        call    [eax+PluginInfo.SetFolder]
2045
        pop     ebp
2046
        test    al, al
2047
        jnz     .reread
2048
        mov     esi, prev_dir
8960 IgorA 2049
        lea     edi, [ebp + PanelData.dir]
589 diamond 2050
@@:
2051
        lodsb
2052
        stosb
2053
        test    al, al
2054
        jnz     @b
2055
.retd:
2056
        ret
180 heavyiron 2057
.reread:
2058
        call    read_folder
2059
.done_cmdbar:
2060
        call    draw_cmdbar
2061
        jmp     .done_redraw
2062
.dotdot:
8960 IgorA 2063
        lea     edi, [ebp + PanelData.dir]
589 diamond 2064
        cmp     word [edi], '/'
2065
        jnz     .dotdot_noroot
8960 IgorA 2066
        cmp     [ebp + PanelData.hPlugin], 0
589 diamond 2067
        jz      .retd
2068
        call    close_plugin_panel
2069
        jmp     .dotdot
2070
.dotdot_noroot:
2071
        mov     edx, edi
180 heavyiron 2072
        mov     al, 0
2073
        or      ecx, -1
2074
        repnz   scasb
2075
        dec     edi
2076
        mov     al, '/'
2077
        std
2078
        repnz   scasb
2079
        cld
2080
        inc     edi
589 diamond 2081
        cmp     edi, edx
2082
        jnz     @f
2083
        inc     edi
2084
@@:
2085
        push    dword [edi]
180 heavyiron 2086
        mov     byte [edi], 0
2087
        push    edi
8960 IgorA 2088
        mov     eax, [ebp + PanelData.hPlugin]
589 diamond 2089
        test    eax, eax
2090
        jz      .dotdot_native
2091
        push    ebp
8960 IgorA 2092
        lea     esi, [ebp + PanelData.dir]
589 diamond 2093
        push    esi
2094
        push    aDotDot
8960 IgorA 2095
        push    [ebp + PanelData.hFile]
589 diamond 2096
        call    [eax+PluginInfo.SetFolder]
2097
        pop     ebp
2098
        test    al, al
2099
        jnz     .dotdot_native
2100
        pop     edi
2101
        pop     dword [edi]
2102
        ret
2103
.dotdot_native:
180 heavyiron 2104
        call    read_folder
2105
        pop     edi
589 diamond 2106
        pop     dword [edi]
2107
        push    edi
2108
        cmp     byte [edi], '/'
2109
        jnz     @f
2110
        inc     edi
2111
@@:
8960 IgorA 2112
        mov     edx, [ebp + PanelData.files]
2113
        mov     ecx, [ebp + PanelData.numfiles]
180 heavyiron 2114
.scanloop:
2115
        mov     esi, [edx]
321 diamond 2116
        add     esi, 40
180 heavyiron 2117
        push    esi edi
2118
@@:
2119
        lodsb
2120
        call    match_symbol
2121
        jnz     @f
2122
        inc     edi
2123
        test    al, al
2124
        jnz     @b
2125
@@:
2126
        pop     edi esi
2127
        jz      .scanfound
2128
        add     edx, 4
2129
        loop    .scanloop
2130
        jmp     .scandone
2131
.scanfound:
8960 IgorA 2132
        sub     edx, [ebp + PanelData.files]
180 heavyiron 2133
        shr     edx, 2
8960 IgorA 2134
        mov     [ebp + PanelData.index], edx
2135
        sub     edx, [ebp + PanelData.colst]
180 heavyiron 2136
        jb      .scandone
2137
        inc     edx
8960 IgorA 2138
        mov     [ebp + PanelData.start], edx
180 heavyiron 2139
.scandone:
589 diamond 2140
        pop     edi
2141
        mov     byte [edi], 0
180 heavyiron 2142
        jmp     .done_cmdbar
2143
.ctrl_f39:
2144
        sub     al, 0x3D
2145
        add     al, al
8960 IgorA 2146
        mov     ah, [ebp + PanelData.sortmode]
180 heavyiron 2147
        and     ah, 0xFE
2148
        cmp     al, ah
2149
        jnz     @f
8960 IgorA 2150
        and     [ebp + PanelData.sortmode], 1
2151
        or      al, [ebp + PanelData.sortmode]
180 heavyiron 2152
        xor     al, 1
2153
@@:
8960 IgorA 2154
        mov     [ebp + PanelData.sortmode], al
2155
        mov     eax, [ebp + PanelData.index]
2156
        mov     ecx, [ebp + PanelData.files]
180 heavyiron 2157
        push    dword [ecx+eax*4]
2158
        push    ecx
2159
        call    sort_files
2160
        pop     edi
2161
        pop     eax
2162
        or      ecx, -1
2163
        repnz   scasd
2164
        not     ecx
2165
        dec     ecx
8960 IgorA 2166
        mov     [ebp + PanelData.index], ecx
2167
        sub     ecx, [ebp + PanelData.start]
180 heavyiron 2168
        jb      .less_start
8960 IgorA 2169
        sub     ecx, [ebp + PanelData.colst]
180 heavyiron 2170
        jae     .gr_end
2171
@@:     jmp     .done_redraw
2172
.less_start:
8960 IgorA 2173
        add     [ebp + PanelData.start], ecx
180 heavyiron 2174
        jmp     @b
2175
.gr_end:
2176
        inc     ecx
8960 IgorA 2177
        add     [ebp + PanelData.start], ecx
180 heavyiron 2178
        jmp     @b
2179
.alt_f12:
8960 IgorA 2180
        mov     ebp, panel1
180 heavyiron 2181
        cmp     al, 0x3B
2182
        jz      @f
8960 IgorA 2183
        mov     ebp, panel2
180 heavyiron 2184
@@:
2185
; get drives list
2186
        mov     ebx, dirinfo
2187
        mov     [ebx+dirinfo.size-dirinfo], 1
2188
        mov     [ebx+dirinfo.dirdata-dirinfo], driveinfo
2189
        mov     [ebx+dirinfo.name-dirinfo], tmpname
2190
        mov     byte [tmpname], '/'
474 diamond 2191
        xor     edx, edx
180 heavyiron 2192
        xor     ecx, ecx
2193
.drive_loop_e:
2194
        mov     byte [tmpname+1], 0
8932 IgorA 2195
        push    SF_FILE
180 heavyiron 2196
        pop     eax
517 diamond 2197
        int     40h
180 heavyiron 2198
        mov     ebx, dirinfo
2199
        test    eax, eax
2200
        jnz     .drive_loop_e_done
2201
        mov     esi, driveinfo+32+40
2202
        mov     edi, tmpname+1
2203
@@:
2204
        lodsb
2205
        stosb
2206
        test    al, al
2207
        jnz     @b
2208
        push    [ebx+dirinfo.first-dirinfo]
2209
        and     [ebx+dirinfo.first-dirinfo], 0
2210
.drive_loop_i:
8932 IgorA 2211
        push    SF_FILE
180 heavyiron 2212
        pop     eax
517 diamond 2213
        int     40h
180 heavyiron 2214
        mov     ebx, dirinfo
2215
        test    eax, eax
2216
        jnz     .drive_loop_i_done
474 diamond 2217
        add     ecx, 32+8
2218
        push    ecx
2219
        and     ecx, 0xFFF
2220
        cmp     ecx, 32+8
2221
        pop     ecx
2222
        ja      @f
2223
        call    xpgrealloc
2224
        mov     edx, eax
180 heavyiron 2225
        test    eax, eax
474 diamond 2226
        jnz     @f
2227
        pop     eax
2228
        ret
180 heavyiron 2229
@@:
474 diamond 2230
        lea     edi, [edx+ecx-32]
180 heavyiron 2231
        mov     esi, tmpname
2232
@@:
2233
        lodsb
2234
        test    al, al
2235
        jz      @f
2236
        stosb
2237
        jmp     @b
2238
@@:
2239
        mov     esi, driveinfo+32+40
2240
        mov     al, '/'
2241
        stosb
2242
@@:
2243
        lodsb
2244
        stosb
2245
        test    al, al
2246
        jnz     @b
2247
        inc     [ebx+dirinfo.first-dirinfo]
2248
        jmp     .drive_loop_i
2249
.drive_loop_i_done:
2250
        pop     [ebx+dirinfo.first-dirinfo]
2251
        inc     [ebx+dirinfo.first-dirinfo]
2252
        jmp     .drive_loop_e
2253
.drive_loop_e_done:
2254
        and     [ebx+dirinfo.first-dirinfo], 0
474 diamond 2255
        mov     edi, edx
2256
        xor     esi, esi
2257
        add     ecx, edx
2258
@@:
2259
        and     dword [edi], 0
2260
        mov     dword [edi+4], esi
2261
        mov     esi, edi
2262
        add     edi, 32+8
2263
        cmp     edi, ecx
2264
        jae     @f
2265
        mov     [esi], edi
2266
        jmp     @b
2267
@@:
2268
        mov     ecx, edx
8960 IgorA 2269
        lea     edi, [ebp + PanelData.dir]
2270
        cmp     [ebp + PanelData.hPlugin], 0
589 diamond 2271
        jz      .find_cur_drive_loop
8960 IgorA 2272
        mov     edi, [ebp + PanelData.parents]
589 diamond 2273
        add     edi, 8
180 heavyiron 2274
.find_cur_drive_loop:
2275
        push    edi
2276
        lea     esi, [ecx+8]
2277
@@:
2278
        lodsb
2279
        test    al, al
2280
        jz      .cur_drive_found
2281
        call    match_symbol
2282
        jnz     @f
2283
        inc     edi
2284
        jmp     @b
2285
@@:
474 diamond 2286
        cmp     dword [ecx], 0
180 heavyiron 2287
        jz      @f
2288
        pop     edi
474 diamond 2289
        mov     ecx, [ecx]
180 heavyiron 2290
        jmp     .find_cur_drive_loop
2291
@@:
474 diamond 2292
        mov     ecx, edx
180 heavyiron 2293
.cur_drive_found:
2294
        pop     edi
2295
        push    1
2296
        push    aDrive
2297
        push    ecx
8960 IgorA 2298
        mov     eax, [ebp + PanelData.height]
180 heavyiron 2299
        sub     eax, 2
2300
        jae     @f
2301
        add     eax, 2
2302
@@:
2303
        push    eax
8960 IgorA 2304
        push    [ebp + PanelData.width]
2305
        push    [ebp + PanelData.top]
2306
        push    [ebp + PanelData.left]
180 heavyiron 2307
        call    menu_centered_in
2308
        cmp     eax, -1
589 diamond 2309
        jnz     @f
2310
        mov     ecx, edx
2311
        call    pgfree
2312
        ret
2313
@@:
2314
        push    eax
644 diamond 2315
        push    edx
589 diamond 2316
        call    close_plugin_panels
644 diamond 2317
        pop     edx
8960 IgorA 2318
        lea     edi, [ebp + PanelData.dir]
589 diamond 2319
        push    edi
314 diamond 2320
        mov     esi, edi
2321
        mov     edi, prev_dir
2322
        mov     ecx, 1024/4
2323
        rep     movsd
589 diamond 2324
        pop     edi
2325
        pop     esi
2326
        add     esi, 8
180 heavyiron 2327
@@:
2328
        lodsb
2329
        stosb
2330
        test    al, al
2331
        jnz     @b
474 diamond 2332
        mov     ecx, edx
2333
        call    pgfree
180 heavyiron 2334
        call    read_folder
2335
        jmp     .done_redraw
283 diamond 2336
.shift_f5:
589 diamond 2337
; todo: copy to plugin panel
8960 IgorA 2338
        cmp     [ebp + PanelData.hPlugin], 0
589 diamond 2339
        jz      @f
2340
        ret
2341
@@:
517 diamond 2342
        mov     esi, ebp
8960 IgorA 2343
        cmp     [ebp + PanelData.selected_num], 0
517 diamond 2344
        jnz     .f5_2
283 diamond 2345
        call    get_curfile_folder_entry
2346
        lea     esi, [ecx+40]
2347
        mov     edi, CopyDestEditBuf
2348
        mov     eax, CopyDestEditBuf.length
2349
        stosd
2350
        scasd
2351
        xor     eax, eax
2352
        stosd
2353
        mov     edx, edi
2354
@@:
2355
        lodsb
2356
        test    al, al
2357
        jz      .f5_common
2358
        stosb
2359
        jmp     @b
2360
.f5:
589 diamond 2361
; todo: copy to plugin panel
517 diamond 2362
        mov     esi, ebp
8960 IgorA 2363
        xor     esi, panel1 xor panel2
2364
        cmp     [esi + PanelData.hPlugin], 0
589 diamond 2365
        jz      .f5_2
2366
        ret
517 diamond 2367
.f5_2:
8960 IgorA 2368
        add     esi, PanelData.dir
283 diamond 2369
        mov     edi, CopyDestEditBuf
2370
        mov     eax, CopyDestEditBuf.length
2371
        stosd
2372
        scasd
2373
        xor     eax, eax
2374
        stosd
2375
        mov     edx, edi
2376
@@:
2377
        lodsb
2378
        test    al, al
2379
        jz      @f
321 diamond 2380
        cmp     edi, CopyDestEditBuf+12+511
2381
        jae     .bigfoldername
283 diamond 2382
        stosb
2383
        jmp     @b
2384
@@:
2385
        mov     al, '/'
2386
        stosb
2387
.f5_common:
8960 IgorA 2388
        mov     eax, [ebp + PanelData.hPlugin]
814 diamond 2389
        mov     [source_hModule], eax
8960 IgorA 2390
        mov     eax, [ebp + PanelData.hFile]
814 diamond 2391
        mov     [source_hPlugin], eax
2392
        mov     eax, left_dotdot_entry
8960 IgorA 2393
        cmp     ebp, panel1
814 diamond 2394
        jz      @f
2395
        add     eax, right_dotdot_entry-left_dotdot_entry
2396
@@:
2397
        mov     [default_attr], eax
283 diamond 2398
        mov     byte [edi], 0
2399
        sub     edi, edx
2400
        mov     [edx-8], edi
2401
        mov     edi, CopySourceTextBuf
2402
        mov     esi, aCopy1
2403
@@:
2404
        lodsb
2405
        test    al, al
2406
        jz      @f
2407
        stosb
2408
        jmp     @b
2409
@@:
8960 IgorA 2410
        mov     eax, [ebp + PanelData.selected_num]
517 diamond 2411
        test    eax, eax
2412
        jz      .f5_noselected1
2413
        mov     ebx, eax
2414
        push    10
2415
        pop     ecx
2416
        push    -'0'
2417
@@:
2418
        xor     edx, edx
2419
        div     ecx
2420
        push    edx
2421
        test    eax, eax
2422
        jnz     @b
2423
@@:
2424
        pop     eax
2425
        add     al, '0'
2426
        jz      @f
2427
        stosb
2428
        jmp     @b
2429
@@:
2430
if lang eq ru
2431
        mov     dword [edi], ' эле'
2432
        mov     dword [edi+4], 'мент'
2433
        add     edi, 8
2434
        cmp     ebx, 1
2435
        jz      @f
2436
        mov     al, 'а'
2437
        stosb
2438
        cmp     ebx, 4
2439
        jbe     @f
2440
        mov     word [edi-1], 'ов'
2441
        inc     edi
2442
@@:
2443
else
2444
        mov     dword [edi], ' ite'
2445
        mov     byte [edi+4], 'm'
2446
        add     edi, 5
2447
        cmp     ebx, 1
2448
        jz      @f
2449
        mov     al, 's'
2450
        stosb
2451
@@:
2452
end if
2453
        jmp     .f5_selected1
2454
.f5_noselected1:
2455
        mov     al, '"'
2456
        stosb
283 diamond 2457
        call    get_curfile_folder_entry
2458
        lea     esi, [ecx+40]
2459
        lea     eax, [esi+1]
2460
@@:
2461
        inc     esi
2462
        cmp     byte [esi-1], 0
2463
        jnz     @b
2464
        sub     esi, eax
2465
        xchg    eax, esi
2466
        dec     esi
2467
        mov     edx, [cur_width]
2468
        sub     edx, 50
2469
        sub     eax, edx
2470
        jbe     @f
2471
        add     esi, eax
2472
        mov     al, '.'
2473
        stosb
2474
        stosb
2475
        stosb
2476
@@:
2477
        lodsb
2478
        test    al, al
2479
        jz      @f
2480
        stosb
2481
        jmp     @b
2482
@@:
517 diamond 2483
        mov     al, '"'
2484
        stosb
2485
.f5_selected1:
283 diamond 2486
        mov     esi, aCopy2
2487
@@:
2488
        lodsb
2489
        stosb
2490
        test    al, al
2491
        jnz     @b
2492
        mov     ebx, copy_dlgdata
2493
        mov     eax, [cur_width]
2494
        sub     eax, 12
2495
        mov     [ebx + dlgtemplate.width], eax
2496
        dec     eax
2497
        dec     eax
2498
        mov     [ebx - copy_dlgdata + copy_dlgdata.width2], eax
2499
        mov     [ebx - copy_dlgdata + copy_dlgdata.width3], eax
2500
        shr     eax, 1
2501
        dec     eax
2502
        dec     eax
2503
        mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x2], eax
2504
        sub     eax, aCopyLength-1
2505
        mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x1], eax
2506
        add     eax, aCopyLength+3
2507
        mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x1], eax
2508
        add     eax, aCancelBLength - 1
2509
        mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x2], eax
2510
        mov     byte [ebx - copy_dlgdata + copy_dlgdata.flags0], 0xC
2511
        and     byte [ebx - copy_dlgdata + copy_dlgdata.flags1], not 4
2512
        and     byte [ebx - copy_dlgdata + copy_dlgdata.flags2], not 4
2513
        push    ebx
2514
        call    DialogBox
2515
        cmp     eax, copy_dlgdata.copy_btn
2516
        jnz     .ret2
2517
; Копируем
2518
        mov     esi, CopyDestEditBuf+12
2519
        mov     edi, esi
2520
        xor     eax, eax
2521
        or      ecx, -1
2522
        repnz   scasb
2523
        dec     edi
2524
        dec     edi
2525
        cmp     edi, esi
2526
        jb      .ret2
517 diamond 2527
        mov     [bEndSlash], 0
283 diamond 2528
        cmp     byte [edi], '/'
2529
        jnz     @f
2530
        cmp     edi, esi
2531
        jz      @f
2532
        mov     byte [edi], 0
2533
        dec     edi
517 diamond 2534
        mov     [bEndSlash], 1
283 diamond 2535
@@:
2536
; Если путь не начинается со слэша, считаем его относительно текущей папки
2537
        cmp     byte [esi], '/'
2538
        jz      .copy_absolute_path
2539
        push    esi
2540
        push    edi
8960 IgorA 2541
        lea     edi, [ebp + PanelData.dir]
283 diamond 2542
        or      ecx, -1
2543
        xor     eax, eax
2544
        repnz   scasb
2545
        not     ecx
2546
        pop     edi
321 diamond 2547
        push    edi
2548
        add     edi, ecx
2549
        cmp     edi, CopyDestEditBuf+12+513
2550
        pop     edi
2551
        jb      @f
2552
        pop     esi
2553
        jmp     .bigfilename
2554
@@:
283 diamond 2555
        lea     edx, [edi+2]
2556
        sub     edx, esi
2557
        lea     edi, [edi+ecx+1]
2558
        xchg    ecx, edx
2559
        std
2560
        lea     esi, [esi+ecx-1]
2561
        rep     movsb
2562
        cld
2563
        pop     edi
8960 IgorA 2564
        lea     esi, [ebp + PanelData.dir]
283 diamond 2565
        push    edi
2566
        mov     ecx, edx
2567
        rep     movsb
2568
        mov     byte [edi-1], '/'
2569
        pop     esi
2570
.copy_absolute_path:
517 diamond 2571
; Сначала создаём все вышележащие папки, которые ещё не существуют
2572
; Последний из элементов может быть как файлом, так и папкой;
2573
; форсируем папку в случае, если хотя бы один из источников является папкой
2574
        xor     edx, edx
8960 IgorA 2575
        cmp     [ebp + PanelData.selected_num], 0
517 diamond 2576
        jz      .f5_noselected2
8960 IgorA 2577
        mov     ecx, [ebp + PanelData.numfiles]
2578
        mov     edi, [ebp + PanelData.files]
517 diamond 2579
.scanselected2:
2580
        mov     eax, [edi]
2581
        add     edi, 4
2582
        test    byte [eax+303], 1
2583
        jz      @f
2584
        test    byte [eax], 10h
2585
        jz      @f
2586
        inc     edx
2587
@@:
2588
        loop    .scanselected2
2589
        jmp     .f5_selected2
2590
.f5_noselected2:
2591
        call    get_curfile_folder_entry
2592
        test    byte [ecx], 10h
2593
        setnz   dl
2594
.f5_selected2:
283 diamond 2595
        xor     eax, eax
2596
        mov     edi, esi
2597
.countslashloop:
2598
        cmp     byte [edi], '/'
2599
        jnz     @f
2600
        inc     eax
517 diamond 2601
        mov     ecx, edi
283 diamond 2602
@@:
2603
        inc     edi
2604
        cmp     byte [edi], 0
2605
        jnz     .countslashloop
517 diamond 2606
        mov     [bNeedRestoreName], 0
2607
; "/file-system/partition" folders already exist, so we don't need to create them
283 diamond 2608
        cmp     eax, 2
517 diamond 2609
        jbe     .createupdone
2610
; we interpret destination as folder if edx!=0 or bEndSlash!=0
2611
        test    edx, edx
2612
        jnz     @f
2613
        cmp     [bEndSlash], 0
2614
        jnz     @f
2615
        mov     edi, ecx
2616
        dec     eax
283 diamond 2617
@@:
517 diamond 2618
        mov     [attrinfo.name], esi
2619
        mov     ecx, eax
2620
; ищем последнюю папку, которая ещё существует
2621
.createuploop1:
2622
        cmp     eax, 2
2623
        jbe     .createupdone1
2624
        mov     dl, [edi]
2625
        mov     byte [edi], 0
2626
        push    eax
8932 IgorA 2627
        push    SF_FILE
283 diamond 2628
        pop     eax
517 diamond 2629
        mov     ebx, attrinfo
2630
        int     0x40
321 diamond 2631
        test    eax, eax
517 diamond 2632
        pop     eax
522 diamond 2633
        mov     byte [edi], dl
517 diamond 2634
        jnz     .createupcont1
2635
        test    byte [attrinfo.attr], 10h
2636
        jnz     .createupdone1
2637
; the item required to be a folder, but is file
2638
        push    aNotFolder
321 diamond 2639
        push    esi
517 diamond 2640
        mov     eax, esp
2641
        push    ContinueBtn
2642
        push    1
321 diamond 2643
        push    eax
2644
        push    2
2645
        call    SayErr
283 diamond 2646
        pop     eax
517 diamond 2647
        pop     eax
2648
.ret3:
2649
        ret
2650
.createupcont1:
2651
        dec     eax
2652
@@:
2653
        dec     edi
2654
        cmp     byte [edi], '/'
2655
        jnz     @b
2656
        jmp     .createuploop1
2657
.createupdone1:
2658
; создаём все папки, которые нам нужны
2659
        cmp     eax, ecx
2660
        jae     .createupdone
2661
@@:
2662
        inc     edi
2663
        cmp     byte [edi], 0
2664
        jz      @f
2665
        cmp     byte [edi], '/'
2666
        jnz     @b
2667
@@:
2668
        mov     dl, byte [edi]
2669
        mov     byte [edi], 0
321 diamond 2670
        push    eax
517 diamond 2671
        push    RetryOrCancelBtn
321 diamond 2672
        push    2
517 diamond 2673
        call    makedir
522 diamond 2674
        mov     byte [edi], dl
517 diamond 2675
        mov     [bNeedRestoreName], 1
2676
        pop     eax
2677
        jnz     .ret3
2678
        inc     eax
2679
        jmp     .createupdone1
2680
.createupdone:
2681
        mov     dl, 1
2682
        cmp     byte [edi], 1
2683
        sbb     eax, -1
2684
        cmp     eax, 2
2685
        jbe     .docopy
2686
        mov     [attrinfo.attr], 0      ; assume zero attributes if error
8932 IgorA 2687
        push    SF_FILE
517 diamond 2688
        pop     eax
2689
        mov     ebx, attrinfo
2690
        int     0x40
2691
        test    [attrinfo.attr], 10h
2692
        setnz   dl
2693
.docopy:
2694
        call    get_curfile_folder_entry
2695
        mov     eax, ecx
2696
        cmp     [bNeedRestoreName], 0
2697
        jz      @f
2698
        cmp     [bEndSlash], 0
2699
        jnz     @f
8960 IgorA 2700
        cmp     [ebp + PanelData.selected_num], 0
517 diamond 2701
        jnz     @f
2702
        test    byte [eax], 10h
2703
        jz      @f
2704
        mov     dl, 0
2705
@@:
2706
; начинаем собственно копирование
2707
        mov     [bDestIsFolder], dl
2708
        mov     [copy_bSkipAll], 0
2709
        mov     [copy_bSkipAll2], 0
589 diamond 2710
        mov     [copy_bSkipAll3], 0
8960 IgorA 2711
        test    [ebp + PanelData.plugin_flags], 2
589 diamond 2712
        jnz     .copy_GetFiles
8960 IgorA 2713
        cmp     [ebp + PanelData.selected_num], 0
517 diamond 2714
        jnz     .f5_selected3
2715
        call    copy_file
283 diamond 2716
.copydone:
2717
        push    ebp
2718
        call    .ctrl_r
2719
        pop     ebp
8960 IgorA 2720
        xor     ebp, panel1 xor panel2
283 diamond 2721
        jmp     .ctrl_r
517 diamond 2722
.f5_selected3:
8960 IgorA 2723
        mov     ecx, [ebp + PanelData.numfiles]
2724
        mov     esi, [ebp + PanelData.files]
517 diamond 2725
.f5_selected_copyloop:
2726
        lodsd
2727
        test    byte [eax+303], 1
2728
        jz      .f5_selected_copycont
2729
        mov     [bDestIsFolder], dl
2730
        call    copy_file
2731
        ja      .f5_multiple_cancel
2732
        and     byte [eax+303], not 1
2733
        pushad
2734
        call    draw_panel
2735
        cmp     [bNeedRestoreName], 0
321 diamond 2736
        jz      @f
517 diamond 2737
        mov     esi, CopyDestEditBuf+12
2738
        call    delete_last_name_from_end
321 diamond 2739
@@:
517 diamond 2740
        popad
2741
.f5_selected_copycont:
2742
        loop    .f5_selected_copyloop
2743
.f5_multiple_cancel:
321 diamond 2744
        jmp     .copydone
589 diamond 2745
.copy_GetFiles:
8960 IgorA 2746
        mov     ecx, [ebp + PanelData.selected_num]
589 diamond 2747
        cmp     ecx, 1
2748
        adc     ecx, 0
2749
        shl     ecx, 2
2750
        call    xpgalloc
2751
        test    eax, eax
2752
        jnz     @f
2753
        ret
2754
@@:
2755
        push    ebp eax ; save
2756
        push    copy_AddDir     ; adddir
2757
        push    copy_AddFile    ; addfile
2758
        push    eax             ; items
2759
        shr     ecx, 2
2760
        push    ecx             ; NumItems
8960 IgorA 2761
        push    [ebp + PanelData.hFile]
589 diamond 2762
        mov     edi, eax
2763
        call    get_curfile_folder_entry
2764
        mov     [edi], ecx
8960 IgorA 2765
        cmp     [ebp + PanelData.selected_num], 0
589 diamond 2766
        jz      .cgf1
8960 IgorA 2767
        mov     esi, [ebp + PanelData.files]
2768
        mov     ecx, [ebp + PanelData.numfiles]
589 diamond 2769
.cgf0:
2770
        lodsd
2771
        test    byte [eax+303], 1
2772
        jz      @f
2773
        stosd
2774
@@:
2775
        loop    .cgf0
2776
.cgf1:
8960 IgorA 2777
        mov     eax, [ebp + PanelData.hPlugin]
589 diamond 2778
        call    [eax+PluginInfo.GetFiles]
2779
        pop     ecx ebp
2780
        call    pgfree
2781
        jmp     .copydone
283 diamond 2782
 
180 heavyiron 2783
.f3:
8960 IgorA 2784
        mov     eax, [ebp + PanelData.files]
997 diamond 2785
        mov     ecx, [eax+ecx*4]
2786
        test    byte [ecx], 10h
2787
        jnz     .ret2
8960 IgorA 2788
        lea     esi, [ebp + PanelData.dir]
997 diamond 2789
        xor     eax, eax
180 heavyiron 2790
        call    view_file
2791
.ret2:
2792
        ret
814 diamond 2793
.f4:
2794
        call    edit_file
2795
        ret
474 diamond 2796
.f8_has_selected:
2797
        mov     edi, saved_file_name+511
2798
        mov     byte [edi], 0
8960 IgorA 2799
        mov     eax, [ebp + PanelData.selected_num]
474 diamond 2800
if lang eq ru
2801
        cmp     eax, 1
2802
        jz      @f
2803
        dec     edi
2804
        mov     byte [edi], 'а'
2805
        cmp     eax, 4
2806
        jbe     @f
2807
        dec     edi
2808
        mov     word [edi], 'ов'
2809
@@:
2810
        mov     dword [edi-4], 'мент'
2811
        mov     dword [edi-8], ' эле'
2812
        sub     edi, 8
2813
else
2814
        cmp     eax, 1
2815
        jz      @f
2816
        dec     edi
2817
        mov     byte [edi], 's'
2818
@@:
2819
        mov     dword [edi-4], 'item'
2820
        mov     byte [edi-5], ' '
2821
        sub     edi, 5
2822
end if
2823
        xor     edx, edx
2824
        push    10
2825
        pop     ecx
2826
@@:
2827
        div     ecx
2828
        add     dl, '0'
2829
        dec     edi
2830
        mov     [edi], dl
2831
        xor     edx, edx
2832
        test    eax, eax
2833
        jnz     @b
2834
        push    edi
2835
        push    aConfirmDeleteText
2836
        mov     eax, esp
2837
        push    DeleteOrCancelBtn
2838
        push    2
2839
        push    eax
2840
        push    2
2841
        push    aDeleteCaption
2842
        call    Message
2843
        add     esp, 8
2844
        test    eax, eax
2845
        jnz     .ret2
2846
        mov     [del_bSkipAll], 0
8960 IgorA 2847
        mov     ecx, [ebp + PanelData.numfiles]
474 diamond 2848
        jecxz   .ret2
8960 IgorA 2849
        mov     esi, [ebp + PanelData.files]
474 diamond 2850
.f8_loop:
2851
        lodsd
2852
        test    byte [eax+303], 1
2853
        jz      @f
2854
        call    delete_file
2855
        ja      .f8_multiple_cancel
2856
@@:
2857
        loop    .f8_loop
2858
.f8_multiple_cancel:
522 diamond 2859
        jmp     .copydone
180 heavyiron 2860
.f8:
589 diamond 2861
; todo: delete files from plugin panel
8960 IgorA 2862
        cmp     [ebp + PanelData.hPlugin], 0
589 diamond 2863
        jz      @f
2864
        ret
2865
@@:
8960 IgorA 2866
        cmp     [ebp + PanelData.selected_num], 0
474 diamond 2867
        jnz     .f8_has_selected
183 diamond 2868
        call    get_curfile_folder_entry
814 diamond 2869
        cmp     word [ecx+40], '..'
2870
        jnz     @f
2871
        cmp     byte [ecx+42], 0
2872
        jz      .f8_not_allowed
2873
@@:
183 diamond 2874
        cmp     [bConfirmDelete], 0
2875
        jz      .f8_allowed
474 diamond 2876
        lea     eax, [ecx+40]
2877
        push    eax
183 diamond 2878
        mov     esi, aConfirmDeleteText
2879
        mov     edi, aConfirmDeleteTextBuf
474 diamond 2880
        push    edi
183 diamond 2881
@@:
2882
        lodsb
2883
        stosb
2884
        test    al, al
2885
        jnz     @b
2886
        dec     edi
2887
        mov     esi, aDeleteFolder
2888
        test    byte [ecx], 10h
2889
        jnz     @f
2890
        mov     esi, aDeleteFile
2891
@@:
2892
        lodsb
2893
        stosb
2894
        test    al, al
2895
        jnz     @b
321 diamond 2896
        mov     eax, esp
474 diamond 2897
        push    DeleteOrCancelBtn
321 diamond 2898
        push    2
2899
        push    eax
474 diamond 2900
        push    2
2901
        push    aDeleteCaption
2902
        call    Message
2903
        add     esp, 8
321 diamond 2904
        test    eax, eax
474 diamond 2905
        jz      .f8_allowed
814 diamond 2906
.f8_not_allowed:
474 diamond 2907
        ret
2908
.f8_allowed:
2909
        mov     [del_bSkipAll], 0
2910
        mov     eax, ecx
2911
        call    delete_file
522 diamond 2912
        jmp     .copydone
180 heavyiron 2913
.ctrl_r:
2914
; Rescan panel
2915
;       call    read_folder
2916
;       jmp     .done_redraw
8960 IgorA 2917
        mov     eax, [ebp + PanelData.index]
180 heavyiron 2918
        push    eax
183 diamond 2919
        call    get_curfile_name
283 diamond 2920
        mov     esi, ecx
180 heavyiron 2921
        mov     edi, saved_file_name
2922
@@:
2923
        lodsb
2924
        stosb
2925
        test    al, al
2926
        jnz     @b
997 diamond 2927
.ctrl_r.doread:
8960 IgorA 2928
        push    [ebp + PanelData.start]
180 heavyiron 2929
        call    read_folder
8960 IgorA 2930
        pop     [ebp + PanelData.start]
2931
        pop     [ebp + PanelData.index]
180 heavyiron 2932
        or      eax, -1
2933
@@:
2934
        inc     eax
8960 IgorA 2935
        cmp     eax, [ebp + PanelData.numfiles]
180 heavyiron 2936
        jae     .ctrl_r.notfound
8960 IgorA 2937
        mov     ecx, [ebp + PanelData.files]
321 diamond 2938
        mov     esi, [ecx+eax*4]
2939
        add     esi, 40
180 heavyiron 2940
        mov     edi, saved_file_name
2941
        call    strcmpi
2942
        jnz     @b
2943
.ctrl_r.found:
8960 IgorA 2944
        mov     [ebp + PanelData.index], eax
180 heavyiron 2945
.ctrl_r.notfound:
8960 IgorA 2946
        mov     eax, [ebp + PanelData.numfiles]
180 heavyiron 2947
        dec     eax
8960 IgorA 2948
        cmp     [ebp + PanelData.index], eax
180 heavyiron 2949
        jbe     @f
8960 IgorA 2950
        mov     [ebp + PanelData.index], eax
180 heavyiron 2951
@@:
8960 IgorA 2952
        mov     eax, [ebp + PanelData.index]
2953
        cmp     [ebp + PanelData.start], eax
180 heavyiron 2954
        jbe     @f
8960 IgorA 2955
        mov     [ebp + PanelData.start], eax
180 heavyiron 2956
@@:
2957
        inc     eax
8960 IgorA 2958
        sub     eax, [ebp + PanelData.colst]
180 heavyiron 2959
        jae     @f
2960
        xor     eax, eax
2961
@@:
8960 IgorA 2962
        cmp     [ebp + PanelData.start], eax
180 heavyiron 2963
        jae     @f
8960 IgorA 2964
        mov     [ebp + PanelData.start], eax
180 heavyiron 2965
@@:
8960 IgorA 2966
        mov     eax, [ebp + PanelData.numfiles]
2967
        sub     eax, [ebp + PanelData.colst]
180 heavyiron 2968
        jbe     @f
8960 IgorA 2969
        cmp     [ebp + PanelData.start], eax
180 heavyiron 2970
        jbe     @f
8960 IgorA 2971
        mov     [ebp + PanelData.start], eax
180 heavyiron 2972
@@:
2973
        jmp     .done_redraw
283 diamond 2974
.menu:
589 diamond 2975
; todo: context menu for plugin panel
8960 IgorA 2976
        cmp     [ebp + PanelData.hPlugin], 0
589 diamond 2977
        jz      @f
2978
        ret
2979
@@:
283 diamond 2980
; display context menu
2981
; ignore folders
2982
        call    get_curfile_folder_entry
2983
        test    byte [ecx], 10h
2984
        jz      @f
2985
.menuret:
2986
        ret
2987
@@:
2988
        call    find_extension
2989
        jc      .menuret
2990
; known extension
474 diamond 2991
@@:
2992
        cmp     byte [edi], 0
283 diamond 2993
        jz      .menuret
474 diamond 2994
        cmp     byte [edi], ';'
2995
        jz      @f
2996
        inc     edi
2997
        jmp     @b
2998
@@:
2999
        inc     edi
3000
@@:
3001
        inc     edi
3002
        cmp     byte [edi-1], ' '
3003
        jz      @b
3004
        cmp     byte [edi-1], 9
3005
        jz      @b
3006
        dec     edi
3007
        cmp     byte [edi], 0
3008
        jz      .menuret
283 diamond 3009
        mov     ecx, esi
3010
@@:
3011
        inc     ecx
3012
        cmp     byte [ecx-1], 0
3013
        jnz     @b
3014
        sub     ecx, esi        ; ecx = длина имени файла+1 = длина заголовка+1
3015
        cmp     ecx, 15
3016
        jb      @f
3017
        mov     cl, 15
3018
@@:
3019
        xor     edx, edx
474 diamond 3020
        xor     ebp, ebp
3021
        push    edx
283 diamond 3022
.menucreateloop:
474 diamond 3023
        mov     eax, edi
3024
        xor     ebx, ebx
283 diamond 3025
@@:
474 diamond 3026
        cmp     byte [edi], ','
3027
        jz      @f
3028
        cmp     byte [edi], bl
3029
        jz      @f
3030
        inc     edi
3031
        jmp     @b
3032
@@:
3033
        xchg    bl, [edi]
3034
        pushad
3035
        push    nullstr
3036
        push    1024
3037
        push    saved_file_name
3038
        push    eax
3039
        push    aMenu
3040
        push    app_path
3041
        call    [ini.get_str]
3042
        popad
3043
        mov     [edi], bl
3044
        mov     eax, saved_file_name
3045
@@:
3046
        cmp     byte [eax], 0
3047
        jz      .menucreatecont
3048
        cmp     byte [eax], ','
3049
        jz      @f
283 diamond 3050
        inc     eax
474 diamond 3051
        jmp     @b
3052
@@:
3053
        mov     byte [eax], 0
3054
        push    eax
3055
        sub     eax, saved_file_name-1
283 diamond 3056
        cmp     eax, ecx
3057
        ja      @f
3058
        mov     eax, ecx
3059
@@:
474 diamond 3060
        xchg    eax, [esp]
3061
        inc     eax
3062
        push    eax
3063
@@:
3064
        inc     eax
3065
        cmp     byte [eax-1], 0
3066
        jnz     @b
3067
        sub     eax, [esp]
3068
        add     [esp+4], eax
3069
        pop     eax eax
3070
        add     eax, 8
3071
        add     ebp, eax
3072
        push    ebp
3073
        and     ebp, 0xFFF
3074
        cmp     ebp, eax
3075
        pop     ebp
3076
        ja      @f
3077
        push    eax
3078
        xchg    edx, [esp+4]
3079
        push    ecx
3080
        mov     ecx, ebp
3081
        call    xpgrealloc
3082
        pop     ecx
3083
        pop     edx
3084
        xchg    edx, [esp]
283 diamond 3085
        test    eax, eax
474 diamond 3086
        xchg    eax, [esp]
283 diamond 3087
        jz      .menucreated
474 diamond 3088
@@:
3089
        neg     eax
3090
        add     eax, ebp
3091
        add     eax, [esp]
3092
        and     dword [eax], 0
3093
        and     dword [eax+4], 0
283 diamond 3094
        test    edx, edx
3095
        jz      @f
474 diamond 3096
        sub     eax, [esp]
283 diamond 3097
        mov     [edx], eax
474 diamond 3098
        add     eax, [esp]
3099
        sub     edx, [esp]
3100
        mov     [eax+4], edx
283 diamond 3101
@@:
3102
        mov     edx, eax
474 diamond 3103
        push    esi edi
3104
        mov     esi, saved_file_name
283 diamond 3105
        lea     edi, [eax+8]
3106
@@:
3107
        lodsb
3108
        stosb
3109
        test    al, al
3110
        jnz     @b
474 diamond 3111
        push    esi
3112
        sub     esi, saved_file_name
283 diamond 3113
        sub     esi, ecx
3114
        jae     .menunoadd
3115
        neg     esi
3116
@@:
3117
        mov     byte [edi-1], ' '
3118
        stosb
3119
        dec     esi
3120
        jnz     @b
3121
.menunoadd:
3122
        pop     esi
474 diamond 3123
@@:
3124
        lodsb
3125
        stosb
3126
        test    al, al
3127
        jnz     @b
3128
        pop     edi esi
3129
.menucreatecont:
3130
        inc     edi
3131
        cmp     byte [edi-1], ','
3132
        jz      .menucreateloop
283 diamond 3133
.menucreated:
3134
        test    edx, edx
474 diamond 3135
        jz      .menuret_free
283 diamond 3136
        and     dword [edx], 0
474 diamond 3137
        pop     edx
3138
        mov     ecx, edx
3139
        add     [ecx], edx
283 diamond 3140
@@:
474 diamond 3141
        mov     ecx, [ecx]
3142
        cmp     dword [ecx], 0
283 diamond 3143
        jz      @f
474 diamond 3144
        add     [ecx], edx
3145
        add     [ecx+4], edx
283 diamond 3146
        jmp     @b
3147
@@:
474 diamond 3148
        add     [ecx+4], edx
3149
        push    edx
283 diamond 3150
        push    1
3151
        push    esi
3152
        push    edx
3153
        call    menu
3154
        cmp     eax, -1
474 diamond 3155
        jz      .menuret_free
3156
        lea     edi, [eax+8]
283 diamond 3157
@@:
474 diamond 3158
        inc     edi
3159
        cmp     byte [edi-1], 0
3160
        jnz     @b
3161
        mov     ebp, [active_panel]
283 diamond 3162
        call    get_curfile_folder_entry
474 diamond 3163
        call    .run_association2
3164
.menuret_free:
3165
        pop     ecx
3166
        jmp     pgfree
321 diamond 3167
.f7:
3168
        mov     dword [CopyDestEditBuf], CopyDestEditBuf.length
3169
        and     dword [CopyDestEditBuf+4], 0
3170
        and     dword [CopyDestEditBuf+8], 0
3171
        mov     byte [CopyDestEditBuf+12], 0
3172
        mov     ebx, mkdir_dlgdata
3173
        mov     eax, [cur_width]
3174
        sub     eax, 12
3175
        mov     [ebx + dlgtemplate.width], eax
3176
        dec     eax
3177
        dec     eax
3178
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.width2], eax
3179
        shr     eax, 1
3180
        dec     eax
3181
        dec     eax
3182
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cont_x2], eax
3183
        sub     eax, a_ContinueLength-1
3184
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cont_x1], eax
3185
        add     eax, a_ContinueLength+3
3186
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cnl_x1], eax
3187
        add     eax, aCancelBLength - 1
3188
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cnl_x2], eax
3189
        mov     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags0], 0xC
3190
        and     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags1], not 4
3191
        and     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags2], not 4
3192
        push    ebx
3193
        call    DialogBox
3194
        cmp     eax, mkdir_dlgdata.cont_btn
3195
        jnz     .ret2
3196
        mov     esi, CopyDestEditBuf+12
3197
        cmp     byte [esi], 0
3198
        jz      .ret2
3199
        cmp     byte [esi], '/'
3200
        jz      .mkdir_absolute_path
3201
        push    esi
8960 IgorA 3202
        lea     edi, [ebp + PanelData.dir]
321 diamond 3203
        or      ecx, -1
3204
        xor     eax, eax
3205
        repnz   scasb
3206
        not     ecx
3207
        mov     edi, esi
3208
@@:
3209
        cmp     byte [edi+1], 0
3210
        jz      @f
3211
        inc     edi
3212
        jmp     @b
3213
@@:
3214
        push    edi
3215
        add     edi, ecx
3216
        cmp     edi, CopyDestEditBuf+12+513
3217
        pop     edi
3218
        jb      @f
3219
        pop     esi
3220
        jmp     .bigfilename
3221
@@:
3222
        lea     edx, [edi+2]
3223
        sub     edx, esi
3224
        lea     edi, [edi+ecx+1]
3225
        xchg    ecx, edx
3226
        std
3227
        lea     esi, [esi+ecx-1]
3228
        rep     movsb
3229
        cld
3230
        pop     edi
8960 IgorA 3231
        lea     esi, [ebp + PanelData.dir]
321 diamond 3232
        push    edi
3233
        mov     ecx, edx
3234
        rep     movsb
3235
        mov     byte [edi-1], '/'
3236
        pop     esi
3237
.mkdir_absolute_path:
517 diamond 3238
        push    RetryOrCancelBtn
321 diamond 3239
        push    2
517 diamond 3240
        call    makedir
321 diamond 3241
        jmp     .copydone
474 diamond 3242
.change_mode:
3243
        dec     eax
8960 IgorA 3244
        mov     [ebp + PanelData.colmode], eax
474 diamond 3245
        call    calc_colwidths
3246
        jmp     draw_panel
3247
.quick_jump:
3248
        dec     eax
3249
        cmp     al, 10
3250
        jnz     @f
3251
        xor     eax, eax
3252
@@:
3253
        mov     eax, [FolderShortcuts+eax*4]
3254
        test    eax, eax
3255
        jnz     @f
3256
        ret
3257
@@:
589 diamond 3258
        push    eax
3259
        call    close_plugin_panels
8960 IgorA 3260
        lea     esi, [ebp + PanelData.dir]
589 diamond 3261
        push    esi
474 diamond 3262
        mov     edi, prev_dir
3263
@@:
3264
        lodsb
3265
        stosb
3266
        test    al, al
3267
        jnz     @b
3268
        pop     edi esi
3269
@@:
3270
        lodsb
3271
        stosb
3272
        test    al, al
3273
        jnz     @b
3274
        jmp     .reread
3275
.greyplus:
3276
        push    0
3277
        mov     ecx, aSelect
3278
        jmp     @f
3279
.greyminus:
3280
        push    1
3281
        mov     ecx, aDeselect
3282
@@:
3283
        mov     eax, mark_dlgdata
3284
        mov     [eax+mark_dlgdata.title-mark_dlgdata], ecx
3285
        mov     [eax+mark_dlgdata.flags-mark_dlgdata], 0xC
3286
        mov     edi, enter_string_buf+12
3287
        mov     dword [edi-12], 512
3288
        mov     dword [edi-8], 1
3289
        and     dword [edi-4], 0
3290
        mov     word [edi], '*'
3291
        push    eax
3292
        call    DialogBox
3293
        inc     eax
3294
        jnz     @f
3295
.noselect:
3296
        pop     eax
3297
        ret
3298
@@:
3299
        xor     eax, eax
3300
        mov     esi, edi
3301
@@:
3302
        lodsb
3303
        mov     al, [tolower_table+eax]
3304
        mov     [esi-1], al
3305
        test    al, al
3306
        jnz     @b
3307
@@:
8960 IgorA 3308
        mov     ecx, [ebp + PanelData.numfiles]
3309
        mov     ebx, [ebp + PanelData.files]
474 diamond 3310
        jecxz   .noselect
3311
        mov     eax, [ebx]
3312
        cmp     word [eax+40], '..'
3313
        jnz     .selectloop
3314
        cmp     byte [eax+42], 0
3315
        jnz     .selectloop
3316
        dec     ecx
3317
        jz      .noselect
3318
        add     ebx, 4
3319
.selectloop:
3320
        xor     eax, eax
3321
        mov     esi, [ebx]
3322
        add     esi, 40
3323
        mov     edx, lower_file_name-1
3324
@@:
3325
        lodsb
3326
        inc     edx
3327
        mov     al, [tolower_table+eax]
3328
        mov     [edx], al
3329
        test    al, al
3330
        jnz     @b
3331
        mov     esi, lower_file_name
3332
        call    match_mask_rev_lowercase
3333
        jc      @f
3334
        mov     esi, [ebx]
3335
        mov     eax, [esi+32]
3336
        cmp     byte [esp], 0
3337
        jz      .doselect
3338
        test    byte [esi+303], 1
3339
        jz      @f
3340
        and     byte [esi+303], not 1
8960 IgorA 3341
        sub     dword [ebp + PanelData.selected_size], eax
474 diamond 3342
        mov     eax, [esi+36]
8960 IgorA 3343
        sbb     dword [ebp + PanelData.selected_size+4], eax
3344
        dec     dword [ebp + PanelData.selected_num]
474 diamond 3345
        jmp     @f
3346
.doselect:
3347
        test    byte [esi+303], 1
3348
        jnz     @f
3349
        or      byte [esi+303], 1
8960 IgorA 3350
        add     dword [ebp + PanelData.selected_size], eax
474 diamond 3351
        mov     eax, [esi+36]
8960 IgorA 3352
        adc     dword [ebp + PanelData.selected_size+4], eax
3353
        inc     dword [ebp + PanelData.selected_num]
474 diamond 3354
@@:
3355
        add     ebx, 4
3356
        dec     ecx
3357
        jnz     .selectloop
3358
        pop     eax
3359
        jmp     .done_redraw
517 diamond 3360
.greyasterisk:
8960 IgorA 3361
        mov     ecx, [ebp + PanelData.numfiles]
3362
        mov     esi, [ebp + PanelData.files]
517 diamond 3363
        jecxz   .galoopdone
3364
.galoop:
3365
        lodsd
3366
        cmp     word [eax+40], '..'
3367
        jnz     @f
3368
        cmp     byte [eax+42], 0
3369
        jz      .gacont
3370
@@:
3371
        xor     byte [eax+303], 1
3372
        mov     edx, [eax+32]
3373
        test    byte [eax+303], 1
3374
        jz      .gadel
8960 IgorA 3375
        add     dword [ebp + PanelData.selected_size], edx
517 diamond 3376
        mov     edx, [eax+36]
8960 IgorA 3377
        adc     dword [ebp + PanelData.selected_size+4], edx
3378
        inc     dword [ebp + PanelData.selected_num]
517 diamond 3379
        jmp     .gacont
3380
.gadel:
8960 IgorA 3381
        sub     dword [ebp + PanelData.selected_size], edx
517 diamond 3382
        mov     edx, [eax+36]
8960 IgorA 3383
        sbb     dword [ebp + PanelData.selected_size+4], edx
3384
        dec     dword [ebp + PanelData.selected_num]
517 diamond 3385
.gacont:
3386
        loop    .galoop
3387
.galoopdone:
3388
        jmp     .done_redraw
180 heavyiron 3389
 
589 diamond 3390
@@:
3391
        call    close_plugin_panel
3392
close_plugin_panels:
8960 IgorA 3393
        cmp     [ebp + PanelData.hPlugin], 0
589 diamond 3394
        jnz     @b
3395
        ret
3396
 
3397
close_plugin_panel:
3398
; close plugin and restore old directory
8960 IgorA 3399
        mov     esi, [ebp + PanelData.parents]
3400
        add     esi, [ebp + PanelData.parents_sz]
589 diamond 3401
@@:
3402
        dec     esi
3403
        cmp     byte [esi-1], 0
3404
        jnz     @b
3405
        push    esi
8960 IgorA 3406
        lea     edi, [ebp + PanelData.dir]
589 diamond 3407
@@:
3408
        lodsb
3409
        stosb
3410
        test    al, al
3411
        jnz     @b
3412
        pop     esi
3413
        sub     esi, 9
3414
        mov     edx, [esi]      ; hPlugin
3415
        mov     ebx, [esi+4]    ; hFile
8960 IgorA 3416
        sub     esi, [ebp + PanelData.parents]
3417
        mov     [ebp + PanelData.parents_sz], esi
3418
        xchg    edx, [ebp + PanelData.hPlugin]
3419
        xchg    ebx, [ebp + PanelData.hFile]
589 diamond 3420
        push    edx ebx
8960 IgorA 3421
        lea     ebx, [ebp + PanelData.plugin_flags] ;plugin_info
589 diamond 3422
        and     dword [ebx], 0
8960 IgorA 3423
        mov     eax, [ebp + PanelData.hPlugin]
589 diamond 3424
        test    eax, eax
3425
        jz      @f
3426
        push    ebp
3427
        push    ebx
8960 IgorA 3428
        push    [ebp + PanelData.hFile]
589 diamond 3429
        call    [eax+PluginInfo.GetOpenPluginInfo]
3430
        pop     ebp
3431
@@:
3432
        pop     ebx edx
3433
 
3434
close_handle_if_unused:
3435
; edx=hPlugin, ebx=hFile
3436
        push    ebp
3437
        xor     ecx, ecx
3438
@@:
3439
        mov     eax, [screens]
3440
        mov     ebp, [eax+ecx*8+4]
3441
        mov     eax, [eax+ecx*8]
3442
        call    [eax+screen_vtable.IsHandleUsed]
3443
        jz      .used
3444
        inc     ecx
3445
        cmp     ecx, [num_screens]
3446
        jb      @b
3447
        push    ebx
3448
        call    [edx+PluginInfo.ClosePlugin]
3449
.used:
3450
        pop     ebp
3451
        ret
3452
 
3453
panels_IsHandleUsed:
3454
; edx=hPlugin, ebx=hFile
8960 IgorA 3455
        mov     ebp, panel1
589 diamond 3456
        call    .1
3457
        jz      .ret
8960 IgorA 3458
        mov     ebp, panel2
589 diamond 3459
 
3460
.1:
8960 IgorA 3461
        cmp     edx, [ebp+ PanelData.hPlugin]
589 diamond 3462
        jnz     @f
8960 IgorA 3463
        cmp     ebx, [ebp+ PanelData.hFile]
589 diamond 3464
        jz      .ret
3465
@@:
8960 IgorA 3466
        mov     esi, [ebp + PanelData.parents_sz]
589 diamond 3467
        test    esi, esi
3468
        jnz     @f
3469
        inc     esi
3470
.ret:
3471
        ret
3472
@@:
8960 IgorA 3473
        add     esi, [ebp + PanelData.parents]
589 diamond 3474
@@:
3475
        dec     esi
3476
        cmp     byte [esi-1], 0
3477
        jnz     @b
3478
        sub     esi, 9
3479
        cmp     edx, [esi]      ; hPlugin
3480
        jnz     .no
3481
        mov     ebx, [esi+4]    ; hFile
3482
        jz      .ret
3483
.no:
8960 IgorA 3484
        cmp     esi, [ebp + PanelData.parents]
589 diamond 3485
        jnz     @b
3486
        inc     esi
3487
        ret
3488
 
3489
panels_OnExit:
3490
; close plugin panels
8960 IgorA 3491
        mov     ebp, panel1
589 diamond 3492
        call    close_plugin_panels
8960 IgorA 3493
        mov     ebp, panel2
589 diamond 3494
        call    close_plugin_panels
3495
        ret
3496
 
180 heavyiron 3497
panels_OnRedraw:
814 diamond 3498
        or      [cursor_x], -1
3499
        or      [cursor_y], -1
180 heavyiron 3500
        call    draw_cmdbar
8960 IgorA 3501
        mov     ebp, panel1
474 diamond 3502
        call    calc_colwidths
180 heavyiron 3503
        call    draw_panel
8960 IgorA 3504
        mov     ebp, panel2
474 diamond 3505
        call    calc_colwidths
180 heavyiron 3506
        call    draw_panel
3507
        ret
3508
 
3509
init_console:
474 diamond 3510
        mov     ecx, [console_data_ptr]
3511
        call    pgfree
283 diamond 3512
        mov     eax, [cur_width]
3513
        mul     [cur_height]
3514
        mov     ecx, eax
474 diamond 3515
        push    ecx
3516
        shl     ecx, 2
3517
        call    pgalloc
3518
        pop     ecx
283 diamond 3519
        test    eax, eax
3520
        jz      exit
3521
        mov     [console_data_ptr], eax
3522
        mov     edi, eax
180 heavyiron 3523
        mov     ax, 0720h
3524
        rep     stosw
8960 IgorA 3525
        mov     [panel1.left], ecx
3526
        mov     [panel1.top], ecx
3527
        mov     [panel2.top], ecx
180 heavyiron 3528
        mov     eax, [cur_width]
3529
        inc     eax
3530
        shr     eax, 1
8960 IgorA 3531
        mov     [panel1.width], eax
3532
        mov     [panel2.left], eax
180 heavyiron 3533
        sub     eax, [cur_width]
3534
        neg     eax
8960 IgorA 3535
        mov     [panel2.width], eax
180 heavyiron 3536
        mov     eax, [cur_height]
3537
        dec     eax
3538
        dec     eax
8960 IgorA 3539
        mov     [panel1.height], eax
3540
        mov     [panel2.height], eax
180 heavyiron 3541
        ret
3542
 
183 diamond 3543
get_curfile_folder_entry:
8960 IgorA 3544
        mov     ecx, [ebp + PanelData.index]
321 diamond 3545
        shl     ecx, 2
8960 IgorA 3546
        add     ecx, [ebp + PanelData.files]
321 diamond 3547
        mov     ecx, [ecx]
183 diamond 3548
        ret
3549
get_curfile_name:
3550
        call    get_curfile_folder_entry
3551
        add     ecx, 40
3552
        ret
3553
 
814 diamond 3554
quick_find:
8960 IgorA 3555
        cmp     [ebp + PanelData.numfiles], 0
814 diamond 3556
        jz      .nof
8960 IgorA 3557
        mov     ecx, [ebp + PanelData.index]
814 diamond 3558
.scanloop:
3559
        mov     edi, ecx
3560
        shl     edi, 2
8960 IgorA 3561
        add     edi, [ebp + PanelData.files]
814 diamond 3562
        mov     edi, [edi]
3563
        add     edi, 40
3564
        mov     esi, quick_search_buf + 12
3565
@@:
3566
        lodsb
3567
        test    al, al
3568
        jz      .ok
3569
        call    match_symbol
3570
        jnz     .no
3571
        inc     edi
3572
        jmp     @b
3573
.no:
3574
        inc     ecx
8960 IgorA 3575
        cmp     ecx, [ebp + PanelData.numfiles]
814 diamond 3576
        jb      @f
3577
        xor     ecx, ecx
3578
@@:
8960 IgorA 3579
        cmp     ecx, [ebp + PanelData.index]
814 diamond 3580
        jnz     .scanloop
3581
.nof:
3582
        stc
3583
        ret
3584
.ok:
8960 IgorA 3585
        cmp     ecx, [ebp + PanelData.index]
814 diamond 3586
        jz      .ret
8960 IgorA 3587
        mov     [ebp + PanelData.index], ecx
3588
        mov     eax, [ebp + PanelData.height]
814 diamond 3589
        shr     eax, 1
3590
        sub     ecx, eax
3591
        jae     @f
3592
        xor     ecx, ecx
3593
@@:
8960 IgorA 3594
        mov     eax, [ebp + PanelData.numfiles]
3595
        sub     eax, [ebp + PanelData.colst]
814 diamond 3596
        jnc     @f
3597
        xor     eax, eax
3598
        xor     ecx, ecx
3599
@@:
3600
        cmp     ecx, eax
3601
        jb      @f
3602
        mov     ecx, eax
3603
@@:
8960 IgorA 3604
        mov     [ebp + PanelData.start], ecx
814 diamond 3605
        call    draw_panel
3606
.ret:
3607
        clc
3608
        ret
3609
 
3610
quick_find_next:
8960 IgorA 3611
        cmp     [ebp + PanelData.numfiles], 0
814 diamond 3612
        jz      quick_find.nof
8960 IgorA 3613
        mov     ecx, [ebp + PanelData.index]
814 diamond 3614
        jmp     quick_find.no
3615
 
3616
quick_find_prev:
8960 IgorA 3617
        cmp     [ebp + PanelData.numfiles], 0
814 diamond 3618
        jz      quick_find.nof
8960 IgorA 3619
        mov     ecx, [ebp + PanelData.index]
814 diamond 3620
.scanloop:
3621
        dec     ecx
3622
        jns     @f
8960 IgorA 3623
        mov     ecx, [ebp + PanelData.numfiles]
814 diamond 3624
        dec     ecx
3625
@@:
8960 IgorA 3626
        cmp     ecx, [ebp + PanelData.index]
814 diamond 3627
        jz      quick_find.nof
3628
        mov     edi, ecx
3629
        shl     edi, 2
8960 IgorA 3630
        add     edi, [ebp + PanelData.files]
814 diamond 3631
        mov     edi, [edi]
3632
        add     edi, 40
3633
        mov     esi, quick_search_buf + 12
3634
@@:
3635
        lodsb
3636
        test    al, al
3637
        jz      quick_find.ok
3638
        call    match_symbol
3639
        jnz     .scanloop
3640
        inc     edi
3641
        jmp     @b
3642
 
180 heavyiron 3643
panels_getname:
3644
if lang eq ru
3645
        mov     eax, 'Пане'
3646
        stosd
3647
        mov     eax, 'ли  '
3648
        stosd
3649
        mov     eax, '    '
3650
        stosd
3651
        stosb
3652
else
3653
        mov     eax, 'Pane'
3654
        stosd
3655
        mov     eax, 'ls  '
3656
        stosd
3657
        mov     eax, '    '
3658
        stosd
3659
        stosb
3660
end if
3661
        sub     ecx, 13
3662
        mov     ebp, [active_panel]
3663
        push    3
3664
        pop     edx
8960 IgorA 3665
        cmp     [ebp + PanelData.hPlugin], 0
589 diamond 3666
        jz      .native
8960 IgorA 3667
        mov     esi, [ebp + PanelData.parents]
3668
        add     esi, [ebp + PanelData.parents_sz]
180 heavyiron 3669
@@:
589 diamond 3670
        dec     esi
3671
        cmp     byte [esi-1], 0
3672
        jz      @f
3673
        cmp     byte [esi-1], '/'
3674
        jnz     @b
3675
@@:
3676
        push    ecx edi
3677
        shr     ecx, 1
3678
@@:
180 heavyiron 3679
        lodsb
589 diamond 3680
        test    al, al
3681
        jz      @f
180 heavyiron 3682
        stosb
589 diamond 3683
        loop    @b
3684
@@:
3685
        sub     edi, [esp]
3686
        sub     [esp+4], edi
3687
        add     [esp], edi
3688
        pop     edi ecx
8960 IgorA 3689
        lea     esi, [ebp + PanelData.dir]
589 diamond 3690
        cmp     byte [esi+1], 0
3691
        jnz     @f
3692
        inc     esi
3693
@@:
3694
        jmp     .main
3695
.native:
8960 IgorA 3696
        lea     esi, [ebp + PanelData.dir]
589 diamond 3697
@@:
3698
        lodsb
3699
        stosb
180 heavyiron 3700
        dec     ecx
3701
        test    al, al
3702
        jz      @f
3703
        cmp     al, '/'
3704
        jnz     @b
3705
        dec     edx
3706
        jnz     @b
3707
@@:
3708
        test    al, al
3709
        jnz     @f
3710
        dec     esi
3711
        dec     edi
3712
@@:
589 diamond 3713
.main:
180 heavyiron 3714
        push    esi
3715
@@:
3716
        lodsb
3717
        test    al, al
3718
        jnz     @b
3719
        dec     esi
3720
        mov     ebx, esi
3721
        sub     ebx, [esp]
3722
        dec     esi
3723
        push    esi
8960 IgorA 3724
        mov     esi, [ebp + PanelData.index]
321 diamond 3725
        shl     esi, 2
8960 IgorA 3726
        add     esi, [ebp + PanelData.files]
321 diamond 3727
        mov     esi, [esi]
3728
        add     esi, 40
180 heavyiron 3729
        push    esi
3730
@@:
3731
        lodsb
3732
        test    al, al
3733
        jnz     @b
3734
        add     ebx, esi
3735
        sub     ebx, [esp]
3736
        dec     esi
3737
        cmp     ebx, ecx
3738
        jbe     @f
3739
        mov     al, '.'
3740
        stosb
3741
        stosb
3742
        stosb
3743
        sub     ecx, 3
3744
        mov     ebx, ecx
3745
@@:
3746
        add     edi, ebx
3747
        inc     ecx
3748
        std
3749
@@:
3750
        movsb
3751
        dec     ecx
3752
        jz      .nodir
3753
        cmp     esi, [esp]
3754
        jae     @b
589 diamond 3755
        mov     esi, [esp+4]
180 heavyiron 3756
        mov     al, '/'
3757
        stosb
3758
        dec     ecx
3759
        jz      .nodir
3760
@@:
3761
        cmp     esi, [esp+8]
3762
        jb      .nodir
3763
        movsb
3764
        loop    @b
3765
.nodir:
3766
        cld
3767
        pop     eax
3768
        pop     eax
3769
        pop     eax
3770
        ret
3771
 
3772
draw_window:
8932 IgorA 3773
        push    SF_REDRAW
180 heavyiron 3774
        pop     eax
8932 IgorA 3775
        push    SSF_BEGIN_DRAW
180 heavyiron 3776
        pop     ebx
517 diamond 3777
        int     40h
8932 IgorA 3778
        mov     al, SF_STYLE_SETTINGS
3779
        mov     bl, SSF_GET_SKIN_HEIGHT
517 diamond 3780
        int     40h
180 heavyiron 3781
        mov     [skinh], eax
3782
        mov     ebx, [cur_width]
3783
        imul    ebx, font_width
283 diamond 3784
        add     ebx, 100*65536 + 5*2-1
180 heavyiron 3785
        mov     ecx, [cur_height]
3786
        imul    ecx, font_height
283 diamond 3787
        lea     ecx, [eax+ecx+5-1+100*65536]
180 heavyiron 3788
        xor     eax, eax
314 diamond 3789
        mov     edx, 0x53000000
517 diamond 3790
        mov     edi, header
3791
        int     40h
8932 IgorA 3792
        mov     al, SF_DRAW_RECT
314 diamond 3793
        xor     edx, edx
3794
        cmp     [fill_width], 0
3795
        jz      @f
3796
        mov     ebx, [wnd_width]
3797
        sub     ebx, [fill_width]
3798
        sub     ebx, 5-1
3799
        shl     ebx, 16
3800
        mov     bx, word [fill_width]
3801
        mov     ecx, [skinh-2]
3802
        mov     cx, word [wnd_height]
3803
        sub     cx, word [skinh]
3804
        sub     cx, 5-1
517 diamond 3805
        int     0x40
314 diamond 3806
@@:
3807
        cmp     [fill_height], 0
3808
        jz      @f
3809
        xor     edx, edx
3810
        mov     ebx, 50000h
3811
        mov     bx, word [wnd_width]
3812
        sub     ebx, 9
3813
        mov     ecx, [wnd_height]
3814
        sub     ecx, [fill_height]
3815
        sub     ecx, 5-1
3816
        shl     ecx, 16
3817
        mov     cx, word [fill_height]
517 diamond 3818
        int     0x40
314 diamond 3819
@@:
283 diamond 3820
;        xor     ecx, ecx
3821
;        call    draw_image
8932 IgorA 3822
        mov     al, SF_PUT_IMAGE_EXT
474 diamond 3823
        mov     ebx, [MemForImage]
3824
        test    ebx, ebx
3825
        jz      @f
3826
        mov     ecx, [cur_width]
3827
        imul    ecx, font_width*10000h
3828
        mov     cx, word [cur_height]
3829
        imul    cx, font_height
3830
        mov     edx, [skinh]
3831
        add     edx, 5*10000h
3832
        mov     esi, 8
3833
        mov     edi, console_colors
3834
        xor     ebp, ebp
517 diamond 3835
        int     0x40
474 diamond 3836
@@:
8932 IgorA 3837
        mov     al, SF_REDRAW
3838
        push    SSF_END_DRAW
180 heavyiron 3839
        pop     ebx
517 diamond 3840
        int     40h
180 heavyiron 3841
        ret
3842
 
3843
draw_image.nomem:
8932 IgorA 3844
        mov     al, SF_DRAW_RECT
180 heavyiron 3845
        xor     edx, edx
3846
        mov     ebx, [cur_width]
3847
        imul    ebx, font_width
3848
        add     ebx, 5*65536
3849
        mov     ecx, [skinh-2]
3850
        mov     cx, word [cur_height]
3851
        imul    cx, font_height
517 diamond 3852
        int     40h
8932 IgorA 3853
        mov     al, SF_DRAW_TEXT
180 heavyiron 3854
        mov     ebx, 32*65536+32
3855
        mov     ecx, 0xFFFFFF
3856
        mov     edx, nomem_draw
3857
        push    nomem_draw.size
3858
        pop     esi
517 diamond 3859
        int     40h
180 heavyiron 3860
        ret
3861
 
3862
draw_image:
474 diamond 3863
        mov     [bMemForImageValidData], byte 1
3864
        cmp     [MemForImage], 0
3865
        jnz     .allocated
3866
; allocate memory for image
3867
        mov     ecx, [cur_width]
3868
        imul    ecx, [cur_height]
3869
        imul    ecx, font_width*font_height
3870
        call    pgalloc
3871
        test    eax, eax
3872
        jz      draw_image.nomem
3873
        mov     [MemForImage], eax
3874
        mov     [bMemForImageValidData], byte 0
3875
.allocated:
814 diamond 3876
        push    ebp
283 diamond 3877
        and     [max_x], 0
3878
        or      [min_x], -1
474 diamond 3879
        and     [max_y], 0
283 diamond 3880
        or      [min_y], -1
474 diamond 3881
        mov     eax, [cursor_y]
3882
        mul     [cur_width]
3883
        add     eax, [cursor_x]
3884
        add     eax, eax
3885
        add     eax, [console_data_ptr]
3886
        xchg    [cur_cursor_pos], eax
3887
        mov     [old_cursor_pos], eax
3888
        mov     edi, [MemForImage]
283 diamond 3889
        mov     esi, [console_data_ptr]
474 diamond 3890
        mov     ecx, [cur_height]
3891
.lh:
3892
        push    ecx
283 diamond 3893
        mov     ecx, [cur_width]
474 diamond 3894
.lw:
3895
        push    ecx
3896
        mov     eax, [cur_width]
3897
        imul    eax, [cur_height]
3898
        mov     ebx, [esi]
3899
        cmp     [bMemForImageValidData], 0
3900
        jz      @f
3901
        cmp     esi, [cur_cursor_pos]
3902
        jz      @f
3903
        cmp     esi, [old_cursor_pos]
3904
        jz      @f
3905
        cmp     bx, [eax*2+esi]
3906
        jnz     @f
3907
        inc     esi
3908
        inc     esi
3909
        jmp     .skip_symbol
283 diamond 3910
@@:
474 diamond 3911
        mov     [eax*2+esi], bx
3912
        cmp     ecx, [min_x]
283 diamond 3913
        ja      @f
474 diamond 3914
        mov     [min_x], ecx
283 diamond 3915
@@:
474 diamond 3916
        cmp     ecx, [max_x]
283 diamond 3917
        jb      @f
474 diamond 3918
        mov     [max_x], ecx
283 diamond 3919
@@:
474 diamond 3920
        mov     eax, [esp+4]
3921
        mov     [min_y], eax
3922
        cmp     eax, [max_y]
283 diamond 3923
        jb      @f
474 diamond 3924
        mov     [max_y], eax
283 diamond 3925
@@:
3926
        push    edi
474 diamond 3927
        xor     eax, eax
3928
        mov     al, [esi+1]
3929
        and     al, 0xF
3930
        mov     ebx, eax
3931
        mov     al, [esi+1]
3932
        shr     al, 4
3933
        mov     ebp, eax
283 diamond 3934
        sub     ebx, ebp
474 diamond 3935
        lodsb
3936
        inc     esi
180 heavyiron 3937
if font_width > 8
3938
        lea     edx, [eax+eax+font]
3939
else
3940
        lea     edx, [eax+font]
3941
end if
3942
.sh:
474 diamond 3943
        mov     ecx, [edx]
3944
repeat font_width
3945
        shr     ecx, 1
283 diamond 3946
        sbb     eax, eax
3947
        and     eax, ebx
3948
        add     eax, ebp
474 diamond 3949
        mov     [edi+%-1], al
3950
end repeat
3951
        mov     eax, [cur_width]
3952
;        imul    eax, font_width
3953
;        add     edi, eax
3954
if font_width = 6
3955
        lea     eax, [eax*2+eax]
3956
        lea     edi, [edi+eax*2]
3957
else if font_width = 7
3958
        lea     edi, [edi+eax*8]
3959
        sub     edi, eax
3960
else if font_width = 8
3961
        lea     edi, [edi+eax*8]
3962
else if font_width = 9
3963
        lea     edi, [edi+eax*8]
180 heavyiron 3964
        add     edi, eax
474 diamond 3965
else if font_width = 10
3966
        lea     eax, [eax*4+eax]
3967
        lea     edi, [edi+eax*2]
3968
else
3969
Unknown font_width value!
3970
end if
180 heavyiron 3971
if font_width > 8
3972
        add     edx, 256*2
474 diamond 3973
        cmp     edx, font+256*2*font_height
180 heavyiron 3974
else
3975
        add     edx, 256
474 diamond 3976
        cmp     edx, font+256*font_height
180 heavyiron 3977
end if
474 diamond 3978
        jb      .sh
283 diamond 3979
        pop     edi
3980
.skip_symbol:
3981
        pop     ecx
3982
        add     edi, font_width
3983
        dec     ecx
3984
        jnz     .lw
474 diamond 3985
        mov     eax, [cur_width]
283 diamond 3986
        imul    eax, (font_height-1)*font_width
180 heavyiron 3987
        add     edi, eax
474 diamond 3988
        pop     ecx
283 diamond 3989
        dec     ecx
3990
        jnz     .lh
3991
; cursor
3992
        mov     eax, [cursor_y]
3993
        inc     eax
3994
        jz      .nocursor
474 diamond 3995
        mul     [cur_width]
283 diamond 3996
        imul    eax, font_height*font_width
3997
        mov     edx, [cursor_x]
3998
        inc     edx
3999
        imul    edx, font_width
4000
        add     eax, edx
474 diamond 4001
        add     eax, [MemForImage]
4002
        mov     edx, [cur_width]
283 diamond 4003
        imul    edx, font_width
4004
        neg     edx
814 diamond 4005
        mov     ecx, [cursor_size]
283 diamond 4006
.cursor_loop:
4007
        push    ecx
4008
        mov     ecx, font_width
4009
        add     eax, edx
4010
        push    eax
4011
@@:
814 diamond 4012
;;        add     byte [eax-1], 0x10
283 diamond 4013
        xor     byte [eax-1], 7
4014
        sub     eax, 1
4015
        loop    @b
4016
        pop     eax
180 heavyiron 4017
        pop     ecx
283 diamond 4018
        loop    .cursor_loop
4019
.nocursor:
474 diamond 4020
        cmp     [min_y], -1
4021
        jz      .nodraw
4022
        mov     ecx, [cur_width]
4023
        mov     ebx, [cur_height]
4024
        mov     eax, ebx
4025
        sub     ebx, [max_y]
4026
        sub     eax, [min_y]
4027
        sub     eax, ebx
4028
        inc     eax
4029
        imul    ebp, eax, font_height
4030
        mov     edx, ecx
4031
        sub     edx, [max_x]
283 diamond 4032
        imul    edx, font_width
474 diamond 4033
        mov     eax, edx
283 diamond 4034
        shl     edx, 16
474 diamond 4035
        imul    dx, bx, font_height
4036
        imul    ebx, [cur_width]
4037
        mov     ecx, [max_x]
4038
        sub     ecx, [min_x]
4039
        inc     ecx
4040
        imul    ecx, font_width*10000h
4041
        add     ecx, ebp
4042
        imul    ebx, font_width*font_height
4043
        add     ebx, [MemForImage]
4044
        add     ebx, eax
283 diamond 4045
        add     edx, [skinh]
474 diamond 4046
        add     edx, 5*10000h
4047
        imul    esi, [cur_width], font_width
4048
        mov     ebp, ecx
4049
        shr     ebp, 16
4050
        sub     esi, ebp
4051
        mov     ebp, esi
8932 IgorA 4052
        push    SF_PUT_IMAGE_EXT
180 heavyiron 4053
        pop     eax
474 diamond 4054
        mov     edi, console_colors
283 diamond 4055
        push    8
4056
        pop     esi
517 diamond 4057
        int     40h
283 diamond 4058
.nodraw:
814 diamond 4059
        pop     ebp
180 heavyiron 4060
        ret
4061
 
4062
get_console_ptr:
4063
; in: eax=x, edx=y
4064
; out: edi->console data
4065
        push    edx
4066
        imul    edx, [cur_width]
4067
        add     edx, eax
283 diamond 4068
        mov     edi, [console_data_ptr]
4069
        lea     edi, [edi + edx*2]
180 heavyiron 4070
        pop     edx
4071
        ret
4072
 
8960 IgorA 4073
;description:
4074
; draw keys F1-F10
4075
align 16
180 heavyiron 4076
draw_keybar:
4077
        pushad
4078
        xor     eax, eax
4079
        test    [ctrlstate], 3
4080
        jz      @f
4081
        inc     eax
4082
@@:
4083
        test    [ctrlstate], 0xC
4084
        jz      @f
4085
        or      al, 2
4086
@@:
4087
        test    [ctrlstate], 0x30
4088
        jz      @f
4089
        or      al, 4
4090
@@:
4091
        imul    eax, 6*12
997 diamond 4092
        mov     esi, [active_screen_keybar]
180 heavyiron 4093
        add     esi, eax
4094
        xor     ecx, ecx
4095
        inc     ecx
4096
        xor     eax, eax
4097
        mov     edx, [cur_height]
4098
        dec     edx
4099
        call    get_console_ptr
4100
        push    6
4101
        pop     ebx
4102
        mov     eax, [cur_width]
4103
        sub     eax, 11+9+3*2+6
4104
        cmp     eax, 7*11
4105
        jl      @f
4106
        cdq
4107
        mov     bl, 11
4108
        div     ebx
4109
        mov     ebx, eax
4110
@@:
4111
        xor     edx, edx
4112
.l:
4113
        add     edx, 7
4114
        cmp     cl, 10
4115
        jb      @f
4116
        inc     edx
4117
@@:
4118
        cmp     edx, [cur_width]
4119
        ja      .ret
4120
        cmp     cl, 10
4121
        jae     .twodig
4122
        lea     eax, [ecx+'0']
4123
        stosb
4124
        mov     al, [keybar_number_color]
4125
        stosb
4126
        jmp     .cmn
4127
.twodig:
4128
        mov     al, cl
4129
        cbw
4130
        div     [_10]
4131
        add     al, '0'
4132
        stosb
4133
        mov     al, [keybar_number_color]
4134
        stosb
4135
        xchg    al, ah
4136
        add     al, '0'
4137
        stosw
4138
.cmn:
4139
        mov     ah, [keybar_name_color]
4140
        push    ecx
4141
        mov     cl, 6
4142
@@:
4143
        lodsb
4144
        stosw
4145
        loop    @b
4146
        mov     al, ' '
4147
        lea     ecx, [ebx-6]
4148
        cmp     byte [esp], 12
4149
        jz      .ret_pop
4150
        add     edx, ecx
4151
        rep     stosw
4152
        pop     ecx
4153
        inc     edx
4154
        cmp     edx, [cur_width]
4155
        ja      .ret
4156
        mov     ah, [keybar_bgr_color]
4157
        stosw
4158
        inc     ecx
4159
        jmp     .l
4160
.ret_pop:
4161
        pop     ecx
4162
.ret:
4163
        cmp     byte [edi-2], ' '
4164
        jnz     @f
4165
        dec     edi
4166
        dec     edi
4167
@@:
4168
        push    edi
283 diamond 4169
        xor     eax, eax
180 heavyiron 4170
        mov     edx, [cur_height]
4171
        call    get_console_ptr
4172
        mov     ecx, edi
4173
        pop     edi
4174
        sub     ecx, edi
4175
        shr     ecx, 1
4176
        mov     al, ' '
4177
        mov     ah, [keybar_name_color]
4178
        rep     stosw
4179
.done:
814 diamond 4180
        cmp     [bDisplayQuickSearch], 0
4181
        jz      @f
4182
        push    QuickSearchDlg
4183
        call    DrawDialogBox
4184
@@:
180 heavyiron 4185
        popad
4186
        ret
4187
 
4188
draw_cmdbar:
4189
        mov     esi, [active_panel]
8960 IgorA 4190
        add     esi, PanelData.dir
180 heavyiron 4191
        xor     eax, eax
4192
        mov     edx, [cur_height]
4193
        dec     edx
4194
        dec     edx
4195
        call    get_console_ptr
4196
        mov     ah, [cmdbar_prefix_color]
4197
        mov     ecx, [cur_width]
4198
        dec     ecx
4199
@@:
4200
        lodsb
4201
        test    al, al
4202
        jz      @f
4203
        stosw
4204
        loop    @b
4205
@@:
4206
        mov     al, '>'
4207
        stosw
4208
        mov     al, ' '
4209
        mov     ah, [cmdbar_normal_color]
4210
        rep     stosw
4211
        ret
4212
 
8932 IgorA 4213
align 16
180 heavyiron 4214
draw_border:
4215
        push    edi
4216
        mov     al, 0xC9
4217
        stosw
4218
        mov     al, 0xCD
4219
        lea     ecx, [ebx-2]
4220
        rep     stosw
4221
        mov     al, 0xBB
4222
        stosw
4223
        pop     edi
4224
        add     edi, [cur_width]
4225
        add     edi, [cur_width]
4226
        lea     ecx, [edx-2]
4227
.l:
4228
        push    edi
4229
        mov     al, 0xBA
4230
        stosw
4231
        mov     al, 0x20
4232
        push    ecx
4233
        lea     ecx, [ebx-2]
4234
        rep     stosw
4235
        pop     ecx
4236
        mov     al, 0xBA
4237
        stosw
4238
        pop     edi
4239
        add     edi, [cur_width]
4240
        add     edi, [cur_width]
4241
        loop    .l
4242
        mov     al, 0xC8
4243
        stosw
4244
        mov     al, 0xCD
4245
        lea     ecx, [ebx-2]
4246
        rep     stosw
4247
        mov     al, 0xBC
4248
        stosw
4249
        ret
4250
 
474 diamond 4251
calc_colwidths:
4252
; in: ebp->panel data
8960 IgorA 4253
        imul    esi, [ebp + PanelData.colmode], PanelMode.size
474 diamond 4254
        add     esi, colmodes
4255
        lodsd
4256
        mov     ecx, eax
4257
        lea     edx, [ecx-1]
4258
        xor     ebx, ebx
4259
        add     esi, PanelMode.ColumnWidths-4
4260
        push    ecx esi
4261
        xor     eax, eax
4262
.loop:
4263
        lodsb
4264
        add     edx, eax
4265
        cmp     al, 1
4266
        adc     ebx, 0
4267
        loop    .loop
4268
        pop     esi ecx
8960 IgorA 4269
        lea     edi, [ebp + PanelData.colwidths]
474 diamond 4270
        test    ebx, ebx
4271
        jz      .loop2
8960 IgorA 4272
        mov     eax, [ebp + PanelData.width]
474 diamond 4273
        dec     eax
4274
        dec     eax
4275
        sub     eax, edx
4276
        jae     @f
4277
        xor     eax, eax
4278
@@:
4279
        xor     edx, edx
4280
        div     ebx
4281
        test    eax, eax
4282
        jnz     @f
4283
        xor     edx, edx
4284
        inc     eax
4285
@@:
4286
        push    eax
4287
.loop2:
4288
        movzx   eax, byte [esi]
4289
        inc     esi
4290
        test    eax, eax
4291
        jnz     @f
4292
        pop     eax
4293
        push    eax
4294
        dec     ebx
4295
        cmp     ebx, edx
4296
        jae     @f
4297
        inc     eax
4298
@@:
4299
        stosd
4300
        loop    .loop2
4301
        pop     eax
4302
        and     dword [edi], 0
4303
        ret
4304
 
589 diamond 4305
GetPanelTitle_default:
4306
        mov     edi, [esp+8]
4307
        mov     ecx, 1024
4308
        mov     esi, [esp+12]
4309
        test    esi, esi
4310
        jz      .nohost
4311
        mov     edx, esi
4312
@@:
4313
        lodsb
4314
        test    al, al
4315
        jz      @f
4316
        cmp     al, '/'
4317
        jnz     @b
4318
        mov     edx, esi
4319
        jmp     @b
4320
@@:
4321
        mov     esi, edx
4322
@@:
4323
        lodsb
4324
        stosb
4325
        test    al, al
4326
        loopnz  @b
4327
        dec     edi
4328
        inc     ecx
4329
.nohost:
4330
        mov     esi, [esp+16]
4331
        cmp     word [esi], '/'
4332
        jz      .nodir
4333
@@:
4334
        lodsb
4335
        stosb
4336
        test    al, al
4337
        loopnz  @b
4338
        dec     edi
4339
.nodir:
4340
        mov     byte [edi], 0
4341
        ret     10h
4342
 
8932 IgorA 4343
;input:
4344
; ebp - pointer to panel1 or panel2
4345
align 16
180 heavyiron 4346
draw_panel:
8960 IgorA 4347
        mov     eax, [ebp + PanelData.left]
4348
        mov     edx, [ebp + PanelData.top]
180 heavyiron 4349
        call    get_console_ptr
4350
; draw border
4351
        mov     ah, [panel_border_color]
8960 IgorA 4352
        mov     ebx, [ebp + PanelData.width]
4353
        mov     edx, [ebp + PanelData.height]
180 heavyiron 4354
        call    draw_border
4355
        push    eax
8960 IgorA 4356
        mov     eax, [ebp + PanelData.left]
4357
        mov     edx, [ebp + PanelData.top]
4358
        add     edx, [ebp + PanelData.height]
180 heavyiron 4359
        sub     edx, 3
4360
        call    get_console_ptr
4361
        pop     eax
4362
        mov     al, 0xC7
4363
        stosw
4364
        mov     al, 0xC4
4365
        lea     ecx, [ebx-2]
4366
        rep     stosw
4367
        mov     al, 0xB6
4368
        stosw
474 diamond 4369
 
8960 IgorA 4370
        imul    esi, [ebp + PanelData.colmode], PanelMode.size
474 diamond 4371
        add     esi, colmodes
4372
        lodsd
4373
        mov     ecx, eax        ; number of columns
8960 IgorA 4374
        lea     ebx, [ebp + PanelData.colwidths]
4375
        mov     eax, [ebp + PanelData.left]
180 heavyiron 4376
        inc     eax
4377
        mov     [column_left], eax
8960 IgorA 4378
        mov     eax, [ebp + PanelData.top]
474 diamond 4379
        inc     eax
4380
        mov     [column_top], eax
8960 IgorA 4381
        mov     eax, [ebp + PanelData.height]
474 diamond 4382
        sub     eax, 4
4383
        mov     [column_height], eax
4384
        dec     eax
8960 IgorA 4385
        mov     [ebp + PanelData.colsz], eax
4386
        and     [ebp + PanelData.colst], 0
4387
        mov     eax, [ebp + PanelData.start]
474 diamond 4388
        mov     [column_index], eax
4389
        mov     [last_column_index], eax
4390
.columns_loop:
4391
        push    ecx
4392
        mov     eax, [ebx]
4393
        add     ebx, 4
4394
        mov     [column_width], eax
4395
        cmp     ecx, 1
4396
        jz      .skip_right_border
4397
        add     eax, [column_left]
8960 IgorA 4398
        mov     edx, [ebp + PanelData.top]
180 heavyiron 4399
        call    get_console_ptr
474 diamond 4400
        mov     ah, [panel_header_color]
180 heavyiron 4401
        mov     al, 0xD1
4402
        mov     [edi], ax
4403
        add     edi, [cur_width]
4404
        add     edi, [cur_width]
474 diamond 4405
        mov     ecx, [column_height]
180 heavyiron 4406
        mov     al, 0xB3
4407
@@:
4408
        mov     [edi], ax
4409
        add     edi, [cur_width]
4410
        add     edi, [cur_width]
4411
        loop    @b
4412
        mov     al, 0xC1
4413
        stosw
474 diamond 4414
.skip_right_border:
4415
        mov     eax, [column_left]
4416
        mov     edx, [column_top]
4417
        call    get_console_ptr
4418
; заголовок столбца
4419
        push    edi
4420
        mov     edx, [esi]
4421
        and     edx, 0xF
4422
        mov     edx, [column_headers+edx*4]
4423
        movzx   ecx, byte [edx]
4424
        inc     edx
4425
        cmp     ecx, [column_width]
4426
        jb      @f
180 heavyiron 4427
        mov     ecx, [column_width]
474 diamond 4428
@@:
4429
        push    ecx
4430
        sub     ecx, [column_width]
4431
        neg     ecx
4432
        shr     ecx, 1
4433
        mov     al, ' '
4434
        mov     ah, [column_header_color]
4435
        rep     stosw
4436
        pop     ecx
4437
        jecxz   .skipcopyhdr
4438
        push    ecx
4439
@@:
4440
        mov     al, [edx]
4441
        inc     edx
4442
        stosw
4443
        loop    @b
4444
        pop     ecx
4445
.skipcopyhdr:
4446
        sub     ecx, [column_width]
4447
        neg     ecx
180 heavyiron 4448
        inc     ecx
474 diamond 4449
        shr     ecx, 1
4450
        mov     al, ' '
4451
        rep     stosw
4452
        pop     edi
4453
        add     edi, [cur_width]
4454
        add     edi, [cur_width]
4455
; сам столбец
4456
        mov     eax, [esi]
4457
        and     eax, 0xF
4458
        push    ebx esi
4459
        call    dword [draw_column_proc+eax*4]
4460
        pop     esi ebx
4461
        inc     esi
4462
        mov     eax, [column_width]
4463
        inc     eax
4464
        add     [column_left], eax
4465
        pop     ecx
4466
        dec     ecx
4467
        jnz     .columns_loop
180 heavyiron 4468
; Заголовок панели (текущая папка)
8960 IgorA 4469
        lea     esi, [ebp + PanelData.dir]
4470
        mov     eax, [ebp + PanelData.hPlugin]
589 diamond 4471
        test    eax, eax
4472
        jz      .native
4473
        push    ebp
4474
        push    esi
8960 IgorA 4475
        mov     esi, [ebp + PanelData.parents]
4476
        add     esi, [ebp + PanelData.parents_sz]
589 diamond 4477
@@:
4478
        dec     esi
4479
        cmp     byte [esi-1], 0
4480
        jnz     @b
4481
        push    esi
4482
        push    execdata
8960 IgorA 4483
        push    [ebp + PanelData.hFile]
589 diamond 4484
        call    [eax+PluginInfo.GetPanelTitle]
4485
        pop     ebp
4486
        mov     esi, execdata
4487
.native:
180 heavyiron 4488
        mov     edi, cur_header
8960 IgorA 4489
        mov     ecx, [ebp + PanelData.width]
631 diamond 4490
        sub     ecx, 6
4491
        cmp     byte [esi], '/'
4492
        jnz     .copy_rest
4493
        dec     ecx
180 heavyiron 4494
        movsb
4495
@@:
4496
        lodsb
4497
        stosb
4498
        dec     ecx
4499
        test    al, al
4500
        jz      .header_created
4501
        cmp     al, '/'
4502
        jnz     @b
631 diamond 4503
.copy_rest:
180 heavyiron 4504
        mov     edx, esi
4505
@@:
4506
        lodsb
4507
        test    al, al
4508
        jnz     @b
4509
        sub     esi, edx
4510
        dec     esi
4511
        cmp     esi, ecx
4512
        jbe     @f
4513
        mov     word [edi], '..'
4514
        mov     byte [edi+2], '.'
4515
        add     edi, 3
4516
        sub     ecx, 3
4517
        add     edx, esi
4518
        sub     edx, ecx
4519
@@:
4520
        mov     esi, edx
4521
@@:
4522
        lodsb
4523
        stosb
4524
        dec     ecx
4525
        test    al, al
4526
        jnz     @b
4527
.header_created:
8960 IgorA 4528
        mov     edx, [ebp + PanelData.top]
4529
        mov     eax, [ebp + PanelData.left]
180 heavyiron 4530
        shr     ecx, 1
4531
        lea     eax, [eax+ecx+3]
4532
        call    get_console_ptr
4533
        mov     ah, [panel_active_header_color]
4534
        cmp     ebp, [active_panel]
4535
        jz      @f
4536
        mov     ah, [panel_header_color]
4537
@@:
4538
        mov     al, ' '
4539
        stosw
4540
        mov     esi, cur_header
4541
@@:
4542
        lodsb
4543
        test    al, al
4544
        jz      @f
4545
        stosw
4546
        jmp     @b
4547
@@:
4548
        mov     al, ' '
4549
        stosw
8960 IgorA 4550
        mov     edx, [ebp + PanelData.top]
180 heavyiron 4551
        inc     edx
8960 IgorA 4552
        mov     eax, [ebp + PanelData.left]
180 heavyiron 4553
        inc     eax
4554
        call    get_console_ptr
8960 IgorA 4555
        movzx   eax, [ebp + PanelData.sortmode]
180 heavyiron 4556
        mov     al, [compare_names+eax]
4557
        stosb
8960 IgorA 4558
        mov     eax, [ebp + PanelData.selected_num]
474 diamond 4559
        test    eax, eax
4560
        jz      .skip_selected_info
4561
; Информация о выделенных файлах
8960 IgorA 4562
        push    dword [ebp + PanelData.selected_size+4]
4563
        push    dword [ebp + PanelData.selected_size]
474 diamond 4564
        call    fill_total_info
8960 IgorA 4565
        mov     eax, [ebp + PanelData.width]
474 diamond 4566
        sub     eax, 2
4567
        cmp     ecx, eax
4568
        jbe     @f
4569
        mov     ecx, eax
4570
        mov     edi, saved_file_name+512
4571
        sub     edi, eax
4572
        mov     byte [edi], '.'
4573
        mov     word [edi+1], '..'
4574
@@:
4575
        mov     esi, edi
4576
        sub     eax, ecx
4577
        shr     eax, 1
4578
        inc     eax
8960 IgorA 4579
        add     eax, [ebp + PanelData.left]
4580
        mov     edx, [ebp + PanelData.top]
4581
        add     edx, [ebp + PanelData.height]
474 diamond 4582
        sub     edx, 3
4583
        call    get_console_ptr
4584
        mov     ah, [panel_numselected_color]
4585
@@:
4586
        lodsb
4587
        stosw
4588
        loop    @b
4589
.skip_selected_info:
4590
; Информация об общем числе и размере файлов панели
8960 IgorA 4591
        mov     eax, [ebp + PanelData.total_num]
4592
        push    dword [ebp + PanelData.total_size+4]
4593
        push    dword [ebp + PanelData.total_size]
474 diamond 4594
        call    fill_total_info
8960 IgorA 4595
        mov     eax, [ebp + PanelData.width]
474 diamond 4596
        sub     eax, 2
4597
        cmp     ecx, eax
4598
        jbe     @f
4599
        mov     ecx, eax
4600
        mov     byte [edi+ecx-3], '.'
4601
        mov     word [edi+ecx-2], '..'
4602
@@:
4603
        sub     eax, ecx
4604
        shr     eax, 1
4605
        inc     eax
8960 IgorA 4606
        add     eax, [ebp + PanelData.left]
4607
        add     edx, [ebp + PanelData.top]
4608
        add     edx, [ebp + PanelData.height]
474 diamond 4609
        dec     edx
4610
        mov     esi, edi
4611
        call    get_console_ptr
4612
        mov     ah, [panel_number_color]
4613
@@:
4614
        lodsb
4615
        stosw
4616
        loop    @b
8960 IgorA 4617
        cmp     [ebp + PanelData.numfiles], 0
180 heavyiron 4618
        jz      .skip_curinfo
474 diamond 4619
; Информация о текущем файле
8960 IgorA 4620
        mov     ebx, [ebp + PanelData.index]
4621
        mov     eax, [ebp + PanelData.files]
180 heavyiron 4622
        mov     ebx, [eax+ebx*4]
8960 IgorA 4623
        mov     eax, [ebp + PanelData.left]
4624
        add     eax, [ebp + PanelData.width]
180 heavyiron 4625
        dec     eax
8960 IgorA 4626
        mov     edx, [ebp + PanelData.top]
4627
        add     edx, [ebp + PanelData.height]
180 heavyiron 4628
        dec     edx
4629
        dec     edx
4630
        call    get_console_ptr
8960 IgorA 4631
        mov     ecx, [ebp + PanelData.width]
180 heavyiron 4632
        dec     ecx
4633
        dec     ecx
8960 IgorA 4634
        cmp     [ebp + PanelData.colmode], 3
474 diamond 4635
        jz      .show_curname
180 heavyiron 4636
; Время модификации
4637
        sub     edi, 5*2
4638
        sub     ecx, 6
4639
        mov     al, [ebx+24+2]
4640
        aam
4641
        or      ax, 0x3030
4642
        mov     [edi], ah
4643
        mov     [edi+2], al
4644
        mov     [edi+4], byte ':'
4645
        mov     al, [ebx+24+1]
4646
        aam
4647
        or      ax, 0x3030
4648
        mov     [edi+6], ah
4649
        mov     [edi+8], al
4650
        mov     al, [panel_normal_color]
4651
        mov     [edi+1], al
4652
        mov     [edi+3], al
4653
        mov     [edi+5], al
4654
        mov     [edi+7], al
4655
        mov     [edi+9], al
4656
        dec     edi
4657
        mov     [edi], al
4658
        dec     edi
4659
        mov     byte [edi], ' '
4660
; Дата модификации
4661
        sub     edi, 8*2
4662
        sub     ecx, 9
4663
        mov     al, [ebx+28+0]
4664
        aam
4665
        or      ax, 0x3030
4666
        mov     [edi], ah
4667
        mov     [edi+2], al
4668
        mov     [edi+4], byte '.'
4669
        mov     al, [ebx+28+1]
4670
        aam
4671
        or      ax, 0x3030
4672
        mov     [edi+6], ah
4673
        mov     [edi+8], al
4674
        mov     [edi+10], byte '.'
4675
        mov     ax, [ebx+28+2]
4676
        div     [_100]
4677
        mov     al, ah
4678
        aam
4679
        or      ax, 0x3030
4680
        mov     [edi+12], ah
4681
        mov     [edi+14], al
4682
        mov     al, [panel_normal_color]
4683
        mov     [edi+1], al
4684
        mov     [edi+3], al
4685
        mov     [edi+5], al
4686
        mov     [edi+7], al
4687
        mov     [edi+9], al
4688
        mov     [edi+11], al
4689
        mov     [edi+13], al
4690
        mov     [edi+15], al
4691
        dec     edi
4692
        mov     [edi], al
4693
        dec     edi
4694
        mov     [edi], byte ' '
4695
; Размер
4696
        std
4697
        mov     ah, [panel_normal_color]
4698
        dec     edi
4699
        dec     edi
4700
        dec     ecx
4701
        test    byte [ebx], 0x10
4702
        jz      .size_file
4703
        push    ecx
4704
        mov     esi, aFolder+aFolder.size-1
4705
        mov     ecx, aFolder.size
4706
        cmp     word [ebx+40], '..'
4707
        jnz     @f
4708
        cmp     byte [ebx+42], 0
4709
        jnz     @f
4710
        mov     esi, aUp+aUp.size-1
4711
        mov     cl, aUp.size
4712
@@:
4713
        sub     [esp], ecx
4714
@@:
4715
        lodsb
4716
        stosw
4717
        loop    @b
4718
        pop     ecx
4719
        jmp     .size_done
4720
.size_file:
4721
        mov     edx, [ebx+36]
4722
        test    edx, edx
4723
        jz      .size_less_4g
4724
        cmp     edx, 10*256
4725
        jae     .size_tera
4726
; в гигабайтах
4727
        mov     al, 'G'
283 diamond 4728
        shl     edx, 2
180 heavyiron 4729
        jmp     .size_letter
4730
.size_tera:
4731
; в терабайтах
4732
        shr     edx, 8
4733
        mov     al, 'T'
4734
        jmp     .size_letter
4735
.size_less_4g:
4736
        mov     edx, [ebx+32]
4737
        cmp     edx, 10*(1 shl 20)
4738
        jae     .size_mega
4739
        cmp     edx, 1 shl 20
4740
        jb      .size_num
4741
        shr     edx, 10
4742
        mov     al, 'K'
4743
        jmp     .size_letter
4744
.size_mega:
4745
        mov     al, 'M'
4746
        shr     edx, 20
4747
.size_letter:
4748
        stosw
4749
        dec     ecx
4750
        mov     al, ' '
4751
        stosw
4752
        dec     ecx
4753
.size_num:
4754
        xchg    eax, edx
4755
        xor     edx, edx
4756
        div     [_10d]
4757
        xchg    eax, edx
4758
        add     al, '0'
4759
        mov     ah, [panel_normal_color]
4760
        stosw
4761
        dec     ecx
4762
        test    edx, edx
4763
        jnz     .size_num
4764
.size_done:
4765
        cld
474 diamond 4766
.show_curname:
180 heavyiron 4767
; Имя
4768
        sub     edi, ecx
4769
        sub     edi, ecx
4770
        lea     esi, [ebx+40]
4771
@@:
4772
        lodsb
4773
        test    al, al
4774
        jnz     @b
4775
        sub     esi, ebx
4776
        sub     esi, 41
4777
        mov     ah, [panel_normal_color]
4778
        cmp     esi, ecx
4779
        lea     edx, [ebx+40]
4780
        jbe     @f
4781
        mov     al, '{'
4782
        mov     [edi-2], ax
4783
        add     edx, esi
4784
        sub     edx, ecx
4785
@@:
4786
        mov     esi, edx
4787
@@:
4788
        lodsb
4789
        test    al, al
4790
        jz      @f
4791
        stosw
4792
        loop    @b
4793
@@:
4794
        mov     al, ' '
4795
        rep     stosw
4796
.skip_curinfo:
4797
        call    draw_image
4798
        ret
4799
 
474 diamond 4800
fill_total_info:
4801
        mov     edi, saved_file_name+511
4802
        mov     byte [edi], ' '
180 heavyiron 4803
if lang eq ru
474 diamond 4804
        mov     byte [edi-1], 'е'
4805
        dec     edi
4806
        cmp     eax, 1
4807
        jz      @f
4808
        mov     word [edi-1], 'ах'
4809
        dec     edi
4810
@@:
4811
        mov     dword [edi-4], 'файл'
4812
        mov     byte [edi-5], ' '
4813
        sub     edi, 5
180 heavyiron 4814
else
474 diamond 4815
        cmp     eax, 1
4816
        jz      @f
4817
        dec     edi
4818
        mov     byte [edi], 's'
4819
@@:
4820
        mov     dword [edi-4], 'file'
4821
        mov     byte [edi-5], ' '
4822
        sub     edi, 5
180 heavyiron 4823
end if
474 diamond 4824
        xor     edx, edx
4825
        push    10
4826
        pop     ecx
4827
@@:
4828
        div     ecx
4829
        dec     edi
4830
        add     dl, '0'
4831
        mov     [edi], dl
4832
        xor     edx, edx
4833
        test    eax, eax
4834
        jnz     @b
180 heavyiron 4835
if lang eq ru
474 diamond 4836
        mov     dword [edi-4], 'т в '
4837
        mov     dword [edi-8], ' бай'
4838
        sub     edi, 8
180 heavyiron 4839
else
474 diamond 4840
        mov     dword [edi-4], ' in '
4841
        mov     dword [edi-8], 'ytes'
4842
        mov     word [edi-10], ' b'
4843
        sub     edi, 10
180 heavyiron 4844
end if
474 diamond 4845
        lea     esi, [edi-3]
4846
        mov     edx, [esp+8]
4847
        mov     eax, [esp+4]
4848
.selsizel:
4849
        push    edx
4850
        mov     ebx, edx
4851
        xor     edx, edx
4852
        add     ebx, ebx
4853
        adc     edx, edx
4854
        push    ebx
4855
        push    edx
4856
        add     ebx, ebx
4857
        adc     edx, edx
4858
        add     ebx, [esp+4]
4859
        adc     edx, [esp]
4860
        add     esp, 8
4861
        add     eax, ebx
4862
        adc     edx, 0
4863
        div     ecx
4864
        dec     edi
4865
        cmp     edi, esi
4866
        jae     @f
4867
        mov     byte [edi], ','
4868
        dec     edi
4869
        sub     esi, 4
4870
@@:
4871
        pop     ebx
4872
        add     dl, '0'
4873
        mov     byte [edi], dl
4874
        xchg    eax, ebx
4875
        mul     [muldiv10]
4876
        add     eax, ebx
4877
        adc     edx, 0
4878
        mov     ebx, eax
4879
        or      ebx, edx
4880
        jnz     .selsizel
4881
        dec     edi
4882
        mov     byte [edi], ' '
4883
        mov     ecx, saved_file_name+512
4884
        sub     ecx, edi
4885
        ret     8
4886
 
4887
get_file_color:
4888
        mov     ah, [esi + 6]
4889
        cmp     ebp, [active_panel]
4890
        jnz     @f
8960 IgorA 4891
        cmp     ecx, [ebp + PanelData.index]
474 diamond 4892
        jnz     @f
4893
        mov     ah, [esi + 7]
4894
@@:
4895
        test    byte [esi + 303], 1
4896
        jnz     @f
4897
        mov     ah, [esi + 4]
4898
        cmp     ebp, [active_panel]
4899
        jnz     @f
8960 IgorA 4900
        cmp     ecx, [ebp + PanelData.index]
474 diamond 4901
        jnz     @f
4902
        mov     ah, [esi + 5]
4903
@@:
4904
        ret
4905
 
4906
draw_name_column:
4907
        mov     eax, [column_index]
4908
        mov     [last_column_index], eax
8960 IgorA 4909
        mov     edx, [ebp + PanelData.numfiles]
180 heavyiron 4910
        mov     ecx, [column_height]
4911
        dec     ecx
4912
.l:
4913
        cmp     [column_index], edx
4914
        jae     .ret
4915
        push    ecx
474 diamond 4916
        mov     ecx, [column_index]
8960 IgorA 4917
        mov     esi, [ebp + PanelData.files]
474 diamond 4918
        mov     esi, [esi+ecx*4]
4919
        mov     ebx, [esi]
4920
        call    get_file_color
321 diamond 4921
        add     esi, 40
180 heavyiron 4922
        mov     ecx, [column_width]
4923
        push    edi
4924
@@:
4925
        lodsb
4926
        test    al, al
4927
        jz      @f
4928
        stosw
4929
        loop    @b
474 diamond 4930
        lodsb
4931
        test    al, al
180 heavyiron 4932
        jz      @f
4933
        mov     byte [edi], '}'
474 diamond 4934
        jmp     .continue
180 heavyiron 4935
@@:
474 diamond 4936
        test    bl, 10h
4937
        jnz     .noalignext
8960 IgorA 4938
        mov     ebx, [ebp + PanelData.colmode]
474 diamond 4939
; sizeof(PanelMode) = 40
4940
        lea     ebx, [ebx+ebx*4]
4941
        cmp     [colmodes+ebx*8+PanelMode.bAlignExtensions], 0
4942
        jz      .noalignext
4943
        push    ecx
4944
        sub     ecx, [column_width]
4945
        neg     ecx
4946
        jz      .noalignext2
4947
        dec     esi
4948
@@:
4949
        dec     esi
4950
        cmp     byte [esi], '.'
4951
        loopnz  @b
4952
        jnz     .noalignext2
4953
        inc     esi
4954
        sub     ecx, [column_width]
4955
        neg     ecx
4956
        sub     ecx, [esp]
4957
        sub     edi, ecx
4958
        sub     edi, ecx
4959
        dec     ecx
4960
        mov     ebx, [esp+4]
4961
        cmp     ecx, 3
4962
        ja      @f
4963
        mov     cl, 3
4964
@@:
4965
        sub     ecx, [column_width]
4966
        sub     ebx, edi
4967
        sar     ebx, 1
4968
        sub     ebx, ecx
4969
        pop     ecx
4970
        inc     ecx
4971
        push    0
4972
        cmp     ecx, ebx
4973
        jbe     @f
4974
        sub     ecx, ebx
4975
        mov     [esp], ecx
4976
        mov     ecx, ebx
4977
@@:
180 heavyiron 4978
        mov     al, ' '
4979
        rep     stosw
474 diamond 4980
@@:
4981
        lodsb
4982
        test    al, al
4983
        jz      .noalignext2
4984
        stosw
4985
        jmp     @b
4986
.noalignext2:
4987
        pop     ecx
4988
.noalignext:
4989
        mov     al, ' '
4990
        rep     stosw
4991
.continue:
180 heavyiron 4992
        pop     edi
4993
        add     edi, [cur_width]
4994
        add     edi, [cur_width]
4995
        inc     [column_index]
4996
        pop     ecx
4997
        dec     ecx
4998
        jnz     .l
4999
.ret:
8960 IgorA 5000
        mov     eax, [ebp + PanelData.colsz]
5001
        add     [ebp + PanelData.colst], eax
5002
        cmp     ebp, panel1
180 heavyiron 5003
        jnz     .ret2
5004
; Число экранов
814 diamond 5005
; calculate number of viewer and editor screens
5006
        xor     ebx, ebx
5007
        xor     edx, edx
5008
        mov     ecx, [num_screens]
5009
        mov     esi, [screens]
5010
.3:
5011
        lodsd
5012
        cmp     eax, viewer_vtable
5013
        jnz     @f
5014
        inc     ebx
5015
@@:
5016
        cmp     eax, editor_vtable
5017
        jnz     @f
5018
        inc     edx
5019
@@:
5020
        lodsd
5021
        loop    .3
5022
        mov     eax, ebx
5023
        mov     esi, edx
5024
        or      eax, edx
180 heavyiron 5025
        jz      .ret2
5026
        xor     eax, eax
5027
        xor     edx, edx
5028
        call    get_console_ptr
5029
        mov     al, '['
814 diamond 5030
        stosb
5031
        mov     al, [panel_nscreens_color]
5032
        stosb
5033
        xchg    eax, ebx
5034
.5:
180 heavyiron 5035
        push    -'0'
5036
@@:
5037
        xor     edx, edx
5038
        div     [_10d]
5039
        push    edx
5040
        test    eax, eax
5041
        jnz     @b
5042
@@:
5043
        pop     eax
5044
        add     eax, '0'
5045
        jz      @f
814 diamond 5046
        stosb
5047
        mov     al, bl
5048
        stosb
180 heavyiron 5049
        jmp     @b
5050
@@:
814 diamond 5051
        test    esi, esi
5052
        jz      .4
5053
        mov     al, '+'
5054
        stosb
5055
        mov     al, bl
5056
        stosb
5057
        xor     eax, eax
5058
        xchg    eax, esi
5059
        jmp     .5
5060
.4:
180 heavyiron 5061
        mov     al, ']'
5062
        mov     ah, [panel_nscreens_color]
5063
        stosw
5064
.ret2:
474 diamond 5065
draw_empty_column:
180 heavyiron 5066
        ret
5067
 
474 diamond 5068
draw_size_column:
5069
        add     edi, [column_width]
5070
        add     edi, [column_width]
5071
        dec     edi
5072
        dec     edi
5073
        std
5074
        mov     ecx, [column_height]
5075
        dec     ecx
5076
        push    [last_column_index]
5077
.l:
8960 IgorA 5078
        mov     edx, [ebp + PanelData.numfiles]
474 diamond 5079
        cmp     [last_column_index], edx
5080
        jae     .ret
5081
        push    ecx
5082
        push    edi
5083
        mov     ecx, [last_column_index]
8960 IgorA 5084
        mov     esi, [ebp + PanelData.files]
474 diamond 5085
        mov     esi, [esi+ecx*4]
5086
        call    get_file_color
5087
        mov     ecx, [column_width]
5088
@@:
5089
        mov     ebx, eax
5090
        cmp     word [esi+40], '..'
5091
        jnz     .nodotdot
5092
        cmp     byte [esi+42], 0
5093
        jnz     .nodotdot
5094
if lang eq ru
5095
        mov     al, 'х'
5096
        stosw
5097
        mov     al, 'р'
5098
        stosw
5099
        mov     al, 'е'
5100
        stosw
5101
        mov     al, 'в'
5102
        stosw
5103
        mov     al, 'В'
5104
        stosw
5105
        sub     ecx, 5
5106
else
5107
        mov     al, ' '
5108
        stosw
5109
        stosw
5110
        mov     al, 'p'
5111
        stosw
5112
        mov     al, 'U'
5113
        stosw
5114
        sub     ecx, 4
5115
end if
5116
        jmp     .size_written
5117
.nodotdot:
5118
        test    byte [esi], 10h
5119
        jz      .nofolder
5120
if lang eq ru
5121
        mov     al, 'а'
5122
        stosw
5123
        mov     al, 'к'
5124
        stosw
5125
        mov     al, 'п'
5126
        stosw
5127
        mov     al, 'а'
5128
        stosw
5129
        mov     al, 'П'
5130
        stosw
5131
        sub     ecx, 5
5132
else
5133
        mov     al, 'r'
5134
        stosw
5135
        mov     al, 'e'
5136
        stosw
5137
        mov     al, 'd'
5138
        stosw
5139
        mov     al, 'l'
5140
        stosw
5141
        mov     al, 'o'
5142
        stosw
5143
        mov     al, 'F'
5144
        stosw
5145
        sub     ecx, 6
5146
end if
5147
        jmp     .size_written
5148
.nofolder:
5149
        mov     eax, [esi+32]
5150
        mov     edx, [esi+36]
5151
        test    edx, edx
5152
        jz      .less_4G
5153
        cmp     edx, 10000/4*1024
5154
        jb      .giga
5155
        mov     al, 'T'
5156
        shr     edx, 10
5157
        jmp     .write_letter
5158
.giga:
5159
        mov     al, 'G'
5160
        shl     edx, 2
5161
        jmp     .write_letter
5162
.less_4G:
5163
        mov     edx, eax
5164
        cmp     eax, 1000000
5165
        jb      .byte
5166
        cmp     eax, 10000*1024
5167
        jb      .kilo
5168
        mov     al, 'M'
5169
        shr     edx, 20
5170
        jmp     .write_letter
5171
.kilo:
5172
        mov     al, 'K'
5173
        shr     edx, 10
5174
.write_letter:
5175
        mov     ah, bh
5176
        stosw
5177
        mov     al, ' '
5178
        stosw
5179
        dec     ecx
5180
        dec     ecx
5181
.byte:
5182
        xchg    eax, edx
5183
        xor     edx, edx
5184
        div     [_10d]
5185
        xchg    eax, edx
5186
        add     al, '0'
5187
        mov     ah, bh
5188
        stosw
5189
        dec     ecx
5190
        test    edx, edx
5191
        jnz     .byte
5192
.size_written:
5193
        mov     eax, ebx
5194
        test    ecx, ecx
5195
        jle     @f
5196
        mov     al, ' '
5197
        rep     stosw
5198
@@:
5199
        mov     byte [edi+1], ah
5200
        pop     edi
5201
        add     edi, [cur_width]
5202
        add     edi, [cur_width]
5203
        inc     [last_column_index]
5204
        pop     ecx
5205
        dec     ecx
5206
        jnz     .l
5207
.ret:
5208
        pop     [last_column_index]
5209
        cld
5210
        ret
5211
 
5212
draw_date_column:
5213
        mov     ecx, [column_height]
5214
        dec     ecx
5215
        push    [last_column_index]
5216
.l:
8960 IgorA 5217
        mov     edx, [ebp + PanelData.numfiles]
474 diamond 5218
        cmp     [last_column_index], edx
5219
        jae     .ret
5220
        push    ecx
5221
        push    edi
5222
        mov     ecx, [last_column_index]
8960 IgorA 5223
        mov     esi, [ebp + PanelData.files]
474 diamond 5224
        mov     esi, [esi+ecx*4]
5225
        call    get_file_color
5226
        mov     bh, ah
5227
        mov     byte [edi-1], bh
5228
        mov     al, [esi+28]
5229
        aam
5230
        add     eax, '00'
5231
        push    eax
5232
        mov     al, ah
5233
        mov     ah, bh
5234
        stosw
5235
        pop     eax
5236
        mov     ah, bh
5237
        stosw
5238
        mov     al, '.'
5239
        stosw
5240
        mov     al, [esi+29]
5241
        aam
5242
        add     eax, '00'
5243
        push    eax
5244
        mov     al, ah
5245
        mov     ah, bh
5246
        stosw
5247
        pop     eax
5248
        mov     ah, bh
5249
        stosw
5250
        mov     al, '.'
5251
        stosw
5252
        movzx   eax, word [esi+30]
5253
        xor     edx, edx
5254
        div     [_10d]
5255
        xchg    eax, edx
5256
        add     al, '0'
5257
        mov     ah, bh
5258
        mov     [edi+2], ax
5259
        xchg    eax, edx
5260
        xor     edx, edx
5261
        div     [_10d]
5262
        xchg    eax, edx
5263
        add     al, '0'
5264
        mov     ah, bh
5265
        stosw
5266
        pop     edi
5267
        add     edi, [cur_width]
5268
        add     edi, [cur_width]
5269
        inc     [last_column_index]
5270
        pop     ecx
5271
        dec     ecx
5272
        jnz     .l
5273
.ret:
5274
        pop     [last_column_index]
5275
        cld
5276
        ret
5277
 
5278
draw_time_column:
5279
        mov     ecx, [column_height]
5280
        dec     ecx
5281
        push    [last_column_index]
5282
.l:
8960 IgorA 5283
        mov     edx, [ebp + PanelData.numfiles]
474 diamond 5284
        cmp     [last_column_index], edx
5285
        jae     .ret
5286
        push    ecx
5287
        push    edi
5288
        mov     ecx, [last_column_index]
8960 IgorA 5289
        mov     esi, [ebp + PanelData.files]
474 diamond 5290
        mov     esi, [esi+ecx*4]
5291
        call    get_file_color
5292
        mov     bh, ah
5293
        mov     byte [edi-1], bh
5294
        mov     al, [esi+26]
5295
        aam
5296
        add     eax, '00'
5297
        push    eax
5298
        mov     al, ah
5299
        mov     ah, bh
5300
        stosw
5301
        pop     eax
5302
        mov     ah, bh
5303
        stosw
5304
        mov     al, ':'
5305
        stosw
5306
        mov     al, [esi+25]
5307
        aam
5308
        add     eax, '00'
5309
        push    eax
5310
        mov     al, ah
5311
        mov     ah, bh
5312
        stosw
5313
        pop     eax
5314
        mov     ah, bh
5315
        stosw
5316
        pop     edi
5317
        add     edi, [cur_width]
5318
        add     edi, [cur_width]
5319
        inc     [last_column_index]
5320
        pop     ecx
5321
        dec     ecx
5322
        jnz     .l
5323
.ret:
5324
        pop     [last_column_index]
5325
        cld
5326
        ret
5327
 
180 heavyiron 5328
;insert_last_dot:
5329
;        push    eax esi
5330
;        mov     ah, 0
5331
;.loop:
5332
;        lodsb
5333
;        test    al, al
5334
;        jz      .done
5335
;        cmp     al, '.'
5336
;        jnz     .loop
5337
;        mov     ah, 1
5338
;        jmp     .loop
5339
;.done:
5340
;        test    ah, ah
5341
;        jnz     @f
5342
;        mov     byte [esi-1], '.'
5343
;        mov     byte [esi], 0
5344
;@@:
5345
;        pop     esi eax
5346
;        ret
5347
 
5348
;delete_last_dot:
5349
;        push    esi
5350
;@@:
5351
;        cmp     byte [esi], 0
5352
;        jz      @f
5353
;        inc     esi
5354
;        jmp     @b
5355
;@@:
5356
;        cmp     byte [esi-1], '.'
5357
;        jnz     @f
5358
;        mov     byte [esi-1], 0
5359
;@@:     pop     esi
5360
;        ret
5361
 
5362
read_folder:
8960 IgorA 5363
        mov     eax, [ebp + PanelData.nfa]
180 heavyiron 5364
        mov     [dirinfo.size], eax
5365
        shl     eax, 2
8960 IgorA 5366
        add     eax, [ebp + PanelData.files]
180 heavyiron 5367
        mov     [dirinfo.dirdata], eax
8960 IgorA 5368
        lea     eax, [ebp + PanelData.dir]
180 heavyiron 5369
        mov     [dirinfo.name], eax
474 diamond 5370
        xor     eax, eax
8960 IgorA 5371
        mov     [ebp + PanelData.total_num], eax
5372
        mov     dword [ebp + PanelData.total_size], eax
5373
        mov     dword [ebp + PanelData.total_size+4], eax
5374
        mov     [ebp + PanelData.selected_num], eax
5375
        mov     dword [ebp + PanelData.selected_size], eax
5376
        mov     dword [ebp + PanelData.selected_size+4], eax
314 diamond 5377
.retry:
8960 IgorA 5378
        mov     eax, [ebp + PanelData.hPlugin]
589 diamond 5379
        test    eax, eax
5380
        jz      .native
5381
        mov     ecx, [dirinfo.size]
8960 IgorA 5382
        test    [ebp + PanelData.plugin_flags], 1
589 diamond 5383
        jz      @f
5384
        dec     ecx     ; reserve one entry for '..'
5385
@@:
5386
        push    ebp
5387
        push    [dirinfo.dirdata]
5388
        push    ecx
5389
        push    0
8960 IgorA 5390
        push    [ebp + PanelData.hFile]
589 diamond 5391
        call    [eax + PluginInfo.ReadFolder]
5392
        pop     ebp
5393
        mov     ebx, [dirinfo.dirdata]
5394
        mov     ebx, [ebx+4]
5395
        jmp     .read
5396
.native:
8932 IgorA 5397
        push    SF_FILE
180 heavyiron 5398
        pop     eax
5399
        mov     ebx, dirinfo
517 diamond 5400
        int     40h
589 diamond 5401
.read:
180 heavyiron 5402
        test    eax, eax
5403
        jz      .ok
5404
        cmp     eax, 6
5405
        jz      .ok
314 diamond 5406
; Failed to read folder, notify user
5407
        cmp     [bSilentFolderMode], 0
5408
        jnz     .dont_notify
474 diamond 5409
        push    dword aContinue
5410
        push    dword aRetry
314 diamond 5411
        mov     edx, esp
5412
        call    get_error_msg
5413
        push    [dirinfo.name]
474 diamond 5414
        push    dword aCannotReadFolder
314 diamond 5415
        push    eax
5416
        mov     eax, esp
5417
        push    edx
5418
        push    2
5419
        push    eax
5420
        push    3
5421
        call    SayErr
5422
        add     esp, 5*4
5423
        test    eax, eax
5424
        jz      .retry
5425
.dont_notify:
589 diamond 5426
; If not on plugin panel, try to return to previous directory
8960 IgorA 5427
        cmp     [ebp + PanelData.hPlugin], 0
589 diamond 5428
        jnz     @f
314 diamond 5429
        mov     esi, prev_dir
5430
        cmp     byte [esi], 0
5431
        jz      @f
8960 IgorA 5432
        lea     edi, [ebp + PanelData.dir]
314 diamond 5433
        mov     ecx, 1024/4
5434
        rep     movsd
5435
        mov     byte [prev_dir], 0
5436
        ret
5437
@@:
5438
        mov     [bSilentFolderMode], 1  ; enter silent mode
589 diamond 5439
; Try to read parent folder
314 diamond 5440
        mov     esi, [dirinfo.name]
5441
        xor     edx, edx
5442
.up1:
5443
        lodsb
5444
        test    al, al
5445
        jz      .up1done
5446
        cmp     al, '/'
5447
        jnz     .up1
5448
        inc     edx
5449
        lea     edi, [esi-1]
5450
        jmp     .up1
5451
.up1done:
8960 IgorA 5452
        cmp     [ebp + PanelData.hPlugin], 0
589 diamond 5453
        jz      .4
5454
        cmp     edx, 1
5455
        ja      .up
5456
; чтение с панели плагина обломалось по полной
5457
; при этом мы уже в корне
5458
; делаем вид, что функция чтения вернула 0 элементов
5459
; (если нужен вход "..", он будет добавлен автоматически)
5460
        xor     ebx, ebx        ; 0 items read
5461
        mov     eax, [dirinfo.dirdata]
5462
        mov     [eax+8], ebx    ; 0 items total
5463
        jmp     .ok
5464
.4:
314 diamond 5465
        cmp     edx, 2
5466
        jbe     .noup
589 diamond 5467
.up:
314 diamond 5468
        stosb
5469
        jmp     read_folder
5470
.noup:
589 diamond 5471
; There is no parent folder, and we are not on plugin panel
5472
; Try to read ramdisk
314 diamond 5473
        mov     esi, [dirinfo.name]
5474
        mov     edi, esi
5475
        lodsd
5476
        or      eax, 0x00202000
5477
        cmp     eax, '/rd/'
5478
        jnz     @f
5479
        lodsw
5480
        cmp     ax, '1'
5481
        jz      .nosetrd
5482
@@:
5483
        mov     eax, '/rd/'
5484
        stosd
5485
        mov     ax, '1'
5486
        stosw
5487
        jmp     read_folder
5488
.nosetrd:
5489
; Даже рамдиск не прочитался. Значит, не судьба...
8960 IgorA 5490
        and     dword [ebp + PanelData.numfiles], 0
5491
        and     dword [ebp + PanelData.index], 0
5492
        and     dword [ebp + PanelData.start], 0
314 diamond 5493
        mov     [bSilentFolderMode], 0  ; leave silent mode
180 heavyiron 5494
        ret
5495
.ok:
5496
        mov     eax, [dirinfo.dirdata]
5497
        cmp     [eax+8], ebx
5498
        jz      .readdone
474 diamond 5499
        push    dword [eax+8]
8960 IgorA 5500
        mov     ecx, [ebp + PanelData.files]
474 diamond 5501
        call    pgfree
5502
        pop     ecx
5503
        add     ecx, 0xF
5504
        and     ecx, not 0xF
5505
        push    ecx
5506
        imul    ecx, 4+304
5507
        add     ecx, 32
5508
        call    xpgalloc
180 heavyiron 5509
        test    eax, eax
5510
        jnz     .succ1
5511
        pop     eax
5512
        jmp     .readdone
5513
.succ1:
8960 IgorA 5514
        mov     [ebp + PanelData.files], eax
5515
        pop     [ebp + PanelData.nfa]
321 diamond 5516
        mov     [prev_dir], 0
180 heavyiron 5517
        jmp     read_folder
5518
.readdone:
589 diamond 5519
        xor     edx, edx
8960 IgorA 5520
        mov     [ebp + PanelData.start], edx
5521
        mov     [ebp + PanelData.index], edx
5522
        mov     [ebp + PanelData.start], edx
5523
        mov     edi, [ebp + PanelData.files]
5524
        mov     eax, [ebp + PanelData.nfa]
321 diamond 5525
        lea     eax, [edi + eax*4 + 32]
5526
        mov     ecx, [eax-32+4]
283 diamond 5527
        test    ecx, ecx
5528
        jz      .loopdone
180 heavyiron 5529
; Игнорируем специальные входы, соответствующие папке '.' и метке тома
5530
.ptrinit:
321 diamond 5531
        cmp     word [eax+40], '.'
180 heavyiron 5532
        jz      .loopcont
321 diamond 5533
        test    byte [eax], 8
180 heavyiron 5534
        jnz     .loopcont
474 diamond 5535
        mov     byte [eax+303], 0
321 diamond 5536
        test    edx, edx
5537
        jnz     .nodotdot
5538
        cmp     word [eax+40], '..'
5539
        jnz     .nodotdot
5540
        cmp     byte [eax+42], 0
5541
        jnz     .nodotdot
5542
        mov     edx, eax
5543
        push    edi
5544
@@:
8960 IgorA 5545
        cmp     edi, [ebp + PanelData.files]
321 diamond 5546
        jbe     @f
5547
        push    dword [edi-4]
5548
        pop     dword [edi]
5549
        sub     edi, 4
5550
        jmp     @b
5551
@@:
180 heavyiron 5552
        stosd
321 diamond 5553
        pop     edi
5554
        scasd
5555
        jmp     .dotdot
5556
.nodotdot:
5557
        stosd
474 diamond 5558
        xor     ebx, ebx
5559
        test    byte [eax], 10h
5560
        setz    bl
8960 IgorA 5561
        add     [ebp + PanelData.total_num], ebx
474 diamond 5562
        mov     ebx, dword [eax+32]
8960 IgorA 5563
        add     dword [ebp + PanelData.total_size], ebx
474 diamond 5564
        mov     ebx, dword [eax+36]
8960 IgorA 5565
        adc     dword [ebp + PanelData.total_size+4], ebx
321 diamond 5566
.dotdot:
283 diamond 5567
; подсветка
5568
;        call    insert_last_dot
589 diamond 5569
        call    highlight_init
5570
;        call    delete_last_dot
5571
.loopcont:
5572
        add     eax, 304
5573
        dec     ecx
5574
        jnz     .ptrinit
5575
.loopdone:
5576
        push    edi
8960 IgorA 5577
        sub     edi, [ebp + PanelData.files]
589 diamond 5578
        shr     edi, 2
8960 IgorA 5579
        mov     [ebp + PanelData.numfiles], edi
589 diamond 5580
        pop     edi
5581
        test    edx, edx
5582
        jnz     @f
8960 IgorA 5583
        test    [ebp + PanelData.plugin_flags], 1
589 diamond 5584
        jz      @f
8960 IgorA 5585
        mov     ecx, [ebp + PanelData.numfiles]
5586
        inc     [ebp + PanelData.numfiles]
589 diamond 5587
        lea     esi, [edi-4]
5588
        std
5589
        rep     movsd
5590
        cld
5591
        mov     eax, left_dotdot_entry
8960 IgorA 5592
        cmp     ebp, panel1
589 diamond 5593
        jz      .zq
5594
        add     eax, right_dotdot_entry-left_dotdot_entry
5595
.zq:
5596
        stosd
5597
        call    highlight_init
5598
@@:
5599
; Сортировка
5600
sort_files:
8960 IgorA 5601
        movzx   eax, [ebp + PanelData.sortmode]
589 diamond 5602
        mov     ebx, [compare_fns + eax*4]
5603
.mode:
8960 IgorA 5604
        mov     edx, [ebp + PanelData.files]
5605
        mov     ecx, [ebp + PanelData.numfiles]
589 diamond 5606
        jecxz   .skip
5607
        mov     eax, [edx]
5608
        cmp     word [eax+40], '..'
5609
        jnz     .nodotdot
5610
        cmp     byte [eax+42], 0
5611
        jnz     .nodotdot
5612
        dec     ecx
5613
        add     edx, 4
5614
.nodotdot:
5615
        call    sort
5616
.skip:
5617
        mov     [bSilentFolderMode], 0  ; leave silent mode
5618
        ret
5619
 
5620
highlight_init:
283 diamond 5621
        pushad
321 diamond 5622
        mov     ebp, eax
283 diamond 5623
        lea     esi, [ebp+40]
5624
        mov     edi, lower_file_name
5625
        mov     edx, edi
474 diamond 5626
        xor     eax, eax
283 diamond 5627
@@:
5628
        lodsb
474 diamond 5629
        mov     al, [tolower_table+eax]
283 diamond 5630
        stosb
5631
        test    al, al
5632
        jnz     @b
5633
        mov     esi, edx
5634
        lea     edx, [edi-1]
5635
        xor     ecx, ecx
5636
.highlight_test_loop:
5637
        mov     ebx, [highlight_groups+ecx*4]
5638
        mov     al, [ebx + highlight.IncludeAttributes]
5639
        mov     ah, [ebp]
5640
        and     ah, al
5641
        cmp     ah, al
5642
        jnz     .highlight_test_failed
5643
        lea     edi, [ebx + highlight.Mask]
5644
        call    match_mask_rev_lowercase
5645
        jc      .highlight_test_failed
5646
        mov     ah, [ebx + highlight.NormalColor]
5647
        test    ah, ah
5648
        jnz     @f
5649
        mov     ah, [panel_normal_color]
5650
@@:
474 diamond 5651
        mov     [ebp+4], ah
283 diamond 5652
        mov     ah, [ebx + highlight.CursorColor]
5653
        test    ah, ah
5654
        jnz     @f
5655
        mov     ah, [panel_cursor_color]
5656
@@:
474 diamond 5657
        mov     [ebp+5], ah
5658
        mov     ah, [ebx + highlight.SelectedColor]
5659
        test    ah, ah
5660
        jnz     @f
5661
        mov     ah, [panel_selected_color]
5662
@@:
283 diamond 5663
        mov     [ebp+6], ah
474 diamond 5664
        mov     ah, [ebx + highlight.SelectedCursorColor]
5665
        test    ah, ah
5666
        jnz     @f
5667
        mov     ah, [panel_selected_cursor_color]
5668
@@:
5669
        mov     [ebp+7], ah
283 diamond 5670
        jmp     .doname
5671
.highlight_test_failed:
5672
        inc     ecx
5673
        cmp     ecx, [highlight_num_groups]
5674
        jb      .highlight_test_loop
5675
.nohighlight:
5676
        mov     ah, [panel_normal_color]
474 diamond 5677
        mov     [ebp+4], ah
5678
        mov     ah, [panel_cursor_color]
283 diamond 5679
        mov     [ebp+5], ah
474 diamond 5680
        mov     ah, [panel_selected_color]
283 diamond 5681
        mov     [ebp+6], ah
474 diamond 5682
        mov     ah, [panel_selected_cursor_color]
5683
        mov     [ebp+7], ah
283 diamond 5684
.doname:
5685
        popad
180 heavyiron 5686
        ret
5687
 
5688
compare_name:
5689
        test    byte [esi], 10h
5690
        jnz     .1dir
5691
        test    byte [edi], 10h
5692
        jnz     .greater
5693
.eq1:
5694
        add     esi, 40
5695
        add     edi, 40
5696
        jmp     strcmpi
5697
.greater:
5698
        test    esi, esi
5699
        ret
5700
.1dir:
5701
        test    byte [edi], 10h
5702
        jnz     .eq1
5703
.less:
5704
        xor     edi, edi
5705
        stc
5706
        ret
5707
 
5708
compare_name_rev:
5709
        test    byte [esi], 10h
5710
        jnz     .1dir
5711
        test    byte [edi], 10h
5712
        jnz     .greater
5713
.eq1:
5714
        add     esi, 40
5715
        add     edi, 40
5716
        xchg    esi, edi
5717
        jmp     strcmpi
5718
.greater:
5719
        test    esi, esi
5720
        ret
5721
.1dir:
5722
        test    byte [edi], 10h
5723
        jnz     .eq1
5724
.less:
5725
        xor     edi, edi
5726
        stc
5727
        ret
5728
 
5729
strcmpi:
5730
        push    eax
5731
@@:
5732
        lodsb
5733
        call    match_symbol
5734
        jnz     .ret
5735
        inc     edi
5736
        test    al, al
5737
        jnz     @b
5738
.ret:
5739
        pop     eax
5740
        ret
5741
 
5742
compare_ext:
5743
        test    byte [esi], 10h
5744
        jnz     .1dir
5745
        test    byte [edi], 10h
5746
        jnz     .greater
5747
.eq1:
5748
        add     esi, 40
5749
        add     edi, 40
5750
        push    esi edi
5751
        call    seek_ext
5752
        xchg    esi, edi
5753
        call    seek_ext
5754
        xchg    esi, edi
5755
        call    strcmpi
5756
        jnz     .ret
5757
        pop     edi esi
5758
        jmp     strcmpi
5759
.ret:
5760
        pop     edi esi
5761
        ret
5762
.greater:
5763
        test    esi, esi
5764
        ret
5765
.1dir:
5766
        test    byte [edi], 10h
5767
        jnz     .eq1
5768
.less:
5769
        xor     edi, edi
5770
        stc
5771
        ret
5772
 
5773
compare_ext_rev:
5774
        test    byte [esi], 10h
5775
        jnz     .1dir
5776
        test    byte [edi], 10h
5777
        jnz     .greater
5778
.eq1:
5779
        add     esi, 40
5780
        add     edi, 40
5781
        push    esi edi
5782
        call    seek_ext
5783
        xchg    esi, edi
5784
        call    seek_ext
5785
        call    strcmpi
5786
        jnz     .ret
5787
        pop     edi esi
5788
        xchg    esi, edi
5789
        jmp     strcmpi
5790
.ret:
5791
        pop     edi esi
5792
        ret
5793
.greater:
5794
        test    esi, esi
5795
        ret
5796
.1dir:
5797
        test    byte [edi], 10h
5798
        jnz     .eq1
5799
.less:
5800
        xor     edi, edi
5801
        stc
5802
        ret
5803
 
5804
seek_ext:
5805
        push    eax
5806
        xor     eax, eax
5807
.l:
5808
        inc     esi
5809
        cmp     byte [esi-1], '.'
5810
        jnz     @f
5811
        mov     eax, esi
5812
@@:
5813
        cmp     byte [esi-1], 0
5814
        jnz     .l
5815
        test    eax, eax
5816
        jnz     @f
5817
        lea     eax, [esi-1]
5818
@@:
5819
        mov     esi, eax
5820
        pop     eax
5821
        ret
5822
 
5823
compare_modified:
5824
        test    byte [esi], 10h
5825
        jnz     .1dir
5826
        test    byte [edi], 10h
5827
        jnz     .greater
5828
.eq1:
5829
        push    edi
5830
        mov     edi, [edi+28]
5831
        cmp     edi, [esi+28]
5832
        pop     edi
5833
        jnz     @f
5834
        push    edi
5835
        mov     edi, [edi+24]
5836
        cmp     edi, [esi+24]
5837
        pop     edi
5838
        jnz     @f
5839
        add     esi, 40
5840
        add     edi, 40
5841
        jmp     strcmpi
5842
@@:
5843
        ret
5844
.greater:
5845
        test    esi, esi
5846
        ret
5847
.1dir:
5848
        test    byte [edi], 10h
5849
        jnz     .eq1
5850
.less:
5851
        xor     edi, edi
5852
        stc
5853
        ret
5854
 
5855
compare_modified_rev:
5856
        test    byte [esi], 10h
5857
        jnz     .1dir
5858
        test    byte [edi], 10h
5859
        jnz     .greater
5860
.eq1:
5861
        push    esi
5862
        mov     esi, [esi+28]
5863
        cmp     esi, [edi+28]
5864
        pop     esi
5865
        jnz     @f
5866
        push    esi
5867
        mov     esi, [esi+24]
5868
        cmp     esi, [edi+24]
5869
        pop     esi
5870
        jnz     @f
5871
        add     esi, 40
5872
        add     edi, 40
5873
        xchg    esi, edi
5874
        jmp     strcmpi
5875
@@:
5876
        ret
5877
.greater:
5878
        test    esi, esi
5879
        ret
5880
.1dir:
5881
        test    byte [edi], 10h
5882
        jnz     .eq1
5883
.less:
5884
        xor     edi, edi
5885
        stc
5886
        ret
5887
 
5888
compare_size:
5889
        test    byte [esi], 10h
5890
        jnz     .1dir
5891
        test    byte [edi], 10h
5892
        jnz     .greater
5893
.eq1:
5894
        push    edi
5895
        mov     edi, [edi+36]
5896
        cmp     edi, [esi+36]
5897
        pop     edi
5898
        jnz     @f
5899
        push    edi
5900
        mov     edi, [edi+32]
5901
        cmp     edi, [esi+32]
5902
        pop     edi
5903
        jnz     @f
5904
        add     esi, 40
5905
        add     edi, 40
5906
        jmp     strcmpi
5907
@@:
5908
        ret
5909
.greater:
5910
        test    esi, esi
5911
        ret
5912
.1dir:
5913
        test    byte [edi], 10h
5914
        jnz     .eq1
5915
.less:
5916
        xor     edi, edi
5917
        stc
5918
        ret
5919
 
5920
compare_size_rev:
5921
        test    byte [esi], 10h
5922
        jnz     .1dir
5923
        test    byte [edi], 10h
5924
        jnz     .greater
5925
.eq1:
5926
        push    esi
5927
        mov     esi, [esi+36]
5928
        cmp     esi, [edi+36]
5929
        pop     esi
5930
        jnz     @f
5931
        push    esi
5932
        mov     esi, [esi+32]
5933
        cmp     esi, [edi+32]
5934
        pop     esi
5935
        jnz     @f
5936
        add     esi, 40
5937
        add     edi, 40
5938
        xchg    esi, edi
5939
        jmp     strcmpi
5940
@@:
5941
        ret
5942
.greater:
5943
        test    esi, esi
5944
        ret
5945
.1dir:
5946
        test    byte [edi], 10h
5947
        jnz     .eq1
5948
.less:
5949
        xor     edi, edi
5950
        stc
5951
        ret
5952
 
5953
compare_unordered:
5954
        cmp     esi, edi
5955
        ret
5956
compare_unordered_rev:
5957
        cmp     edi, esi
5958
        ret
5959
 
5960
compare_created:
5961
        test    byte [esi], 10h
5962
        jnz     .1dir
5963
        test    byte [edi], 10h
5964
        jnz     .greater
5965
.eq1:
5966
        push    edi
5967
        mov     edi, [edi+12]
5968
        cmp     edi, [esi+12]
5969
        pop     edi
5970
        jnz     @f
5971
        push    edi
5972
        mov     edi, [edi+8]
5973
        cmp     edi, [esi+8]
5974
        pop     edi
5975
        jnz     @f
5976
        add     esi, 40
5977
        add     edi, 40
5978
        jmp     strcmpi
5979
@@:
5980
        ret
5981
.greater:
5982
        test    esi, esi
5983
        ret
5984
.1dir:
5985
        test    byte [edi], 10h
5986
        jnz     .eq1
5987
.less:
5988
        xor     edi, edi
5989
        stc
5990
        ret
5991
 
5992
compare_created_rev:
5993
        test    byte [esi], 10h
5994
        jnz     .1dir
5995
        test    byte [edi], 10h
5996
        jnz     .greater
5997
.eq1:
5998
        push    esi
5999
        mov     esi, [esi+12]
6000
        cmp     esi, [edi+12]
6001
        pop     esi
6002
        jnz     @f
6003
        push    esi
6004
        mov     esi, [esi+8]
6005
        cmp     esi, [edi+8]
6006
        pop     esi
6007
        jnz     @f
6008
        add     esi, 40
6009
        add     edi, 40
6010
        xchg    esi, edi
6011
        jmp     strcmpi
6012
@@:
6013
        ret
6014
.greater:
6015
        test    esi, esi
6016
        ret
6017
.1dir:
6018
        test    byte [edi], 10h
6019
        jnz     .eq1
6020
.less:
6021
        xor     edi, edi
6022
        stc
6023
        ret
6024
 
6025
compare_accessed:
6026
        test    byte [esi], 10h
6027
        jnz     .1dir
6028
        test    byte [edi], 10h
6029
        jnz     .greater
6030
.eq1:
6031
        push    edi
6032
        mov     edi, [edi+20]
6033
        cmp     edi, [esi+20]
6034
        pop     edi
6035
        jnz     @f
6036
        push    edi
6037
        mov     edi, [edi+16]
6038
        cmp     edi, [esi+16]
6039
        pop     edi
6040
        jnz     @f
6041
        add     esi, 40
6042
        add     edi, 40
6043
        jmp     strcmpi
6044
@@:
6045
        ret
6046
.greater:
6047
        test    esi, esi
6048
        ret
6049
.1dir:
6050
        test    byte [edi], 10h
6051
        jnz     .eq1
6052
.less:
6053
        xor     edi, edi
6054
        stc
6055
        ret
6056
 
6057
compare_accessed_rev:
6058
        test    byte [esi], 10h
6059
        jnz     .1dir
6060
        test    byte [edi], 10h
6061
        jnz     .greater
6062
.eq1:
6063
        push    esi
6064
        mov     esi, [esi+20]
6065
        cmp     esi, [edi+20]
6066
        pop     esi
6067
        jnz     @f
6068
        push    esi
6069
        mov     esi, [esi+16]
6070
        cmp     esi, [edi+16]
6071
        pop     esi
6072
        jnz     @f
6073
        add     esi, 40
6074
        add     edi, 40
6075
        xchg    esi, edi
6076
        jmp     strcmpi
6077
@@:
6078
        ret
6079
.greater:
6080
        test    esi, esi
6081
        ret
6082
.1dir:
6083
        test    byte [edi], 10h
6084
        jnz     .eq1
6085
.less:
6086
        xor     edi, edi
6087
        stc
6088
        ret
6089
 
589 diamond 6090
ReadFolder_default:
6091
        mov     eax, 2
6092
        ret     10h
6093
 
283 diamond 6094
if 0
589 diamond 6095
; Following subroutines work, but are slow
180 heavyiron 6096
match_mask:
6097
; in: esi->name, edi->mask
6098
; out: CF clear <=> match
6099
        pusha
6100
        xchg    esi, edi
6101
.main_cycle:
6102
        push    esi
6103
@@:
6104
        lodsb
6105
        test    al, al
6106
        jz      @f
6107
        cmp     al, ','
6108
        jz      @f
6109
        cmp     al, '|'
6110
        jnz     @b
6111
@@:
6112
        mov     [esi-1], byte 0
6113
        xchg    esi, [esp]
6114
        call    match_single_mask
6115
        pop     esi
6116
        mov     [esi-1], al
6117
        jnc     .found
6118
        cmp     al, ','
6119
        jz      .main_cycle
6120
.done_fail:
6121
        stc
6122
        popa
6123
        ret
6124
.found:
6125
        test    al, al
6126
        jz      .done_succ
6127
        cmp     al, '|'
6128
        jz      .test_exclude
6129
        lodsb
6130
        jmp     .found
6131
.done_succ:
6132
        clc
6133
        popa
6134
        ret
6135
.test_exclude:
6136
        push    esi
6137
@@:
6138
        lodsb
6139
        test    al, al
6140
        jz      @f
6141
        cmp     al, ','
6142
        jnz     @b
6143
@@:
6144
        mov     byte [esi-1], 0
6145
        xchg    esi, [esp]
6146
        call    match_single_mask
6147
        pop     esi
6148
        mov     [esi-1], al
6149
        jnc     .done_fail
6150
        test    al, al
6151
        jz      .done_succ
6152
        jmp     .test_exclude
6153
 
6154
match_single_mask:
6155
; in: esi->mask, edi->name
6156
; out: CF clear <=> match
6157
        pusha
6158
.mask_symbol:
6159
        lodsb
6160
        test    al, al
6161
        jz      .mask_done
6162
        cmp     al, '*'
6163
        jz      .asterisk
6164
        cmp     al, '?'
6165
        jz      .quest
6166
        cmp     al, '['
6167
        jz      .list
6168
        call    match_symbol
6169
        jnz     .done_fail
6170
        inc     edi
6171
        jmp     .mask_symbol
6172
.done_fail:
6173
        stc
6174
        popa
6175
        ret
6176
.mask_done:
6177
        scasb
6178
        jnz     .done_fail
6179
.done_succ:
6180
        clc
6181
        popa
6182
        ret
6183
.quest:
6184
        mov     al, 0
6185
        scasb
6186
        jz      .done_fail
6187
        jmp     .mask_symbol
6188
.list:
6189
        lodsb
6190
        cmp     al, ']'
6191
        jz      .done_fail
6192
        cmp     byte [esi+1], '-'
6193
        jz      .range
6194
        call    match_symbol
6195
        jnz     .list
6196
.listok:
6197
        inc     edi
6198
@@:
6199
        lodsb
6200
        cmp     al, ']'
6201
        jnz     @b
6202
        jmp     .mask_symbol
6203
.range:
6204
        call    match_symbol
6205
        ja      @f
6206
        mov     al, [esi+2]
6207
        call    match_symbol
6208
        jae     .listok
6209
@@:
6210
        inc     esi
6211
        jmp     .list
6212
.asterisk:
283 diamond 6213
        cmp     byte [esi], 0
6214
        jz      .done_succ
6215
        cmp     byte [esi], '?'
6216
        jnz     @f
6217
        mov     al, 0
6218
        scasb
6219
        jz      .done_fail
6220
        inc     esi
6221
        jmp     .asterisk
6222
@@:
6223
        cmp     byte [esi], '['
6224
        jz      .asterisk_common
6225
; the mask is ...*...
6226
.asterisk_normal:
6227
        mov     al, [esi]
6228
@@:
6229
        cmp     byte [edi], 0
6230
        jz      .done_fail
6231
        call    match_symbol
6232
        jz      @f
6233
        inc     edi
6234
        jmp     @b
6235
@@:
6236
        inc     edi
6237
        inc     esi
6238
        call    match_single_mask
6239
        jnc     .done_succ
6240
        dec     esi
6241
        jmp     .asterisk_normal
6242
.asterisk_common:
180 heavyiron 6243
        push    edi
6244
@@:
6245
        call    match_single_mask
6246
        jnc     @f
6247
        mov     al, 0
6248
        scasb
6249
        jnz     @b
6250
        pop     edi
6251
        jmp     .done_fail
6252
@@:
6253
        pop     edi
6254
        jmp     .done_succ
6255
 
283 diamond 6256
match_mask_rev:
6257
; in: esi->name, edx->end of name, edi->mask
6258
; out: CF clear <=> match
6259
        pusha
6260
        xchg    esi, edx
6261
        xchg    esi, edi
6262
.main_cycle:
6263
        mov     ecx, esi
6264
@@:
6265
        lodsb
6266
        test    al, al
6267
        jz      @f
6268
        cmp     al, ','
6269
        jz      @f
6270
        cmp     al, '|'
6271
        jnz     @b
6272
@@:
6273
        dec     esi
6274
        mov     [esi], byte 0
6275
        call    match_single_mask_rev2
6276
        mov     [esi], al
6277
        inc     esi
6278
        jnc     .found
6279
        cmp     al, ','
6280
        jz      .main_cycle
6281
.done_fail:
6282
        stc
6283
        popa
6284
        ret
6285
.found:
6286
        test    al, al
6287
        jz      .done_succ
6288
        cmp     al, '|'
6289
        jz      .test_exclude
6290
        lodsb
6291
        jmp     .found
6292
.done_succ:
6293
        clc
6294
        popa
6295
        ret
6296
.test_exclude:
6297
        mov     ecx, esi
6298
@@:
6299
        lodsb
6300
        test    al, al
6301
        jz      @f
6302
        cmp     al, ','
6303
        jnz     @b
6304
@@:
6305
        dec     esi
6306
        mov     byte [esi], 0
6307
        call    match_single_mask_rev2
6308
        mov     [esi], al
6309
        inc     esi
6310
        jnc     .done_fail
6311
        test    al, al
6312
        jz      .done_succ
6313
        jmp     .test_exclude
6314
 
6315
match_single_mask_rev2:
6316
        pusha
6317
        jmp     match_single_mask_rev.mask_symbol
6318
match_single_mask_rev:
6319
; in: esi->mask, edi->end of name, edx->start of name
6320
; out: CF clear <=> match
6321
        pusha
6322
        mov     ecx, esi
6323
@@:
6324
        lodsb
6325
        test    al, al
6326
        jnz     @b
6327
        dec     esi
6328
; esi->end of mask, ecx->start of mask
6329
.mask_symbol:
6330
        dec     esi
6331
        cmp     esi, ecx
6332
        jb      .mask_done
6333
        mov     al, [esi]
6334
        cmp     al, '*'
6335
        jz      .asterisk
6336
        cmp     al, '?'
6337
        jz      .quest
6338
        cmp     al, ']'
6339
        jz      .list
6340
        dec     edi
6341
        cmp     edi, edx
6342
        jb      .done_fail
6343
        call    match_symbol
6344
        jz      .mask_symbol
6345
.done_fail:
6346
        stc
6347
        popa
6348
        ret
6349
.mask_done:
6350
        cmp     edi, edx
6351
        jnz     .done_fail
6352
.done_succ:
6353
        clc
6354
        popa
6355
        ret
6356
.quest:
6357
        dec     edi
6358
        cmp     edi, edx
6359
        jb      .done_fail
6360
        jmp     .mask_symbol
6361
.list:
6362
        dec     edi
6363
        cmp     edi, edx
6364
        jb      .done_fail
6365
.list_check:
6366
        dec     esi
6367
        cmp     esi, ecx
6368
        jbe     .done_fail
6369
        mov     al, [esi]
6370
        cmp     al, '['
6371
        jz      .done_fail
6372
        cmp     byte [esi-1], '-'
6373
        jz      .range
6374
        call    match_symbol
6375
        jnz     .list_check
6376
.listok:
6377
@@:
6378
        dec     esi
6379
        cmp     esi, ecx
6380
        jb      .done_fail
6381
        cmp     byte [esi], '['
6382
        jnz     @b
6383
        jmp     .mask_symbol
6384
.range:
6385
        call    match_symbol
6386
        jb      @f
6387
        mov     al, [esi-2]
6388
        call    match_symbol
6389
        jbe     .listok
6390
@@:
6391
        dec     esi
6392
        dec     esi
6393
        jmp     .list_check
6394
.asterisk:
6395
        cmp     esi, ecx
6396
        jz      .done_succ
6397
        cmp     byte [esi-1], '?'
6398
        jnz     @f
6399
        cmp     edi, edx
6400
        jz      .done_fail
6401
        dec     esi
6402
        jmp     .asterisk
6403
@@:
6404
        cmp     byte [esi-1], ']'
6405
        jz      .asterisk_common
6406
; the mask is ...*...
6407
.asterisk_normal:
6408
        mov     al, [esi-1]
6409
@@:
6410
        cmp     edi, edx
6411
        jz      .done_fail
6412
        call    match_symbol
6413
        jz      @f
6414
        dec     edi
6415
        jmp     @b
6416
@@:
6417
        dec     edi
6418
        dec     esi
6419
        call    match_single_mask_rev2
6420
        jnc     .done_succ
6421
        inc     esi
6422
        jmp     .asterisk_normal
6423
.asterisk_common:
6424
        push    edi
6425
@@:
6426
        call    match_single_mask_rev2
6427
        jnc     @f
6428
        dec     edi
6429
        cmp     edi, edx
6430
        jae     @b
6431
        pop     edi
6432
        jmp     .done_fail
6433
@@:
6434
        pop     edi
6435
        jmp     .done_succ
6436
end if
6437
 
474 diamond 6438
;tolower:
6439
;        push    ecx
6440
;        movzx   ecx, al
6441
;        mov     al, [tolower_table+ecx]
6442
;        pop     ecx
6443
;        ret
180 heavyiron 6444
 
6445
match_symbol:
6446
; in: al,[edi]=symbols
6447
; out: flags as 'cmp al,[edi]'
474 diamond 6448
        push    eax ecx
6449
        movzx   ecx, al
6450
        mov     al, [tolower_table+ecx]
6451
        movzx   ecx, byte [edi]
6452
        cmp     al, [tolower_table+ecx]
6453
        pop     ecx eax
180 heavyiron 6454
        ret
6455
 
283 diamond 6456
match_mask_rev_lowercase:
6457
; in: esi->name, edx->end of name, edi->mask
6458
; out: CF clear <=> match
6459
        pusha
6460
        xchg    esi, edx
6461
        xchg    esi, edi
6462
.main_cycle:
6463
        mov     ecx, esi
6464
@@:
6465
        lodsb
6466
        test    al, al
6467
        jz      @f
6468
        cmp     al, ','
6469
        jz      @f
474 diamond 6470
        cmp     al, ';'
6471
        jz      @f
283 diamond 6472
        cmp     al, '|'
6473
        jnz     @b
6474
@@:
6475
        dec     esi
6476
        mov     [esi], byte 0
6477
        call    match_single_mask_rev_lowercase
6478
        mov     [esi], al
6479
        inc     esi
6480
        jnc     .found
6481
        cmp     al, ','
6482
        jz      .main_cycle
474 diamond 6483
        cmp     al, ';'
6484
        jz      .main_cycle
283 diamond 6485
.done_fail:
6486
        stc
6487
        popa
6488
        ret
6489
.found:
6490
        test    al, al
6491
        jz      .done_succ
6492
        cmp     al, '|'
6493
        jz      .test_exclude
6494
        lodsb
6495
        jmp     .found
6496
.done_succ:
6497
        clc
6498
        popa
6499
        ret
6500
.test_exclude:
6501
        mov     ecx, esi
6502
@@:
6503
        lodsb
6504
        test    al, al
6505
        jz      @f
6506
        cmp     al, ','
474 diamond 6507
        jz      @f
6508
        cmp     al, ';'
283 diamond 6509
        jnz     @b
6510
@@:
6511
        dec     esi
6512
        mov     byte [esi], 0
6513
        call    match_single_mask_rev_lowercase
6514
        mov     [esi], al
6515
        inc     esi
6516
        jnc     .done_fail
6517
        test    al, al
6518
        jz      .done_succ
6519
        jmp     .test_exclude
180 heavyiron 6520
 
283 diamond 6521
match_single_mask_rev_lowercase:
6522
; in: esi->end of mask, ecx->start of mask, edi->end of name, edx->start of name
6523
; out: CF clear <=> match
6524
        push    esi edi eax
6525
.mask_symbol:
6526
        dec     esi
6527
        cmp     esi, ecx
6528
        jb      .mask_done
6529
        mov     al, [esi]
6530
        cmp     al, '*'
6531
        jz      .asterisk
6532
        dec     edi
6533
        cmp     edi, edx
6534
        jb      .done_fail
1000 diamond 6535
        cmp     al, '?'
6536
        jz      .mask_symbol
6537
        cmp     al, ']'
6538
        jz      .list_check
283 diamond 6539
        cmp     al, [edi]
6540
        jz      .mask_symbol
6541
.done_fail:
6542
        stc
6543
        pop     eax edi esi
6544
        ret
6545
.mask_done:
6546
        cmp     edi, edx
6547
        jnz     .done_fail
6548
.done_succ:
6549
        clc
6550
        pop     eax edi esi
6551
        ret
6552
.list_check:
6553
        dec     esi
6554
        cmp     esi, ecx
6555
        jbe     .done_fail
6556
        mov     al, [esi]
6557
        cmp     al, '['
6558
        jz      .done_fail
6559
        cmp     byte [esi-1], '-'
6560
        jz      .range
6561
        cmp     al, [edi]
6562
        jnz     .list_check
6563
.listok:
6564
@@:
6565
        dec     esi
6566
        cmp     esi, ecx
6567
        jb      .done_fail
6568
        cmp     byte [esi], '['
6569
        jnz     @b
6570
        jmp     .mask_symbol
6571
.range:
6572
        cmp     al, [edi]
6573
        jb      @f
6574
        mov     al, [esi-2]
6575
        cmp     al, [edi]
6576
        jbe     .listok
6577
@@:
6578
        dec     esi
6579
        dec     esi
6580
        jmp     .list_check
6581
.asterisk:
6582
        cmp     esi, ecx
6583
        jz      .done_succ
6584
        cmp     byte [esi-1], '?'
6585
        jnz     @f
6586
        cmp     edi, edx
6587
        jz      .done_fail
6588
        dec     esi
1000 diamond 6589
        dec     edi
283 diamond 6590
        jmp     .asterisk
6591
@@:
6592
        cmp     byte [esi-1], ']'
6593
        jz      .asterisk_common
6594
; the mask is ...*...
6595
.asterisk_normal:
6596
        mov     al, [esi-1]
6597
@@:
1000 diamond 6598
        dec     edi
283 diamond 6599
        cmp     edi, edx
1000 diamond 6600
        jb      .done_fail
283 diamond 6601
        cmp     al, [edi]
1000 diamond 6602
        jnz     @b
283 diamond 6603
@@:
6604
        dec     esi
6605
        call    match_single_mask_rev_lowercase
6606
        jnc     .done_succ
6607
        inc     esi
6608
        jmp     .asterisk_normal
6609
.asterisk_common:
6610
        push    edi
6611
@@:
6612
        call    match_single_mask_rev_lowercase
6613
        jnc     @f
6614
        dec     edi
6615
        cmp     edi, edx
6616
        jae     @b
6617
        pop     edi
6618
        jmp     .done_fail
6619
@@:
6620
        pop     edi
6621
        jmp     .done_succ
180 heavyiron 6622
 
283 diamond 6623
find_extension:
6624
        lea     esi, [ecx+40]
6625
        push    esi
6626
@@:
6627
        lodsb
6628
        test    al, al
6629
        jnz     @b
6630
@@:
6631
        dec     esi
6632
        cmp     byte [esi], '.'
6633
        jz      .found_ext
6634
        cmp     esi, [esp]
6635
        ja      @b
6636
; empty extension
6637
        pop     esi
6638
        stc
6639
        ret
6640
.found_ext:
6641
        inc     esi
474 diamond 6642
        mov     edi, [associations]
517 diamond 6643
        test    edi, edi
6644
        jz      .notfound
474 diamond 6645
.find_loop:
283 diamond 6646
        push    esi edi
6647
        call    strcmpi
6648
        pop     edi esi
474 diamond 6649
        pushf
6650
@@:
283 diamond 6651
        inc     edi
474 diamond 6652
        cmp     byte [edi-1], 0
6653
        jnz     @b
6654
        popf
6655
        jz      .found
283 diamond 6656
@@:
474 diamond 6657
        inc     edi
6658
        cmp     byte [edi-1], 0
6659
        jnz     @b
6660
        cmp     byte [edi], 0
6661
        jnz     .find_loop
517 diamond 6662
.notfound:
474 diamond 6663
; unknown extension
6664
        stc
6665
.found:
283 diamond 6666
        pop     esi
6667
        ret
6668
 
589 diamond 6669
header  db      'Kolibri Far ',version,0
283 diamond 6670
 
180 heavyiron 6671
nomem_draw      db      'No memory for redraw.',0
6672
.size = $ - nomem_draw
6673
 
6674
def_left_dir    db      '/rd/1',0
6675
def_right_dir   db      '/hd0/1',0
6676
 
314 diamond 6677
bSilentFolderMode db    1
6678
 
814 diamond 6679
bQuickSearchMode db     0
6680
bDisplayQuickSearch db  0
6681
 
180 heavyiron 6682
if lang eq ru
6683
aFolder         db      'Папка'
6684
.size = $-aFolder
6685
aUp             db      'Вверх'
6686
.size = $-aUp
6687
aDrive          db      'Диск',0
6688
aScreens        db      'Экраны',0
6689
else
6690
aFolder         db      'Folder'
6691
.size = $-aFolder
6692
aUp             db      'Up'
6693
.size = $-aUp
6694
aDrive          db      'Drive',0
6695
aScreens        db      'Screens',0
6696
end if
6697
 
474 diamond 6698
align 4
180 heavyiron 6699
_10d dd 10
6700
_100d dd 100
474 diamond 6701
muldiv10 dd 429496729
180 heavyiron 6702
_10 db 10
6703
_100 db 100
6704
 
6705
fpu_cw  dw      000011100111111b
6706
 
6707
keybar_panels:
6708
if lang eq ru
6709
; без клавиш-модификаторов
6710
        db      'Помощь'
6711
        db      'ПользМ'
6712
        db      'Просм '
6713
        db      'Редакт'
6714
        db      'Копир '
6715
        db      'Перен '
6716
        db      'Папка '
6717
        db      'Удален'
6718
        db      'КонфМн'
6719
        db      'Выход '
6720
        db      'Модули'
6721
        db      'Экраны'
6722
; Shift
6723
        db      'Добавл'
6724
        db      'Распак'
6725
        db      'АрхКом'
6726
        db      'Редак.'
6727
        db      'Копир '
6728
        db      'Переим'
6729
        db      '      '
6730
        db      'Удален'
6731
        db      'Сохран'
6732
        db      'Послдн'
6733
        db      'Группы'
6734
        db      'Выбран'
6735
; Ctrl
6736
        db      'Левая '
6737
        db      'Правая'
6738
        db      'Имя   '
6739
        db      'Расшир'
6740
        db      'Модиф '
6741
        db      'Размер'
6742
        db      'Несорт'
6743
        db      'Создан'
6744
        db      'Доступ'
6745
        db      'Описан'
6746
        db      'Владел'
6747
        db      'Сорт  '
6748
; Ctrl+Shift
6749
        db      '      '
6750
        db      '      '
6751
        db      'Просм '
6752
        db      'Редакт'
6753
        db      '      '
6754
        db      '      '
6755
        db      '      '
6756
        db      '      '
6757
        db      '      '
6758
        db      '      '
6759
        db      '      '
6760
        db      '      '
6761
; Alt
6762
        db      'Левая '
6763
        db      'Правая'
6764
        db      'Смотр.'
4933 hidnplayr 6765
        db      '      '
180 heavyiron 6766
        db      'Печать'
6767
        db      'Связь '
6768
        db      'Искать'
6769
        db      'Истор '
6770
        db      'Видео '
6771
        db      'Дерево'
6772
        db      'ИстПр '
6773
        db      'ИстПап'
6774
; Alt+Shift
6775
        db      '      '
6776
        db      '      '
6777
        db      '      '
6778
        db      '      '
6779
        db      '      '
6780
        db      '      '
6781
        db      '      '
6782
        db      '      '
6783
        db      'КонфПл'
6784
        db      '      '
6785
        db      '      '
6786
        db      '      '
6787
; Alt+Ctrl
6788
times 12 db     '      '
6789
; Alt+Ctrl+Shift
6790
times 12 db     '      '
6791
else
6792
; No modificators
6793
        db      'Help  '
6794
        db      'UserMn'
6795
        db      'View  '
6796
        db      'Edit  '
6797
        db      'Copy  '
6798
        db      'RenMov'
6799
        db      'MkFold'
6800
        db      'Delete'
6801
        db      'ConfMn'
6802
        db      'Quit  '
6803
        db      'Plugin'
6804
        db      'Screen'
6805
; Shift
6806
        db      'Add   '
6807
        db      'Extrct'
6808
        db      'ArcCmd'
6809
        db      'Edit..'
6810
        db      'Copy  '
6811
        db      'Rename'
6812
        db      '      '
6813
        db      'Delete'
6814
        db      'Save  '
6815
        db      'Last  '
6816
        db      'Group '
6817
        db      'SelUp '
6818
; Ctrl
6819
        db      'Left  '
6820
        db      'Right '
6821
        db      'Name  '
6822
        db      'Extens'
6823
        db      'Modifn'
6824
        db      'Size  '
6825
        db      'Unsort'
6826
        db      'Creatn'
6827
        db      'Access'
6828
        db      'Descr '
6829
        db      'Owner '
6830
        db      'Sort  '
6831
; Ctrl+Shift
6832
        db      '      '
6833
        db      '      '
6834
        db      'View  '
6835
        db      'Edit  '
6836
        db      '      '
6837
        db      '      '
6838
        db      '      '
6839
        db      '      '
6840
        db      '      '
6841
        db      '      '
6842
        db      '      '
6843
        db      '      '
6844
; Alt
6845
        db      'Left  '
6846
        db      'Right '
6847
        db      'View..'
4933 hidnplayr 6848
        db      '      '
180 heavyiron 6849
        db      'Print '
6850
        db      'MkLink'
6851
        db      'Find  '
6852
        db      'Histry'
6853
        db      'Video '
6854
        db      'Tree  '
6855
        db      'ViewHs'
6856
        db      'FoldHs'
6857
; Alt+Shift
6858
        db      '      '
6859
        db      '      '
6860
        db      '      '
6861
        db      '      '
6862
        db      '      '
6863
        db      '      '
6864
        db      '      '
6865
        db      '      '
6866
        db      'ConfPl'
6867
        db      '      '
6868
        db      '      '
6869
        db      '      '
6870
; Alt+Ctrl
6871
times 12 db     '      '
6872
; Alt+Ctrl+Shift
6873
times 12 db     '      '
6874
end if
6875
 
6876
keybar_viewer:
6877
if lang eq ru
6878
; без клавиш-модификаторов
6879
        db      'Помощь'
6880
        db      'Развер'
6881
        db      'Выход '
6882
        db      'Код   '
6883
        db      '      '
6884
        db      'Редакт'
6885
        db      'Поиск '
6886
keybar_cp:
6887
        db      'cp1251'
6888
        db      '      '
6889
        db      'Выход '
6890
        db      'Модули'
6891
        db      'Экраны'
6892
; Shift
6893
        db      '      '
6894
        db      'Слова '
6895
        db      '      '
6896
        db      '      '
6897
        db      '      '
6898
        db      '      '
6899
        db      'Дальше'
6900
        db      'Таблиц'
6901
        db      '      '
6902
        db      '      '
6903
        db      '      '
6904
        db      '      '
6905
; Ctrl
6906
        db      '      '
6907
        db      '      '
6908
        db      '      '
6909
        db      '      '
6910
        db      '      '
6911
        db      '      '
6912
        db      '      '
6913
        db      '      '
6914
        db      '      '
6915
        db      'Позиц '
6916
        db      '      '
6917
        db      '      '
6918
; Ctrl+Shift
6919
        db      '      '
6920
        db      '      '
6921
        db      '      '
6922
        db      '      '
6923
        db      '      '
6924
        db      '      '
6925
        db      '      '
6926
        db      '      '
6927
        db      '      '
6928
        db      '      '
6929
        db      '      '
6930
        db      '      '
6931
; Alt
6932
        db      '      '
6933
        db      '      '
6934
        db      '      '
6935
        db      '      '
6936
        db      'Печать'
6937
        db      '      '
6938
        db      'Назад '
6939
        db      'Перейт'
6940
        db      'Видео '
6941
        db      '      '
6942
        db      'ИстПр '
6943
        db      '      '
6944
; Alt+Shift
6945
        db      '      '
6946
        db      '      '
6947
        db      '      '
6948
        db      '      '
6949
        db      '      '
6950
        db      '      '
6951
        db      '      '
6952
        db      '      '
6953
        db      'Конфиг'
6954
        db      '      '
6955
        db      '      '
6956
        db      '      '
6957
; Alt+Ctrl
6958
times 12 db     '      '
6959
; Alt+Ctrl+Shift
6960
times 12 db     '      '
6961
else
6962
; No modificators
6963
        db      'Help  '
6964
        db      'Unwrap'
6965
        db      'Quit  '
6966
        db      'Hex   '
6967
        db      '      '
6968
        db      'Edit  '
6969
        db      'Search'
6970
keybar_cp:
6971
        db      'cp1251'
6972
        db      '      '
6973
        db      'Quit  '
6974
        db      'Plugin'
6975
        db      'Screen'
6976
; Shift
6977
        db      '      '
6978
        db      'WWrap '
6979
        db      '      '
6980
        db      '      '
6981
        db      '      '
6982
        db      '      '
6983
        db      'Next  '
6984
        db      'Table '
6985
        db      '      '
6986
        db      '      '
6987
        db      '      '
6988
        db      '      '
6989
; Ctrl
6990
        db      '      '
6991
        db      '      '
6992
        db      '      '
6993
        db      '      '
6994
        db      '      '
6995
        db      '      '
6996
        db      '      '
6997
        db      '      '
6998
        db      '      '
6999
        db      'GoFile'
7000
        db      '      '
7001
        db      '      '
7002
; Ctrl+Shift
7003
        db      '      '
7004
        db      '      '
7005
        db      '      '
7006
        db      '      '
7007
        db      '      '
7008
        db      '      '
7009
        db      '      '
7010
        db      '      '
7011
        db      '      '
7012
        db      '      '
7013
        db      '      '
7014
        db      '      '
7015
; Alt
7016
        db      '      '
7017
        db      '      '
7018
        db      '      '
7019
        db      '      '
7020
        db      'Print '
7021
        db      '      '
7022
        db      'Prev  '
7023
        db      'Goto  '
7024
        db      'Video '
7025
        db      '      '
7026
        db      'ViewHs'
7027
        db      '      '
7028
; Alt+Shift
7029
        db      '      '
7030
        db      '      '
7031
        db      '      '
7032
        db      '      '
7033
        db      '      '
7034
        db      '      '
7035
        db      '      '
7036
        db      '      '
7037
        db      'Config'
7038
        db      '      '
7039
        db      '      '
7040
        db      '      '
7041
; Alt+Ctrl
7042
times 12 db     '      '
7043
; Alt+Ctrl+Shift
7044
times 12 db     '      '
7045
end if
7046
 
814 diamond 7047
keybar_editor:
7048
if lang eq ru
7049
; без клавиш-модификаторов
7050
        db      'Помощь'
7051
        db      'Сохран'
7052
        db      '      '
7053
        db      '      '
7054
        db      '      '
7055
        db      'Просм '
7056
        db      'Поиск '
7057
keybar_cp2:
7058
        db      'cp1251'
7059
        db      '      '
7060
        db      'Выход '
7061
        db      'Модули'
7062
        db      'Экраны'
7063
; Shift
7064
        db      '      '
7065
        db      'Сохр.в'
7066
        db      '      '
7067
        db      'Редак.'
7068
        db      '      '
7069
        db      '      '
7070
        db      'Дальше'
7071
        db      'Таблиц'
7072
        db      '      '
7073
        db      'СхрВых'
7074
        db      '      '
7075
        db      '      '
7076
; Ctrl
7077
        db      '      '
7078
        db      '      '
7079
        db      '      '
7080
        db      '      '
7081
        db      '      '
7082
        db      '      '
7083
        db      'Замена'
7084
        db      '      '
7085
        db      '      '
7086
        db      'Позиц '
7087
        db      '      '
7088
        db      '      '
7089
; Ctrl+Shift
7090
        db      '      '
7091
        db      '      '
7092
        db      '      '
7093
        db      '      '
7094
        db      '      '
7095
        db      '      '
7096
        db      '      '
7097
        db      '      '
7098
        db      '      '
7099
        db      '      '
7100
        db      '      '
7101
        db      '      '
7102
; Alt
7103
        db      '      '
7104
        db      '      '
7105
        db      '      '
7106
        db      '      '
7107
        db      'Печать'
7108
        db      '      '
7109
        db      '      '
7110
        db      'Строка'
7111
        db      'Видео '
7112
        db      '      '
7113
        db      'ИстПр '
7114
        db      '      '
7115
; Alt+Shift
7116
        db      '      '
7117
        db      '      '
7118
        db      '      '
7119
        db      '      '
7120
        db      '      '
7121
        db      '      '
7122
        db      '      '
7123
        db      '      '
7124
        db      'Конфиг'
7125
        db      '      '
7126
        db      '      '
7127
        db      '      '
7128
; Alt+Ctrl
7129
times 12 db     '      '
7130
; Alt+Ctrl+Shift
7131
times 12 db     '      '
7132
else
7133
; No modificators
7134
        db      'Help  '
7135
        db      'Save  '
7136
        db      '      '
7137
        db      '      '
7138
        db      '      '
7139
        db      'View  '
7140
        db      'Search'
7141
keybar_cp2:
7142
        db      'cp1251'
7143
        db      '      '
7144
        db      'Quit  '
7145
        db      'Plugin'
7146
        db      'Screen'
7147
; Shift
7148
        db      '      '
7149
        db      'SaveAs'
7150
        db      '      '
7151
        db      'Edit..'
7152
        db      '      '
7153
        db      '      '
7154
        db      'Next  '
7155
        db      'Table '
7156
        db      '      '
7157
        db      'SaveQ '
7158
        db      '      '
7159
        db      '      '
7160
; Ctrl
7161
        db      '      '
7162
        db      '      '
7163
        db      '      '
7164
        db      '      '
7165
        db      '      '
7166
        db      '      '
7167
        db      'Replac'
7168
        db      '      '
7169
        db      '      '
7170
        db      'GoFile'
7171
        db      '      '
7172
        db      '      '
7173
; Ctrl+Shift
7174
        db      '      '
7175
        db      '      '
7176
        db      '      '
7177
        db      '      '
7178
        db      '      '
7179
        db      '      '
7180
        db      '      '
7181
        db      '      '
7182
        db      '      '
7183
        db      '      '
7184
        db      '      '
7185
        db      '      '
7186
; Alt
7187
        db      '      '
7188
        db      '      '
7189
        db      '      '
7190
        db      '      '
7191
        db      'Print '
7192
        db      '      '
7193
        db      '      '
7194
        db      'Goto  '
7195
        db      'Video '
7196
        db      '      '
7197
        db      'ViewHs'
7198
        db      '      '
7199
; Alt+Shift
7200
        db      '      '
7201
        db      '      '
7202
        db      '      '
7203
        db      '      '
7204
        db      '      '
7205
        db      '      '
7206
        db      '      '
7207
        db      '      '
7208
        db      'Config'
7209
        db      '      '
7210
        db      '      '
7211
        db      '      '
7212
; Alt+Ctrl
7213
times 12 db     '      '
7214
; Alt+Ctrl+Shift
7215
times 12 db     '      '
7216
end if
7217
 
180 heavyiron 7218
        align   4
7219
cur_width       dd      80
7220
cur_height      dd      25
283 diamond 7221
saved_width     dd      -1
7222
saved_height    dd      -1
8960 IgorA 7223
fill_width      dd      0 ;остаток от деления ширины окна на ширину шрифта
314 diamond 7224
fill_height     dd      0
180 heavyiron 7225
max_width = 256
7226
max_height = 256
283 diamond 7227
console_data_ptr dd     0
180 heavyiron 7228
 
283 diamond 7229
cursor_x        dd      -1
7230
cursor_y        dd      -1
814 diamond 7231
cursor_size     dd      cursor_normal_size
474 diamond 7232
cur_cursor_pos  dd      -1
7233
old_cursor_pos  dd      -1
283 diamond 7234
 
997 diamond 7235
idle_interval   dd      -1
7236
 
8960 IgorA 7237
active_panel    dd      panel1
180 heavyiron 7238
 
474 diamond 7239
associations    dd      0
517 diamond 7240
associations_size dd    1               ; terminating zero
7241
associations_allocated dd 0x1000        ; start with one page
474 diamond 7242
 
180 heavyiron 7243
console_colors  dd      0x000000, 0x000080, 0x008000, 0x008080
7244
                dd      0x800000, 0x800080, 0x808000, 0xC0C0C0
7245
                dd      0x808080, 0x0000FF, 0x00FF00, 0x00FFFF
7246
                dd      0xFF0000, 0xFF00FF, 0xFFFF00, 0xFFFFFF
7247
 
7248
compare_fns     dd      compare_name
7249
                dd      compare_name_rev
7250
                dd      compare_ext
7251
                dd      compare_ext_rev
7252
                dd      compare_modified
7253
                dd      compare_modified_rev
7254
                dd      compare_size
7255
                dd      compare_size_rev
7256
                dd      compare_unordered
7257
                dd      compare_unordered_rev
7258
                dd      compare_created
7259
                dd      compare_created_rev
7260
                dd      compare_accessed
7261
                dd      compare_accessed_rev
7262
 
7263
ctrlkey_tests   dd      ctrlkey_test0
7264
                dd      ctrlkey_test1
7265
                dd      ctrlkey_test2
7266
                dd      ctrlkey_test3
7267
                dd      ctrlkey_test4
7268
ctrlkey_tests_num = 5
7269
 
7270
virtual at 0
7271
screen_vtable:
7272
        .OnRedraw       dd      ?
997 diamond 7273
        .OnActivate     dd      ?
7274
        .OnIdle         dd      ?
180 heavyiron 7275
        .OnKey          dd      ?
7276
        .keybar         dd      ?
7277
        .getname        dd      ?
589 diamond 7278
        .OnExit         dd      ?
7279
        .IsHandleUsed   dd      ?
180 heavyiron 7280
end virtual
7281
 
7282
panels_vtable:
7283
        dd      panels_OnRedraw
997 diamond 7284
        dd      0
7285
        dd      0
180 heavyiron 7286
        dd      panels_OnKey
7287
        dd      keybar_panels
7288
        dd      panels_getname
589 diamond 7289
        dd      panels_OnExit
7290
        dd      panels_IsHandleUsed
180 heavyiron 7291
 
7292
viewer_vtable:
7293
        dd      viewer_OnRedraw
997 diamond 7294
        dd      0
7295
        dd      0
180 heavyiron 7296
        dd      viewer_OnKey
7297
        dd      keybar_viewer
7298
        dd      viewer_getname
589 diamond 7299
        dd      viewer_OnExit
7300
        dd      viewer_IsHandleUsed
180 heavyiron 7301
 
814 diamond 7302
editor_vtable:
7303
        dd      editor_OnRedraw
997 diamond 7304
        dd      0
7305
        dd      0
814 diamond 7306
        dd      editor_OnKey
7307
        dd      keybar_editor
7308
        dd      editor_getname
7309
        dd      editor_OnExit
7310
        dd      editor_IsHandleUsed
7311
 
997 diamond 7312
filesearch_vtable:
7313
        dd      filesearch_OnRedraw
7314
        dd      filesearch_OnActivate
7315
        dd      filesearch_OnIdle
7316
        dd      filesearch_OnKey
7317
        dd      0
7318
        dd      filesearch_getname
7319
        dd      filesearch_OnExit
7320
        dd      filesearch_IsHandleUsed
7321
 
314 diamond 7322
; additions to this table require changes in tools.inc::get_error_msg
7323
errors1:
7324
        dd      error0msg
7325
        dd      error1msg
7326
        dd      error2msg
7327
        dd      error3msg
7328
        dd      error4msg
7329
        dd      error5msg
7330
        dd      error6msg
7331
        dd      error7msg
7332
        dd      error8msg
7333
        dd      error9msg
7334
        dd      error10msg
7335
        dd      error11msg
7336
errors2:
7337
        dd      error30msg
7338
        dd      error31msg
7339
        dd      error32msg
7340
 
180 heavyiron 7341
encodings:
7342
.cp866 = 0
7343
.cp1251 = 1
474 diamond 7344
.koi8r = 2
7345
.unicode = 3
180 heavyiron 7346
 
7347
.names:
7348
        db      'cp866   '
7349
        db      'cp1251  '
474 diamond 7350
        db      'koi8-r  '
7351
        db      'Unicode '
180 heavyiron 7352
 
7353
.tables:
7354
; cp866 - trivial map
7355
        times 128 db %+127
7356
; cp1251
7357
        db      0x3F,0x3F,0x27,0x3F,0x22,0x3A,0xC5,0xD8,0x3F,0x25,0x3F,0x3C,0x3F,0x3F,0x3F,0x3F
7358
        db      0x3F,0x27,0x27,0x22,0x22,0x07,0x2D,0x2D,0x3F,0x54,0x3F,0x3E,0x3F,0x3F,0x3F,0x3F
7359
        db      0xFF,0xF6,0xF7,0x3F,0xFD,0x3F,0xB3,0x15,0xF0,0x63,0xF2,0x3C,0xBF,0x2D,0x52,0xF4
7360
        db      0xF8,0x2B,0x49,0x69,0x3F,0xE7,0x14,0xFA,0xF1,0xFC,0xF3,0x3E,0x3F,0x3F,0x3F,0xF5
7361
        times 0x30 db %-1+0x80
7362
        times 0x10 db %-1+0xE0
474 diamond 7363
; koi8-r
7364
        db      0xC4,0xB3,0xDA,0xBF,0xC0,0xD9,0xC3,0xB4,0xC2,0xC1,0xC5,0xDF,0xDC,0xDB,0xDD,0xDE
7365
        db      0xB0,0xB1,0xB2,0xF4,0xFE,0xF9,0xFB,0xF7,0xF3,0xF2,0xFF,0xF5,0xF8,0xFD,0xFA,0xF6
7366
        db      0xCD,0xBA,0xD5,0xF1,0xD6,0xC9,0xB8,0xB7,0xBB,0xD4,0xD3,0xC8,0xBE,0xBD,0xBC,0xC6
7367
        db      0xC7,0xCC,0xB5,0xF0,0xB6,0xB9,0xD1,0xD2,0xCB,0xCF,0xD0,0xCA,0xD8,0xD7,0xCE,0xFC
7368
        db      0xEE,0xA0,0xA1,0xE6,0xA4,0xA5,0xE4,0xA3,0xE5,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE
7369
        db      0xAF,0xEF,0xE0,0xE1,0xE2,0xE3,0xA6,0xA2,0xEC,0xEB,0xA7,0xE8,0xED,0xE9,0xE7,0xEA
7370
        db      0x9E,0x80,0x81,0x96,0x84,0x85,0x94,0x83,0x95,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E
7371
        db      0x8F,0x9F,0x90,0x91,0x92,0x93,0x86,0x82,0x9C,0x9B,0x87,0x98,0x9D,0x99,0x97,0x9A
180 heavyiron 7372
 
474 diamond 7373
.menu:
7374
        db      .cp866
7375
.menu.1:
7376
        dd      .menu.2
7377
        dd      0
7378
if lang eq ru
7379
        db      '&DOS текст (cp866)',0
7380
else
7381
        db      '&DOS text (cp866)',0
7382
end if
7383
        db      .cp1251
7384
.menu.2:
7385
        dd      .menu.3
7386
        dd      .menu.1
7387
if lang eq ru
7388
        db      '&Windows текст (cp1251)',0
7389
else
7390
        db      '&Windows text (cp1251)',0
7391
end if
7392
        db      .koi8r
7393
.menu.3:
7394
        dd      .menu.4
7395
        dd      .menu.2
7396
if lang eq ru
7397
        db      '&Linux текст (koi8-r)',0
7398
else
7399
        db      '&Linux text (koi8-r)',0
7400
end if
7401
        db      .unicode
7402
.menu.4:
7403
        dd      0
7404
        dd      .menu.3
7405
        db      '&Unicode',0
7406
 
180 heavyiron 7407
active_screen   dd      0
814 diamond 7408
viewer_tabsize  dd      8
7409
editor_tabsize  dd      8
180 heavyiron 7410
 
7411
ascii2scan:
7412
        times 32 db 0
7413
        db      0x39,0x02,0x03,0x04,0x05,0x06,0x08,0x28,0x0A,0x0B,0x09,0x0D,0x33,0x0C,0x34,0x35
7414
        db      0x0B,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x27,0x27,0x33,0x0D,0x34,0x35
7415
        db      0x03,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
7416
        db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x07,0x0C
7417
        db      0x29,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
7418
        db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x29,0x00
7419
        db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
7420
        db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
7421
        db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
7422
        times 48 db 0
7423
        db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
7424
        db      0x29,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
814 diamond 7425
scan2ascii:
7426
        db      0,0,'1234567890-=',0,0
7427
        db      'qwertyuiop[]',0,0,'as'
7428
        db      'dfghjkl;',27h,'`',0,'\zxcv'
7429
        db      'bnm,./',0,0,0,' ',0,0,0,0,0,0
180 heavyiron 7430
 
7431
; Клавишные сочетания
7432
; db scancode, reserved
7433
; dw ctrlstate
7434
; dd handler
7435
; ctrlstate: младшие 4 бита - для Shift, следующие - для Ctrl, следующие - для Alt
7436
; 0 = ни одна клавиша не нажата
7437
; 1 = ровно одна нажата
7438
; 2 = обе нажаты
7439
; 3 = левая нажата, правая нет
7440
; 4 = правая нажата, левая нет
7441
panels_ctrlkeys:
7442
        dw      0x48, 0
7443
        dd      panels_OnKey.up
7444
        dw      0x50, 0
7445
        dd      panels_OnKey.down
7446
        dw      0x4B, 0
7447
        dd      panels_OnKey.left
7448
        dw      0x4D, 0
7449
        dd      panels_OnKey.right
474 diamond 7450
        dw      0x51, 0
7451
        dd      panels_OnKey.pgdn
7452
        dw      0x49, 0
7453
        dd      panels_OnKey.pgup
180 heavyiron 7454
        dw      0xF, 0
7455
        dd      panels_OnKey.tab
7456
        dw      0x47, 0
7457
        dd      panels_OnKey.home
7458
        dw      0x4F, 0
7459
        dd      panels_OnKey.end
7460
        dw      0x1C, 0
7461
        dd      panels_OnKey.enter
7462
        dw      0x3D, 0
7463
        dd      panels_OnKey.f3
814 diamond 7464
        dw      0x3E, 0
7465
        dd      panels_OnKey.f4
283 diamond 7466
        dw      0x3F, 0
7467
        dd      panels_OnKey.f5
7468
        dw      0x3F, 1
7469
        dd      panels_OnKey.shift_f5
321 diamond 7470
        dw      0x41, 0
7471
        dd      panels_OnKey.f7
997 diamond 7472
        dw      0x41, 0x100
7473
        dd      panels_OnKey.alt_f7
180 heavyiron 7474
        dw      0x42, 0
7475
        dd      panels_OnKey.f8
283 diamond 7476
        dw      0x43, 0x100
7477
        dd      alt_f9
180 heavyiron 7478
        dw      0x44, 0
7479
        dd      exit
283 diamond 7480
        dw      0x5D, 0
7481
        dd      panels_OnKey.menu
180 heavyiron 7482
repeat 9-3+1
7483
        dw      0x3D+%-1, 0x10
7484
        dd      panels_OnKey.ctrl_f39
7485
end repeat
7486
        dw      0x3B, 0x100
7487
        dd      panels_OnKey.alt_f12
7488
        dw      0x3C, 0x100
7489
        dd      panels_OnKey.alt_f12
7490
        dw      0x58, 0
7491
        dd      F12
7492
        dw      0x13, 0x10
7493
        dd      panels_OnKey.ctrl_r
474 diamond 7494
        dw      2, 0x30
7495
        dd      panels_OnKey.change_mode
7496
        dw      3, 0x30
7497
        dd      panels_OnKey.change_mode
7498
        dw      4, 0x30
7499
        dd      panels_OnKey.change_mode
7500
        dw      5, 0x30
7501
        dd      panels_OnKey.change_mode
7502
repeat 10
7503
        dw      %+1, 0x40
7504
        dd      panels_OnKey.quick_jump
7505
end repeat
7506
        dw      0x52, 0
7507
        dd      panels_OnKey.insert
7508
        dw      0x4E, 0
7509
        dd      panels_OnKey.greyplus
7510
        dw      0x4A, 0
7511
        dd      panels_OnKey.greyminus
517 diamond 7512
        dw      0x37, 0
7513
        dd      panels_OnKey.greyasterisk
180 heavyiron 7514
        db      0
7515
 
7516
viewer_ctrlkeys:
7517
        dw      1, 0
7518
        dd      viewer_OnKey.exit
7519
        dw      0x51, 0
7520
        dd      viewer_OnKey.pgdn
7521
        dw      0x49, 0
7522
        dd      viewer_OnKey.pgup
7523
        dw      0x50, 0
7524
        dd      viewer_OnKey.down
7525
        dw      0x48, 0
7526
        dd      viewer_OnKey.up
7527
        dw      0x4B, 0
7528
        dd      viewer_OnKey.left
7529
        dw      0x4B, 0x10
7530
        dd      viewer_OnKey.ctrl_left
7531
        dw      0x4B, 0x11
7532
        dd      viewer_OnKey.ctrl_shift_left
7533
        dw      0x4C, 0
7534
        dd      viewer_OnKey.exit
7535
        dw      0x4D, 0
7536
        dd      viewer_OnKey.right
7537
        dw      0x4D, 0x10
7538
        dd      viewer_OnKey.ctrl_right
7539
        dw      0x4D, 0x11
7540
        dd      viewer_OnKey.ctrl_shift_right
7541
        dw      0x3C, 0
7542
        dd      viewer_OnKey.f2
7543
        dw      0x3D, 0
7544
        dd      viewer_OnKey.exit
7545
        dw      0x3E, 0
7546
        dd      viewer_OnKey.f4
997 diamond 7547
        dw      0x41, 0
7548
        dd      viewer_OnKey.f7
7549
        dw      0x41, 1
7550
        dd      viewer_OnKey.shift_f7
180 heavyiron 7551
        dw      0x42, 0
7552
        dd      viewer_OnKey.f8
474 diamond 7553
        dw      0x42, 1
7554
        dd      viewer_OnKey.shift_f8
180 heavyiron 7555
        dw      0x44, 0
7556
        dd      viewer_OnKey.exit
7557
        dw      0x47, 0
7558
        dd      viewer_OnKey.home
7559
        dw      0x4F, 0
7560
        dd      viewer_OnKey.end
7561
        dw      0x58, 0
7562
        dd      F12
283 diamond 7563
        dw      0x43, 0x100
7564
        dd      alt_f9
180 heavyiron 7565
        db      0
7566
 
814 diamond 7567
editor_ctrlkeys:
7568
        dw      1, 0
7569
        dd      editor_OnKey.exit_confirm
7570
        dw      0x0E, 0
7571
        dd      editor_OnKey.backspace
7572
        dw      0x3C, 0
7573
        dd      editor_OnKey.f2
997 diamond 7574
        dw      0x41, 0
7575
        dd      editor_OnKey.f7
7576
        dw      0x41, 1
7577
        dd      editor_OnKey.shift_f7
814 diamond 7578
        dw      0x43, 0x100
7579
        dd      alt_f9
7580
        dw      0x44, 0
7581
        dd      editor_OnKey.exit_confirm
7582
        dw      0x44, 1
7583
        dd      editor_OnKey.exit_save
7584
        dw      0x47, 0
7585
        dd      editor_OnKey.home
7586
        dw      0x48, 0
7587
        dd      editor_OnKey.up
7588
        dw      0x49, 0
7589
        dd      editor_OnKey.pgup
7590
        dw      0x4B, 0
7591
        dd      editor_OnKey.left
7592
        dw      0x4D, 0
7593
        dd      editor_OnKey.right
7594
        dw      0x4F, 0
7595
        dd      editor_OnKey.end
7596
        dw      0x50, 0
7597
        dd      editor_OnKey.down
7598
        dw      0x51, 0
7599
        dd      editor_OnKey.pgdn
7600
        dw      0x52, 0
7601
        dd      editor_OnKey.ins
7602
        dw      0x53, 0
7603
        dd      editor_OnKey.del
7604
        dw      0x58, 0
7605
        dd      F12
4933 hidnplayr 7606
        dw      0xF, 0x100      ; Alt+Tab
2633 mario79 7607
        dd      dummy_key
4933 hidnplayr 7608
        dw      0xF, 0x101      ; Shift+Alt+Tab
2633 mario79 7609
        dd      dummy_key
814 diamond 7610
        db      0
7611
 
2633 mario79 7612
dummy_key:
4933 hidnplayr 7613
        ret
2633 mario79 7614
 
180 heavyiron 7615
dirinfo:
7616
                dd      1
7617
.first          dd      0
7618
                dd      0
7619
.size           dd      300
7620
.dirdata        dd      0
7621
                db      0
7622
.name           dd      0
7623
 
7624
readinfo:
7625
                dd      0
7626
.first          dq      0
7627
.size           dd      0
7628
.data           dd      0
7629
                db      0
7630
.name           dd      0
7631
 
283 diamond 7632
writeinfo:
7633
.code           dd      2
7634
.first          dq      0
7635
.size           dd      0
7636
.data           dd      0
7637
                db      0
7638
.name           dd      0
7639
 
180 heavyiron 7640
attrinfo:
7641
                dd      5
7642
                dd      0
7643
                dd      0
7644
                dd      0
7645
                dd      .attr
7646
                db      0
7647
.name           dd      0
7648
 
7649
delinfo:
7650
                dd      8
7651
                dd      0
7652
                dd      0
7653
                dd      0
7654
                dd      0
7655
                db      0
7656
                dd      execdata
7657
 
321 diamond 7658
mkdirinfo:
7659
                dd      9
7660
                dd      0
7661
                dd      0
7662
                dd      0
7663
                dd      0
7664
                db      0
7665
                dd      CopyDestEditBuf+12
7666
 
180 heavyiron 7667
if lang eq ru
7668
compare_names   db      'иИрРмМаАнНсСдД'
7669
else
7670
compare_names   db      'nNxXmMsSuUcCaA'
7671
end if
7672
 
183 diamond 7673
; Здесь начинаются конфигурационные данные - в текущей реализации они зашиты в бинарник
7674
 
180 heavyiron 7675
; Панель
7676
panel_normal_color      db      1Bh
474 diamond 7677
panel_selected_color    db      1Eh
180 heavyiron 7678
panel_border_color      db      1Bh
7679
panel_cursor_color      db      30h
474 diamond 7680
panel_selected_cursor_color db  3Eh
180 heavyiron 7681
panel_header_color      db      1Bh
7682
panel_active_header_color db    30h
7683
column_header_color     db      1Eh
474 diamond 7684
panel_number_color      db      1Bh
7685
panel_numselected_color db      3Eh
180 heavyiron 7686
panel_nscreens_color    db      0Bh
183 diamond 7687
; Диалоги
314 diamond 7688
dialog_colors:
183 diamond 7689
dialog_main_color       db      70h
7690
dialog_border_color     db      70h
7691
dialog_header_color     db      70h
314 diamond 7692
dialog_edit_color       db      30h
7693
dialog_unmodified_edit_color db 38h
183 diamond 7694
dialog_normal_btn_color db      70h
7695
dialog_selected_btn_color db    30h
997 diamond 7696
dialog_list_color       db      70h
7697
dialog_selected_list_color db   0Fh
7698
dialog_scroll_list_color db     70h
314 diamond 7699
; Предупреждения и ошибки
7700
warning_colors:
7701
; !!! должны быть те же поля и в том же порядке, что и для обычных диалогов !!!
7702
warning_main_color      db      4Fh
7703
warning_border_color    db      4Fh
7704
warning_header_color    db      4Fh
7705
warning_edit_color      db      30h
7706
warning_unmodified_edit_color db 38h
7707
warning_normal_btn_color db     4Fh
7708
warning_selected_btn_color db   70h
997 diamond 7709
warning_list_color      db      3Fh
7710
warning_selected_list_color db  70h
7711
warning_scroll_list_color db    3Fh
180 heavyiron 7712
; Меню
7713
menu_normal_color       db      3Fh
7714
menu_selected_color     db      0Fh
7715
menu_highlight_color    db      3Eh
7716
menu_selected_highlight_color db 0Eh
7717
menu_border_color       db      3Fh
7718
menu_header_color       db      3Fh
7719
menu_scrollbar_color    db      3Fh
7720
; Линейка клавиш
7721
keybar_number_color     db      7
7722
keybar_name_color       db      30h
7723
keybar_bgr_color        db      7
7724
; Командная строка
7725
cmdbar_normal_color     db      7
7726
cmdbar_prefix_color     db      7
7727
; Просмотрщик
7728
view_normal_color       db      1Bh
997 diamond 7729
view_selected_color     db      30h
180 heavyiron 7730
view_status_color       db      30h
7731
view_arrows_color       db      1Eh
814 diamond 7732
; Редактор
7733
edit_normal_color       db      1Bh
7734
edit_status_color       db      30h
180 heavyiron 7735
 
7736
; Подсветка файлов
7737
highlight_num_groups    dd      10
7738
highlight_groups        dd      highlight_group0
7739
                dd      highlight_group1
7740
                dd      highlight_group2
7741
                dd      highlight_group3
7742
                dd      highlight_group4
7743
                dd      highlight_group5
7744
                dd      highlight_group6
7745
                dd      highlight_group7
7746
                dd      highlight_group8
7747
                dd      highlight_group9
7748
 
7749
; Формат описания группы подсветки:
7750
virtual at 0
7751
highlight:
474 diamond 7752
        .IncludeAttributes      db ?
180 heavyiron 7753
        .NormalColor            db ?
7754
        .CursorColor            db ?
474 diamond 7755
        .SelectedColor          db ?
7756
        .SelectedCursorColor    db ?
180 heavyiron 7757
        .Mask:                  ; ASCIIZ-string
7758
end virtual
7759
 
283 diamond 7760
; all highlight masks must be in lowercase!
180 heavyiron 7761
highlight_group0:
7762
        db      2
474 diamond 7763
        db      13h, 38h, 0, 0
180 heavyiron 7764
        db      '*',0
7765
highlight_group1:
7766
        db      4
474 diamond 7767
        db      13h, 38h, 0, 0
180 heavyiron 7768
        db      '*',0
7769
highlight_group2:
7770
        db      10h
474 diamond 7771
        db      1Fh, 3Fh, 0, 0
180 heavyiron 7772
        db      '*|..',0
7773
highlight_group3:
7774
        db      10h
474 diamond 7775
        db      0, 0, 0, 0
180 heavyiron 7776
        db      '..',0
7777
highlight_group4:
7778
        db      0
474 diamond 7779
        db      1Ah, 3Ah, 0, 0
814 diamond 7780
        db      '*.exe,*.com,*.bat,*.cmd,*.kex',0
180 heavyiron 7781
highlight_group5:
7782
        db      0
474 diamond 7783
        db      1Ah, 3Ah, 0, 0
814 diamond 7784
        db      '*|*.*,readme,makefile',0
180 heavyiron 7785
highlight_group6:
7786
        db      0
474 diamond 7787
        db      1Dh, 3Dh, 0, 0
180 heavyiron 7788
        db      '*.rar,*.zip,*.[zj],*.[bg7]z,*.[bg]zip,*.tar,*.t[ag]z,*.ar[cj],*.r[0-9][0-9],'
7789
        db      '*.a[0-9][0-9],*.bz2,*.cab,*.msi,*.jar,*.lha,*.lzh,*.ha,*.ac[bei],*.pa[ck],'
7790
        db      '*.rk,*.cpio,*.rpm,*.zoo,*.hqx,*.sit,*.ice,*.uc2,*.ain,*.imp,*.777,*.ufa,*.boa,'
7791
        db      '*.bs[2a],*.sea,*.hpk,*.ddi,*.x2,*.rkv,*.[lw]sz,*.h[ay]p,*.lim,*.sqz,*.chz',0
7792
highlight_group7:
7793
        db      0
474 diamond 7794
        db      16h, 36h, 0, 0
180 heavyiron 7795
        db      '*.bak,*.tmp',0
7796
highlight_group8:
7797
        db      0
474 diamond 7798
        db      17h, 37h, 0, 0
180 heavyiron 7799
        db      '*.asm,*.inc',0
7800
highlight_group9:
7801
        db      10h
474 diamond 7802
        db      1Fh, 3Fh, 0, 0
180 heavyiron 7803
        db      '*',0
7804
 
183 diamond 7805
bConfirmDelete  db      1
321 diamond 7806
bConfirmDeleteIncomplete db 0
183 diamond 7807
 
474 diamond 7808
FolderShortcuts dd      0,0,0,0,0,0,0,0,0,0
7809
 
183 diamond 7810
; Здесь заканчиваются конфигурационные данные
7811
 
7812
bWasE0          db      0
7813
ctrlstate       db      0
474 diamond 7814
MemForImage     dd      0
7815
restore_semicolon dd    0
7816
bForHex         db      0
183 diamond 7817
 
7818
align   4
314 diamond 7819
; Сообщение о обломе при выделении памяти
7820
nomem_dlgdata:
7821
        dd      2
7822
        dd      -1
7823
        dd      -1
7824
        dd      12
7825
        dd      2
7826
        dd      1
7827
        dd      1
7828
        dd      aError
814 diamond 7829
        rb      8
314 diamond 7830
        dd      0
7831
        dd      0
7832
        dd      2
7833
; строка "No memory"
7834
        dd      1
7835
        dd      1,0,10,0
7836
        dd      aNoMemory
7837
        dd      1
7838
; кнопка "Ok"
7839
        dd      2
7840
        dd      4,1,7,1
7841
        dd      aOk
7842
        dd      0xD
7843
 
283 diamond 7844
; диалог копирования
7845
copy_dlgdata:
314 diamond 7846
        dd      1
283 diamond 7847
.x      dd      -1
7848
.y      dd      -1
7849
.width  dd      ?
7850
.height dd      4
7851
        dd      4
7852
        dd      2
7853
        dd      aCopyCaption
7854
.main_color db ?
7855
.border_color db ?
7856
.header_color db ?
7857
        db      0
814 diamond 7858
        dd      ?
283 diamond 7859
        dd      0
7860
        dd      0
7861
        dd      4
7862
; строка 'Копировать "%s" в:'
7863
        dd      1
7864
        dd      1,0
7865
.width2 dd      ?
7866
        dd      0
7867
        dd      CopySourceTextBuf
7868
        dd      0
7869
; поле редактирования с именем файла/папки назначения
7870
        dd      3
7871
        dd      1,1
7872
.width3 dd      ?
7873
        dd      1
7874
        dd      CopyDestEditBuf
7875
.flags0 dd      0
7876
; кнопка "копировать"
7877
.copy_btn:
7878
        dd      2
7879
.copy_x1 dd     ?
7880
        dd      3
7881
.copy_x2 dd     ?
7882
        dd      3
7883
        dd      aCopy
7884
.flags1 dd      18h
7885
; кнопка "отменить"
7886
        dd      2
7887
.cnl_x1 dd      ?
7888
        dd      3
7889
.cnl_x2 dd      ?
7890
        dd      3
7891
        dd      aCancelB
7892
.flags2 dd      8
7893
 
321 diamond 7894
mkdir_dlgdata:
7895
        dd      1
7896
        dd      -1, -1
7897
.width  dd      ?
7898
.height dd      4
7899
        dd      4, 2
7900
        dd      aMkDirCaption
814 diamond 7901
        dd      ?, ?
321 diamond 7902
        dd      0
7903
        dd      0
7904
        dd      4
7905
; Строка "Создать папку"
7906
        dd      1
7907
        dd      1,0,aMkDirLen,0
7908
        dd      aMkDir
7909
        dd      0
7910
; поле редактирования с именем создаваемой папки
7911
        dd      3
7912
        dd      1,1
7913
.width2 dd      ?
7914
        dd      1
7915
        dd      CopyDestEditBuf
7916
.flags0 dd      0xC
7917
; кнопка "Продолжить"
7918
.cont_btn:
7919
        dd      2
7920
.cont_x1 dd     ?
7921
        dd      3
7922
.cont_x2 dd     ?
7923
        dd      3
7924
        dd      a_Continue
7925
.flags1 dd      18h
7926
; кнопка "отменить"
7927
        dd      2
7928
.cnl_x1 dd      ?
7929
        dd      3
7930
.cnl_x2 dd      ?
7931
        dd      3
7932
        dd      aCancelB
7933
.flags2 dd      8
283 diamond 7934
 
474 diamond 7935
; диалог выделения/снятия
7936
mark_dlgdata:
7937
        dd      1
7938
        dd      -1, -1
7939
        dd      37, 1
7940
        dd      4, 2
7941
.title  dd      ?
814 diamond 7942
        dd      ?, ?
474 diamond 7943
        dd      0, 0
7944
        dd      1
7945
; поле редактирования
7946
        dd      3
7947
        dd      1, 0, 35, 0
7948
        dd      enter_string_buf
7949
.flags  dd      ?
7950
 
814 diamond 7951
; диалог быстрого поиска в панели (Alt+буквы)
7952
QuickSearchDlg:
7953
        dd      5
7954
.x      dd      ?
7955
.y      dd      ?
7956
        dd      20, 1
7957
        dd      1, 1
7958
        dd      aSearch
7959
        dd      ?, ?
7960
        dd      0, 0
7961
        dd      1
7962
; поле редактирования
7963
        dd      3
7964
        dd      1, 0, 18, 0
7965
        dd      quick_search_buf
7966
        dd      1Ch
7967
 
997 diamond 7968
; диалог поиска в файле для просмотрщика и редактора
7969
find_in_file_dlgdata:
7970
        dd      1
7971
.x      dd      -1
7972
.y      dd      -1
7973
.width  dd      ?
7974
.height dd      7
7975
        dd      4, 2
7976
        dd      aSearch
7977
        dd      ?, ?
7978
        dd      0, 0
7979
        dd      8
7980
; Строка "Искать"
7981
        dd      1
7982
        dd      1,0,aSearchForLen,0
7983
        dd      aSearchFor
7984
        dd      0
7985
; поле редактирования с текстом для поиска
7986
        dd      3
7987
        dd      1,1
7988
.width2 dd      ?
7989
        dd      1
7990
        dd      SearchStringEditBuf
7991
.flags0 dd      0xC
7992
; горизонтальный разделитель
7993
        dd      4
7994
        dd      -1,2
7995
        dd      -1,2
7996
        dd      0
7997
        dd      0
7998
; флажок "Учитывать регистр"
7999
        dd      5
8000
        dd      1,3
8001
        dd      -1,3
8002
        dd      aCaseSensitive
8003
.flags_case dd  18h     ; default: search is case sensitive
8004
; флажок "Только целые слова"
8005
        dd      5
8006
        dd      1,4
8007
        dd      -1,4
8008
        dd      aWholeWords
8009
.flags_whole dd 8       ; default: do NOT search whole words only
8010
; горизонтальный разделитель
8011
        dd      4
8012
        dd      -1,5
8013
        dd      -1,5
8014
        dd      0
8015
        dd      0
8016
; кнопка "Искать"
8017
.search_btn:
8018
        dd      2
8019
.search_x1 dd   ?
8020
        dd      6
8021
.search_x2 dd   ?
8022
        dd      6
8023
        dd      aSearchB
8024
.flags1 dd      18h
8025
; кнопка "отменить"
8026
        dd      2
8027
.cnl_x1 dd      ?
8028
        dd      6
8029
.cnl_x2 dd      ?
8030
        dd      6
8031
        dd      aCancelB
8032
.flags2 dd      8
8033
 
8034
; первый диалог поиска в файлах (запрос)
8035
filesearch_query_template:
8036
        dd      1
8037
.x      dd      ?
8038
.y      dd      ?
8039
.width  dd      ?
8040
.height dd      9
8041
        dd      4, 2
8042
        dd      aFileSearch
8043
        dd      ?
8044
        dd      0
8045
        dd      0, 0
8046
        dd      10
8047
; строка-приглашение для ввода маски
8048
        dd      1
8049
        dd      1,0,aFileMasksLen,0
8050
        dd      aFileMasks
8051
        dd      0
8052
; поле ввода для маски
8053
        dd      3
8054
        dd      1, 1
8055
.width2 dd      ?
8056
        dd      1
8057
.editptr1 dd    ?
8058
        dd      0xC
8059
; строка-приглашение для текста поиска
8060
        dd      1
8061
        dd      1,2,aContainingTextLen,2
8062
        dd      aContainingText
8063
        dd      0
8064
; поле ввода для текста поиска
8065
        dd      3
8066
        dd      1, 3
8067
.width3 dd      ?
8068
        dd      3
8069
.editptr2 dd    ?
8070
        dd      8
8071
; горизонтальный разделитель
8072
        dd      4
8073
        dd      -1,4
8074
        dd      -1,4
8075
        dd      0
8076
        dd      0
8077
; флажок "Учитывать регистр"
8078
        dd      5
8079
        dd      1,5
8080
        dd      -1,5
8081
        dd      aCaseSensitive
8082
.flags_case dd  ?       ; will be initialized from find_in_file_dlgdata
8083
; флажок "Только целые слова"
8084
        dd      5
8085
        dd      1,6
8086
        dd      -1,6
8087
        dd      aWholeWords
8088
.flags_whole dd ?       ; will be initialized from find_in_file_dlgdata
8089
; горизонтальный разделитель
8090
        dd      4
8091
        dd      -1,7
8092
        dd      -1,7
8093
        dd      0
8094
        dd      0
8095
; кнопка "Искать"
8096
.search_btn:
8097
        dd      2
8098
.search_x1 dd   ?
8099
        dd      8
8100
.search_x2 dd   ?
8101
        dd      8
8102
        dd      aSearchB
8103
        dd      18h
8104
; кнопка "отменить"
8105
        dd      2
8106
.cnl_x1 dd      ?
8107
        dd      8
8108
.cnl_x2 dd      ?
8109
        dd      8
8110
        dd      aCancelB
8111
        dd      8
8112
.size = $ - filesearch_query_template
8113
 
8114
; второй диалог поиска в файлах (сканирование)
8115
filesearch_search_template:
8116
        dd      1
8117
.x      dd      ?
8118
.y      dd      ?
8119
.width  dd      ?
8120
.height dd      ?
8121
        dd      4, 2
8122
.caption dd     ?
8123
        dd      ?
8124
        dd      0
8125
        dd      0, 0
8126
        dd      9
8127
; список найденных файлов
8128
        dd      6
8129
        dd      0, 0
8130
.width1 dd      ?
8131
.height1 dd     ?
8132
.data1  dd      ?
8133
        dd      0
8134
; горизонтальный разделитель
8135
        dd      4
8136
        dd      -1
8137
.y2     dd      ?
8138
        dd      -1
8139
        dd      ?
8140
        dd      0, 0
8141
; строка "Поиск  в:" либо "Поиск закончен..."
8142
        dd      1
8143
        dd      1
8144
.y3     dd      ?
8145
.width3 dd      ?
8146
        dd      ?
8147
.data3  dd      ?
8148
        dd      0
8149
; строка с текущей папкой
8150
        dd      1
8151
.x4     dd      ?
8152
.y4     dd      ?
8153
.width4 dd      ?
8154
        dd      ?
8155
.data4  dd      ?
8156
        dd      0
8157
; горизонтальный разделитель
8158
        dd      4
8159
        dd      -1
8160
.y5     dd      ?
8161
        dd      -1
8162
        dd      ?
8163
        dd      0, 0
8164
; кнопки
8165
.btn1:
8166
        dd      2
8167
.btn1x1 dd      ?
8168
.btn1y  dd      ?
8169
.btn1x2 dd      ?
8170
        dd      ?
8171
        dd      aNewSearch
8172
        dd      8
8173
.btn2:
8174
        dd      2
8175
.btn2x1 dd      ?
8176
.btn2y  dd      ?
8177
.btn2x2 dd      ?
8178
        dd      ?
8179
        dd      aGoto
8180
        dd      1Ch
8181
.btn3:
8182
        dd      2
8183
.btn3x1 dd      ?
8184
.btn3y  dd      ?
8185
.btn3x2 dd      ?
8186
        dd      ?
8187
        dd      aView
8188
        dd      8
8189
.btn4:
8190
        dd      2
8191
.btn4x1 dd      ?
8192
.btn4y  dd      ?
8193
.btn4x2 dd      ?
8194
        dd      ?
8195
        dd      aCancelB2
8196
        dd      8
8197
.size = $ - filesearch_search_template
8198
 
321 diamond 8199
RetryOrCancelBtn:
8200
        dd      aRetry
8201
        dd      a_Cancel
8202
DeleteOrKeepBtn:
8203
        dd      a_Delete
8204
        dd      aKeep
8205
RetryOrIgnoreBtn:
8206
        dd      aRetry
8207
        dd      aIgnore
474 diamond 8208
DeleteOrCancelBtn:
8209
        dd      a_Delete
8210
        dd      a_Cancel
8211
DeleteErrorBtn:
8212
        dd      aRetry
997 diamond 8213
SkipOrCancelBtn:
474 diamond 8214
        dd      aSkip
8215
        dd      aSkipAll
8216
        dd      a_Cancel
517 diamond 8217
ContinueBtn:
8218
        dd      aContinue
814 diamond 8219
EditorExitBtn:
8220
        dd      aSave
8221
        dd      aDontSave
8222
        dd      aContinueEdit
997 diamond 8223
YesOrNoBtn:
8224
        dd      aYes
8225
        dd      aNo
814 diamond 8226
 
589 diamond 8227
aCannotOpenFile_ptr     dd      aCannotOpenFile
997 diamond 8228
aCannotCreateThread_ptr dd      aCannotCreateThread
8229
ConfirmCancelMsg        dd      aConfirmCancel
814 diamond 8230
EditConfigErr_ptr:
8231
        dd      aEditConfigErr1
8232
        dd      aEditConfigErr2
183 diamond 8233
if lang eq ru
8234
aDeleteCaption          db      'Удаление',0
474 diamond 8235
aConfirmDeleteText      db      'Вы хотите удалить',0
8236
aDeleteFolder           db      ' папку',0
183 diamond 8237
aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
474 diamond 8238
aDeleteFile             db      ' файл',0
283 diamond 8239
aCancelB                db      '[ Отменить ]',0
8240
aCancelBLength = $ - aCancelB - 1
997 diamond 8241
aCancelB2               db      '[ Отмена ]',0
8242
aCancelB2Length = $ - aCancelB2 - 1
283 diamond 8243
aCopyCaption            db      'Копирование',0
8244
aCopy                   db      '[ Копировать ]',0
8245
aCopyLength = $ - aCopy - 1
321 diamond 8246
a_Continue              db      '[ Продолжить ]',0
8247
a_ContinueLength = $ - a_Continue - 1
517 diamond 8248
aCopy1                  db      'Копировать ',0
8249
aCopy2                  db      ' в:',0
314 diamond 8250
aError                  db      'Ошибка',0
8251
aContinue               db      'Продолжить',0
8252
aRetry                  db      'Повторить',0
321 diamond 8253
a_Cancel                db      'Отменить',0
8254
a_Delete                db      'Удалить',0
474 diamond 8255
aSkip                   db      'Пропустить',0
8256
aSkipAll                db      'Пропустить все',0
997 diamond 8257
aYes                    db      'Да',0
8258
aNo                     db      'Нет',0
314 diamond 8259
error0msg               db      'Странно... Нет ошибки',0
8260
error1msg               db      'Странно... Не определена база и/или раздел жёсткого диска',0
8261
error2msg               db      'Функция не поддерживается для данной файловой системы',0
8262
error3msg               db      'Неизвестная файловая система',0
8263
error4msg               db      'Странно... Ошибка 4',0
8264
error5msg               db      'Файл не найден',0
8265
error6msg               db      'Файл закончился',0
8266
error7msg               db      'Странно... Указатель вне памяти приложения',0
8267
error8msg               db      'Диск заполнен',0
8268
error9msg               db      'Файловая структура разрушена',0
8269
error10msg              db      'Доступ запрещён',0
8270
error11msg              db      'Ошибка устройства',0
8271
error30msg              db      'Недостаточно памяти',0
8272
error31msg              db      'Файл не является исполняемым',0
8273
error32msg              db      'Слишком много процессов',0
8274
aUnknownError           db      'Неизвестный код ошибки: ',0
8275
aCannotReadFolder       db      'Не могу прочитать папку',0
321 diamond 8276
aRunError               db      'Ошибка при запуске программы:',0
8277
aFileNameTooBig         db      'Полное имя файла слишком длинное',0
8278
aFolderNameTooBig       db      'Полное имя папки слишком длинное',0
8279
aCmdLineTooBig          db      'Командная строка превышает границу OS в 256 символов',0
8280
aCannotCopyToSelf       db      'Файл не может быть скопирован в самого себя',0
8281
aCannotReadFile         db      'Не могу прочитать файл',0
8282
aIncompleteFile         db      'Был получен неполный файл. Удалить его?',0
8283
aKeep                   db      'Оставить',0
8284
aCannotWriteFile        db      'Не могу записать в файл',0
8285
aCannotDeleteFile       db      'Не могу удалить файл',0
8286
aCannotDeleteFolder     db      'Не могу удалить папку',0
517 diamond 8287
aNotFolder              db      'не является папкой',0
321 diamond 8288
aIgnore                 db      'Игнорировать',0
8289
aMkDirCaption           db      'Создание папки',0
8290
aMkDir                  db      'Создать папку',0
8291
aMkDirLen = $ - aMkDir - 1
8292
aCannotMakeFolder       db      'Не могу создать папку',0
474 diamond 8293
aName                   db      3,'Имя'
8294
aSize                   db      6,'Размер'
8295
aDate                   db      4,'Дата'
8296
aTime                   db      5,'Время'
8297
aCannotLoadDLL          db      'Не могу загрузить DLL',0
589 diamond 8298
aCannotLoadPlugin       db      'Не могу загрузить плагин',0
474 diamond 8299
aInvalidDLL             db      'Файл не найден или имеет неверный формат',0
8300
aMissingExport          db      'Необходимая функция не найдена',0
8301
aInitFailed             db      'Ошибка при инициализации',0
8302
aIncompatibleVersion    db      'Несовместимая версия',0
8303
aTables                 db      'Таблицы',0
8304
aSelect                 db      'Пометить',0
8305
aDeselect               db      'Снять',0
589 diamond 8306
aCannotOpenFile         db      'Ошибка при открытии файла',0
997 diamond 8307
aCannotCreateThread     db      'Ошибка при создании потока',0
589 diamond 8308
aCannotSetFolder        db      'Не могу зайти в папку',0
814 diamond 8309
aSearch                 db      'Поиск',0
997 diamond 8310
aSearchB                db      '[ Искать ]',0
8311
aSearchBLength = $ - aSearchB - 1
8312
aSearchFor              db      'Искать',0
8313
aSearchForLen = $ - aSearchFor - 1
8314
aCaseSensitive          db      'Учитывать регистр',0
8315
aWholeWords             db      'Только целые слова',0
8316
aReverseSearch          db      'Обратный поиск',0
8317
aStringNotFound         db      'Строка не найдена',0
8318
aFileSearch             db      'Поиск файла',0
8319
aFileMasks              db      'Одна или несколько масок файлов:',0
8320
aFileMasksLen = $ - aFileMasks - 1
8321
aContainingText         db      'Содержащих текст:',0
8322
aContainingTextLen = $ - aContainingText - 1
8323
aSearchingIn            db      'Поиск "" в:',0
8324
aSearchingInLen = $ - aSearchingIn - 1
8325
aSearchDone             db      'Поиск закончен. Найдено ? файл(ов)',0
8326
aSearchDoneLen = $ - aSearchDone - 1
8327
aNewSearch              db      '[ Новый поиск ]',0
8328
aNewSearchLen = $ - aNewSearch - 1
8329
aGoto                   db      '[ Перейти ]',0
8330
aGotoLen = $ - aGoto - 1
8331
aView                   db      '[ Смотреть ]',0
8332
aViewLen = $ - aView - 1
814 diamond 8333
aEditConfigErr1         db      'Ошибка в конфигурации плагинов для редактора.',0
8334
aEditConfigErr2         db      'Попробуйте убрать лишние плагины.',0
8335
aEditNoMemory           db      'Файл слишком велик для загрузки в редактор.',0
8336
aLine                   db      '  Строка'
8337
aCol                    db      '   Кол '
8338
aEditorTitle            db      'Редактор',0
8339
aFileModified           db      'Файл был изменён',0
8340
aSave                   db      'Сохранить',0
8341
aDontSave               db      'Не сохранять',0
8342
aContinueEdit           db      'Продолжить редактирование',0
8343
aCannotSaveToPlugin     db      'Сохранение файлов на панелях плагинов не поддерживается',0
997 diamond 8344
aCannotSearchOnPlugin   db      'Поиск на панелях плагинов не поддерживается',0
8345
aCancelled              db      'Действие было прервано',0
8346
aConfirmCancel          db      'Вы действительно хотите отменить действие?',0
183 diamond 8347
else
8348
aDeleteCaption          db      'Delete',0
474 diamond 8349
aConfirmDeleteText      db      'Do you wish to delete',0
8350
aDeleteFolder           db      ' the folder',0
183 diamond 8351
aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
474 diamond 8352
aDeleteFile             db      ' the file',0
183 diamond 8353
aDelete                 db      ' Delete ',0
8354
aDeleteLength = $ - aDelete - 1
8355
aCancel                 db      ' Cancel ',0
8356
aCancelLength = $ - aCancel - 1
283 diamond 8357
aCancelB                db      '[ Cancel ]',0
8358
aCancelBLength = $ - aCancelB - 1
1035 diamond 8359
aCancelB2 = aCancelB
8360
aCancelB2Length = $ - aCancelB2 - 1
283 diamond 8361
aCopyCaption            db      'Copy',0
8362
aCopy                   db      '[ Copy ]',0
8363
aCopyLength = $ - aCopy - 1
321 diamond 8364
a_Continue              db      '[ Continue ]',0
8365
a_ContinueLength = $ - a_Continue - 1
283 diamond 8366
aCopy1                  db      'Copy "',0
8367
aCopy2                  db      '" to:',0
314 diamond 8368
aError                  db      'Error',0
8369
aContinue               db      'Continue',0
8370
aRetry                  db      'Retry',0
321 diamond 8371
a_Cancel                db      'Cancel',0
8372
a_Delete                db      'Delete',0
474 diamond 8373
aSkip                   db      'Skip',0
8374
aSkipAll                db      'Skip all',0
997 diamond 8375
aYes                    db      'Yes',0
8376
aNo                     db      'No',0
314 diamond 8377
error0msg               db      'Strange... No error',0
8378
error1msg               db      'Strange... Hard disk base and/or partition not defined',0
8379
error2msg               db      'The file system does not support this function',0
8380
error3msg               db      'Unknown file system',0
8381
error4msg               db      'Strange... Error 4',0
8382
error5msg               db      'File not found',0
8383
error6msg               db      'End of file',0
8384
error7msg               db      'Strange... Pointer lies outside of application memory',0
8385
error8msg               db      'Disk is full',0
8386
error9msg               db      'File structure is destroyed',0
8387
error10msg              db      'Access denied',0
8388
error11msg              db      'Device error',0
8389
error30msg              db      'Not enough memory',0
8390
error31msg              db      'File is not executable',0
8391
error32msg              db      'Too many processes',0
8392
aUnknownError           db      'Unknown error code: ',0
8393
aCannotReadFolder       db      'Cannot read folder',0
321 diamond 8394
aRunError               db      'Cannot execute program:',0
8395
aFileNameTooBig         db      'Full file name is too long',0
8396
aFolderNameTooBig       db      'Full folder name is too long',0
8397
aCmdLineTooBig          db      'Command line is too long (OS limit is 256 symbols)',0
8398
aCannotCopyToSelf       db      'File cannot be copied onto itself',0
8399
aCannotReadFile         db      'Cannot read file',0
8400
aIncompleteFile         db      'Incomplete file was retrieved. Delete it?',0
8401
aKeep                   db      'Keep',0
474 diamond 8402
aCannotWriteFile        db      'Cannot write to the file',0
8403
aCannotDeleteFile       db      'Cannot delete the file',0
8404
aCannotDeleteFolder     db      'Cannot delete the folder',0
517 diamond 8405
aNotFolder              db      'is not a folder',0
321 diamond 8406
aIgnore                 db      'Ignore',0
8407
aMkDirCaption           db      'Make folder',0
8408
aMkDir                  db      'Create the folder',0
8409
aMkDirLen = $ - aMkDir - 1
8410
aCannotMakeFolder       db      'Cannot create folder',0
474 diamond 8411
aName                   db      4,'Name'
8412
aSize                   db      4,'Size'
8413
aDate                   db      4,'Date'
8414
aTime                   db      4,'Time'
8415
aCannotLoadDLL          db      'Cannot load DLL',0
589 diamond 8416
aCannotLoadPlugin       db      'Cannot load plugin',0
474 diamond 8417
aInvalidDLL             db      'File is not found or invalid',0
8418
aMissingExport          db      'Required function is not present',0
8419
aInitFailed             db      'Initialization failed',0
8420
aIncompatibleVersion    db      'Incompatible version',0
8421
aTables                 db      'Tables',0
8422
aSelect                 db      'Select',0
8423
aDeselect               db      'Deselect',0
589 diamond 8424
aCannotOpenFile         db      'Cannot open the file',0
997 diamond 8425
aCannotCreateThread     db      'Cannot create a thread',0
8426
aCannotSetFolder        db      'Cannot enter to the folder',0
814 diamond 8427
aSearch                 db      'Search',0
997 diamond 8428
aSearchB                db      '[ Search ]',0
8429
aSearchBLength = $ - aSearchB - 1
8430
aSearchFor              db      'Search for',0
8431
aSearchForLen = $ - aSearch - 1
8432
aCaseSensitive          db      'Case sensitive',0
8433
aWholeWords             db      'Whole words',0
8434
aReverseSearch          db      'Reverse search',0
8435
aStringNotFound         db      'Could not find the string',0
8436
aFileSearch             db      'Find file',0
8437
aFileMasks              db      'A file mask or several file masks:',0
1035 diamond 8438
aFileMasksLen = $ - aFileMasks - 1
997 diamond 8439
aContainingText         db      'Containing text:',0
1035 diamond 8440
aContainingTextLen = $ - aContainingText - 1
997 diamond 8441
aSearchingIn            db      'Searching "" in:',0
8442
aSearchingInLen = $ - aSearchingIn - 1
8443
aSearchDone             db      'Search done. Found ? file(s)',0
8444
aSearchDoneLen = $ - aSearchDone - 1
8445
aNewSearch              db      '[ New search ]',0
8446
aNewSearchLen = $ - aNewSearch - 1
8447
aGoto                   db      '[ Go to ]',0
8448
aGotoLen = $ - aGoto - 1
8449
aView                   db      '[ View ]',0
8450
aViewLen = $ - aView - 1
814 diamond 8451
aEditConfigErr1         db      'Error in configuration of plugins for the editor.',0
8452
aEditConfigErr2         db      'Try to remove unnecessary plugins.',0
1035 diamond 8453
aEditNoMemory           db      'The file is too big for the editor.',0
814 diamond 8454
aLine                   db      '    Line'
8455
aCol                    db      '   Col '
8456
aEditorTitle            db      'Editor',0
8457
aFileModified           db      'File has been modified',0
8458
aSave                   db      'Save',0
8459
aDontSave               db      'Do not save',0
8460
aContinueEdit           db      'Continue editing',0
8461
aCannotSaveToPlugin     db      'Saving is not supported for plugin panels',0
1035 diamond 8462
aCannotSearchOnPlugin   db      'The search on plugin panels is not supported yet',0
997 diamond 8463
aCancelled              db      'Operation has been interrupted',0
8464
aConfirmCancel          db      'Do you really want to cancel it?',0
183 diamond 8465
end if
474 diamond 8466
 
314 diamond 8467
aOk                     db      'OK',0
474 diamond 8468
aNoMemory               db      'No memory!'
8469
nullstr                 db      0
589 diamond 8470
aUntitled               db      'untitled',0
8471
aDotDot                 db      '..',0,0
474 diamond 8472
standard_dll_path:
631 diamond 8473
libini_name             db      '/sys/lib/'
474 diamond 8474
standard_dll_path_size = $ - standard_dll_path
8475
                        db      'libini.obj',0
8476
aStart                  db      'START',0
8477
aLibInit                db      'lib_init',0
8478
aVersion                db      'version',0
1102 diamond 8479
aIniGetInt              db      'ini_get_int',0
8480
aIniGetStr              db      'ini_get_str',0
8481
aIniSetInt              db      'ini_set_int',0
8482
aIniEnumKeys            db      'ini_enum_keys',0
589 diamond 8483
aPluginLoad             db      'plugin_load',0
8484
aPluginUnload           db      'plugin_unload',0
8485
aGetattr                db      'getattr',0
8486
aOpen                   db      'open',0
8487
aRead                   db      'read',0
8488
aSetpos                 db      'setpos',0
8489
aClose                  db      'close',0
8490
aOpenFilePlugin         db      'OpenFilePlugin',0
8491
aClosePlugin            db      'ClosePlugin',0
8492
aReadFolder             db      'ReadFolder',0
8493
aSetFolder              db      'SetFolder',0
8494
aGetOpenPluginInfo      db      'GetOpenPluginInfo',0
8495
aGetPanelTitle          db      'GetPanelTitle',0
8496
aGetFiles               db      'GetFiles',0
814 diamond 8497
aEditInfoSize           db      'EditInfoSize',0
183 diamond 8498
 
474 diamond 8499
aConfirmations          db      'Confirmations',0
8500
aConfirmDelete          db      'Delete',0
8501
aConfirmDeleteIncomplete db     'DeleteIncomplete',0
8502
 
589 diamond 8503
aPanels                 db      'Panels',0
8504
aLeftViewMode           db      'LeftViewMode',0
8505
aRightViewMode          db      'RightViewMode',0
1045 diamond 8506
aLeftSortMode           db      'LeftSortMode',0
8507
aRightSortMode          db      'RightSortMode',0
589 diamond 8508
 
814 diamond 8509
aEditor                 db      'Editor',0
8510
aEolStyle               db      'EOLStyle',0
8511
 
474 diamond 8512
aAssociations           db      'Associations',0
589 diamond 8513
aPlugins                db      'Plugins',0
474 diamond 8514
aMenu                   db      'Menu',0
8515
aFolderShortcuts        db      'FolderShortcuts',0
8516
aShortcut               db      'Shortcut'
8517
.d                      db      '0',0
8518
 
8519
align 4
8520
ini_import:
8521
ini.get_int     dd      aIniGetInt
8522
ini.get_str     dd      aIniGetStr
517 diamond 8523
ini.enum_keys   dd      aIniEnumKeys
589 diamond 8524
ini.set_int     dd      aIniSetInt
474 diamond 8525
                dd      0
8526
 
589 diamond 8527
plugin_exported:
8528
        dd      aPluginUnload
8529
        dd      aGetattr
8530
        dd      aOpen
8531
        dd      aRead
8532
        dd      aSetpos
8533
        dd      aClose
8534
        dd      aOpenFilePlugin
8535
        dd      aClosePlugin
8536
        dd      aReadFolder
8537
        dd      aSetFolder
8538
        dd      aGetOpenPluginInfo
8539
        dd      aGetPanelTitle
8540
        dd      aGetFiles
814 diamond 8541
        dd      aEditInfoSize
589 diamond 8542
        dd      0
8543
plugin_exported_default:
8544
        dd      plugin_unload_default
8545
        dd      getattr_default
8546
        dd      open_default
8547
        dd      read
8548
        dd      setpos_default
8549
        dd      close
8550
        dd      OpenFilePlugin_default
8551
        dd      ClosePlugin_default
8552
        dd      ReadFolder_default
8553
        dd      SetFolder_default
8554
        dd      GetOpenPluginInfo_default
8555
        dd      GetPanelTitle_default
8556
        dd      GetFiles_default
814 diamond 8557
        dd      0       ; default value for EditInfoSize
589 diamond 8558
 
8559
kfar_info:
8560
        dd      .size
8561
        dd      version_dword
8562
        dd      open
631 diamond 8563
        dd      open2
589 diamond 8564
        dd      read
8565
        dd      -1      ; write: to be implemented
8566
        dd      seek
631 diamond 8567
        dd      tell
589 diamond 8568
        dd      -1      ; flush: to be implemented
8569
        dd      filesize
8570
        dd      close
8571
        dd      xpgalloc
8572
        dd      xpgrealloc
8573
        dd      pgfree
8574
        dd      getfreemem
8575
        dd      libini_alloc
8576
        dd      libini_realloc
8577
        dd      libini_free
8578
        dd      menu
8579
        dd      menu_centered_in
8580
        dd      DialogBox
8581
        dd      SayErr
8582
        dd      Message
8583
        dd      cur_width
8584
.size = $ - kfar_info
8585
 
8586
plugins         dd      0
8587
num_plugins     dd      0
8588
alloc_plugins   dd      0
8589
 
814 diamond 8590
EditPlugInfo    dd      0
8591
EditEOLStyle    db      edit.eol_unix
8592
 
474 diamond 8593
virtual at 0
589 diamond 8594
PluginInfo:
8595
.unload         dd      ?
8596
.getattr        dd      ?
8597
.open           dd      ?
8598
.read           dd      ?
8599
.setpos         dd      ?
8600
.close          dd      ?
8601
.OpenFilePlugin dd      ?
8602
.ClosePlugin    dd      ?
8603
.ReadFolder     dd      ?
8604
.SetFolder      dd      ?
8605
.GetOpenPluginInfo dd   ?
8606
.GetPanelTitle  dd      ?
8607
.GetFiles       dd      ?
814 diamond 8608
.EditInfoSize   dd      ?
8609
.EditInfoOffs   dd      ?
589 diamond 8610
.size = $
8611
end virtual
8612
 
8613
virtual at 0
474 diamond 8614
PanelMode:
8615
; up to 16 columns on one panel
8616
.NumColumns     dd      ?
8617
; available column types:
8618
COLUMN_TYPE_NONE = 0
8619
COLUMN_TYPE_NAME = 1
8620
        COLUMN_NAME_MARK = 10h          ; (reserved)
8621
        COLUMN_NAME_NOPATH = 20h        ; (reserved)
8622
        COLUMN_NAME_RIGHTALIGN = 40h    ; (reserved)
8623
COLUMN_TYPE_SIZE = 2
8624
        COLUMN_SIZE_COMMA = 10h         ; (reserved)
8625
COLUMN_TYPE_PACKED_SIZE = 3             ; (reserved)
8626
COLUMN_TYPE_DATE = 4
8627
COLUMN_TYPE_TIME = 5
8628
COLUMN_TYPE_DATETIME = 6                ; (reserved)
8629
COLUMN_TYPE_DATETIME_CREATION = 7       ; (reserved)
8630
COLUMN_TYPE_DATETIME_ACCESS = 8         ; (reserved)
8631
COLUMN_TYPE_ATTRIBUTES = 9              ; (reserved)
8632
COLUMN_TYPE_DESCRIPTION = 10            ; (reserved)
8633
COLUMN_TYPE_OWNER = 11                  ; (reserved)
8634
COLUMN_TYPE_NUMLINKS = 12               ; (reserved)
8635
COLUMN_TYPE_CUSTOM = 13                 ; (reserved)
8636
.ColumnTypes    rb      16
8637
 
8638
.ColumnWidths   rb      16
8639
.bFullScreen    db      ?               ; (reserved)
8640
.bAlignExtensions db    ?
8641
                rb      2
8642
.size = $
8643
end virtual
8644
 
8645
align 4
8646
column_headers:
8647
        dd      nullstr
8648
        dd      aName
8649
        dd      aSize
8650
        dd      nullstr
8651
        dd      aDate
8652
        dd      aTime
8653
draw_column_proc:
8654
        dd      draw_empty_column
8655
        dd      draw_name_column
8656
        dd      draw_size_column
8657
        dd      -1
8658
        dd      draw_date_column
8659
        dd      draw_time_column
8660
colmodes:
8661
; режим 0 : NM,SC,D
8662
        dd      3
8663
        db      COLUMN_TYPE_NAME+COLUMN_NAME_MARK, COLUMN_TYPE_SIZE+COLUMN_SIZE_COMMA
8664
                db      COLUMN_TYPE_DATE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
8665
        db      0, 10, 8
8666
                times 13 db 0
8667
        db      0, 1
8668
                times 2 db 0
8669
; режим 1 : N,N,N
8670
        dd      3
8671
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_NAME, COLUMN_TYPE_NAME
8672
                times 13 db 0
8673
        times 16 db 0
8674
        db      0, 1
8675
                times 2 db 0
8676
; режим 2 : N,N
8677
        dd      2
8678
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_NAME
8679
                times 14 db 0
8680
        times 16 db 0
8681
        db      0, 0
8682
                times 2 db 0
8683
; режим 3 : N,S,D,T
8684
        dd      4
8685
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_SIZE, COLUMN_TYPE_DATE, COLUMN_TYPE_TIME
8686
                times 12 db 0
8687
        db      0, 6, 8, 5
8688
                times 12 db 0
8689
        db      0, 1
8690
                times 2 db 0
8691
; режим 4 : N,S
8692
        dd      2
8693
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_SIZE
8694
                times 14 db 0
8695
        db      0, 6
8696
                times 14 db 0
8697
        db      0, 0
8698
                times 2 db 0
8699
; режим 5 : N,S,P,DM,DC,DA,A
8700
; режим 6 : N,Z
8701
; режим 7 : N,S,Z
8702
; режим 8 : N,S,O
8703
; режим 9 : N,S,LN
8704
 
180 heavyiron 8705
execinfo:
8706
        dd      7
8707
        dd      0
8708
execparams dd   0
8709
        dd      0
8710
        dd      0
8711
        db      0
8712
execptr dd      ?
8713
 
8714
IncludeIGlobals
8715
 
8716
i_end:
8717
 
8718
IncludeUGlobals
8719
 
8720
execdata rb     1024
321 diamond 8721
execdataend:
180 heavyiron 8722
        align   4
8723
attrinfo.attr   rb      40
8724
 
8960 IgorA 8725
panel1 PanelData
180 heavyiron 8726
 
8960 IgorA 8727
panel2 PanelData
180 heavyiron 8728
 
283 diamond 8729
;console_data    rb      max_width*max_height*2
180 heavyiron 8730
 
814 diamond 8731
nomem_dlgsavearea       rb      8 + (12+4)*(3+3)*2
314 diamond 8732
 
814 diamond 8733
quicksearch_savearea    rb      22*3*2
8734
quicksearch_maxlen = 64
8735
quick_search_buf        rb      12 + quicksearch_maxlen
8736
 
180 heavyiron 8737
cur_header      rb      max_width
8738
tmp             dd      ?
8739
 
8740
skinh           dd      ?
8741
std_colors      rd      10
8742
 
283 diamond 8743
min_y           dd      ?
8744
max_y           dd      ?
8745
min_x           dd      ?
8746
max_x           dd      ?
8747
used_width      dd      ?
8748
used_height     dd      ?
8749
 
314 diamond 8750
wnd_width       dd      ?
8751
wnd_height      dd      ?
8752
 
180 heavyiron 8753
column_left     dd      ?
8754
column_top      dd      ?
8755
column_width    dd      ?
8756
column_height   dd      ?
8757
column_index    dd      ?
474 diamond 8758
last_column_index dd    ?
180 heavyiron 8759
 
8760
scrpos          dq      ?
8761
viewer_right_side dq    ?
8762
 
814 diamond 8763
EditDataSize    dd      ?
8764
EditBlockStart  dd      ?
8765
EditBlockSize   dd      ?
8766
 
180 heavyiron 8767
saved_file_name:
8768
procinfo        rb      1024
283 diamond 8769
lower_file_name = procinfo + 512
180 heavyiron 8770
 
474 diamond 8771
app_path        rb      1100
8772
 
314 diamond 8773
error_msg       rb      128
8774
 
8775
prev_dir        rb      1024
8776
 
180 heavyiron 8777
driveinfo       rb      32+304
8778
tmpname         rb      32
8779
 
8780
screens         dd      ?
8781
num_screens     dd      ?
8782
active_screen_vtable dd ?
8783
active_screen_data dd   ?
997 diamond 8784
active_screen_keybar dd ?
180 heavyiron 8785
 
589 diamond 8786
default_attr    dd      ?
631 diamond 8787
left_dotdot_entry       rb      40+4    ; 40 bytes for attributes + '..'
8788
right_dotdot_entry      rb      40+4
589 diamond 8789
 
183 diamond 8790
aConfirmDeleteTextBuf   rb      aConfirmDeleteTextMax + 1
283 diamond 8791
CopySourceTextBuf       rb      512
8792
CopyDestEditBuf         rb      12+512+1
321 diamond 8793
.length = $ - CopyDestEditBuf - 13
183 diamond 8794
 
997 diamond 8795
SearchStringEditBuf     rb      12
8796
SearchString            rb      253+1
8797
SearchStringEditBuf.length = $ - SearchString - 1
8798
                        db      ?       ; used for output (string -> "string")
8799
 
474 diamond 8800
enter_string_buf        rb      12+512+1
8801
 
8802
bMemForImageValidData   db      ?
8803
 
283 diamond 8804
align 4
997 diamond 8805
identical_table rb      256
474 diamond 8806
tolower_table   rb      256
997 diamond 8807
isspace_table   rb      256
8808
composite_table rb      256
283 diamond 8809
layout          rb      128
8810
 
517 diamond 8811
copy_buffer_size = 65536
283 diamond 8812
copy_buffer     rb      copy_buffer_size
8813
 
589 diamond 8814
filedata_buffer_size = 1024
8815
filedata_buffer rb      filedata_buffer_size
8816
 
8817
source_hModule  dd      ?
8818
source_hPlugin  dd      ?
8819
source_hFile    dd      ?
474 diamond 8820
; data for directory delete
8821
; If directory nested level is >1024, then its full name is too big,
8822
; so we see the overflow when creating full name (we check for this!)
8823
del_dir_stack   rd      1024
8824
del_dir_stack_ptr dd    ?
8825
del_dir_query_size = 32
8826
del_dir_query_area rb   32+304*del_dir_query_size
8827
 
517 diamond 8828
label copy_dir_stack dword at del_dir_stack
8829
label copy_dir_stack_ptr dword at del_dir_stack_ptr
8830
copy_dir_query_size = del_dir_query_size
8831
copy_dir_query_area = del_dir_query_area
8832
del_bSkipAll    db      ?       ; for directory errors
8833
label copy_bSkipAll byte at del_bSkipAll
8834
copy_bSkipAll2  db      ?       ; for file read/write errors
589 diamond 8835
copy_bSkipAll3  db      ?       ; for SetFolder errors
517 diamond 8836
 
8837
bEndSlash       db      ?
8838
bDestIsFolder   db      ?
8839
bNeedRestoreName db     ?
8840
 
180 heavyiron 8841
; stack
183 diamond 8842
        align   4
589 diamond 8843
        rb      32768
180 heavyiron 8844
stacktop:
8845
 
8846
mem: