Subversion Repositories Kolibri OS

Rev

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