Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
461 Lrz 1
;  04.04.2007 Исправлено управление мышкой, при удалении последнего символа в буфере пишеться 0 (спасибо Mario79)
449 Lrz 2
;  04.04.2007 Модернизировал систему выделения, существенно переделано управление и обработка, добавленно блокирования обработки других боксов, во время выделения мышкой текста, для этого в текст программы необходимо добавить идентификатор бокса т.е. dd 0x0 и в него будет помещаться укаатель на editbox
439 Lrz 3
;  30.03.2007 Переделал процедуру выделения, теперь текст выделяется только только мышкой
404 Lrz 4
;  09.03.2007 Дописал управление mouse + shift  выделение и перемещение
396 Lrz 5
;  07.03.2007 Дописал управление с shift home + end усправил несколько багов
391 Lrz 6
;  06.03.2007 Переписал полностью алгоритм управления shift
348 Lrz 7
;  15.02.2007 улучшение снятия выделения и перерисовки очищаемой области, значительно приятнее работает компонент
8
;  13.02.2007 убрал по возможности мерцание, улучшена обработка перерисовки фона
9
; добавил фитчу внесения 0х0 по адресу ed_size иначе у Maxxx32 были несостыковки в коде. Причина в том, что оптимизация была сведена к тому, что я не чистил символы в буфере, когда удалял, я просто их не выводил, и потом, когда вносился новый символ, он попросту затирал уже имеющийся. Если бы, программа обрабатывала конец строки по ed_size, проблемы не возникло. Но сейчас этот недостаток исправлен.
306 Lrz 10
;  01.02.2007 доработка edit_box, исправил баги.
295 Lrz 11
;  26.01.2007 нормальная работа компанента исправил фукцию .check_offset
12
;  24.01.2007 пофиксел баги вызваные не правильным кодом )).
289 Lrz 13
;  22.01.2007 избавился от глюков при работе с выделением и удаление, корректная работа клавишей del & backspase
14
;  20.01.2007 реализовал выделение текста по shift
234 Lrz 15
;  12.12.2006 реализовал поддержку кнопки insert и сегодя компонент почти работает!!!!
16
;  07.12.2006 продолжается работа над переработкой компонента,изменениям подверглись многие функции, переработан вывод текста, а така же алгоритм внесения символов.
17
;  03.09.2006 по возможности отказался от 16 битной арифметики, добавил новые баги
18
;  09.08.2006 произведена оптимизация работы конпок DEL и Backspace, уменьшен размер выполняемого кода.
19
;  21.07.2006 добавлена функция кнопки Del, теперь можно удалять символы при помощи данной клавиши
20
; Автор: Евтихов Максим (Maxxxx32) email: maxxxxm@mail.ru
21
; Дата последних изменений: 13.06.06 10:40
22
;  Напишите в исходном коде своей программы use_edit_box,
23
; это вставит необходимые процедуры в код вашей программы.
24
;  Процедуры:
25
;   edit_box.draw - полная перерисовка;
26
;   edit_box.key - обработка клавиатуры;
27
;   edit_box.mouse - обработка мыши;
28
;   edit_box.focus - установка фокуса;
29
;   edit_box.blur - его размывание;
30
;   edit_box.get_n - получить количество прорисовываемых символов.
31
;  При вызове любых из этих процедур в регистре edi следует
32
; оставить указатель на структуру.
33
;  Пример структуры:
34
; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text
35
; длина, высота, верх, цвет фона, цвет рамки, если выбран,
36
; цвет рамки, если не выбран, максимальное количество символов,
37
; указатель на буфер, где будут хранится символы. Буфер должен
38
; оканчиваться нулем, например если максимальное количество 255:
39
;  some_edit_text:
40
;       rb      256 ;255+1
41
 
42
;  Пример вызова процедуры:
43
;       mov     edi,some_edit
44
;       call    edit_box.draw
45
 
46
;  При вызове процедуры edit_box.key код клавиши должен
47
; находится в ah, то есть перед вызовом этой процедуры надо вызвать
48
; 2-ую сисемную функцию, например:
49
;       mov     eax,2
50
;       int     0x40
51
;       mov     edi,some_edit1
52
;       call    edit_box.key
53
;       mov     edi,some_edit2
54
;       call    edit_box.key
55
;  Перед вызовом обработчика мыши следует проверить, является ли окно
56
; активным.
57
;  Если щелчок мыши был пройзведен за пределами edit box
58
; фокус теряется.
461 Lrz 59
;;;;;;;;;;;;;;;;;;
60
include 'editbox.mac'    ;макрос который должен облегчить жизнь :) специально для editbox
61
;;;;;;;;;;;;;;;;;;
234 Lrz 62
macro use_edit_box
63
{
64
edit_box:
461 Lrz 65
ed_width        equ [edi]               ;ширина компонента
66
ed_left         equ [edi+4]             ;положение по оси х
67
ed_top          equ [edi+8]             ;положение по оси у
68
ed_color        equ [edi+12]            ;цвет фона компонента
69
shift_color	equ [edi+16]		;=0x6a9480
70
ed_focus_border_color   equ [edi+20]    ;цвет рамки компонента
71
ed_blur_border_color    equ [edi+24]    ;цвет не активного компонента
72
ed_text_color   equ [edi+28]            ;цвет текста
73
ed_max          equ [edi+32]                    ;кол-во символов которые можно максимально ввести
74
ed_text         equ [edi+36]                    ;указатель на буфер
75
ed_flags        equ [edi+40]            ;флаги
76
ed_size equ [edi+42]                    ;кол-во символов
77
ed_pos  equ [edi+46]                    ;позиция курсора
78
ed_offset       equ [edi+50]            ;смещение
79
cl_curs_x       equ [edi+54]            ;предыдущее координата курсора по х
80
cl_curs_y       equ [edi+58]            ;предыдущее координата курсора по у
81
ed_shift_pos    equ [edi+62]            ;положение курсора
82
ed_shift_pos_old equ [edi+66]           ;старое положение курсора
234 Lrz 83
;==========================================================
84
;=== процедура прорисовки =================================
85
;==========================================================
86
.draw:
87
pusha
88
;--- рисуем рамку ---
461 Lrz 89
        call    .draw_border            ; Функция стабильна
234 Lrz 90
.draw_bg_cursor_text:
91
;--- изменяем смещение, если надо ---
461 Lrz 92
        call    .check_offset           ;вычисление позиции курсора стабильна
234 Lrz 93
;--- рисуем внутреннюю область ---
461 Lrz 94
        call    .draw_bg                ;нарисовать прямоугольник рабочей области
402 Lrz 95
;---- рисуем выделение, по shift если есть
461 Lrz 96
        call    .draw_shift
234 Lrz 97
.draw_cursor_text:
98
;--- рисуем курсор ---
461 Lrz 99
        ;--- может его не надо рисовать ----
100
        test    word ed_flags,ed_focus
101
        je     @f
102
        call    .draw_cursor
234 Lrz 103
@@:
461 Lrz 104
        call    .draw_text
105
edit_ex
106
 
107
;debug_func
234 Lrz 108
;----------------------------------------------------------
402 Lrz 109
;--- процедура прорисовки выделеной части -----------------
110
;----------------------------------------------------------
111
.draw_shift:
461 Lrz 112
        test    word ed_flags,ed_shift_bac ;установка флага, выделенной области
113
        jz      @f
114
        mov     ebp,shift_color
115
        mov     ebx,dword       ed_shift_pos
116
        call    .sh_cl_
117
@@:     ret
402 Lrz 118
;----------------------------------------------------------
234 Lrz 119
;--- процедура прорисовки текста --------------------------
120
;----------------------------------------------------------
121
.draw_text:
122
;--- вычисляем, сколько помещается символов ---
123
;--- чтобы мусор не рисовать ---
461 Lrz 124
        call    .get_n
125
        mov     esi,ed_size
126
        mov     ebx,ed_offset
127
        sub     esi,ebx
128
        cmp     eax,esi
129
        jae     @F
130
        mov     esi,eax         ;чтобы не выходить за пределы экрана
402 Lrz 131
;--- рисуем текст ---
461 Lrz 132
@@:     mov     eax,4
133
        mov     ebx,ed_left
134
        mov     edx,ed_offset
135
        add     ebx,2
136
        shl     ebx,16
137
        mov     bx,ed_top
138
        add     ebx,4
139
        mov     ecx,ed_text_color
140
        add     edx,ed_text
141
        int     0x40
234 Lrz 142
ret
143
;----------------------------------------------------------
144
;--- процедура прорисовки фона ----------------------------
145
;входные данные
146
;eax
292 Lrz 147
;edx - color
234 Lrz 148
;----------------------------------------------------------
343 Lrz 149
;вход только цвет edx
234 Lrz 150
.draw_bg:
461 Lrz 151
        mov     ebx,ed_left
152
        add     ebx,1
153
        shl     ebx,16
154
        mov     bx,ed_width
155
        sub     ebx,1
156
        mov     edx,ed_color
391 Lrz 157
.draw_bg_eax:
461 Lrz 158
        mov     ecx,ed_top
159
        mov     eax,13
160
        add     ecx,1
161
        shl     ecx,16
162
        mov     cx,ed_height
163
        dec     ecx
164
        int     0x40
234 Lrz 165
ret
166
 
167
;----------------------------------------------------------
168
;--- процедура получения количества символов в текущей щирине компонента --------------
169
;----------------------------------------------------------
170
.get_n:
461 Lrz 171
        mov     eax,ed_width    ;получем ширину компонента
172
        xor     edx,edx   ;результат распологается в паре edx:eax в eax - остаток
173
        sub     eax,4           ;вычтим 4
174
        mov     ebx,6           ;загрузми делитель
175
        div     ebx             ;размделим на 6
234 Lrz 176
ret
177
;----------------------------------------------------------
178
;--- процедура рисования курсора --------------------------
179
;----------------------------------------------------------
391 Lrz 180
;входные ebp- цвет
234 Lrz 181
.clear_cursor:
461 Lrz 182
        mov     edx,ebp
183
        mov     ebx,cl_curs_x
184
        mov     ecx,cl_curs_y
185
        jmp     .draw_curs
234 Lrz 186
.draw_cursor:
461 Lrz 187
	mov     edx,ed_text_color
188
        mov     ebx,ed_pos
189
        mov     ecx,ed_offset
190
        sub     ebx,ecx
234 Lrz 191
 
461 Lrz 192
        lea     ebx,[ebx*2+ebx]
193
        shl     ebx,1
194
        ;imul   ebx,6
195
        add     bx,ed_left
196
        mov     ecx,ed_top
197
        inc     ebx
198
        add     ecx,2
199
        mov     ebp,ebx
200
        shl     ebx,16
201
        mov     bx,bp
202
        mov     ebp,ecx
203
 
204
        shl     ecx,16
205
        mov     cx,bp
206
        add     cx,ed_height-4
207
 
208
        mov     cl_curs_x,ebx
209
        mov     cl_curs_y,ecx
210
.draw_curs:
211
        mov     eax,38
212
        int     0x40
234 Lrz 213
ret
214
;----------------------------------------------------------
215
;--- процедура рисования рамки ----------------------------
216
;----------------------------------------------------------
217
.draw_border:
218
;--- цвет рамки ---
461 Lrz 219
        test    word ed_flags,ed_focus
220
        mov     edx,ed_focus_border_color
221
        jne     @f
222
        mov     edx,ed_blur_border_color
234 Lrz 223
@@:
224
;--- сверху ---
461 Lrz 225
        mov     eax,38
226
        mov     ebx,ed_left
227
        mov     ecx,ebx
228
        shl     ebx,16
229
        mov     bx,cx
230
        add     bx,ed_width
231
        mov     ecx, ed_top
232
        mov     esi,ecx
233
        shl     ecx,16
234
        mov     cx,si
235
        int     0x40
234 Lrz 236
 
237
;--- снизу ---
461 Lrz 238
        mov     esi,ecx
239
        add     ecx,ed_height
240
        mov     ebp,ecx
241
        shl     ecx,16
242
        mov     cx,bp
243
        int     0x40
234 Lrz 244
 
245
;--- слева ---
461 Lrz 246
        mov     cx,si
247
        mov     ebp,ebx
248
        sub     bx,ed_width
249
        int     0x40
234 Lrz 250
 
251
;--- справа ---
461 Lrz 252
        mov     ebx,ebp
253
        shl     ebx,16
254
        mov     bx,bp
255
        int     0x40
234 Lrz 256
ret
257
;----------------------------------------------------------
258
;--- проверка, зашел ли курсор за границы и, если надо, ---
259
;--- изменяем смещение ------------------------------------
296 Lrz 260
;--- eax = -1, если не изменилось или eax = 0, если
234 Lrz 261
; изменилось
262
;----------------------------------------------------------
263
.check_offset:
350 Lrz 264
pusha
461 Lrz 265
        mov     ecx,ed_pos
266
        mov     ebx,ed_offset
267
        cmp     ebx,ecx
268
        ja      .sub_8
295 Lrz 269
 
461 Lrz 270
        push    ebx
271
        call    .get_n                  ;получим кол-во символов в паре регистров edx:eax
272
        pop     ebx
273
        mov     edx,ebx
274
        add     edx,eax         ;ed_offset+width editbox
275
        inc     edx             ;необходимо для номального положения курсора в крайней левой позиции
276
        cmp     edx,ecx
277
        ja      @f
295 Lrz 278
 
461 Lrz 279
        mov     edx,ed_size
280
        cmp     edx,ecx
281
        je      .add_end
296 Lrz 282
 
461 Lrz 283
        sub     edx,ecx
284
        cmp     edx,8
285
        jbe     .add_8
286
        add     ebx,8
287
        jmp     .chk_d
295 Lrz 288
 
461 Lrz 289
.sub_8: cmp     ecx,0
290
        je      .sub_min
291
        cmp     ebx,8
292
        jbe     .sub_min
293
        sub     ebx,8   ;ebx=ed_offset
294
        jmp     .chk_d
295 Lrz 295
.sub_min:
461 Lrz 296
        xor     ebx,ebx
297
        jmp     .chk_d
295 Lrz 298
 
461 Lrz 299
.add_end:sub    edx,eax
300
        mov     ebx,edx
301
        jmp     .chk_d
302
.add_8: add     ebx,edx
303
.chk_d: mov     ed_offset,ebx
304
        call    .draw_bg
305
        and     word ed_flags,ed_offset_cl
306
edit_ex
295 Lrz 307
@@:
461 Lrz 308
        or      word ed_flags,ed_offset_fl
309
edit_ex
295 Lrz 310
;==========================================================
311
;=== обработка клавиатуры =================================
312
;==========================================================
313
.key:
314
pusha
461 Lrz 315
        test    word ed_flags,ed_focus ; если не в фокусе, выходим
316
        je      @b
343 Lrz 317
;Проверка на нажаты shift
461 Lrz 318
        call    .check_shift
234 Lrz 319
;----------------------------------------------------------
320
;--- проверяем, что нажато --------------------------------
321
;----------------------------------------------------------
461 Lrz 322
        cmp     ah,8
323
        jz      .backspace
324
        cmp     ah,0xb6
325
        jz      .delete
326
        cmp     ah,176
327
        jz      .left
328
        cmp     ah,179
329
        jz      .right
330
        cmp     ah,180
331
        jz      .home
332
        cmp     ah,181
333
        jz      .end
334
        cmp     ah,185  ;insert
335
        jz      .insert
234 Lrz 336
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
337
;Заглушка на обработку клавиш вверх и вниз
461 Lrz 338
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
339
        cmp     ah,177
340
        jz      .no_figure
341
        cmp     ah,178
342
        jz      .no_figure
343
        cmp     ah,27   ;ESC - клавиша ))
344
        jz      .no_figure
234 Lrz 345
;--- нажата другая клавиша ---
461 Lrz 346
        test    word ed_flags,ed_figure_only  ; только цифры ?
347
        jz      @f
348
        cmp     ah,'0'
349
        jb      .no_figure
350
        cmp     ah,'9'
351
        ja      .no_figure
292 Lrz 352
;проверка на shift
461 Lrz 353
@@:     test    word ed_flags,ed_shift_on
354
        je      @f
355
        ;Входные данные edx=ed_size;ecx=ed_pos
356
        push    eax
357
        mov     edx,ed_size
358
        mov     ecx,ed_pos
359
        pusha
343 Lrz 360
;clear
461 Lrz 361
        mov     ebp,edx ;ed_size
362
        call    .clear_bg
363
        mov     ebp,ed_color
364
        mov     ebx,dword       ed_shift_pos
365
        call    .sh_cl_
350 Lrz 366
 
391 Lrz 367
.sh_nxt:popa
461 Lrz 368
        call    .del_char
292 Lrz 369
;;;;
461 Lrz 370
        mov     eax,dword ed_shift_pos
371
        mov     ebx,ed_size
372
        sub     ebx,eax
373
        mov     ed_size,ebx
374
        pop     eax
292 Lrz 375
        ; проверяем, находится ли курсор в конце
461 Lrz 376
@@:     mov     ecx,ed_size
377
        mov     edx, ed_max
378
        test    word ed_flags,ed_insert
379
        jne     @f
380
        cmp     ecx,edx
381
        jae     .no_figure
382
@@:     mov     ebx, ed_pos
383
        cmp     ebx,edx
384
        jl      @f ; если меньше или равно
234 Lrz 385
.no_figure:
461 Lrz 386
edit_ex
387
.insert: test   word ed_flags,ed_insert ;not    word ed_insert
292 Lrz 388
         je     .insert_1
461 Lrz 389
         and    word ed_flags,ed_insert_cl
390
        jmp     .no_figure
292 Lrz 391
.insert_1:
461 Lrz 392
        or      word ed_flags,ed_insert
393
        jmp     .no_figure
292 Lrz 394
.ins_v:
461 Lrz 395
        dec     dword [ebp+42];ed_size    ;processing is insert
396
        sub     esi,ecx
397
        add     esi,ebx
398
        mov     edi,esi
343 Lrz 399
;clear
400
pusha
461 Lrz 401
        mov     edi,ebp
402
        mov     ebp,ed_pos
403
        call    .clear_bg
343 Lrz 404
popa
461 Lrz 405
        jmp     .In_k
234 Lrz 406
@@:     ; сдвигаем символы после курсора вправо
461 Lrz 407
        mov     ecx,ed_size
408
        push    edi eax
409
        mov     ebp,edi
410
        mov     esi,ed_text     ; Указатель на буфер
411
                                ;Будем работать со строкой
412
        add     esi,ecx         ;add ed_size добавим max size
413
        mov     edi,esi
234 Lrz 414
 
461 Lrz 415
        cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
416
        je      .In_k
234 Lrz 417
 
461 Lrz 418
        test    word [ebp+40],ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
419
        jne     .ins_v
343 Lrz 420
;clear
421
pusha
461 Lrz 422
        mov     edi,ebp
423
        mov     ebp,ed_size
424
        call    .clear_bg
343 Lrz 425
popa
461 Lrz 426
        sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
427
        inc     edi             ;Сместим наши символы в право
428
        std
429
        inc     ecx
430
   @@:
431
        ;--------
432
        lodsb
433
        stosb
434
        ;--------
435
        loop    @b
436
.In_k:  cld
437
        pop eax
438
        mov al,ah
439
        stosb
440
        pop edi
234 Lrz 441
; вставляем код клавиши туда, где курсор
461 Lrz 442
        ; увеличиваем значение размера и позиции
443
        inc      dword ed_size
444
        inc      dword ed_pos
445
        call    .draw_all2
446
        jmp     .shift;.draw_cursor_text
447
.delete:
448
        mov     edx,ed_size
449
        mov     ecx,ed_pos
450
        cmp     edx,ecx
451
        jg      .bac_del
452
        test    word ed_flags,ed_shift_on
453
        jne     .del_bac
454
edit_ex
455
.bac_del:
456
        call    .del_char
457
        jmp     .draw_all
234 Lrz 458
 
459
;--- нажата клавиша backspace ---
460
.backspace:
461 Lrz 461
        ; проверяем, курсор у левого края ?
462
        mov     ecx,ed_pos
463
        test    ecx,ecx
464
        jnz     .del_bac
465
        test    word ed_flags,ed_shift_on
466
        jne     .bac_del
467
 
468
edit_ex
289 Lrz 469
.del_bac:
461 Lrz 470
        mov     edx,ed_size
471
        cmp     edx,ecx ;if ed_pos=ed_size
472
        je      @f
473
        dec     ecx
474
        call    .del_char
475
@@:     test    word ed_flags,ed_shift_on
476
        jne     .bac_del
477
        dec      dword ed_pos
234 Lrz 478
.draw_all:
461 Lrz 479
        push    .shift;.draw_cursor_text;eax
289 Lrz 480
 
461 Lrz 481
        test    word ed_flags,ed_shift_on
482
        je      @f
483
        mov     eax,dword ed_shift_pos
484
        mov     ebx,ed_size
485
        sub     ebx,eax
486
        mov     ed_size,ebx
289 Lrz 487
 
461 Lrz 488
        mov     ebp,ed_color
489
        call    .clear_cursor
490
        call    .check_offset
491
        call    .draw_bg
492
        ret
493
@@:     dec      dword ed_size
289 Lrz 494
 
234 Lrz 495
.draw_all2:
461 Lrz 496
        and    word ed_flags,ed_shift_cl
497
        mov     ebp,ed_color
498
        call    .clear_cursor
499
        call    .check_offset
500
        mov     ebp,ed_size
501
        call    .clear_bg
502
        ret
234 Lrz 503
;--- нажата клавиша left ---
461 Lrz 504
.left:  mov     ebx,ed_pos
505
        test    ebx,ebx
506
        jz      .sh_st_of
507
        or      word ed_flags,ed_left_fl
508
        call    .sh_first_sh
509
        dec      dword ed_pos
510
        call    .sh_enable
511
        jmp     .draw_cursor_text
234 Lrz 512
;--- нажата клавиша right ---
461 Lrz 513
.right: mov     ebx,ed_pos
514
        cmp     ebx,ed_size
515
        je      .sh_st_of
516
        and     word ed_flags,ed_right_fl
517
        call    .sh_first_sh
518
        inc     dword  ed_pos
519
        call    .sh_enable
520
        jmp     .draw_cursor_text
391 Lrz 521
.home:
461 Lrz 522
        mov     ebx,ed_pos
523
        test    ebx,ebx
524
        jz      .sh_st_of
525
        call    .sh_first_sh
526
        xor     eax,eax
527
        mov     ed_pos,eax
528
        call    .sh_home_end
529
        jmp     .draw_cursor_text
391 Lrz 530
.end:
461 Lrz 531
        mov     ebx,ed_pos
532
        cmp     ebx,dword ed_size
533
        je      .sh_st_of
534
        call    .sh_first_sh
535
        mov     eax,ed_size
536
        mov     ed_pos,eax
537
        call    .sh_home_end
538
        jmp     .draw_cursor_text
391 Lrz 539
;Обработка Shift для снятия выделения неизвестной области
348 Lrz 540
.shift: ;;;;;;;SHIFT
461 Lrz 541
        test    word ed_flags,ed_shift
542
        je      .f_exit
343 Lrz 543
 
461 Lrz 544
@@:     mov     ebp,shift_color
545
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
546
        mov     ebx,dword       ed_shift_pos
547
        call    .sh_cl_
548
        jmp     .draw_cursor_text
348 Lrz 549
;;;;;;;;;;;;;;;;;;;;;
461 Lrz 550
.f_exit:call    .check_offset
551
        and     word ed_flags,ed_shift_cl
552
        call    .enable_null
553
        jmp     .draw_cursor_text
348 Lrz 554
.sh_cl_:
282 Lrz 555
;;;;;;SHIFT end
391 Lrz 556
;обработка очистки, при левом - правом движении выделения
348 Lrz 557
;для обработки снятия выделения
396 Lrz 558
;входные параметры ebp=color ebx=ed_shift_pos
461 Lrz 559
        mov     eax,dword       ed_pos
560
        cmp     eax,ebx
439 Lrz 561
 
461 Lrz 562
        jae     .sh_n
563
        push    eax  ;меньшее в eax
564
        push    ebx  ;большее
565
        jmp     .sh_n1
566
                     ;если иначе
567
.sh_n:  push    ebx
568
        push    eax
282 Lrz 569
.sh_n1:
461 Lrz 570
        call    .check_offset
571
        call    .get_n
572
        mov     edx,eax ;size of ed_box
573
        mov     ecx,ed_offset
574
        add     eax,ecx ;eax = w_off= ed_offset+width
575
        mov     edx,eax ;save
576
        pop     ebx     ;большее
577
        pop     eax     ;меньшее
282 Lrz 578
 
461 Lrz 579
        cmp     eax,ecx         ;сравнение с меньшего с offset.
580
        jae     .f_f            ;если больше
581
        xor     eax,eax
582
        cmp     edx,ebx         ;cравним размер w_off с большим
583
        jb      @f
584
        sub     ebx,ecx
585
        jmp     .nxt_f
586
@@:     mov     ebx,edx
587
        sub     ebx,ecx
588
        jmp     .nxt_f
589
.f_f:
590
        sub     eax,ecx
591
        cmp     edx,ebx         ;cравним размер w_off с большим
592
        jle     @f
593
        sub     ebx,ecx
594
        sub     ebx,eax
595
        jmp     .nxt_f
234 Lrz 596
@@:
461 Lrz 597
        mov     ebx,edx
598
        sub     ebx,ecx
599
        sub     ebx,eax
282 Lrz 600
.nxt_f:
461 Lrz 601
        mov     edx,ebx
602
        lea     ebx,[eax*2+eax]
603
        shl     ebx,1
604
        add     ebx,ed_left
605
        inc     ebx
606
        shl     ebx,16
607
        lea     ecx,[edx*2+edx]
608
        shl     ecx,1
609
        mov     bx,cx
610
        inc     ebx
611
        mov     edx,ebp;shift_color
348 Lrz 612
 
461 Lrz 613
        call    .draw_bg_eax
614
@@:     call    .enable_null
615
        ret
391 Lrz 616
;;;;;;;;;;;;;;;;;;;;;
617
;Установка- снятие выделения в один символ
618
;;;;;;;;;;;;;;;;;;;;;
619
.drw_sim:
461 Lrz 620
        mov     eax,dword       ed_pos
621
        call    .draw_rectangle   ;нарисовать прямоугольник с заданным цветом
391 Lrz 622
        jmp     @b
623
;;;;;;;;;;;;;;;;;;;;;
624
;Фукция установки выделения при движения влево и вправо и нажатии shift
625
;Логика:
626
;;;;;;;;;;
627
.draw_wigwag:
628
;функция установки переменных
461 Lrz 629
        mov     ebp,shift_color
630
        call    .clear_cursor
289 Lrz 631
 
461 Lrz 632
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
633
        mov     ebp,shift_color
634
        mov     eax,dword       ed_pos
635
        test    word ed_flags,ed_left_fl
636
        jz      .low
637
        jmp     @f
391 Lrz 638
;;;;;;;;;;
639
;Фукция удаления выделения при движения влево и вправо и нажатии shift
640
;Логика:
641
;;;;;;;;;;
642
.draw_wigwag_cl:
643
;функция установки переменных
461 Lrz 644
        mov     ebp,ed_color
645
        call    .clear_cursor
391 Lrz 646
 
461 Lrz 647
        mov     ebp,ed_color
648
        mov     eax,dword       ed_pos
649
        test    word ed_flags,ed_left_fl
650
        jz      .low
651
@@:     call    .draw_rectangle  ;нарисовать прямоугольник закрашиваемой области
652
        ret
653
.low:   dec     eax
654
        jmp     @b
391 Lrz 655
;входной параметр ebx - ed_pos
656
.sh_first_sh:
461 Lrz 657
        test    word ed_flags,ed_shift
658
        je      @f
659
        mov     dword ed_shift_pos_old,ebx
660
        test    word ed_flags,ed_shift_on
661
        jne     @f
662
        mov     dword ed_shift_pos,ebx
663
        or      word ed_flags,ed_shift_on
664
@@:     ret
391 Lrz 665
;Обработка крайних положений в editbox при нажатом shift
666
;производит снятие выделение, если нет shift
667
;иначе вообще выходит
668
.sh_st_of:
461 Lrz 669
        test    word ed_flags,ed_shift
670
        jne     @f
671
        test    word ed_flags,ed_shift_bac
348 Lrz 672
        je      @f
461 Lrz 673
        mov     ebp,ed_color
674
        mov     ebx,dword       ed_shift_pos
675
        call    .sh_cl_  ;очистка выделеного фрагмента
676
        and     word ed_flags,ed_shift_cl ; очистка от того что убрали выделение
677
        jmp     .draw_cursor_text
391 Lrz 678
@@:
461 Lrz 679
        and     word ed_flags,ed_shift_off
680
edit_ex
391 Lrz 681
;проверка состояния shift был ли он нажат раньше?
682
.sh_enable:
461 Lrz 683
        test    word ed_flags,ed_shift
684
        jne     .sh_ext_en ;нарисовать закрашеный прямоугольник
391 Lrz 685
 
461 Lrz 686
        test    word ed_flags,ed_shift_bac
391 Lrz 687
        je      @f
461 Lrz 688
        call    .check_offset
391 Lrz 689
 
461 Lrz 690
        mov     ebp,ed_color
691
        mov     ebx,dword       ed_shift_pos
692
        call    .sh_cl_  ;очистка выделеного фрагмента
693
        call    .draw_wigwag_cl
694
        and     word ed_flags,ed_shift_cl ; 1вар не нужно
695
        ret
391 Lrz 696
 
461 Lrz 697
@@:     mov     ebp,ed_color
698
        call    .clear_cursor
699
        call    .check_offset
700
        ret
701
.sh_ext_en:
702
        call    .check_offset
703
        test    word ed_flags,ed_offset_fl
704
        je      @f
391 Lrz 705
;Рисование закрашеных прямоугольников и очистка их
461 Lrz 706
        mov     eax,dword       ed_shift_pos
707
        mov     ebx,dword       ed_pos
708
        mov     ecx,dword       ed_shift_pos_old
391 Lrz 709
;проверка и рисование закрашеных областей
461 Lrz 710
        cmp     eax,ecx
711
        je      .1_shem
712
        jb      .smaller
713
        cmp     ecx,ebx
714
        ja      .1_shem
715
        call    .draw_wigwag_cl ;clear
716
        jmp     .sh_e_end
391 Lrz 717
.smaller:
461 Lrz 718
        cmp     ecx,ebx
719
        jb      .1_shem
720
        call    .draw_wigwag_cl ;clear
721
        jmp     .sh_e_end
391 Lrz 722
;alike  =
461 Lrz 723
.1_shem: call   .draw_wigwag
724
.sh_e_end:      and     word ed_flags,ed_shift_off
725
        ret
726
@@:     mov     ebp,shift_color
727
        mov     ebx,dword       ed_shift_pos
728
        call    .sh_cl_
729
        jmp     .sh_e_end
391 Lrz 730
;функция для обработки shift при нажатии home and end
731
.sh_home_end:
461 Lrz 732
        mov     ebp,ed_color
733
        call    .clear_cursor
734
        test    word ed_flags,ed_shift_bac
391 Lrz 735
        je      @f
461 Lrz 736
        mov     ebp,ed_color
737
        mov     ebx,dword       ed_shift_pos_old
738
        call    .sh_cl_
391 Lrz 739
 
461 Lrz 740
@@:     test    word ed_flags,ed_shift
741
        je      .sh_exit_ ;выйти
742
        mov     ebp,shift_color
743
        mov     ebx,dword       ed_shift_pos
744
        call    .sh_cl_
745
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
746
        jmp     .sh_e_end
747
.sh_exit_:      call    .check_offset
748
        ret
343 Lrz 749
;функция внесения 0 по адресу ed_size+1
750
.enable_null:
751
        pusha
461 Lrz 752
        mov     eax,ed_size
753
        mov     ebx,ed_text
754
	test	eax,eax
755
        add     eax,ebx
756
	jne	@f
757
        inc     eax
758
@@:     xor     ebx,ebx
759
        mov     [eax],bl
760
edit_ex
396 Lrz 761
;- удаление символа
762
;Входные данные edx=ed_size;ecx=ed_pos
234 Lrz 763
.del_char:
461 Lrz 764
        mov     esi,ed_text
765
        test    word ed_flags,ed_shift_on
766
        je      @f
767
        mov     eax,dword ed_shift_pos
768
        mov     ebx,esi
769
        cmp     eax,ecx
770
        jae     .dh_n
289 Lrz 771
 
461 Lrz 772
        mov     ed_pos,eax      ;что бы не было убегания курсора
773
        mov     ebp,ecx
774
        sub     ebp,eax
775
        add     ebx,eax  ;eax меньше
776
        sub     edx,ecx
777
        add     esi,ecx
234 Lrz 778
 
461 Lrz 779
        mov     dword ed_shift_pos,ebp
780
        jmp     .del_ch_sh
781
                     ;если иначе
782
.dh_n:
783
        mov     ebp,eax
784
        sub     ebp,ecx
785
        add     ebx,ecx
786
        sub     edx,eax
787
        add     esi,eax
788
        mov     dword ed_shift_pos,ebp
789
        jmp     .del_ch_sh
289 Lrz 790
 
461 Lrz 791
@@:     add     esi,ecx ;указатель + смещение к реальному буфферу
792
        mov     ebx,esi
793
        inc     esi
794
        cld
234 Lrz 795
 
461 Lrz 796
        sub     edx,ecx
289 Lrz 797
.del_ch_sh:
798
 
461 Lrz 799
        push    edi
800
        mov     edi,ebx
234 Lrz 801
@@:
461 Lrz 802
        lodsb
803
        stosb
804
        dec edx
805
        jns @b
806
 
807
        pop edi
808
        ret
343 Lrz 809
;вычислить закрашиваемую область
810
;соглашение в ebp - передается ed_size
811
.clear_bg:
461 Lrz 812
        call    .get_n  ;получить размер в символах ширины компонента
813
        push    eax
814
        mov     ebx,ed_offset
815
        add     eax,ebx ;eax = w_off= ed_offset+width
816
        mov     ebx,ebp ;ed_size
817
 
818
        cmp     eax,ebx
819
        jb      @f
820
        mov     eax,ed_pos
821
        sub     ebx,eax
822
        mov     ecx,ed_offset
823
        sub     eax,ecx
824
        jmp     .nxt
825
@@:     mov     ebx,ed_pos
826
        push    ebx
827
        sub     eax,ebx
828
        mov     ebx,eax ;It is don't optimal
829
 
830
        pop     eax     ;ed_pos
831
        mov     ecx,ed_offset
832
        sub     eax,ecx
343 Lrz 833
.nxt:
461 Lrz 834
        mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
835
        add     ebp,ebx
836
        pop     edx
837
        cmp     ebp,edx
838
        je      @f
839
        inc     ebx
343 Lrz 840
 
461 Lrz 841
@@:     mov     edx,ebx
842
        lea     ebx,[eax*2+eax]
843
        shl     ebx,1
844
        add     ebx,ed_left
845
        inc     ebx
846
        shl     ebx,16
847
        lea     ecx,[edx*2+edx]
848
        shl     ecx,1
849
        mov     bx,cx
850
        mov     edx,ed_color
851
        call    .draw_bg_eax
852
        ret
391 Lrz 853
;;;;;;;;;;;;;;;;;;;
854
;;; Обработка примитивов
855
;;;;;;;;;;;;;;;;;;;;
856
;Нарисовать прямоугольник, цвет передается в ebp
857
;входные параметры:
858
;eax=dword ed_pos
859
;ebp=-цвет ed_color or shift_color
860
.draw_rectangle:
461 Lrz 861
        mov     ecx,dword ed_offset
862
        sub     eax,ecx
863
        lea     ebx,[eax*2+eax]
864
        shl     ebx,1
865
        inc     ebx
866
        add     ebx,ed_left
867
        shl     ebx,16
868
        mov     bx,6
869
        mov     edx,ebp
870
        call    .draw_bg_eax
871
        ret
404 Lrz 872
;;;;;;;;;;;;;;;;;;
873
;;Проверка нажат ли shift
874
;;;;;;;;;;;;;;;;;;
875
.check_shift:
876
pusha   ;сохраним все регистры
461 Lrz 877
        mcall   66,3,1
878
        test    al,0x03
879
        je      @f
404 Lrz 880
        or      word ed_flags,ed_shift   ;установим флаг
461 Lrz 881
@@:edit_ex
234 Lrz 882
;==========================================================
883
;=== обработка мыши =======================================
884
;==========================================================
885
.mouse:
886
pusha
461 Lrz 887
;debug
234 Lrz 888
;----------------------------------------------------------
889
;--- получаем состояние кнопок мыши -----------------------
461 Lrz 890
;----------------------------------------------------------
891
        mcall   37,2
234 Lrz 892
;----------------------------------------------------------
893
;--- проверяем состояние ----------------------------------
894
;----------------------------------------------------------
461 Lrz 895
        test    eax,1
896
        jnz     .mouse_left_button
897
        and     word ed_flags,ed_mouse_on_off
898
        xor     ebx,ebx
899
        mov     dword [mouse_flag],ebx
900
edit_ex
901
.mouse_left_button:
449 Lrz 902
;----------------------------------------------------------
461 Lrz 903
;--- блокировка от фокусировки в других боксах при попадании на них курсора
449 Lrz 904
;----------------------------------------------------------
461 Lrz 905
        mov     eax,dword [mouse_flag]
906
        test    eax,eax
907
        jz      @f
908
        cmp     eax,edi
909
        je      @f
910
        jmp     ._blur
234 Lrz 911
;----------------------------------------------------------
449 Lrz 912
;--- модифицируем координаты, т.е. добавляем координаты окна.
234 Lrz 913
;----------------------------------------------------------
461 Lrz 914
@@:     mcall   9,structure_of_potock,-1
449 Lrz 915
;----------------------------------------------------------
916
;--- получаем координаты мыши относительно 0 т.е всей области экрана
917
;----------------------------------------------------------
461 Lrz 918
        mcall   37,0
234 Lrz 919
;----------------------------------------------------------
449 Lrz 920
;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны?
921
;----------------------------------------------------------
461 Lrz 922
        mov     ecx,structure_of_potock
923
        test    word ed_flags,ed_mouse_on
924
        jne     .mouse_wigwag
449 Lrz 925
;----------------------------------------------------------
234 Lrz 926
;--- проверяем, попадает ли курсор в edit box -------------
927
;----------------------------------------------------------
461 Lrz 928
        mov     ebx,dword [ecx+38]
929
        add     ebx,ed_top
930
        add     ebx,22
931
        cmp     ax,bx
932
        jl      ._blur;.mouse_end_no_focus
234 Lrz 933
 
461 Lrz 934
        add     ebx,ed_height
935
        cmp     ax,bx
936
        jg      ._blur;.mouse_end_no_focus
234 Lrz 937
 
461 Lrz 938
        shr     eax,16
234 Lrz 939
 
461 Lrz 940
        mov     ebx,dword [ecx+34]
941
        add     ebx,ed_left
942
        add     ebx,5
943
        cmp     ax,bx
944
        jl      ._blur;.mouse_end_no_focus
234 Lrz 945
 
461 Lrz 946
        add     ebx,ed_width
947
        cmp     ax,bx
948
        jg      ._blur;.mouse_end_no_focus
234 Lrz 949
;--- изменяем позицию курсора ---
461 Lrz 950
        push    eax
951
        mov     ebp,ed_color
952
        call    .clear_cursor
953
        pop     eax
449 Lrz 954
._mvpos:
461 Lrz 955
        mov     ecx,structure_of_potock
956
        mov     ebx,dword [ecx+34]
957
        xor     edx,edx
958
        sub     eax,ed_left
959
        sub     eax,ebx
960
        sub     eax,5-2    ;толщина обводки скина =5
961
        mov     ebx,6
962
        div     bx
963
        add     eax,ed_offset
964
        cmp     eax,ed_size
965
        jna     ._mshift
966
        mov     eax,ed_size
449 Lrz 967
._mshift:
404 Lrz 968
;;;;;;;
969
;;Секция обработки shift и выделения по shift
970
;;;;;;;
971
        test    word ed_flags,ed_shift_bac
402 Lrz 972
        je      @f
461 Lrz 973
        mov     ebp,dword       ed_color
974
        mov     ebx,dword ed_shift_pos
975
        push    eax
976
        call    .sh_cl_
977
        and     word ed_flags,ed_shift_bac_cl
978
        pop     eax
439 Lrz 979
@@:
461 Lrz 980
        test    word ed_flags,ed_mouse_on
981
        jne     @f
439 Lrz 982
 
461 Lrz 983
        mov     dword ed_shift_pos,eax
984
        or      word  ed_flags,ed_mouse_on
985
        mov     dword ed_pos,eax
986
        mov     dword [mouse_flag],edi          ;установим идентификатор
987
        bts     word ed_flags,1                 ;установка фокуса
988
        jmp     .m_sh
989
@@:
990
        cmp     eax,dword ed_shift_pos  ;если позиции не изменились
991
        je      .mouse_ex
992
        mov     ed_pos,eax
993
        mov     ebp,dword shift_color
994
        mov     ebx,dword ed_shift_pos
995
        call    .sh_cl_
996
        or      word ed_flags,ed_mous_adn_b     ;установим бит что мы выделили +shift_on +
997
.m_sh:  call    .draw_text
998
        call    .draw_cursor
292 Lrz 999
;----------------------------------------------------------
1000
;--- процедура установки фокуса ---------------------------
1001
;----------------------------------------------------------
461 Lrz 1002
        jmp     .drc
234 Lrz 1003
._blur:
461 Lrz 1004
        test    word ed_flags,ed_always_focus
1005
        jne     .mouse_ex
1006
        btr     word ed_flags,1 ; если не в фокусе, выходим
1007
        jnc     .mouse_ex
402 Lrz 1008
 
461 Lrz 1009
        mov     ebp,ed_color
1010
        call    .clear_cursor
1011
.drc:   call    .draw_border
449 Lrz 1012
.mouse_ex:
1013
 
461 Lrz 1014
edit_ex
234 Lrz 1015
;----------------------------------------------------------
1016
;--- процедура размывания фокуса --------------------------
1017
;----------------------------------------------------------
1018
;.blur:
1019
;pusha
1020
;._blur:
461 Lrz 1021
        ;btr     ed_flags,1
1022
        ;jnc     @f
1023
        ;call    .draw_border
1024
        ;call    .clear_cursor
234 Lrz 1025
;@@:
461 Lrz 1026
;edit_ex
1027
 
1028
;----------------------------------------------------------
1029
;--- Обработка .mouse_wigwag
1030
;----------------------------------------------------------
1031
.mouse_wigwag:
1032
        shr     eax,16
1033
        or      word ed_flags,ed_shift_bac
1034
;;;;;;;;;;;;;;;;;;
1035
;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox
1036
;;;;;;;;;;;;;;;;;;
1037
        mov     ecx,structure_of_potock
1038
        mov     ebx,dword [ecx+34]
1039
        add     ebx,ed_left
1040
        add     ebx,5
1041
 
1042
	cmp	eax,ebx
1043
	jb	.mleft
1044
 
1045
	add	ebx,ed_width
1046
	cmp	eax,ebx
1047
	ja	.mright
1048
 
1049
	sub	ebx,ed_width
1050
 
1051
        xor     edx,edx
1052
        sub     eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х
1053
        mov     ebx,6
1054
        div     ebx
1055
;;;;;;;;;;;;;;;;;;
1056
;;процедура обработки положения выделенного текста, в пределах области editbox
1057
;;;;;;;;;;;;;;;;;;
1058
;Получили координаты в eax мышки, т.е. куда она переместилась
1059
;Рисование закрашеных прямоугольников и очистка их
1060
	add	eax,ed_offset	;добавим смещение
1061
	cmp	eax,dword ed_size	;если вышли за пределы, то ничего не делать
1062
	ja	.mwigvag
1063
.mdraw:
1064
        mov     dword   ed_pos,eax ;сохраним новое значение
1065
;Рисование закрашеных прямоугольников и очистка их
1066
	mov     ecx,dword       ed_shift_pos
1067
        mov     ebx,dword       ed_shift_pos_old
1068
        mov     dword   ed_shift_pos_old,eax    ;внесем новое значение старой позиции курсора
1069
;проверка и рисование закрашеных областей
1070
        cmp     ecx,ebx         ;выясняем куда было движение на один шаг назад
1071
        je      .m1_shem        ;движения не было ранее
1072
        jb      .msmaller       ;движение было ->
1073
        cmp     ebx,eax         ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит
1074
        ja      .m1_shem        ;если было движение <- то нужно закрасить область
1075
	je	.mwigvag	;если изменения не было, то ничего не делать
1076
        mov     ebp,ed_color    ;тут нужно очистить область c ed_pos ed_shift_pos_old
1077
;входные параметры ebp=color ebx=ed_shift_pos
1078
        call    .sh_cl_
1079
        jmp     .mwigvag
1080
.msmaller:
1081
        cmp     ebx,eax
1082
        jb      .m1_shem
1083
        mov     ebp,ed_color
1084
;входные параметры ebp=color ebx=ed_shift_pos
1085
        call    .sh_cl_
1086
        jmp     .mwigvag
1087
;alike  =
1088
.m1_shem:
1089
        mov     ebp,shift_color
1090
;входные параметры ebp=color ebx=ed_shift_pos
1091
	mov	ebx,ecx
1092
        call    .sh_cl_
1093
        jmp     .mwigvag
1094
.mwigvag:
1095
        and     word ed_flags,ed_shift_mcl
1096
	jmp	.draw_cursor_text
1097
;       popa
1098
;       ret
1099
.mleft:
1100
	mov	eax,ed_pos
1101
	test	eax,eax
1102
	jz	.mwigvag
1103
	dec	eax
1104
	call	.check_offset
1105
	push	eax
1106
	mov	ebx,ed_shift_pos
1107
	mov	ebp,shift_color
1108
	call	.sh_cl_
1109
	pop	eax
1110
	jmp	.mdraw
1111
.mright:
1112
	mov	eax,ed_pos
1113
	mov	ebx,ed_size
1114
	cmp	eax,ebx
1115
	jae	.mwigvag
1116
	inc     eax
1117
	call	.check_offset
1118
	mov	ebx,ed_shift_pos
1119
	mov	ebp,shift_color
1120
	push	eax
1121
	call	.sh_cl_
1122
	pop	eax
1123
	jmp	.mdraw
1124
 
234 Lrz 1125
}
396 Lrz 1126
ed_figure_only= 1000000000000000b   ;одни символы
391 Lrz 1127
ed_always_focus= 100000000000000b
396 Lrz 1128
ed_focus=                     10b   ;фокус приложения
391 Lrz 1129
ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
439 Lrz 1130
ed_shift_on_off=1111111111110111b
391 Lrz 1131
ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
1132
ed_shift_off=   1111111111111011b
1133
ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
404 Lrz 1134
ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
391 Lrz 1135
ed_shift_cl=    1111111111100011b
461 Lrz 1136
ed_shift_mcl=   1111111111110011b
391 Lrz 1137
ed_left_fl=               100000b
1138
ed_right_fl=    1111111111011111b
396 Lrz 1139
ed_offset_fl=            1000000b
1140
ed_offset_cl=   1111111110111111b
391 Lrz 1141
ed_insert=              10000000b
1142
ed_insert_cl=   1111111101111111b
439 Lrz 1143
ed_mouse_on =          100000000b
446 Lrz 1144
ed_mous_adn_b=         100011000b
439 Lrz 1145
ed_mouse_on_off=1111111011111111b
391 Lrz 1146
ed_height=14 ; высота
234 Lrz 1147
macro draw_edit_boxes start,end
1148
{
461 Lrz 1149
        mov     edi,start
1150
        mov     ecx,((end-start)/ed_struc_size)
234 Lrz 1151
@@:
461 Lrz 1152
        call    edit_box.draw
1153
        add     edi,ed_struc_size
1154
        loop    @b
234 Lrz 1155
}
1156
 
1157
macro mouse_edit_boxes start,end
1158
{
461 Lrz 1159
        mov     edi,start
1160
        mov     ecx,((end-start)/ed_struc_size)
234 Lrz 1161
@@:
461 Lrz 1162
        call    edit_box.mouse
1163
        add     edi,ed_struc_size
1164
        loop    @b
234 Lrz 1165
}
1166
 
1167
macro key_edit_boxes start,end
1168
{
461 Lrz 1169
        mov     edi,start
1170
        mov     ecx,((end-start)/ed_struc_size)
234 Lrz 1171
@@:
461 Lrz 1172
        call    edit_box.key
1173
        add     edi,ed_struc_size
1174
        loop    @b
234 Lrz 1175
}
461 Lrz 1176
ed_struc_size=70
1177
struc  edit_box width,left,top,color,shift_color,focus_border_color,\
1178
       blur_border_color,text_color,max,text,flags,size,pos
234 Lrz 1179
{
1180
.width dd width
1181
.left dd left
1182
.top dd top
1183
.color dd color
461 Lrz 1184
.shift_color dd shift_color
234 Lrz 1185
.focus_border_color dd focus_border_color
1186
.blur_border_color dd blur_border_color
1187
.text_color dd text_color
1188
.max dd max
282 Lrz 1189
.text dd text
1190
.flags dw flags+0
403 Lrz 1191
.size dd size+0
461 Lrz 1192
.pos dd pos+0
234 Lrz 1193
.offset dd 0
1194
.cl_curs_x dd 0
1195
.cl_curs_y dd 0
391 Lrz 1196
.shift   dd 0
1197
.shift_old   dd 0
234 Lrz 1198
}
1199
 
402 Lrz 1200
 
234 Lrz 1201
macro edit_boxes_set_sys_color start,end,color_table
1202
{
461 Lrz 1203
        mov     edi,start
1204
        mov     ecx,((end-start)/ed_struc_size)
1205
        mov     esi,color_table
234 Lrz 1206
@@:
461 Lrz 1207
        mov     eax,[esi+36]
1208
        mov     ebx,[esi+20]
1209
        mov     ed_focus_border_color,eax
1210
        shr     bh,1
1211
        shr     bl,1
1212
        shr     ah,1
1213
        shr     al,1
1214
        add     ah,bh
1215
        add     al,bl
1216
        ror     eax,16
1217
        ror     ebx,16
1218
        shr     bl,1
1219
        shr     al,1
1220
        add     al,bl
1221
        ror     eax,16
1222
        mov     ed_blur_border_color,eax
1223
        add     edi,ed_struc_size
1224
        loop    @b
306 Lrz 1225
}
1226
 
1227
macro draw_edit_box ed_ptr
1228
{
1229
        mov     edi,ed_ptr
1230
        call    edit_box.draw
1231
}
1232
 
1233
macro mouse_edit_box ed_ptr
1234
{
1235
        mov     edi,ed_ptr
1236
        call    edit_box.mouse
1237
}
1238
 
1239
macro key_edit_box ed_ptr
1240
{
1241
        mov     edi,ed_ptr
1242
        call    edit_box.key
234 Lrz 1243
}