Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
183 diamond 1
; int __stdcall GenericBox(DLGTEMPLATE* dlg, void* DlgProc);
2
;       int __stdcall DlgProc(DLGTEMPLATE* dlg, int msg, int param1, int param2);
180 heavyiron 3
 
4
virtual at 0
5
dlgtemplate:
6
.flags          dd      ?
7
.x              dd      ?
8
.y              dd      ?
9
.width          dd      ?
10
.height         dd      ?
11
.border_size_x  dd      ?
12
.border_size_y  dd      ?
13
.title          dd      ?
14
.main_color     db      ?
15
.border_color   db      ?
16
.header_color   db      ?
17
                db      ?       ; align
183 diamond 18
.size = $
180 heavyiron 19
end virtual
20
 
183 diamond 21
GenericBox:
180 heavyiron 22
        pushad
183 diamond 23
        mov     ebx, [esp+20h+4]
24
; center window if required
25
        cmp     [ebx+dlgtemplate.x], -1
26
        jnz     @f
27
        mov     eax, [cur_width]
28
        sub     eax, [ebx+dlgtemplate.width]
29
        shr     eax, 1
30
        mov     [ebx+dlgtemplate.x], eax
31
@@:
32
        cmp     [ebx+dlgtemplate.y], -1
33
        jnz     @f
34
        mov     eax, [cur_height]
35
        sub     eax, [ebx+dlgtemplate.height]
36
        shr     eax, 1
37
        mov     [ebx+dlgtemplate.y], eax
38
@@:
180 heavyiron 39
; some checks
40
        mov     eax, [ebx+dlgtemplate.x]
41
        cmp     eax, 1
42
        jl      .sizeerr
43
        add     eax, [ebx+dlgtemplate.width]
44
        cmp     eax, [cur_width]
45
        jge     .sizeerr
46
        mov     eax, [ebx+dlgtemplate.y]
47
        cmp     eax, 1
48
        jl      .sizeerr
49
        add     eax, [ebx+dlgtemplate.height]
50
        cmp     eax, [cur_height]
51
        jge     .sizeerr
52
        cmp     [ebx+dlgtemplate.border_size_x], 1
53
        jl      .sizeerr
54
        cmp     [ebx+dlgtemplate.border_size_y], 1
55
        jge     .sizeok
56
.sizeerr:
57
        popad
58
        or      eax, -1
59
        ret     8
60
.sizeok:
61
; allocate memory for data under dialog
62
        mov     eax, [ebx+dlgtemplate.width]
63
        add     eax, [ebx+dlgtemplate.border_size_x]
64
        add     eax, [ebx+dlgtemplate.border_size_x]
65
        inc     eax
66
        inc     eax
67
        mov     edx, [ebx+dlgtemplate.height]
68
        add     edx, [ebx+dlgtemplate.border_size_y]
69
        add     edx, [ebx+dlgtemplate.border_size_y]
70
        inc     edx
71
        mul     edx
72
        add     eax, eax
73
        call    mf_alloc
74
        test    eax, eax
75
        jnz     @f
76
; TODO: add error message
77
        popad
78
        or      eax, -1
79
        ret     8
80
@@:
81
        mov     ebp, eax
82
; save data
83
        mov     eax, [ebx+dlgtemplate.y]
84
        add     eax, [ebx+dlgtemplate.height]
85
        add     eax, [ebx+dlgtemplate.border_size_y]
86
        inc     eax
87
        push    eax
88
        mov     eax, [ebx+dlgtemplate.x]
89
        add     eax, [ebx+dlgtemplate.width]
90
        add     eax, [ebx+dlgtemplate.border_size_x]
91
        inc     eax
92
        inc     eax
93
        push    eax
94
        mov     eax, [ebx+dlgtemplate.y]
95
        sub     eax, [ebx+dlgtemplate.border_size_y]
96
        push    eax
97
        mov     eax, [ebx+dlgtemplate.x]
98
        sub     eax, [ebx+dlgtemplate.border_size_x]
99
        push    eax
100
        call    save_console_data
101
; draw shadow
102
        mov     eax, [ebx+dlgtemplate.x]
103
        sub     eax, [ebx+dlgtemplate.border_size_x]
104
        ja      @f
105
        xor     eax, eax
106
@@:
107
        push    eax     ; save real window left
108
        inc     eax
109
        inc     eax
110
        mov     edx, [ebx+dlgtemplate.y]
111
        sub     edx, [ebx+dlgtemplate.border_size_y]
112
        ja      @f
113
        xor     edx, edx
114
@@:
115
        push    edx     ; save real window top
116
        inc     edx
117
        call    get_console_ptr
118
        mov     ecx, [ebx+dlgtemplate.y]
119
        add     ecx, [ebx+dlgtemplate.height]
120
        add     ecx, [ebx+dlgtemplate.border_size_y]
121
        inc     ecx
122
        cmp     ecx, [cur_height]
123
        jb      @f
124
        mov     ecx, [cur_height]
125
@@:
126
        sub     ecx, edx
127
        mov     edx, ecx
128
        mov     ecx, [ebx+dlgtemplate.x]
129
        add     ecx, [ebx+dlgtemplate.width]
130
        add     ecx, [ebx+dlgtemplate.border_size_x]
131
        inc     ecx
132
        inc     ecx
133
        cmp     ecx, [cur_width]
134
        jb      @f
135
        mov     ecx, [cur_width]
136
@@:
137
        sub     ecx, eax
138
        mov     eax, ecx
139
.shadow_loop:
140
        mov     ecx, eax
141
        push    edi
142
.sl1:
143
        inc     edi
144
        test    byte [edi], 0x0F
145
        jnz     @f
146
        or      byte [edi], 8
147
@@:
148
        and     byte [edi], 0x0F
149
        inc     edi
150
        loop    .sl1
151
        pop     edi
152
        add     edi, [cur_width]
153
        add     edi, [cur_width]
154
        dec     edx
155
        jnz     .shadow_loop
156
; draw area background
157
        pop     edx
158
        pop     eax
159
        call    get_console_ptr
160
        mov     ecx, [ebx+dlgtemplate.x]
161
        add     ecx, [ebx+dlgtemplate.width]
162
        add     ecx, [ebx+dlgtemplate.border_size_x]
163
        cmp     ecx, [cur_width]
164
        jb      @f
165
        mov     ecx, [cur_width]
166
@@:
167
        sub     ecx, eax
168
        mov     esi, ecx
169
        mov     ecx, [ebx+dlgtemplate.y]
170
        add     ecx, [ebx+dlgtemplate.height]
171
        add     ecx, [ebx+dlgtemplate.border_size_y]
172
        cmp     ecx, [cur_height]
173
        jb      @f
174
        mov     ecx, [cur_height]
175
@@:
176
        sub     ecx, edx
177
        mov     edx, ecx
178
        mov     al, ' '
179
        mov     ah, [ebx+dlgtemplate.border_color]
180
.1:
181
        mov     ecx, esi
182
        push    edi
183
        rep     stosw
184
        pop     edi
185
        add     edi, [cur_width]
186
        add     edi, [cur_width]
187
        dec     edx
188
        jnz     .1
189
; draw border
190
        mov     eax, [ebx+dlgtemplate.x]
191
        dec     eax
192
        mov     edx, [ebx+dlgtemplate.y]
193
        dec     edx
194
        call    get_console_ptr
195
        mov     edx, [ebx+dlgtemplate.height]
196
        inc     edx
197
        inc     edx
198
        mov     ah, [ebx+dlgtemplate.border_color]
199
        push    ebx
200
        mov     ebx, [ebx+dlgtemplate.width]
201
        inc     ebx
202
        inc     ebx
203
        call    draw_border
204
        pop     ebx
205
; draw header
206
        mov     esi, [ebx+dlgtemplate.title]
207
        test    esi, esi
208
        jz      .noheader
209
        cmp     byte [esi], 0
210
        jz      .noheader
211
        push    esi
212
@@:     lodsb
213
        test    al, al
214
        jnz     @b
215
        mov     eax, esi
216
        pop     esi
217
        sub     eax, esi
218
        inc     eax     ; eax = фышэр чруюыютър + 2
219
        mov     ecx, [ebx+dlgtemplate.width]
220
        cmp     eax, ecx
221
        jbe     .fullhea
222
        sub     ecx, 5
223
        jb      .noheader
224
        xor     edx, edx
225
        jmp     .drawhea
226
.fullhea:
227
        mov     edx, ecx
228
        sub     edx, eax
229
        shr     edx, 1
230
.drawhea:
231
        mov     eax, [ebx+dlgtemplate.x]
232
        add     eax, edx
233
        mov     edx, [ebx+dlgtemplate.y]
234
        dec     edx
235
        call    get_console_ptr
236
        mov     ah, [ebx+dlgtemplate.header_color]
237
        mov     al, ' '
238
        stosw
239
        dec     ecx
240
.2:
241
        jecxz   .3
242
        lodsb
243
        test    al, al
244
        jz      .4
245
        stosw
246
        jmp     .2
247
.3:
248
        mov     al, '.'
249
        stosw
250
        stosw
251
        stosw
252
.4:
253
        mov     al, ' '
254
        stosw
255
.noheader:
256
; draw window background
257
        mov     eax, [ebx+dlgtemplate.x]
258
        mov     edx, [ebx+dlgtemplate.y]
259
        call    get_console_ptr
260
        mov     ah, [ebx+dlgtemplate.main_color]
261
        mov     al, ' '
262
        mov     edx, [ebx+dlgtemplate.height]
263
@@:
264
        mov     ecx, [ebx+dlgtemplate.width]
265
        push    edi
266
        rep     stosw
267
        pop     edi
268
        add     edi, [cur_width]
269
        add     edi, [cur_width]
270
        dec     edx
271
        jnz     @b
272
; send redraw message
273
        mov     eax, [esp+20h+8]
274
        push    ebx ebp
275
        push    0
276
        push    0
277
        push    1
183 diamond 278
        push    ebx
180 heavyiron 279
        call    eax
280
        call    draw_image
281
        pop     ebp ebx
282
; message loop
283
.event:
284
        push    10
285
        pop     eax
286
        int     40h
287
        dec     eax
288
        jz      .redraw
289
        dec     eax
290
        jz      .key
291
        or      eax, -1
292
        int     40h
293
.redraw:
294
        push    ebx ebp
295
        call    draw_window
296
        pop     ebp ebx
297
        jmp     .event
298
.key:
299
        mov     al, 2
300
        int     40h
301
        shr     eax, 8
302
        cmp     al, 0xE0
303
        jnz     @f
304
        mov     [bWasE0], 1
305
        jmp     .event
306
@@:
307
        xchg    ah, [bWasE0]
308
        cmp     al, 0x1D
309
        jz      .ctrl_down
310
        cmp     al, 0x9D
311
        jz      .ctrl_up
312
        cmp     al, 0x2A
313
        jz      .lshift_down
314
        cmp     al, 0xAA
315
        jz      .lshift_up
316
        cmp     al, 0x36
317
        jz      .rshift_down
318
        cmp     al, 0xB6
319
        jz      .rshift_up
320
        cmp     al, 0x38
321
        jz      .alt_down
322
        cmp     al, 0xB8
323
        jz      .alt_up
324
        mov     ecx, [esp+20h+8]
325
        push    ebx ebp
326
        push    0
327
        push    eax
328
        push    2
183 diamond 329
        push    ebx
180 heavyiron 330
        call    ecx
331
        pop     ebp ebx
332
        test    eax, eax
333
        jz      .event
334
        mov     [esp+28], eax
335
        jmp     .exit
336
.ctrl_down:
337
        test    ah, ah
338
        jnz     .rctrl_down
339
        or      [ctrlstate], 4
340
        jmp     .event
341
.rctrl_down:
342
        or      [ctrlstate], 8
343
        jmp     .event
344
.ctrl_up:
345
        test    ah, ah
346
        jnz     .rctrl_up
347
        and     [ctrlstate], not 4
348
        jmp     .event
349
.rctrl_up:
350
        and     [ctrlstate], not 8
351
        jmp     .event
352
.lshift_down:
353
        test    ah, ah
354
        jnz     @f
355
        or      [ctrlstate], 1
356
@@:     jmp     .event
357
.lshift_up:
358
        test    ah, ah
359
        jnz     @b
360
        and     [ctrlstate], not 1
361
        jmp     @b
362
.rshift_down:
363
        or      [ctrlstate], 2
364
        jmp     .event
365
.rshift_up:
366
        and     [ctrlstate], not 2
367
        jmp     .event
368
.alt_down:
369
        test    ah, ah
370
        jnz     .ralt_down
371
        or      [ctrlstate], 0x10
372
        jmp     .event
373
.ralt_down:
374
        or      [ctrlstate], 0x20
375
        jmp     .event
376
.alt_up:
377
        test    ah, ah
378
        jnz     .ralt_up
379
        and     [ctrlstate], not 0x10
380
        jmp     .event
381
.ralt_up:
382
        and     [ctrlstate], not 0x20
383
        jmp     .event
384
.exit:
385
; restore data
386
        mov     eax, [ebx+dlgtemplate.y]
387
        add     eax, [ebx+dlgtemplate.height]
388
        add     eax, [ebx+dlgtemplate.border_size_y]
389
        inc     eax
390
        push    eax
391
        mov     eax, [ebx+dlgtemplate.x]
392
        add     eax, [ebx+dlgtemplate.width]
393
        add     eax, [ebx+dlgtemplate.border_size_x]
394
        inc     eax
395
        inc     eax
396
        push    eax
397
        mov     eax, [ebx+dlgtemplate.y]
398
        sub     eax, [ebx+dlgtemplate.border_size_y]
399
        push    eax
400
        mov     eax, [ebx+dlgtemplate.x]
401
        sub     eax, [ebx+dlgtemplate.border_size_x]
402
        push    eax
403
        call    restore_console_data
404
        call    draw_keybar
405
        mov     eax, ebp
406
        call    mf_free
407
        call    draw_image
408
        popad
409
        ret     8
410
 
411
save_console_data:
412
        cmp     dword [esp+4], 0
413
        jge     @f
414
        and     dword [esp+4], 0
415
@@:
416
        cmp     dword [esp+8], 0
417
        jge     @f
418
        and     dword [esp+8], 0
419
@@:
420
        mov     eax, [esp+12]
421
        cmp     eax, [cur_width]
422
        jbe     @f
423
        mov     eax, [cur_width]
424
@@:
425
        sub     eax, [esp+4]
426
        ja      @f
427
        ret     16
428
@@:
429
        mov     [esp+12], eax
430
        mov     eax, [esp+16]
431
        cmp     eax, [cur_height]
432
        jbe     @f
433
        mov     eax, [cur_height]
434
@@:
435
        sub     eax, [esp+8]
436
        ja      @f
437
        ret     16
438
@@:
439
        mov     [esp+16], eax
440
        mov     eax, [esp+4]
441
        mov     edx, [esp+8]
442
        call    get_console_ptr
443
        mov     esi, edi
444
        mov     edi, ebp
445
.l:
446
        mov     ecx, [esp+12]
447
        push    esi
448
        shr     ecx, 1
449
        rep     movsd
450
        adc     ecx, ecx
451
        rep     movsw
452
        pop     esi
453
        add     esi, [cur_width]
454
        add     esi, [cur_width]
455
        dec     dword [esp+16]
456
        jnz     .l
457
        ret     16
458
 
459
restore_console_data:
460
        cmp     dword [esp+4], 0
461
        jge     @f
462
        and     dword [esp+4], 0
463
@@:
464
        cmp     dword [esp+8], 0
465
        jge     @f
466
        and     dword [esp+8], 0
467
@@:
468
        mov     eax, [esp+12]
469
        cmp     eax, [cur_width]
470
        jbe     @f
471
        mov     eax, [cur_width]
472
@@:
473
        sub     eax, [esp+4]
474
        ja      @f
475
        ret     16
476
@@:
477
        mov     [esp+12], eax
478
        mov     eax, [esp+16]
479
        cmp     eax, [cur_height]
480
        jbe     @f
481
        mov     eax, [cur_height]
482
@@:
483
        sub     eax, [esp+8]
484
        ja      @f
485
        ret     16
486
@@:
487
        mov     [esp+16], eax
488
        mov     eax, [esp+4]
489
        mov     edx, [esp+8]
490
        call    get_console_ptr
491
        mov     esi, ebp
492
.l:
493
        mov     ecx, [esp+12]
494
        push    edi
495
        shr     ecx, 1
496
        rep     movsd
497
        adc     ecx, ecx
498
        rep     movsw
499
        pop     edi
500
        add     edi, [cur_width]
501
        add     edi, [cur_width]
502
        dec     dword [esp+16]
503
        jnz     .l
504
        ret     16
505
 
506
; int __stdcall menu(void* variants, const char* title, unsigned flags);
507
; variants указывает на текущий элемент в двусвязном линейном списке
508
menu:
509
        pop     eax
510
        push    [cur_height]
511
        push    [cur_width]
512
        push    0
513
        push    0
514
        push    eax
515
 
516
; int __stdcall menu_centered_in(unsigned left, unsigned top, unsigned width, unsigned height,
517
;       void* variants, const char* title, unsigned flags);
518
menu_centered_in:
519
        pushad
520
        mov     eax, 56
521
; 36 bytes for dlgtemplate + additional:
522
; +36: dd cur_variant
523
; +40: dd num_variants
524
; +44: dd begin_variant
525
; +48: dd end_variant
526
; +52: dd cur_variant_idx
527
        call    mf_alloc
528
        test    eax, eax
529
        jnz     @f
530
.ret_bad:
531
        popad
532
        or      eax, -1
533
        ret     28
534
@@:
535
        mov     ebx, eax
536
        mov     eax, 1
537
        test    byte [esp+20h+28], 1
538
        jz      @f
539
        mov     al, 3
540
@@:
541
        mov     [ebx+dlgtemplate.border_size_x], eax
542
        inc     eax
543
        shr     eax, 1
544
        mov     [ebx+dlgtemplate.border_size_y], eax
545
; Находим ширину и высоту окна
546
        xor     eax, eax
547
        xor     ecx, ecx
548
        mov     esi, [esp+20h+20]
549
        mov     [ebx+36], esi
550
        and     dword [ebx+52], 0
551
@@:
552
        cmp     dword [esi+4], 0
553
        jz      .find_width
554
        mov     esi, [esi+4]
555
        inc     dword [ebx+52]
556
        jmp     @b
557
.find_width:
558
        mov     [ebx+44], esi
559
        add     esi, 8
560
        push    esi
561
        xor     edx, edx
562
.fw1:
563
        cmp     byte [esi], '&'
564
        jnz     @f
565
        mov     dl, 1
566
@@:
567
        inc     esi
568
        cmp     byte [esi-1], 0
569
        jnz     .fw1
570
        sub     esi, [esp]
571
        sub     esi, edx
572
        dec     esi
573
        cmp     eax, esi
574
        ja      @f
575
        mov     eax, esi
576
@@:
577
        inc     ecx
578
        pop     esi
579
        mov     esi, [esi-8]
580
        test    esi, esi
581
        jnz     .find_width
582
        add     eax, 3
583
        add     eax, [ebx+dlgtemplate.border_size_x]
584
        add     eax, [ebx+dlgtemplate.border_size_x]
585
        cmp     eax, [cur_width]
586
        jb      @f
587
        mov     eax, [cur_width]
588
@@:
589
        sub     eax, [ebx+dlgtemplate.border_size_x]
590
        sub     eax, [ebx+dlgtemplate.border_size_x]
591
        mov     [ebx+dlgtemplate.width], eax
592
        mov     [ebx+dlgtemplate.height], ecx
593
        mov     [ebx+40], ecx
594
        sub     eax, [esp+20h+12]
595
        neg     eax
596
        sar     eax, 1
597
        add     eax, [esp+20h+4]
598
        cmp     eax, [ebx+dlgtemplate.border_size_x]
599
        jge     @f
600
        mov     eax, [ebx+dlgtemplate.border_size_x]
601
@@:
602
        push    eax
603
        add     eax, [ebx+dlgtemplate.width]
604
        add     eax, [ebx+dlgtemplate.border_size_x]
605
        cmp     eax, [cur_width]
606
        jbe     @f
607
        pop     eax
608
        mov     eax, [cur_width]
609
        sub     eax, [ebx+dlgtemplate.width]
610
        sub     eax, [ebx+dlgtemplate.border_size_x]
611
        push    eax
612
@@:
613
        pop     [ebx+dlgtemplate.x]
614
        sub     ecx, [esp+20h+16]
615
        neg     ecx
616
        sar     ecx, 1
617
        add     ecx, [esp+20h+8]
618
        cmp     ecx, [ebx+dlgtemplate.border_size_y]
619
        jge     @f
620
        mov     ecx, [ebx+dlgtemplate.border_size_y]
621
@@:
622
        push    ecx
623
        add     ecx, [ebx+dlgtemplate.height]
624
        add     ecx, [ebx+dlgtemplate.border_size_y]
625
        cmp     ecx, [cur_height]
626
        jbe     @f
627
        pop     ecx
628
        mov     ecx, [cur_height]
629
        sub     ecx, [ebx+dlgtemplate.height]
630
        sub     ecx, [ebx+dlgtemplate.border_size_y]
631
        push    ecx
632
@@:
633
        pop     [ebx+dlgtemplate.y]
634
        mov     eax, [cur_height]
635
        sub     eax, 6
636
        cmp     [ebx+dlgtemplate.height], eax
637
        jbe     .small_height
638
        mov     [ebx+dlgtemplate.height], eax
639
        mov     [ebx+dlgtemplate.y], 3
640
.small_height:
641
        mov     ecx, [ebx+dlgtemplate.height]
642
        mov     eax, [ebx+36]
643
        mov     [ebx+44], eax
644
        dec     ecx
645
        jz      .skip
646
        push    ecx
647
@@:
648
        cmp     dword [eax+4], 0
649
        jz      @f
650
        mov     eax, [eax+4]
651
        loop    @b
652
@@:
653
        mov     [ebx+44], eax
654
        pop     ecx
655
.loop:
656
        mov     eax, [eax]
657
        loop    .loop
658
.skip:
659
        mov     [ebx+48], eax
660
        mov     eax, [esp+20h+24]
661
        mov     [ebx+dlgtemplate.title], eax
662
        mov     al, [menu_normal_color]
663
        mov     [ebx+dlgtemplate.main_color], al
664
        mov     al, [menu_border_color]
665
        mov     [ebx+dlgtemplate.border_color], al
666
        mov     al, [menu_header_color]
667
        mov     [ebx+dlgtemplate.header_color], al
668
        push    MenuDlgProc
669
        push    ebx
183 diamond 670
        call    GenericBox
180 heavyiron 671
        mov     [esp+28], eax
672
        mov     eax, ebx
673
        call    mf_free
674
        popad
675
        ret     28
676
 
677
MenuDlgProc:
183 diamond 678
        mov     eax, [esp+8]
180 heavyiron 679
        cmp     al, 1
680
        jz      .draw
681
        cmp     al, 2
682
        jz      .key
183 diamond 683
        ret     16
180 heavyiron 684
.draw:
685
        call    .dodraw
183 diamond 686
        ret     16
180 heavyiron 687
.key:
183 diamond 688
        mov     al, [esp+12]
180 heavyiron 689
        cmp     al, 0x48
690
        jz      .prev
691
        cmp     al, 0x4B
692
        jz      .prev
693
        cmp     al, 0x4D
694
        jz      .next
695
        cmp     al, 0x50
696
        jz      .next
697
        cmp     al, 0x1C
698
        jz      .enter
699
        cmp     al, 1
700
        jz      .esc
701
        cmp     al, 0x47
702
        jz      .home
703
        cmp     al, 0x4F
704
        jz      .end
705
        cmp     al, 0x51
706
        jz      .pgdn
707
        cmp     al, 0x49
708
        jz      .pgup
709
        mov     edx, [ebx+36]
710
@@:
711
        cmp     dword [edx+4], 0
712
        jz      @f
713
        mov     edx, [edx+4]
714
        jmp     @b
715
@@:
716
.l:
717
        lea     esi, [edx+7]
718
@@:
719
        inc     esi
720
        cmp     byte [esi], 0
721
        jz      .n
722
        cmp     byte [esi], '&'
723
        jnz     @b
724
        movzx   ecx, byte [esi+1]
725
        cmp     [ascii2scan+ecx], al
726
        jnz     .n
727
        mov     eax, edx
183 diamond 728
        ret     16
180 heavyiron 729
.n:
730
        mov     edx, [edx]
731
        test    edx, edx
732
        jnz     .l
733
.ret:
734
        xor     eax, eax
183 diamond 735
        ret     16
180 heavyiron 736
.pgup:
737
        mov     eax, [ebx+36]
738
        mov     ecx, [ebx+dlgtemplate.height]
739
.pgupl:
740
        cmp     dword [eax+4], 0
741
        jz      .posret
742
        call    .line_prev
743
        loop    .pgupl
744
        jmp     .posret
745
.prev:
746
        mov     eax, [ebx+36]
747
        cmp     dword [eax+4], 0
748
        jz      .end
749
        call    .line_prev
750
.posret:
751
        mov     [ebx+36], eax
752
.redraw:
753
        call    .dodraw
754
        call    draw_image
755
        xor     eax, eax
183 diamond 756
        ret     16
180 heavyiron 757
.next:
758
        mov     eax, [ebx+36]
759
        cmp     dword [eax], 0
760
        jz      .home
761
        call    .line_next
762
        jmp     .posret
763
.pgdn:
764
        mov     eax, [ebx+36]
765
        mov     ecx, [ebx+dlgtemplate.height]
766
.pgdnl:
767
        cmp     dword [eax], 0
768
        jz      .posret
769
        call    .line_next
770
        loop    .pgdnl
771
        jmp     .posret
772
.home:
773
        mov     eax, [ebx+36]
774
@@:
775
        cmp     dword [eax+4], 0
776
        jz      @f
777
        mov     eax, [eax+4]
778
        jmp     @b
779
@@:
780
        mov     [ebx+44], eax
781
        push    eax
782
        mov     ecx, [ebx+dlgtemplate.height]
783
        dec     ecx
784
        jz      .h1
785
.h2:
786
        mov     eax, [eax]
787
        loop    .h2
788
.h1:
789
        mov     [ebx+48], eax
790
        pop     eax
791
        and     dword [ebx+52], 0
792
        jmp     .posret
793
.end:
794
        mov     eax, [ebx+36]
795
@@:
796
        cmp     dword [eax], 0
797
        jz      @f
798
        mov     eax, [eax]
799
        jmp     @b
800
@@:
801
        mov     [ebx+48], eax
802
        push    eax
803
        mov     ecx, [ebx+dlgtemplate.height]
804
        dec     ecx
805
        jz      .e1
806
.e2:
807
        mov     eax, [eax+4]
808
        loop    .e2
809
.e1:
810
        mov     [ebx+44], eax
811
        mov     eax, [ebx+40]
812
        dec     eax
813
        mov     [ebx+52], eax
814
        pop     eax
815
        jmp     .posret
816
.esc:
817
        or      eax, -1
183 diamond 818
        ret     16
180 heavyiron 819
.enter:
820
        mov     eax, [ebx+36]
183 diamond 821
        ret     16
180 heavyiron 822
 
823
.line_prev:
824
        cmp     eax, [ebx+44]
825
        jnz     @f
826
        mov     edx, [ebx+44]
827
        mov     edx, [edx+4]
828
        mov     [ebx+44], edx
829
        mov     edx, [ebx+48]
830
        mov     edx, [edx+4]
831
        mov     [ebx+48], edx
832
@@:
833
        mov     eax, [eax+4]
834
        dec     dword [ebx+52]
835
        ret
836
.line_next:
837
        cmp     eax, [ebx+48]
838
        jnz     @f
839
        mov     edx, [ebx+44]
840
        mov     edx, [edx]
841
        mov     [ebx+44], edx
842
        mov     edx, [ebx+48]
843
        mov     edx, [edx]
844
        mov     [ebx+48], edx
845
@@:
846
        mov     eax, [eax]
847
        inc     dword [ebx+52]
848
        ret
849
 
850
.dodraw:
851
        mov     eax, [ebx+dlgtemplate.x]
852
        mov     edx, [ebx+dlgtemplate.y]
853
        call    get_console_ptr
854
        mov     esi, [ebx+44]
855
.0:
856
        xor     edx, edx
857
        mov     ah, [menu_selected_color]
858
        cmp     esi, [ebx+36]
859
        jz      @f
860
        mov     ah, [menu_normal_color]
861
@@:
862
        push    edi
863
        mov     ecx, [ebx+dlgtemplate.width]
864
        mov     al, ' '
865
        stosw
866
        dec     ecx
867
        stosw
868
        dec     ecx
869
        dec     ecx
870
        push    esi
871
        add     esi, 8
872
@@:
873
        lodsb
874
        test    al, al
875
        jz      @f
876
        cmp     al, '&'
877
        jnz     .noamp
878
        test    dl, dl
879
        jnz     .noamp
880
        mov     dl, 1
881
        lodsb
882
        push    eax
883
        mov     ah, [menu_selected_highlight_color]
884
        push    ecx
885
        mov     ecx, [esp+8]
886
        cmp     ecx, [ebx+36]
887
        pop     ecx
888
        jz      .amp1
889
        mov     ah, [menu_highlight_color]
890
.amp1:
891
        stosw
892
        pop     eax
893
        jmp     .amp2
894
.noamp:
895
        stosw
896
.amp2:
897
        loop    @b
898
        mov     al, ' '
899
        cmp     byte [esi], 0
900
        jnz     .1
901
        lodsb
902
        jmp     .1
903
@@:
904
        mov     al, ' '
905
.1:
906
        stosw
907
        mov     al, ' '
908
        rep     stosw
909
        pop     esi edi
910
        add     edi, [cur_width]
911
        add     edi, [cur_width]
912
        cmp     esi, [ebx+48]
913
        jz      @f
914
        mov     esi, [esi]
915
        test    esi, esi
916
        jnz     .0
917
@@:
918
; Линейка прокрутки
919
        mov     ecx, [ebx+dlgtemplate.height]
920
        cmp     ecx, [ebx+40]
921
        jz      .noscrollbar
922
        sub     ecx, 2
923
        jbe     .noscrollbar
924
        mov     eax, [ebx+52]
925
        mul     ecx
926
        div     dword [ebx+40]
927
        push    eax
928
        mov     eax, [ebx+dlgtemplate.x]
929
        add     eax, [ebx+dlgtemplate.width]
930
        mov     edx, [ebx+dlgtemplate.y]
931
        call    get_console_ptr
932
        pop     edx
933
        inc     edx
934
        mov     al, 0x1E
935
        mov     ah, [menu_scrollbar_color]
936
        mov     [edi], ax
937
        add     edi, [cur_width]
938
        add     edi, [cur_width]
939
.2:
940
        mov     al, 0xB2
941
        dec     edx
942
        jz      @f
943
        mov     al, 0xB0
944
@@:
945
        mov     [edi], ax
946
        add     edi, [cur_width]
947
        add     edi, [cur_width]
948
        loop    .2
949
        mov     al, 0x1F
950
        stosw
951
.noscrollbar:
952
        ret
183 diamond 953
 
954
virtual at 0
955
dlgitemtemplate:
956
; Элементы:
957
;       1 = статический текст
958
.type           dd      ?
959
.x1             dd      ?
960
.y1             dd      ?
961
.x2             dd      ?
962
.y2             dd      ?
963
.data           dd      ?
964
.flags          dd      ?
965
; Флаги:
966
;       0 = выравнивание влево
967
;       1 = выравнивание по центру
968
;       2 = выравнивание вправо
969
;       4 = элемент имеет фокус ввода
970
.size = $
971
end virtual
972
;       struct DLGDATA
973
;       {
974
;               DLGTEMPLATE dialog;     /* window description */
975
;               void* DlgProc;          /* dialog procedure */
976
; /* int __stdcall DlgProc(DLGDATA* dlg, int msg, int param1, int param2); */
977
;               void* user_data;        /* arbitrary user data */
978
;               unsigned num_items;     /* number of items in the following array */
979
;               DLGITEMTEMPLATE items[]; /* array of dialog items */
980
;       }
981
; int __stdcall DialogBox(DLGDATA* dlg);
982
DialogBox:
983
        push    ManagerDlgProc
984
        push    dword [esp+8]
985
        call    GenericBox
986
        ret     8
987
 
988
ManagerDlgProc:
989
        mov     eax, [esp+8]
990
        dec     eax
991
        jz      .draw
992
        dec     eax
993
        jz      .key
994
        xor     eax, eax
995
        ret     16
996
.draw:
997
        call    .dodraw
998
        ret     16
999
.key:
1000
; find item with focus
1001
        add     ebx, dlgtemplate.size+12
1002
        mov     ecx, [ebx-4]
1003
        jecxz   .nobtns
1004
@@:
1005
        test    [ebx+dlgitemtemplate.flags], 4
1006
        jnz     @f
1007
        add     ebx, dlgitemtemplate.size
1008
        loop    @b
1009
@@:
1010
.nobtns:
1011
        mov     al, [esp+12]
1012
        cmp     al, 1
1013
        jz      .esc
1014
        cmp     al, 0x1C
1015
        jz      .enter
1016
        cmp     al, 0xF
1017
        jz      .tab
1018
        cmp     al, 0x48
1019
        jz      .up
1020
        cmp     al, 0x4B
1021
        jz      .left
1022
        cmp     al, 0x4D
1023
        jz      .right
1024
        cmp     al, 0x50
1025
        jz      .down
1026
.ret0:
1027
        xor     eax, eax
1028
        ret     16
1029
.esc:
1030
        or      eax, -1
1031
        ret     16
1032
.enter:
1033
        mov     eax, ebx
1034
        ret     16
1035
.tab:
1036
        test    [ctrlstate], 3
1037
        jnz     .shift_tab
1038
.right:
1039
.down:
1040
        jecxz   .ret0
1041
        and     byte [ebx+dlgitemtemplate.flags], not 4
1042
        dec     ecx
1043
        jz      .find_first_btn
1044
@@:
1045
        add     ebx, dlgitemtemplate.size
1046
        cmp     [ebx+dlgitemtemplate.type], 2
1047
        jz      .btn_found
1048
        loop    @b
1049
.find_first_btn:
1050
        mov     ebx, [esp+4]
1051
        add     ebx, dlgtemplate.size+12
1052
@@:
1053
        cmp     [ebx+dlgitemtemplate.type], 2
1054
        jz      .btn_found
1055
        add     ebx, dlgitemtemplate.size
1056
        jmp     @b
1057
.btn_found:
1058
        or      byte [ebx+dlgitemtemplate.flags], 4
1059
        mov     ebx, [esp+4]
1060
        call    .dodraw
1061
        call    draw_image
1062
        xor     eax, eax
1063
        ret     16
1064
.shift_tab:
1065
.left:
1066
.up:
1067
        jecxz   .ret0
1068
        and     byte [ebx+dlgitemtemplate.flags], not 4
1069
        mov     eax, [esp+4]
1070
        sub     ecx, [eax+dlgtemplate.size+8]
1071
        neg     ecx
1072
        jz      .find_last_btn
1073
@@:
1074
        sub     ebx, dlgitemtemplate.size
1075
        cmp     [ebx+dlgitemtemplate.type], 2
1076
        loopnz  @b
1077
        jz      .btn_found
1078
.find_last_btn:
1079
        mov     ebx, [eax+dlgtemplate.size+8]
1080
        imul    ebx, dlgitemtemplate.size
1081
        lea     ebx, [ebx+eax+dlgtemplate.size+12]
1082
@@:
1083
        sub     ebx, dlgitemtemplate.size
1084
        cmp     [ebx+dlgitemtemplate.type], 2
1085
        jnz     @b
1086
        jmp     .btn_found
1087
 
1088
.dodraw:
1089
        add     ebx, dlgtemplate.size+8
1090
        mov     ecx, [ebx]
1091
        add     ebx, 4
1092
        jecxz   .done_draw
1093
.draw_loop:
1094
        push    ecx
1095
        mov     eax, [ebx+dlgitemtemplate.type]
1096
        dec     eax
1097
        jz      .draw_text
1098
        dec     eax
1099
        jnz     .draw_loop_continue
1100
        call    draw_button
1101
        jmp     .draw_loop_continue
1102
.draw_text:
1103
        call    draw_static_text
1104
.draw_loop_continue:
1105
        pop     ecx
1106
        add     ebx, dlgitemtemplate.size
1107
        loop    .draw_loop
1108
.done_draw:
1109
        ret
1110
 
1111
draw_static_text:
1112
; рисуем статический текст
1113
        mov     ah, [dialog_main_color]
1114
draw_text:
1115
; определяем длину строки
1116
        mov     esi, [ebx+dlgitemtemplate.data]
1117
        test    esi, esi
1118
        jz      .ret
1119
        or      ecx, -1
1120
@@:
1121
        inc     ecx
1122
        cmp     byte [ecx+esi], 0
1123
        jnz     @b
1124
; в ecx длина строки
1125
        push    eax
1126
        xor     eax, eax
1127
        mov     edx, [ebx+dlgitemtemplate.x2]
1128
        sub     edx, [ebx+dlgitemtemplate.x1]
1129
        inc     edx
1130
        cmp     ecx, edx
1131
        jae     .text_draw
1132
        mov     al, byte [ebx+dlgitemtemplate.flags]
1133
        and     al, 3
1134
        jz      .text_align_left
1135
        cmp     al, 1
1136
        jz      .text_align_center
1137
; текст выровнен вправо
1138
        mov     eax, edx
1139
        sub     eax, ecx
1140
        jmp     .text_draw
1141
.text_align_center:
1142
        mov     eax, edx
1143
        sub     eax, ecx
1144
        shr     eax, 1
1145
        jmp     .text_draw
1146
.text_align_left:
1147
        xor     eax, eax
1148
.text_draw:
1149
        push    ecx
1150
        mov     ecx, [esp+24]
1151
        push    eax
1152
        mov     eax, [ebx+dlgitemtemplate.x1]
1153
        add     eax, [ecx+dlgtemplate.x]
1154
        push    edx
1155
        mov     edx, [ebx+dlgitemtemplate.y1]
1156
        add     edx, [ecx+dlgtemplate.y]
1157
        call    get_console_ptr
1158
        pop     edx
1159
        pop     ecx
1160
        mov     ah, [esp+5]
1161
        mov     al, ' '
1162
        rep     stosw
1163
        pop     ecx
1164
        cmp     ecx, edx
1165
        jbe     .text_copy
1166
        cmp     edx, 3
1167
        jb      .ret
1168
        mov     al, '.'
1169
        stosw
1170
        stosw
1171
        stosw
1172
        add     esi, ecx
1173
        mov     ecx, edx
1174
        sub     ecx, 3
1175
        sub     esi, ecx
1176
.text_copy:
1177
        jecxz   .ret
1178
@@:
1179
        lodsb
1180
        stosw
1181
        loop    @b
1182
.ret:
1183
        mov     ecx, [esp+20]
1184
        mov     eax, [ecx+dlgtemplate.x]
1185
        mov     edx, [ecx+dlgtemplate.y]
1186
        add     eax, [ebx+dlgitemtemplate.x2]
1187
        inc     eax
1188
        add     edx, [ebx+dlgitemtemplate.y1]
1189
        mov     ecx, edi
1190
        call    get_console_ptr
1191
        xchg    ecx, edi
1192
        sub     ecx, edi
1193
        shr     ecx, 1
1194
        pop     eax
1195
        mov     al, ' '
1196
        rep     stosw
1197
        ret
1198
 
1199
draw_button:
1200
        mov     ah, [dialog_normal_btn_color]
1201
        test    [ebx+dlgitemtemplate.flags], 4
1202
        jz      @f
1203
        mov     ah, [dialog_selected_btn_color]
1204
@@:
1205
        jmp     draw_text