Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1032 Lrz 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;Basic macros for use editbox                             ;
3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4
 
1228 Lrz 5
 
6
macro use_editbox_draw
7
{
8
edit_box:
1032 Lrz 9
.draw:
10
        pushad
5679 hidnplayr 11
.draw_1:
1032 Lrz 12
;--- рисуем рамку ---
13
        mov     edi,dword [esp+36]
14
        call    .draw_border            ; Функция стабильна
15
.draw_bg_cursor_text:
16
;--- изменяем смещение, если надо ---
17
        call    .check_offset           ;вычисление позиции курсора стабильна
18
;--- рисуем внутреннюю область ---
19
        call    .draw_bg                ;нарисовать прямоугольник рабочей области
20
;---- рисуем выделение, по shift если есть
21
        call    .draw_shift
22
.draw_cursor_text:
23
;--- рисуем курсор ---
24
        ;--- может его не надо рисовать ----
25
        test    word ed_flags,ed_focus
5679 hidnplayr 26
        jz      @f
1032 Lrz 27
        call    .draw_cursor
28
@@:
29
        call    .draw_text
30
;        ret
31
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32
;Общий выход из editbox для всех функций и пост обработчиков;;
33
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
34
.editbox_exit:
35
        popad
36
        ret 4
37
}
38
 
39
 
40
macro use_editbox_key
41
{
42
;==========================================================
43
;=== обработка клавиатуры =================================
44
;==========================================================
45
edit_box_key:
46
pushad
47
        mov     edi,dword [esp+36]
48
        test    word ed_flags,ed_focus ; если не в фокусе, выходим
5679 hidnplayr 49
        jz      edit_box.editbox_exit
50
        test    word ed_flags,ed_mouse_on or ed_disabled
51
        jnz     edit_box.editbox_exit
1032 Lrz 52
 
3358 mario79 53
;--------------------------------------
54
; this code for Win-keys, works with
55
; kernel SVN r.3356 or later
5679 hidnplayr 56
        push    eax
57
        push    ebx
58
        mcall   66,3
59
        test    ax,0x200        ; LWin
60
        jnz     .win_key_pressed
61
        test    ax,0x400        ; RWin
62
        jz      @f
3358 mario79 63
.win_key_pressed:
5679 hidnplayr 64
        pop     ebx
65
        pop     eax
66
        jmp     edit_box.editbox_exit
3358 mario79 67
@@:
5679 hidnplayr 68
        pop     ebx
69
        pop     eax
3358 mario79 70
;--------------------------------------
1032 Lrz 71
;Проверка нажат shift ?
4601 mario79 72
        call    edit_box_key.check_shift_ctrl_alt
1032 Lrz 73
;----------------------------------------------------------
74
;--- проверяем, что нажато --------------------------------
75
;----------------------------------------------------------
3130 IgorA 76
        cmp     ah,8
77
        jz      edit_box_key.backspace
78
        cmp     ah,0xb6
79
        jz      edit_box_key.delete
80
        cmp     ah,176
81
        jz      edit_box_key.left
82
        cmp     ah,179
83
        jz      edit_box_key.right
84
        cmp     ah,180
85
        jz      edit_box_key.home
86
        cmp     ah,181
87
        jz      edit_box_key.end
88
        cmp     ah,185  ;insert
89
        jz      edit_box_key.insert
4601 mario79 90
; комбинации Ctrl + клавиша
91
        test    word ed_flags,ed_ctrl_on
5679 hidnplayr 92
        jz      @f
4601 mario79 93
; проверка сканкода
94
        ror     eax,8
95
        cmp     ah,46 ; Ctrl + C
96
        je      edit_box_key.ctrl_c
97
        cmp     ah,47 ; Ctrl + V
98
        je      edit_box_key.ctrl_v
5679 hidnplayr 99
        rol     eax,8
4601 mario79 100
@@:
1032 Lrz 101
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
102
;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика
103
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
104
use_key_no_process   up,down,esc,enter,tab,numl,capsl,scrolll
105
;--- нажата другая клавиша ---
106
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1858 lev 107
;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе, если такой необходимости нет, нужно закоментировать макрос
1032 Lrz 108
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
109
use_key_figures_only
110
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1858 lev 111
;проверка на shift, был ли нажат
1032 Lrz 112
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
113
are_key_shift_press
114
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
115
; проверяем, находится ли курсор в конце + дальнейшая обработка
116
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117
are_key_cur_end
118
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1858 lev 119
;Обработка клавиш insert,delete.backspace,home,end,left,right
1032 Lrz 120
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
121
use_work_key
122
}
123
 
124
macro use_editbox_mouse
125
{
126
;==========================================================
127
;=== обработка мыши =======================================
128
;==========================================================
129
;save for stdcall ebx,esi,edi,ebp
130
edit_box_mouse:
131
pushad
132
        mov     edi,dword [esp+36]
5679 hidnplayr 133
        test    word ed_flags,ed_disabled
134
        jnz     edit_box.editbox_exit
1032 Lrz 135
;debug
136
;----------------------------------------------------------
137
;--- получаем состояние кнопок мыши -----------------------
138
;----------------------------------------------------------
139
        mcall   37,2
140
;----------------------------------------------------------
141
;--- проверяем состояние ----------------------------------
142
;----------------------------------------------------------
143
        test    eax,1
144
        jnz     edit_box_mouse.mouse_left_button
145
        and     word ed_flags,ed_mouse_on_off
5679 hidnplayr 146
        mov     ebx,dword ed_mouse_variable
147
        push    0
148
        pop     dword [ebx]
1214 Lrz 149
;        mov     dword [ebx],ebx
1032 Lrz 150
        jmp     edit_box.editbox_exit
151
.mouse_left_button:
152
;----------------------------------------------------------
153
;--- блокировка от фокусировки в других боксах при попадании на них курсора
154
;----------------------------------------------------------
1214 Lrz 155
        mov     eax,dword ed_mouse_variable
5679 hidnplayr 156
        push    dword [eax]
157
        pop     eax
1032 Lrz 158
        test    eax,eax
159
        jz      @f
160
        cmp     eax,edi
161
        je      @f
162
        jmp     edit_box_mouse._blur
163
;----------------------------------------------------------
164
;--- получаем координаты мыши относительно 0 т.е всей области экрана
165
;----------------------------------------------------------
166
@@:     mcall   37,1
167
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
168
;Функция обработки  мышки получение координат и проверка их + выделения
169
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
170
use_work_mouse
171
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
172
;Общие функции обработки
173
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
174
use_general_func
175
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
176
;Функции для работы с key
177
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
178
use_key_func
179
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
180
;Функции для работы с mouse
181
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1858 lev 182
use_mouse_func
1032 Lrz 183
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
184
;Bit mask from editbox
185
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
186
}
187
 
188
 
189
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
190
;ниже расположены функции которыми реализуется весь алгоритм
191
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1858 lev 192
;Макрос для вывода основных функций которые используются боксом
1032 Lrz 193
macro use_general_func
194
{
195
;debug_func
196
;----------------------------------------------------------
1858 lev 197
;--- процедура прорисовки выделенной части -----------------
1032 Lrz 198
;----------------------------------------------------------
199
edit_box.draw_shift:
200
        test    word ed_flags,ed_shift_bac ;установка флага, выделенной области
201
        jz      @f
202
        mov     ebp,shift_color
203
        mov     ebx,dword       ed_shift_pos
204
        call    edit_box_key.sh_cl_
205
@@:     ret
206
;----------------------------------------------------------
207
;--- процедура прорисовки текста --------------------------
208
;----------------------------------------------------------
209
edit_box.draw_text:
210
;--- вычисляем, сколько помещается символов ---
211
;--- чтобы мусор не рисовать ---
212
        call    edit_box.get_n
213
        mov     esi,ed_size
214
        mov     ebx,ed_offset
215
        sub     esi,ebx
216
        cmp     eax,esi
217
        jae     @F
218
        mov     esi,eax         ;чтобы не выходить за пределы экрана
1858 lev 219
;--- рисуем текст ---
1032 Lrz 220
@@:     mov     eax,4
221
        mov     ebx,ed_left
222
        mov     edx,ed_offset
223
        add     ebx,2
224
        shl     ebx,16
225
        add     ebx,ed_top
226
        mov     ecx,ed_text_color
227
        add     ebx,4
228
        add     edx,ed_text
5679 hidnplayr 229
                test    word ed_flags,ed_pass
230
                jz      @f
231
                call    edit_box.draw_password
232
                jmp     .end_f
3089 IgorA 233
@@:
1032 Lrz 234
        mcall
3089 IgorA 235
.end_f:
1032 Lrz 236
ret
3089 IgorA 237
 
238
txt_pass db '*',0
239
 
240
proc edit_box.draw_password
241
locals
5679 hidnplayr 242
        s_len dw ? ;длина выводимого текста
3089 IgorA 243
endl
5679 hidnplayr 244
        cmp esi,1
245
        jl .end_f ;если строка пустая
246
        mov [s_len],si
247
        xor esi,esi
248
        inc esi
249
        lea edx,[txt_pass]
3089 IgorA 250
@@:
5679 hidnplayr 251
        mcall
252
        add ebx,6 shl 16 ;добавляем стандартную ширину символа
253
        dec word[s_len]
254
        cmp word[s_len],0
255
        jg @b
3090 IgorA 256
.end_f:
3089 IgorA 257
ret
258
endp
1032 Lrz 259
;----------------------------------------------------------
260
;--- процедура прорисовки фона ----------------------------
261
;входные данные
262
;eax
263
;edx - color
264
;----------------------------------------------------------
1596 Lrz 265
 
1032 Lrz 266
edit_box.draw_bg:
267
        mov     ebx,ed_left
268
        add     ebx,1
269
        mov     edx,ed_color
5679 hidnplayr 270
        test    word ed_flags, ed_disabled
271
        jz      @f
272
        mov     edx, 0x00cacaca         ; TODO: add new value disabled_color to editbox struct
273
  @@:
1032 Lrz 274
        shl     ebx,16
275
        add     ebx,ed_width
276
        sub     ebx,1
1596 Lrz 277
;вход только цвет edx
1032 Lrz 278
edit_box.draw_bg_eax:
279
        mov     ecx,ed_top
280
        mov     eax,13
281
        add     ecx,1
282
        shl     ecx,16
283
        add     ecx,ed_height
284
        dec     ecx
1858 lev 285
        mcall
1032 Lrz 286
ret
287
;----------------------------------------------------------
1858 lev 288
;--- процедура получения количества символов в текущей ширине компонента
1032 Lrz 289
;----------------------------------------------------------
290
edit_box.get_n:
291
        mov     eax,ed_width    ;получем ширину компонента
1858 lev 292
        xor     edx,edx   ;результат располагается в паре edx:eax в eax - остаток
293
        sub     eax,4           ;вычтем 4
294
        mov     ebx,6           ;загрузим делитель
295
        div     ebx             ;разделим на 6
1032 Lrz 296
ret
297
;----------------------------------------------------------
298
;--- процедура рисования курсора --------------------------
299
;----------------------------------------------------------
300
;входные ebp- цвет
301
edit_box.clear_cursor:
302
        mov     edx,ebp
303
        mov     ebx,cl_curs_x
304
        mov     ecx,cl_curs_y
305
        jmp     edit_box.draw_curs
306
edit_box.draw_cursor:
307
        mov     edx,ed_text_color
308
        mov     ebx,ed_pos
309
        mov     ecx,ed_offset
310
        sub     ebx,ecx
311
 
312
        lea     ebx,[ebx*2+ebx]
313
        shl     ebx,1
314
        ;imul   ebx,6
315
        add     ebx,ed_left
316
        mov     ecx,ed_top
317
        inc     ebx
318
        add     ecx,2
319
        mov     ebp,ebx
320
        shl     ebx,16
321
        mov     bx,bp
322
        mov     ebp,ecx
1858 lev 323
 
1032 Lrz 324
        shl     ecx,16
325
        mov     cx,bp
326
        add     ecx,ed_height-4
1858 lev 327
 
1032 Lrz 328
        mov     cl_curs_x,ebx
329
        mov     cl_curs_y,ecx
1858 lev 330
edit_box.draw_curs:
1032 Lrz 331
        mcall   38
332
ret
333
;----------------------------------------------------------
334
;--- процедура рисования рамки ----------------------------
335
;----------------------------------------------------------
336
edit_box.draw_border:
337
;--- цвет рамки ---
338
        test    word ed_flags,ed_focus
339
        mov     edx,ed_focus_border_color
340
        jne     @f
341
        mov     edx,ed_blur_border_color
342
@@:
343
;--- сверху ---
344
        mov     eax,38
345
        mov     ebx,ed_left
346
        mov     ecx,ebx
347
        shl     ebx,16
348
        mov     bx,cx
349
        add     ebx,ed_width
350
        mov     ecx,ed_top
351
        mov     esi,ecx
352
        shl     ecx,16
353
        mov     cx,si
354
        mcall
355
;--- снизу ---
356
        mov     esi,ecx
357
        add     ecx,ed_height
358
        mov     ebp,ecx
359
        shl     ecx,16
360
        mov     cx,bp
361
        mcall
362
;--- слева ---
363
        mov     cx,si
364
        mov     ebp,ebx
365
        sub     ebx,ed_width
366
        mcall
367
;--- справа ---
368
        mov     ebx,ebp
369
        shl     ebx,16
370
        mov     bx,bp
371
        mcall
372
ret
373
;----------------------------------------------------------
374
;--- проверка, зашел ли курсор за границы и, если надо, ---
375
;--- изменяем смещение ------------------------------------
1858 lev 376
;--- если смещение было, установка флага ed_offset_cl, иначе,
377
; если ничего не изменилось, то выставление ed_offset_fl
1619 IgorA 378
; в общей битовой матрице состояния компонентов word ed_flags
1032 Lrz 379
;----------------------------------------------------------
380
edit_box.check_offset:
381
pushad
382
        mov     ecx,ed_pos
383
        mov     ebx,ed_offset
384
        cmp     ebx,ecx
385
        ja      edit_box.sub_8
386
 
387
        push    ebx
1858 lev 388
        call    edit_box.get_n  ;получим кол-во символов которые умещаются в ширине компонента, в паре регистров edx:eax
1032 Lrz 389
        pop     ebx
390
        mov     edx,ebx
391
        add     edx,eax         ;ed_offset+width editbox
1596 Lrz 392
        inc     edx             ;необходимо для нормального положения курсора в крайней левой позиции
1032 Lrz 393
        cmp     edx,ecx
394
        ja      @f
395
 
396
        mov     edx,ed_size
397
        cmp     edx,ecx
398
        je      edit_box.add_end
399
 
400
        sub     edx,ecx
401
        cmp     edx,8
402
        jbe     edit_box.add_8
403
        add     ebx,8
404
        jmp     edit_box.chk_d
405
 
1216 Lrz 406
edit_box.sub_8:
5679 hidnplayr 407
        test    ecx,ecx
1596 Lrz 408
        jz      edit_box.sub_min
1032 Lrz 409
        cmp     ebx,8
410
        jbe     edit_box.sub_min
411
        sub     ebx,8   ;ebx=ed_offset
412
        jmp     edit_box.chk_d
413
edit_box.sub_min:
414
        xor     ebx,ebx
415
        jmp     edit_box.chk_d
416
 
417
edit_box.add_end:sub    edx,eax
418
        mov     ebx,edx
419
        jmp     edit_box.chk_d
420
edit_box.add_8: add     ebx,edx
421
edit_box.chk_d: mov     ed_offset,ebx
422
        call    edit_box.draw_bg
423
        and     word ed_flags,ed_offset_cl
424
edit_ex
1858 lev 425
@@:
1032 Lrz 426
        or      word ed_flags,ed_offset_fl
1596 Lrz 427
 
1032 Lrz 428
edit_ex
1619 IgorA 429
 
430
align 4
431
proc edit_box_set_text, edit:dword, text:dword
432
pushad
5679 hidnplayr 433
        mov edi,dword[edit]
434
        mov ecx,ed_max
435
        inc ecx ;учитываем будущее обрезание строки для ascii 0
436
        mov edi,dword[text]
437
        xor al,al
438
        cld
439
        repne scasb ;поиск в строке edi символа al
440
        mov ecx,edi ;ecx = text + мин. значение из: 1) ed_max или 2) длины строки text
1619 IgorA 441
 
5679 hidnplayr 442
        mov edi,dword[edit]
443
        mov esi,dword[text]
444
        sub ecx,esi ;ecx = длина строки text (но не больше чем ed_max)
445
        dec ecx
446
        mov ed_size,ecx ;ставим новый размер строки
447
        mov ed_pos,ecx ;ставим курсор в конец новой строки
448
        and word ed_flags,ed_shift_cl ;снимаем выделение если оно было
449
        mov edi,ed_text
450
        repne movsb ;копирование текстовой строки text в edit_box
451
        mov byte[edi],0 ;ставим ascii 0 в конце строки
1619 IgorA 452
popad
453
ret
454
endp
1032 Lrz 455
}
456
 
457
macro use_key_func
458
{
459
;Обработка Shift для снятия выделения неизвестной области
460
edit_box_key.shift: ;;;;;;;SHIFT
461
        test    word ed_flags,ed_shift
462
        je      edit_box_key.f_exit
463
 
464
@@:     mov     ebp,shift_color
465
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
466
        mov     ebx,dword       ed_shift_pos
467
        call    edit_box_key.sh_cl_
468
        jmp     edit_box.draw_cursor_text
469
;;;;;;;;;;;;;;;;;;;;;
1858 lev 470
edit_box_key.f_exit:
5679 hidnplayr 471
        call    edit_box.check_offset
1032 Lrz 472
        and     word ed_flags,ed_shift_cl
473
        call    edit_box_key.enable_null
474
        jmp     edit_box.draw_cursor_text
475
edit_box_key.sh_cl_:
476
;;;;;;SHIFT end
477
;обработка очистки, при левом - правом движении выделения
478
;для обработки снятия выделения
479
;входные параметры ebp=color ebx=ed_shift_pos
480
        mov     eax,dword       ed_pos
481
        cmp     eax,ebx
482
 
483
        jae     edit_box_key.sh_n
484
        push    eax  ;меньшее в eax
485
        push    ebx  ;большее
486
        jmp     edit_box_key.sh_n1
487
                     ;если иначе
1214 Lrz 488
edit_box_key.sh_n:
5679 hidnplayr 489
        push    ebx
1032 Lrz 490
        push    eax
1858 lev 491
edit_box_key.sh_n1:
1032 Lrz 492
        call    edit_box.check_offset
493
        call    edit_box.get_n
494
        mov     edx,eax ;size of ed_box
495
        mov     ecx,ed_offset
496
        add     eax,ecx ;eax = w_off= ed_offset+width
497
        mov     edx,eax ;save
498
        pop     ebx     ;большее
499
        pop     eax     ;меньшее
500
 
1858 lev 501
        cmp     eax,ecx         ;сравнение меньшего с offset.
1032 Lrz 502
        jae     edit_box_key.f_f            ;если больше
503
        xor     eax,eax
504
        cmp     edx,ebx         ;cравним размер w_off с большим
505
        jb      @f
506
        sub     ebx,ecx
507
        jmp     edit_box_key.nxt_f
508
@@:     mov     ebx,edx
1858 lev 509
        sub     ebx,ecx
1032 Lrz 510
        jmp     edit_box_key.nxt_f
1858 lev 511
edit_box_key.f_f:
1032 Lrz 512
        sub     eax,ecx
513
        cmp     edx,ebx         ;cравним размер w_off с большим
514
        jle     @f
515
        sub     ebx,ecx
516
        sub     ebx,eax
517
        jmp     edit_box_key.nxt_f
518
@@:
1858 lev 519
        mov     ebx,edx
1032 Lrz 520
        sub     ebx,ecx
521
        sub     ebx,eax
522
edit_box_key.nxt_f:
523
        mov     edx,ebx
524
        lea     ebx,[eax*2+eax]
525
        shl     ebx,1
526
        add     ebx,ed_left
527
        inc     ebx
528
        shl     ebx,16
529
        lea     ecx,[edx*2+edx]
1858 lev 530
        shl     ecx,1
1032 Lrz 531
        mov     bx,cx
532
        inc     ebx
533
        mov     edx,ebp;shift_color
534
 
535
        call    edit_box.draw_bg_eax
536
@@:     call    edit_box_key.enable_null
537
        ret
538
;;;;;;;;;;;;;;;;;;;;;
539
;Установка- снятие выделения в один символ
540
;;;;;;;;;;;;;;;;;;;;;
541
edit_box_key.drw_sim:
542
        mov     eax,dword       ed_pos
543
        call    edit_box_key.draw_rectangle   ;нарисовать прямоугольник с заданным цветом
544
        jmp     @b
545
;;;;;;;;;;;;;;;;;;;;;
1858 lev 546
;Функция установки выделения при движении влево и вправо и нажатии shift
547
;Логика:
1032 Lrz 548
;;;;;;;;;;
549
edit_box_key.draw_wigwag:
550
;функция установки переменных
551
        mov     ebp,shift_color
552
        call    edit_box.clear_cursor
553
 
1858 lev 554
        or      word ed_flags,ed_shift_bac ;установка флага выделенной области
1032 Lrz 555
        mov     ebp,shift_color
556
        mov     eax,dword       ed_pos
557
        test    word ed_flags,ed_left_fl
558
        jz      edit_box_key.low
559
        jmp     @f
560
;;;;;;;;;;
1858 lev 561
;Функция удаления выделения при движении влево и вправо и нажатии shift
562
;Логика:
1032 Lrz 563
;;;;;;;;;;
564
edit_box_key.draw_wigwag_cl:
565
;функция установки переменных
566
        mov     ebp,ed_color
567
        call    edit_box.clear_cursor
568
 
569
        mov     ebp,ed_color
570
        mov     eax,dword       ed_pos
571
        test    word ed_flags,ed_left_fl
572
        jz      edit_box_key.low
573
@@:     call    edit_box_key.draw_rectangle  ;нарисовать прямоугольник закрашиваемой области
574
        ret
575
edit_box_key.low:   dec     eax
576
        jmp     @b
577
;входной параметр ebx - ed_pos
578
edit_box_key.sh_first_sh:
579
        test    word ed_flags,ed_shift
580
        je      @f
581
        mov     dword ed_shift_pos_old,ebx
582
        test    word ed_flags,ed_shift_on
583
        jne     @f
584
        mov     dword ed_shift_pos,ebx
585
        or      word ed_flags,ed_shift_on
586
@@:     ret
587
;Обработка крайних положений в editbox при нажатом shift
1858 lev 588
;производит снятие выделения, если нет shift
1032 Lrz 589
;иначе вообще выходит
590
edit_box_key.sh_st_of:
591
        test    word ed_flags,ed_shift
592
        jne     @f
593
        test    word ed_flags,ed_shift_bac
594
        je      @f
595
        mov     ebp,ed_color
596
        mov     ebx,dword       ed_shift_pos
597
        call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
1858 lev 598
        and     word ed_flags,ed_shift_cl ; очистка от того, что убрали выделение
1032 Lrz 599
        jmp     edit_box.draw_cursor_text
600
@@:
601
        and     word ed_flags,ed_shift_off
1113 diamond 602
        popad
603
        ret     4
1858 lev 604
;проверка состояния shift, был ли он нажат раньше?
1032 Lrz 605
edit_box_key.sh_enable:
606
        test    word ed_flags,ed_shift
1858 lev 607
        jne     edit_box_key.sh_ext_en ;нарисовать закрашенный прямоугольник
1032 Lrz 608
 
609
        test    word ed_flags,ed_shift_bac
610
        je      @f
611
        call    edit_box.check_offset
612
 
613
        mov     ebp,ed_color
614
        mov     ebx,dword       ed_shift_pos
1858 lev 615
        call    edit_box_key.sh_cl_  ;очистка выделенного фрагмента
616
        call    edit_box_key.draw_wigwag_cl
617
        and     word ed_flags,ed_shift_cl ; 1вар не нужно
1032 Lrz 618
        ret
619
 
620
@@:     mov     ebp,ed_color
621
        call    edit_box.clear_cursor
622
        call    edit_box.check_offset
623
        ret
1858 lev 624
edit_box_key.sh_ext_en:
1032 Lrz 625
        call    edit_box.check_offset
626
        test    word ed_flags,ed_offset_fl
627
        je      @f
1858 lev 628
;Рисование закрашенных прямоугольников и их очистка
1032 Lrz 629
        mov     eax,dword       ed_shift_pos
630
        mov     ebx,dword       ed_pos
631
        mov     ecx,dword       ed_shift_pos_old
1858 lev 632
;проверка и рисование закрашенных областей
1032 Lrz 633
        cmp     eax,ecx
634
        je      edit_box_key.1_shem
635
        jb      edit_box_key.smaller
636
        cmp     ecx,ebx
637
        ja      edit_box_key.1_shem
638
        call    edit_box_key.draw_wigwag_cl ;clear
639
        jmp     edit_box_key.sh_e_end
640
edit_box_key.smaller:
641
        cmp     ecx,ebx
642
        jb      edit_box_key.1_shem
643
        call    edit_box_key.draw_wigwag_cl ;clear
644
        jmp     edit_box_key.sh_e_end
645
;alike  =
646
edit_box_key.1_shem:        call   edit_box_key.draw_wigwag
647
edit_box_key.sh_e_end:      and     word ed_flags,ed_shift_off
648
        ret
649
@@:     mov     ebp,shift_color
650
        mov     ebx,dword       ed_shift_pos
651
        call    edit_box_key.sh_cl_
652
        jmp     edit_box_key.sh_e_end
653
;функция для обработки shift при нажатии home and end
654
edit_box_key.sh_home_end:
655
        mov     ebp,ed_color
656
        call    edit_box.clear_cursor
657
        test    word ed_flags,ed_shift_bac
658
        je      @f
659
        mov     ebp,ed_color
660
        mov     ebx,dword       ed_shift_pos_old
661
        call    edit_box_key.sh_cl_
662
 
663
@@:     test    word ed_flags,ed_shift
664
        je      edit_box_key.sh_exit_ ;выйти
665
        mov     ebp,shift_color
666
        mov     ebx,dword       ed_shift_pos
667
        call    edit_box_key.sh_cl_
668
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
669
        jmp     edit_box_key.sh_e_end
1858 lev 670
edit_box_key.sh_exit_:
1596 Lrz 671
        call    edit_box.draw_bg
5679 hidnplayr 672
        call    edit_box.check_offset
1032 Lrz 673
        ret
674
;функция внесения 0 по адресу ed_size+1
675
edit_box_key.enable_null:
676
        pusha
677
        mov     eax,ed_size
678
        mov     ebx,ed_text
679
        test    eax,eax
680
        add     eax,ebx
681
        jne     @f
682
        inc     eax
683
@@:     xor     ebx,ebx
684
        mov     [eax],bl
685
edit_ex
686
;- удаление символа
687
;Входные данные edx=ed_size;ecx=ed_pos
688
edit_box_key.del_char:
689
        mov     esi,ed_text
690
        test    word ed_flags,ed_shift_on
691
        je      @f
692
        mov     eax,dword ed_shift_pos
693
        mov     ebx,esi
694
        cmp     eax,ecx
695
        jae     edit_box_key.dh_n
696
 
1858 lev 697
        mov     ed_pos,eax      ;чтобы не было убегания курсора
1032 Lrz 698
        mov     ebp,ecx
699
        sub     ebp,eax
1858 lev 700
        add     ebx,eax  ;eax меньше
1032 Lrz 701
        sub     edx,ecx
702
        add     esi,ecx
703
 
704
        mov     dword ed_shift_pos,ebp
705
        jmp     edit_box_key.del_ch_sh
706
                     ;если иначе
1858 lev 707
edit_box_key.dh_n:
1032 Lrz 708
        mov     ebp,eax
709
        sub     ebp,ecx
710
        add     ebx,ecx
711
        sub     edx,eax
712
        add     esi,eax
713
        mov     dword ed_shift_pos,ebp
714
        jmp     edit_box_key.del_ch_sh
715
 
1858 lev 716
@@:     add     esi,ecx ;указатель + смещение к реальному буферу
1032 Lrz 717
        mov     ebx,esi
718
        inc     esi
719
        cld
720
 
721
        sub     edx,ecx
722
edit_box_key.del_ch_sh:
723
 
724
        push    edi
725
        mov     edi,ebx
726
@@:
727
        lodsb
728
        stosb
729
        dec edx
730
        jns @b
1858 lev 731
 
1032 Lrz 732
        pop edi
733
        ret
734
;вычислить закрашиваемую область
735
;соглашение в ebp - передается ed_size
736
edit_box_key.clear_bg:
737
        call    edit_box.get_n  ;получить размер в символах ширины компонента
738
        push    eax
739
        mov     ebx,ed_offset
740
        add     eax,ebx ;eax = w_off= ed_offset+width
741
        mov     ebx,ebp ;ed_size
1858 lev 742
 
1032 Lrz 743
        cmp     eax,ebx
744
        jb      @f
745
        mov     eax,ed_pos
746
        sub     ebx,eax
747
        mov     ecx,ed_offset
748
        sub     eax,ecx
749
        jmp     edit_box_key.nxt
750
@@:     mov     ebx,ed_pos
751
        push    ebx
752
        sub     eax,ebx
1858 lev 753
        mov     ebx,eax ;It is not optimal
754
 
1032 Lrz 755
        pop     eax     ;ed_pos
756
        mov     ecx,ed_offset
757
        sub     eax,ecx
758
edit_box_key.nxt:
759
        mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
760
        add     ebp,ebx
761
        pop     edx
762
        cmp     ebp,edx
763
        je      @f
764
        inc     ebx
765
 
766
@@:     mov     edx,ebx
767
        lea     ebx,[eax*2+eax]
768
        shl     ebx,1
769
        add     ebx,ed_left
770
        inc     ebx
771
        shl     ebx,16
772
        lea     ecx,[edx*2+edx]
1858 lev 773
        shl     ecx,1
1032 Lrz 774
        mov     bx,cx
775
        mov     edx,ed_color
776
        call    edit_box.draw_bg_eax
777
        ret
778
;;;;;;;;;;;;;;;;;;;
779
;;; Обработка примитивов
780
;;;;;;;;;;;;;;;;;;;;
781
;Нарисовать прямоугольник, цвет передается в ebp
782
;входные параметры:
783
;eax=dword ed_pos
1858 lev 784
;ebp=-цвет ed_color or shift_color
1032 Lrz 785
edit_box_key.draw_rectangle:
786
        mov     ecx,dword ed_offset
787
        sub     eax,ecx
788
        lea     ebx,[eax*2+eax]
789
        shl     ebx,1
790
        inc     ebx
791
        add     ebx,ed_left
792
        shl     ebx,16
793
        add     ebx,6
794
        mov     edx,ebp
795
        call    edit_box.draw_bg_eax
796
        ret
797
;;;;;;;;;;;;;;;;;;
798
;;Проверка нажат ли shift
799
;;;;;;;;;;;;;;;;;;
4601 mario79 800
edit_box_key.check_shift_ctrl_alt:
1032 Lrz 801
pusha   ;сохраним все регистры
1034 Lrz 802
        mcall   66,3
4601 mario79 803
        test    al,11b
1032 Lrz 804
        je      @f
4601 mario79 805
        or      word ed_flags,ed_shift   ;установим флаг Shift
806
@@:
807
        and     word ed_flags,ed_ctrl_off ; очистим флаг Ctrl
5679 hidnplayr 808
        test    al,1100b
4601 mario79 809
        je      @f
810
        or      word ed_flags,ed_ctrl_on   ;установим флаг Ctrl
811
@@:
812
        and     word ed_flags,ed_alt_off ; очистим флаг Alt
5679 hidnplayr 813
        test    al,110000b
4601 mario79 814
        je      @f
815
        or      word ed_flags,ed_alt_on   ;установим флаг Alt
1032 Lrz 816
@@:edit_ex
817
}
818
 
819
macro use_key_no_process  up,down,esc,enter,tab,numl,capsl,scrolll
820
{
1858 lev 821
if up eq
1032 Lrz 822
else
823
        cmp     ah,177
824
        jz      edit_box.editbox_exit
825
end if
1858 lev 826
if down eq
1032 Lrz 827
else
828
        cmp     ah,178
829
        jz      edit_box.editbox_exit
830
end if
1858 lev 831
if esc eq
1032 Lrz 832
else
833
        cmp     ah,27   ;ESC - клавиша ))
834
        jz      edit_box.editbox_exit
835
end if
1858 lev 836
if enter eq
1032 Lrz 837
else
838
        cmp     ah,13   ;ENTER - клавиша ))
839
        jz      edit_box.editbox_exit
840
end if
1858 lev 841
if tab eq
1032 Lrz 842
else
843
        cmp     ah,9   ;TAB - клавиша ))
844
        jz      edit_box.editbox_exit
845
end if
846
 
1858 lev 847
if numl eq
1032 Lrz 848
else
849
        cmp     ah,4   ;Num Lock - клавиша ))
850
        jz      edit_box.editbox_exit
851
end if
852
 
1858 lev 853
if capsl eq
1032 Lrz 854
else
855
        cmp     ah,2   ;Caps Lock - клавиша ))
856
        jz      edit_box.editbox_exit
857
end if
858
 
1858 lev 859
if scrolll eq
1032 Lrz 860
else
861
        cmp     ah,1   ;Scroll Lock - клавиша ))
862
        jz      edit_box.editbox_exit
863
end if
864
 
865
}
866
 
867
macro use_key_figures_only
868
{
1858 lev 869
        test    word ed_flags,ed_figure_only  ; только цифры?
1032 Lrz 870
        jz      @f
871
        cmp     ah,'0'
872
        jb      edit_box.editbox_exit
873
        cmp     ah,'9'
874
        ja      edit_box.editbox_exit
875
@@:
876
}
877
macro are_key_shift_press
878
{
879
        test    word ed_flags,ed_shift_on
880
        je      @f
881
        ;Входные данные edx=ed_size;ecx=ed_pos
882
        push    eax
883
        mov     edx,ed_size
884
        mov     ecx, ed_pos
885
        pusha
886
;;;;;;;;;;;;;;;;;;;;;
887
;clear input arrea
888
        mov     ebp,ed_color
889
        mov     ebx,dword       ed_shift_pos
890
        call    edit_box_key.sh_cl_
891
        mov     ebp,ed_size
892
        call    edit_box_key.clear_bg
893
;;;;;;;;;;;;;;;;;;;;;
1858 lev 894
        popa
1032 Lrz 895
        call    edit_box_key.del_char
896
;;;;
897
        mov     ebx,ed_size
3130 IgorA 898
        sub     ebx,dword ed_shift_pos
1032 Lrz 899
        mov     ed_size,ebx
900
        pop     eax
901
@@:
902
}
903
macro are_key_cur_end
904
{
905
        mov     ecx,ed_size
906
        mov     edx, ed_max
907
        test    word ed_flags,ed_insert
908
        jne     @f
909
        cmp     ecx,edx
910
        jae     edit_box.editbox_exit
911
@@:     mov     ebx, ed_pos
912
        cmp     ebx,edx
913
        jl      @f ; если меньше или равно
914
        jmp     edit_box.editbox_exit
915
 
916
@@:     ; сдвигаем символы после курсора вправо
917
        mov     ecx,ed_size
918
        push    edi eax
919
        mov     ebp,edi
920
        mov     esi,ed_text     ; Указатель на буфер
921
                                ;Будем работать со строкой
922
        add     esi,ecx         ;add ed_size добавим max size
923
        mov     edi,esi
924
 
925
        cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
926
        je      edit_box_key.In_k
927
 
1858 lev 928
        test    dword bp_flags,ed_insert ;IF insert is enabled  т.к. edi изменен, адресуем через ebp
1032 Lrz 929
        jne     edit_box_key.ins_v
930
;clear
931
pusha
932
        mov     edi,ebp
933
        mov     ebp,ed_size
934
        call    edit_box_key.clear_bg
935
popa
936
        sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
1858 lev 937
        inc     edi             ;Сместим наши символы вправо
1032 Lrz 938
        std
939
        inc     ecx
1858 lev 940
   @@:
1032 Lrz 941
        ;--------
942
        lodsb
943
        stosb
944
        ;--------
945
        loop    @b
1858 lev 946
edit_box_key.In_k:
5679 hidnplayr 947
        cld
1032 Lrz 948
        pop eax
949
        mov al,ah
950
        stosb
951
        pop edi
952
; вставляем код клавиши туда, где курсор
953
        ; увеличиваем значение размера и позиции
954
        inc      dword ed_size
955
        inc      dword ed_pos
956
        call    edit_box_key.draw_all2
957
        jmp     edit_box_key.shift
958
}
959
macro use_work_key
960
{
961
edit_box_key.insert: test   word ed_flags,ed_insert ;not    word ed_insert
962
         je     @f
963
         and    word ed_flags,ed_insert_cl
964
 
965
        jmp     edit_box.editbox_exit
966
@@:
967
        or      word ed_flags,ed_insert
968
        jmp     edit_box.editbox_exit
969
edit_box_key.ins_v:
1216 Lrz 970
;        dec     dword [ebp+48];ed_size    ;processing is insert
5679 hidnplayr 971
        dec     dword bp_size
1032 Lrz 972
        sub     esi,ecx
973
        add     esi,ebx
974
        mov     edi,esi
975
;clear
976
pusha
977
        mov     edi,ebp
978
        mov     ebp,ed_pos
979
        call    edit_box_key.clear_bg
980
popa
981
        jmp     edit_box_key.In_k
982
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1858 lev 983
edit_box_key.delete:
1032 Lrz 984
        mov     edx,ed_size
985
        mov     ecx,ed_pos
986
        cmp     edx,ecx
987
        jg      edit_box_key.bac_del
988
        test    word ed_flags,ed_shift_on
989
        jne     edit_box_key.del_bac
1113 diamond 990
        popad
991
        ret     4
1858 lev 992
edit_box_key.bac_del:
1032 Lrz 993
        call    edit_box_key.del_char
994
        jmp     edit_box_key.draw_all
1858 lev 995
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1032 Lrz 996
;--- нажата клавиша backspace ---
997
edit_box_key.backspace:
1858 lev 998
        test    word ed_flags,ed_shift_on
999
        jne     edit_box_key.delete
1000
        ; проверяем, курсор у левого края?
1032 Lrz 1001
        mov     ecx,ed_pos
1002
        test    ecx,ecx
1003
        jnz     edit_box_key.del_bac
1113 diamond 1004
        popad
1005
        ret     4
1032 Lrz 1006
 
1007
edit_box_key.del_bac:
1008
        mov     edx,ed_size
1009
        cmp     edx,ecx ;if ed_pos=ed_size
1010
        je      @f
1011
        dec     ecx
1012
        call    edit_box_key.del_char
1013
@@:     test    word ed_flags,ed_shift_on
1014
        jne     edit_box_key.bac_del
1015
        dec      dword ed_pos
1016
edit_box_key.draw_all:
1017
        push    edit_box_key.shift;.draw_cursor_text;eax
1018
 
1019
        test    word ed_flags,ed_shift_on
1020
        je      @f
1021
        mov     eax,dword ed_shift_pos
1022
        mov     ebx,ed_size
1023
        sub     ebx,eax
1024
        mov     ed_size,ebx
1025
 
1026
        mov     ebp,ed_color
1027
        call    edit_box.clear_cursor
1028
        call    edit_box.check_offset
1029
        call    edit_box.draw_bg
1030
        ret
1031
@@:     dec      dword ed_size
1032
 
1033
edit_box_key.draw_all2:
1034
        and    word ed_flags,ed_shift_cl
1035
        mov     ebp,ed_color
1036
        call    edit_box.clear_cursor
1037
        call    edit_box.check_offset
1038
        mov     ebp,ed_size
1039
        call    edit_box_key.clear_bg
1040
        ret
1041
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1042
;--- нажата клавиша left ---
1858 lev 1043
edit_box_key.left:
5679 hidnplayr 1044
        mov     ebx,ed_pos
1032 Lrz 1045
        test    ebx,ebx
1046
        jz      edit_box_key.sh_st_of
1047
        or      word ed_flags,ed_left_fl
1048
        call    edit_box_key.sh_first_sh
1049
        dec      dword ed_pos
1050
        call    edit_box_key.sh_enable
1051
        jmp     edit_box.draw_cursor_text
1052
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1053
;--- нажата клавиша right ---
1858 lev 1054
edit_box_key.right:
5679 hidnplayr 1055
        mov     ebx,ed_pos
1032 Lrz 1056
        cmp     ebx,ed_size
1057
        je      edit_box_key.sh_st_of
1058
        and     word ed_flags,ed_right_fl
1059
        call    edit_box_key.sh_first_sh
1060
        inc     dword  ed_pos
1061
        call    edit_box_key.sh_enable
1062
        jmp     edit_box.draw_cursor_text
1063
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1858 lev 1064
edit_box_key.home:
1032 Lrz 1065
        mov     ebx,ed_pos
1066
        test    ebx,ebx
1067
        jz      edit_box_key.sh_st_of
1068
        call    edit_box_key.sh_first_sh
1069
        xor     eax,eax
1070
        mov     ed_pos,eax
1071
        call    edit_box_key.sh_home_end
1072
        jmp     edit_box.draw_cursor_text
1073
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1858 lev 1074
edit_box_key.end:
1032 Lrz 1075
        mov     ebx,ed_pos
1076
        cmp     ebx,dword ed_size
1077
        je      edit_box_key.sh_st_of
1078
        call    edit_box_key.sh_first_sh
1079
        mov     eax,ed_size
1080
        mov     ed_pos,eax
1081
        call    edit_box_key.sh_home_end
1082
        jmp     edit_box.draw_cursor_text
4601 mario79 1083
;-----------------------------------------------------------------------------
1084
edit_box_key.ctrl_c:
1085
; add memory area
5679 hidnplayr 1086
        mov     ecx,ed_size
1087
        add     ecx,3*4
1088
        mcall   68,12
4601 mario79 1089
; building the clipboard slot header
5679 hidnplayr 1090
        xor     ecx,ecx
1091
        mov     [eax+4],ecx ; type 'text'
1092
        inc     ecx
1093
        mov     [eax+8],ecx ; cp866 text encoding
1094
        mov     ecx,ed_size
1095
        add     ecx,3*4
1096
        mov     [eax],ecx
1097
        sub     ecx,3*4
4601 mario79 1098
; copy data
5679 hidnplayr 1099
        mov     esi,ed_text
1100
        push    edi
1101
        mov     edi,eax
1102
        add     edi,3*4
1103
        cld
1104
        rep     movsb
1105
        pop     edi
4601 mario79 1106
; put slot to the kernel clipboard
5679 hidnplayr 1107
        mov     edx,eax
1108
        mov     ecx,[edx]
1109
        push    eax
1110
        mcall   54,2
1111
        pop     ecx
4601 mario79 1112
; remove unnecessary memory area
5679 hidnplayr 1113
        mcall   68,13
4601 mario79 1114
;--------------------------------------
1115
.exit:
1116
        jmp     edit_box.editbox_exit
1117
;-----------------------------------------------------------------------------
1118
edit_box_key.ctrl_v:
5679 hidnplayr 1119
        mcall   54,0
4601 mario79 1120
; no slots of clipboard ?
5679 hidnplayr 1121
        test    eax,eax
1122
        jz      .exit
1123
; main list area not found ?
1124
        inc     eax
1125
        test    eax,eax
1126
        jz      .exit
4601 mario79 1127
 
5679 hidnplayr 1128
        sub     eax,2
1129
        mov     ecx,eax
1130
        mcall   54,1
4601 mario79 1131
; main list area not found ?
5679 hidnplayr 1132
        inc     eax
1133
        test    eax,eax
1134
        jz      .exit
4601 mario79 1135
; error ?
5679 hidnplayr 1136
        sub     eax,2
1137
        test    eax,eax
1138
        jz      .exit
4601 mario79 1139
 
5679 hidnplayr 1140
        inc     eax
4601 mario79 1141
; check contents of container
5679 hidnplayr 1142
        mov     ebx,[eax+4]
4601 mario79 1143
; check for text
5679 hidnplayr 1144
        test    ebx,ebx
1145
        jnz     .no_valid_text
1146
 
1147
        mov     ebx,[eax+8]
4601 mario79 1148
; check for cp866
5679 hidnplayr 1149
        cmp     bl,1
1150
        jnz     .no_valid_text
1151
 
1152
        mov     ecx,[eax]
1153
        sub     ecx,3*4
1154
        cmp     ecx,ed_max
1155
        jb      @f
1156
 
1157
        mov     ecx,ed_max
4601 mario79 1158
@@:
5679 hidnplayr 1159
        mov     esi,eax
1160
        add     esi,3*4
1161
        mov     ed_size,ecx
1162
        mov     ed_pos,ecx
1163
        push    eax edi
1164
        mov     edi,ed_text
1165
        cld
4601 mario79 1166
@@:
5679 hidnplayr 1167
        lodsb
1168
        cmp     al,0x0d ; EOS (end of string)
1169
        je      .replace
4601 mario79 1170
 
5679 hidnplayr 1171
        cmp     al,0x0a ; EOS (end of string)
1172
        jne     .continue
4601 mario79 1173
.replace:
5679 hidnplayr 1174
        mov     al,0x20 ; space
1175
.continue:
1176
        stosb
1177
        dec     ecx
1178
        jnz     @b
1179
;       rep     movsb
1180
        pop     edi eax
1181
;--------------------------------------
4601 mario79 1182
.no_valid_text:
1183
; remove unnecessary memory area
5679 hidnplayr 1184
        mov     ecx,eax
1185
        mcall   68,13
4601 mario79 1186
;--------------------------------------
1187
.exit:
1188
        jmp     edit_box.draw_1
1032 Lrz 1189
}
1190
 
1191
macro use_mouse_func
1192
{
1193
;----------------------------------------------------------
1194
;--- Обработка .mouse_wigwag
1195
;----------------------------------------------------------
1196
edit_box_mouse.mouse_wigwag:
1197
        shr     eax,16
1198
        or      word ed_flags,ed_shift_bac+ed_shift_on+ed_shift
1199
;;;;;;;;;;;;;;;;;;
1200
;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox
1201
;;;;;;;;;;;;;;;;;;
1202
        test    ax,0x8000
1203
        jnz     edit_box_mouse.mleft
1204
 
1205
        mov     ebx,ed_left
1206
        cmp     eax,ebx
1207
        jb      edit_box_mouse.mleft
1208
 
1209
        add     ebx,ed_width
1210
        cmp     eax,ebx
1858 lev 1211
        ja      edit_box_mouse.mright
1032 Lrz 1212
 
1213
        sub     ebx,ed_width
1214
 
1215
        xor     edx,edx
1858 lev 1216
        sub     eax,ebx ; вычтем из координат мышки по оси х координаты до editbox по оси х
1032 Lrz 1217
        mov     ebx,6
1218
        div     ebx
1219
;;;;;;;;;;;;;;;;;;
1220
;;процедура обработки положения выделенного текста, в пределах области editbox
1221
;;;;;;;;;;;;;;;;;;
1222
;Получили координаты в eax мышки, т.е. куда она переместилась
1858 lev 1223
;Рисование закрашенных прямоугольников и их очистка
1032 Lrz 1224
        add     eax,ed_offset   ;добавим смещение
1225
        cmp     eax,dword ed_size       ;если вышли за пределы, то ничего не делать
1226
        ja      edit_box_mouse.mwigvag
1858 lev 1227
edit_box_mouse.mdraw:
1032 Lrz 1228
        mov     dword   ed_pos,eax ;сохраним новое значение
1858 lev 1229
;Рисование закрашенных прямоугольников и их очистка
1032 Lrz 1230
        mov     ecx,dword       ed_shift_pos
1231
        mov     ebx,dword       ed_shift_pos_old
1232
        mov     dword   ed_shift_pos_old,eax    ;внесем новое значение старой позиции курсора
1858 lev 1233
;проверка и рисование закрашенных областей
1032 Lrz 1234
        cmp     ecx,ebx         ;выясняем куда было движение на один шаг назад
1858 lev 1235
        je      edit_box_mouse.m1_shem        ;движения не было ранее
1032 Lrz 1236
        jb      edit_box_mouse.msmaller       ;движение было ->
1237
        cmp     ebx,eax         ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит
1238
        ja      edit_box_mouse.m1_shem        ;если было движение <- то нужно закрасить область
1239
        je      edit_box_mouse.mwigvag        ;если изменения не было, то ничего не делать
1240
        mov     ebp,ed_color    ;тут нужно очистить область c ed_pos ed_shift_pos_old
1241
;входные параметры ebp=color ebx=ed_shift_pos
1242
        call    edit_box_key.sh_cl_
1243
        jmp     edit_box_mouse.mwigvag
1244
edit_box_mouse.msmaller:
1245
        cmp     ebx,eax
1246
        jb      edit_box_mouse.m1_shem
1247
        mov     ebp,ed_color
1248
;входные параметры ebp=color ebx=ed_shift_pos
1249
        call    edit_box_key.sh_cl_
1250
        jmp     edit_box_mouse.mwigvag
1251
;alike  =
1858 lev 1252
edit_box_mouse.m1_shem:
1032 Lrz 1253
        mov     ebp,shift_color
1254
;входные параметры ebp=color ebx=ed_shift_pos
1255
        mov     ebx,ecx
1256
        call    edit_box_key.sh_cl_
1257
        jmp     edit_box_mouse.mwigvag
1258
edit_box_mouse.mwigvag:
1259
        and     word ed_flags,ed_shift_mcl
1260
        jmp     edit_box.draw_cursor_text
1261
;       popa
1262
;       ret
1263
edit_box_mouse.mleft:
1264
        mov     eax,ed_pos
1858 lev 1265
        cmp     eax,0
1032 Lrz 1266
        jbe      edit_box_mouse.mwigvag
1267
        dec     eax
1268
        call    edit_box.check_offset
1269
        push    eax
1270
        mov     ebx,ed_shift_pos
1271
        mov     ebp,shift_color
1272
        call    edit_box_key.sh_cl_
1273
        pop     eax
1274
        jmp     edit_box_mouse.mdraw
1275
edit_box_mouse.mright:
1276
        mov     eax,ed_pos
1277
        mov     ebx,ed_size
1278
        cmp     eax,ebx
1279
        jae     edit_box_mouse.mwigvag
1280
        inc     eax
1281
        call    edit_box.check_offset
1282
        mov     ebx,ed_shift_pos
1283
        mov     ebp,shift_color
1284
        push    eax
1285
        call    edit_box_key.sh_cl_
1286
        pop     eax
1858 lev 1287
        jmp     edit_box_mouse.mdraw
1032 Lrz 1288
}
1289
 
1290
macro use_work_mouse
1291
;----------------------------------------------------------
1292
;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны?
1293
;----------------------------------------------------------
1294
{
1295
        test    word ed_flags,ed_mouse_on
1296
        jne     edit_box_mouse.mouse_wigwag
1297
;----------------------------------------------------------
1298
;--- проверяем, попадает ли курсор в edit box -------------
1299
;----------------------------------------------------------
1300
        mov     ebx,ed_top
1301
        cmp     ax,bx
1302
        jl      edit_box_mouse._blur;.mouse_end_no_focus
1858 lev 1303
 
1032 Lrz 1304
        add     ebx,ed_height
1305
        cmp     ax,bx
1306
        jg      edit_box_mouse._blur;.mouse_end_no_focus
1307
 
1308
        shr     eax,16
1309
 
1310
        mov     ebx,ed_left
1311
        cmp     ax,bx
1312
        jl      edit_box_mouse._blur;.mouse_end_no_focus
1313
 
1314
        add     ebx,ed_width
1315
 
1316
        cmp     ax,bx
1858 lev 1317
        jg      edit_box_mouse._blur;.mouse_end_no_focus
1032 Lrz 1318
 
1319
;--- изменяем позицию курсора ---
1320
        push    eax
1321
        mov     ebp,ed_color
1322
        call    edit_box.clear_cursor
1323
        pop     eax
1324
edit_box_mouse._mvpos:
1325
        xor     edx,edx
1326
        sub     eax,ed_left
1327
 
1328
        mov     ebx,6
1329
        div     bx
1330
        add     eax,ed_offset
1331
        cmp     eax,ed_size
1332
        jna     edit_box_mouse._mshift
1333
        mov     eax,ed_size
1334
 
1335
edit_box_mouse._mshift:
1336
;;;;;;;
1337
;;Секция обработки shift и выделения по shift
1338
;;;;;;;
1339
        test    word ed_flags,ed_shift_bac
1340
        je      @f
1341
        mov     ebp,dword       ed_color
1342
        mov     ebx,dword ed_shift_pos
1343
        push    eax
1344
        call    edit_box_key.sh_cl_
1345
        and     word ed_flags,ed_shift_bac_cl
1346
        pop     eax
1858 lev 1347
@@:
1032 Lrz 1348
        test    word ed_flags,ed_mouse_on
1349
        jne     @f
1858 lev 1350
 
1032 Lrz 1351
        mov     dword ed_shift_pos,eax
1352
        or      word  ed_flags,ed_mouse_on
1353
        mov     dword ed_pos,eax
1214 Lrz 1354
 
1355
;        mov     dword [mouse_flag],edi          ;установим идентификатор
1356
 
5679 hidnplayr 1357
        mov     ebx,dword ed_mouse_variable
1358
        push    edi
1359
        pop     dword [ebx]
1214 Lrz 1360
 
1361
 
1362
 
1363
 
1032 Lrz 1364
        bts     word ed_flags,1                 ;установка фокуса
1365
        jmp     edit_box_mouse.m_sh
1858 lev 1366
@@:
1032 Lrz 1367
        cmp     eax,dword ed_shift_pos  ;если позиции не изменились
1368
        je      edit_box.editbox_exit
1369
        mov     ed_pos,eax
1370
        mov     ebp,dword shift_color
1371
        mov     ebx,dword ed_shift_pos
1372
        call    edit_box_key.sh_cl_
1858 lev 1373
        or      word ed_flags,ed_mous_adn_b     ;установим бит, что мы выделили +shift_on +
1374
edit_box_mouse.m_sh:
5679 hidnplayr 1375
        call    edit_box.draw_text
1032 Lrz 1376
        call    edit_box.draw_cursor
1377
;----------------------------------------------------------
1378
;--- процедура установки фокуса ---------------------------
1379
;----------------------------------------------------------
1380
        jmp     edit_box_mouse.drc
1381
edit_box_mouse._blur:
1382
        test    word ed_flags,ed_always_focus
1383
        jne     edit_box.editbox_exit
1384
        btr     word ed_flags,1 ; если не в фокусе, выходим
1385
        jnc     edit_box.editbox_exit
1386
 
1387
        mov     ebp,ed_color
1388
        call    edit_box.clear_cursor
1389
edit_box_mouse.drc:   call    edit_box.draw_border
1390
        jmp     edit_box.editbox_exit
1391
}
1392
 
1393
 
1394
; Макрос выхода
1395
macro edit_ex
1396
{
1858 lev 1397
popad
1032 Lrz 1398
ret
1399
}
1400
macro debug
1401
{
1402
        ;-----------  отладка
1403
        pushad
1404
;        mov     dword [ed_buffer.2],0
1405
;        mov     eax,edi
1406
        mov eax,dword [ed_buffer.2]
1407
        mov edi,ed_buffer.3
1408
        call .str
1409
        ;рисование фона
1410
        mov eax,13
1411
        mov ebx,178*65536+70
1412
        mov ecx,28*65536+10
1413
        xor edx,edx
1414
        int 0x40
1415
        ;вывод значения на экран
1416
        mov eax,4
1417
        mov ebx,180*65536+30
1418
        mov ecx,0x10DDBBCC
1419
        mov edx,ed_buffer.3
1420
        mov esi,8
1421
        int 0x40
1422
        popad
1423
        ;----------- отладка
1424
}
1425
macro   debug_func
1426
{
1427
.str:
1858 lev 1428
        mov ecx,0x0a ;задается система счисления, изменяются регистры ebx,eax,ecx,edx, входные параметры eax - число
1429
         ;перевод числа в ASCII строку, входные данные ecx=система счисления, edi адрес куда будем записывать строку, причем конец переменной
1430
        cmp eax,ecx  ;сравнить, если в eax меньше, чем в ecx, то перейти на @@-1 т.е. на pop eax
1032 Lrz 1431
        jb @f
1432
        xor edx,edx  ;очистить edx
1433
        div ecx      ;разделить - остаток в edx
1434
        push edx     ;положить в стек
1435
        ;dec edi             ;смещение необходимое для записи с конца строки
1858 lev 1436
        call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента, пока в eax не станет меньше чем в ecx
1032 Lrz 1437
        pop eax
1858 lev 1438
        @@: ;cmp al,10 ;проверить не меньше ли значение в al, чем 10 (для системы счисления 10 данная команда - лишная))
1439
        ;sbb al,$69  ;- честно, данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
1032 Lrz 1440
        ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
1858 lev 1441
        or al,0x30  ;данная команда короче, чем две выше
1442
        stosb       ;записать элемент из регистра al в ячейку памяти es:edi
1443
 
1444
        ret         ;вернуться очень интересный ход, т.к. пока в стеке хранится кол-во вызовов, то столько раз мы и будем вызываться
1032 Lrz 1445
}
1446
 
1214 Lrz 1447
ed_struc_size=76