Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1457 IgorA 1
; макрос для системной библиотеки box_lib.obj
2
; элемент TextEditor для Kolibri OS
4228 IgorA 3
; файл последний раз изменялся 13.11.2013 IgorA
1457 IgorA 4
; на код применена GPL2 лицензия
5
 
6
;input:
7
; edi = pointer to tedit struct
8
; reg = index
9
;output:
10
; reg = pointer to 'tex' struct
11
macro ConvertIndexToPointer reg {
12
  imul reg,sizeof.symbol
13
  add reg,ted_tex
14
}
15
 
16
;--- out_reg = ted_key_words_data[ind_reg].Text[0] ---
17
macro ColToIndexOffset ind_reg,out_reg {
18
	mov out_reg,ind_reg
19
	imul out_reg,sizeof.TexColViv
20
	add out_reg,ted_key_words_data
21
}
22
 
23
macro use_text_edit
24
{
25
TED_PANEL_NULL	 equ 0 ;нет открытой панели
26
TED_PANEL_FIND	 equ 1 ;панель поиска
27
TED_PANEL_SYNTAX equ 2 ;панель выбора файлов подсветки
28
TED_PANEL_WIDTH  equ 150 ;ширина панели
29
 
30
MAX_COLOR_WORD_LEN equ 40
31
;------------------------------------------------------------------------------
32
struct TexSelect
33
  x0 dd ?
34
  y0 dd ?
35
  x1 dd ?
36
  y1 dd ?
37
ends
38
 
39
struct TexColViv
2102 IgorA 40
	Text  rb MAX_COLOR_WORD_LEN ; слово для подсветки
41
	f1    dd 0 ; справка по слову
42
	flags db ? ; f1+4 флаги используемые при выделении
43
	endc  db ? ; f1+5 символ конца выделения (используется при flags&4)
44
	escc  db ? ; f1+6 экранирующий символ (используется при flags&4)
45
	color db ? ; f1+7 номер цвета
1457 IgorA 46
ends
47
 
48
struct symbol
49
  c db ?    ;  +0 символ
50
  col db ?  ;  +1 цвет
51
  perv dd ? ;  +2
52
  next dd ? ;  +6 указатели
53
  tc dd ?   ; +10 врем. создания
54
  td dd ?   ; +14 врем. удаления
55
ends
56
;------------------------------------------------------------------------------
57
 
1464 IgorA 58
ted_symbol_tab db 26 ;ascii код стрелки вправо, используется для рисования табуляции в режиме показа невидимых символов
1458 IgorA 59
 
1457 IgorA 60
if lang eq ru
61
 
62
txtRow db 'Строка',0
63
txtCol db 'Знак',0
64
txtOtm db 'Отмены',0
65
txtBuf db 'Буфер:',0
66
 
67
else
68
 
69
txtRow db 'Rows',0
70
txtCol db 'Cols',0
71
txtOtm db 'Undo',0
72
txtBuf db 'Buffer:',0
73
 
74
end if
75
 
1464 IgorA 76
;EvChar - таблица для фильтрования добавляемых символов, что-бы не попали лишние знаки
1457 IgorA 77
align 4
1458 IgorA 78
EvChar db 0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0
1457 IgorA 79
    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
80
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
81
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
82
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
83
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
84
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
85
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
86
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
87
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
88
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
89
    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
90
    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
91
    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
92
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
93
    db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
94
 
95
KM_SHIFT equ 0x00010000
96
KM_CTRL equ 0x00020000
97
KM_ALT equ 0x00040000
98
KM_NUMLOCK equ 0x00080000
99
 
100
; KEY CODES
101
KEY_F1 equ 0x0000003B
102
KEY_F2 equ 0x0000003C
103
KEY_F3 equ 0x0000003D
104
 
105
 
106
 
107
align 4
108
proc ted_init, edit:dword
1458 IgorA 109
	push eax ecx edi
110
	mov edi,dword[edit]
1457 IgorA 111
 
1458 IgorA 112
	mov ecx,sizeof.symbol
113
	imul ecx,ted_max_chars
1489 IgorA 114
	invoke mem.alloc,ecx ;выделяем память
1458 IgorA 115
	mov ted_tex,eax
116
	mov ted_tex_1,eax
117
	add ted_tex_1,sizeof.symbol
118
	add eax,ecx
119
	mov ted_tex_end,eax
1457 IgorA 120
 
1458 IgorA 121
	stdcall ted_clear, edi,1
1457 IgorA 122
 
123
;-------------------------------------------------
1458 IgorA 124
	mov ecx,1024 ;1024 - для массива ted_arr_key_pos
125
	add ecx,ted_syntax_file_size
1489 IgorA 126
	invoke mem.alloc,ecx
1458 IgorA 127
	mov ted_arr_key_pos,eax
128
	add eax,1024
129
	mov ted_syntax_file,eax
1457 IgorA 130
 
1458 IgorA 131
	stdcall ted_init_scroll_bars,edi,3
132
	pop edi ecx eax
133
	ret
1457 IgorA 134
endp
135
 
1458 IgorA 136
MIN_W_SCRL_ARE equ 3 ;минимальная отображаемая область для верт. скроллинга
137
MIN_H_SCRL_ARE equ 3 ;минимальная отображаемая область для гориз. скроллинга
138
;input:
1459 IgorA 139
; opt = 1 - менять цвет скроллингов, 2 - изменились размеры окна,
140
;  4 - изменились размеры документа
1457 IgorA 141
align 4
1458 IgorA 142
proc ted_init_scroll_bars, edit:dword, opt:dword
143
	pushad
1459 IgorA 144
	mov edi,dword[edit]
1458 IgorA 145
	mov esi,ted_scr_w
146
	mov ebx,ted_scr_h
147
	bt dword[opt],0
148
	jae @f
149
		mov ecx,ted_color_wnd_work
150
		mov dword[esi+sb_offs_bckg_col],ecx
151
		mov dword[ebx+sb_offs_bckg_col],ecx
152
		mov ecx,ted_color_wnd_capt
153
		mov dword[esi+sb_offs_frnt_col],ecx
154
		mov dword[ebx+sb_offs_frnt_col],ecx
155
		mov ecx,ted_color_wnd_bord
156
		mov dword[esi+sb_offs_line_col],ecx
157
		mov dword[ebx+sb_offs_line_col],ecx
158
	@@:
1459 IgorA 159
	bt dword[opt],2 ; изменились размеры документа ?
160
	jae .doc_resize
161
		call ted_get_num_lines
162
		cmp eax,100
163
		jge @f
164
			mov eax,100
165
		@@:
166
		mov dword[esi+sb_offs_max_area],eax
167
	.doc_resize:
168
	bt dword[opt],1 ; изменились размеры окна ?
1458 IgorA 169
	jae .no_size
170
			mov edx,ted_wnd_l
171
			add edx,ted_rec_l
172
			mov word[ebx+sb_offs_start_x],dx ;выставляем левый отступ гориз. скроллинга
173
		mov eax,ted_wnd_h ;calculate lines in page
174
			mov edx,ted_wnd_t
175
			add edx,eax
176
			mov word[ebx+sb_offs_start_y],dx ;выставляем верхний отступ гориз. скроллинга
177
		sub eax,ted_rec_t
178
		xor edx,edx
179
		mov ecx,ted_rec_h
180
		div ecx
181
		cmp eax,MIN_W_SCRL_ARE
182
		jg @f
183
			mov eax,MIN_W_SCRL_ARE
184
		@@:
185
		mov dword[esi+sb_offs_cur_area],eax
186
 
187
		mov eax,ted_wnd_w ;calculate cols in page
188
			mov edx,ted_wnd_l ;левый отступ окна
189
			add edx,eax ;добавляем ширину окна
190
			mov word[esi+sb_offs_start_x],dx ;выставляем левый отступ верт. скроллинга
191
			mov edx,ted_wnd_t
192
			mov word[esi+sb_offs_start_y],dx ;выставляем верхний отступ верт. скроллинга
193
			mov edx,ted_wnd_h
194
			mov word[esi+sb_offs_size_y],dx ;выставляем высоту верт. скроллинга
195
		sub eax,ted_rec_l
196
			mov word[ebx+sb_offs_size_x],ax ;выставляем ширину гориз. скроллинга
197
		xor edx,edx
198
		mov ecx,ted_rec_w
199
		div ecx
200
		cmp eax,MIN_H_SCRL_ARE
201
		jg @f
202
			mov eax,MIN_H_SCRL_ARE
203
		@@:
204
		dec eax
205
		mov dword[ebx+sb_offs_cur_area],eax ;устанавливаем число символов, которые влазят в экран для гориз. скроллинга
206
	.no_size:
207
	popad
208
	ret
209
endp
210
 
211
align 4
1457 IgorA 212
proc ted_delete, edit:dword
1464 IgorA 213
	push edi
214
	mov edi,dword[edit]
1489 IgorA 215
	invoke mem.free,ted_tex
216
	invoke mem.free,ted_arr_key_pos ;ted_syntax_file
1464 IgorA 217
	pop edi
218
	ret
1457 IgorA 219
endp
220
 
221
 
222
;input:
223
; eax = key kodes
224
align 4
225
proc ted_key, edit:dword, table:dword, control:dword
226
	pushad
227
	mov edi,dword[edit]
1458 IgorA 228
	mov esi,ted_el_focus
229
	cmp dword[esi],edi
230
	jne .end_key_fun ;элемент не в фокусе выходим из функции
1457 IgorA 231
	mov esi,dword[control]
232
 
233
	cmp ah,KEY_F1 ;[F1]
234
	jne @f
235
		stdcall ted_show_help_f1,edi
236
		jmp .end_key_fun
237
	@@:
238
	cmp ah,KEY_F3 ;[F3]
239
	jne @f
240
		stdcall ted_but_find_next,edi
241
		jmp .end_key_fun
242
	@@:
243
 
244
	test esi,KM_CTRL ;Ctrl+...
245
	jz .key_Ctrl
246
		cmp ah,24 ;Ctrl+O
247
		jne @f
248
			cmp ted_fun_on_key_ctrl_o,0
249
			je @f
250
				call ted_fun_on_key_ctrl_o
251
		@@:
1458 IgorA 252
		cmp ah,31 ;Ctrl+S
253
		jne @f
254
			cmp ted_fun_on_key_ctrl_s,0
255
			je @f
256
				call ted_fun_on_key_ctrl_s
257
		@@:
1457 IgorA 258
		cmp ah,33 ;Ctrl+F
259
		jne @f
260
		cmp ted_panel_id,TED_PANEL_FIND
261
		je @f
262
			cmp ted_fun_on_key_ctrl_f,0
263
			je @f
264
				call ted_fun_on_key_ctrl_f
265
		@@:
266
		cmp ah,44 ;Ctrl+Z
267
		jne @f
268
			stdcall ted_but_undo,edi
269
		@@:
270
		cmp ah,46 ;Ctrl+C
271
		jne @f
272
			stdcall ted_but_copy,edi
273
		@@:
274
		cmp ah,47 ;Ctrl+V
275
		jne @f
276
			stdcall ted_but_paste,edi
277
		@@:
278
		cmp ah,49 ;Ctrl+N
279
		jne @f
280
			cmp ted_fun_on_key_ctrl_n,0
281
			je @f
282
				call ted_fun_on_key_ctrl_n
283
		@@:
284
		cmp ah,199 ;Ctrl+Home
285
		jne @f
286
			call ted_key_ctrl_home
287
		@@:
288
		jmp .end_key_fun
289
	.key_Ctrl:
290
 
1458 IgorA 291
	test esi,KM_SHIFT ;Shift+...
292
	jz .key_Shift
293
		cmp ah,72 ;Shift+Up
294
		jne @f
295
			call ted_sel_key_up
296
		@@:
297
		cmp ah,75 ;Shift+Left
298
		jne @f
299
			call ted_sel_key_left
300
		@@:
301
		cmp ah,77 ;Shift+Right
302
		jne @f
303
			call ted_sel_key_right
304
		@@:
305
		cmp ah,80 ;Shift+Down
306
		jne @f
307
			call ted_sel_key_down
308
		@@:
309
		;mov ted_drag_k,1 ;начинаем выделение от клавиатуры
310
		jmp .key_MoveCur
311
	.key_Shift:
1457 IgorA 312
;-------------------------------------------------
1458 IgorA 313
	cmp ah,72 ;178 ;Up
314
	jne @f
315
		call ted_draw_cursor_sumb
316
		call ted_cur_move_up
317
		cmp dl,8
318
		jne .no_red_0
319
			call ted_scroll_set_redraw
320
			stdcall ted_draw,edi
321
			jmp @f
322
		.no_red_0:
323
		call ted_draw_main_cursor
324
		mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
325
	@@:
1464 IgorA 326
	cmp ah,80 ;177 ;Down
327
	jne @f
328
		call ted_draw_cursor_sumb
329
		call ted_cur_move_down
330
		cmp dl,8
331
		jne .no_red_1
332
			call ted_scroll_set_redraw
333
			stdcall ted_draw,edi
334
			jmp @f
335
		.no_red_1:
336
		call ted_draw_main_cursor
337
		mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
338
	@@:
3903 IgorA 339
	cmp ah,75 ;176 ;Left
340
	jne @f
341
		call ted_draw_cursor_sumb
342
		call ted_cur_move_left
343
		cmp dl,8
344
		jne .no_red_2
345
			call ted_scroll_set_redraw
346
			stdcall ted_draw,edi
347
			jmp @f
348
		.no_red_2:
349
		call ted_draw_main_cursor
350
		mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
351
	@@:
352
	cmp ah,77 ;179 ;Right
353
	jne @f
354
		call ted_draw_cursor_sumb
355
		call ted_cur_move_right
356
		cmp dl,8
357
		jne .no_red_3
358
			call ted_scroll_set_redraw
359
			stdcall ted_draw,edi
360
			jmp @f
361
		.no_red_3:
362
		call ted_draw_main_cursor
363
		mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
364
	@@:
365
	cmp ah,71 ;180 ;Home
366
	jne @f
367
		call ted_draw_cursor_sumb
368
		call ted_cur_move_x_first_char
369
		cmp dl,8
370
		jne .no_red_4
371
			call ted_scroll_set_redraw
372
			stdcall ted_draw,edi
373
			jmp @f
374
		.no_red_4:
375
		call ted_draw_main_cursor
376
		mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
377
	@@:
378
	cmp ah,79 ;181 ;End
379
	jne @f
380
		call ted_draw_cursor_sumb
381
		call ted_cur_move_x_last_char
382
		cmp dl,8
383
		jne .no_red_5
384
			call ted_scroll_set_redraw
385
			stdcall ted_draw,edi
386
			jmp @f
387
		.no_red_5:
388
		call ted_draw_main_cursor
389
		mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
390
	@@:
391
	cmp ah,73 ;184 ;PageUp
392
	jne @f
393
		call ted_cur_move_page_up
394
		cmp dl,0
395
		je @f
396
		call ted_scroll_set_redraw
397
		stdcall ted_draw,edi
398
	@@:
399
	cmp ah,81 ;183 ;PageDown
400
	jne @f
401
		call ted_cur_move_page_down
402
		cmp dl,0
403
		je @f
404
		call ted_scroll_set_redraw
405
		stdcall ted_draw,edi
406
		mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
407
	@@:
1457 IgorA 408
;-------------------------------------------------
409
	.key_MoveCur:
410
 
3903 IgorA 411
	;ниже пропускаются служебные клавиши, которые могут давать мусорные символы в окно
412
	cmp ah,42 ;[L Shift] когда нажат без других кнопок
413
	je .end_key_fun
414
	cmp ah,54 ;[R Shift] когда нажат без других кнопок
415
	je .end_key_fun
416
	cmp ah,58 ;[Caps Lock]
417
	je .end_key_fun
1457 IgorA 418
	cmp ah,69 ;[Pause Break]
419
	je .end_key_fun
420
	cmp ah,120 ;[Fn]
421
	je .end_key_fun
422
	cmp ah,0x80 ;if key up
423
	ja .end_key_fun
424
 
425
	cmp dword[table],0
426
	je @f
427
		stdcall KeyConvertToASCII, dword[table]
428
	@@:
429
 
430
	;mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
431
 
432
	lea edx,[EvChar] ;берем адрес таблицы с допустимыми символами
433
	add dl,ah
434
	jae @f
435
		add edx,0x100 ;если было переполнение при добавлении кода символа
436
	@@:
437
	cmp byte [edx],1
438
	jne @f
439
		mov ted_key_new,ah
440
		call ted_set_undo
441
		mov edx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
442
		stdcall ted_sel_text_del,edx
443
		cmp al,1
444
		jne .del
445
			mov edx,ted_opt_ed_move_cursor
446
		.del:
447
		cmp ted_cur_ins,1
448
		je .no_ins_mod
449
			stdcall ted_text_del,edi,ted_opt_ed_change_time
450
			mov edx,ted_opt_ed_move_cursor
451
		.no_ins_mod:
452
		mov ecx,edi
453
		add ecx,ted_offs_key_new
454
		stdcall ted_text_add,edi,ecx,1,edx ;добавляем символ введенный с клавиатуры
455
		cmp ted_key_new,13
456
		jne .dr_m_win
2758 IgorA 457
			;если вставили символ новой строки
458
			mov ecx,ted_scr_w
459
			inc dword[ecx+sb_offs_max_area] ;увеличиваем размер вертикального скроллинга
460
			mov edx,ted_cur_y
461
			cmp edx,dword[ecx+sb_offs_cur_area]
462
			jl .no_change
463
				dec ted_cur_y ;курсор оставляем на месте
464
				inc dword[ecx+sb_offs_position] ;сдвигаем ползунок
465
			.no_change:
1457 IgorA 466
			stdcall ted_draw,edi
467
			jmp .dr_cur_l
468
		.dr_m_win:
469
			stdcall ted_draw_cur_line,edi
470
		.dr_cur_l:
471
		cmp ted_fun_draw_panel_buttons,0
472
		je @f
473
			call ted_fun_draw_panel_buttons
474
	@@:
475
 
476
	cmp ah,8 ;[<-]
477
	jne @f
478
		call ted_set_undo
479
		stdcall ted_sel_text_del,ted_opt_ed_change_time
480
		cmp al,1
481
		je .del_one_b
482
			stdcall ted_text_del,edi,ted_opt_ed_change_time+ted_opt_ed_move_cursor
483
		.del_one_b:
484
		stdcall ted_draw,edi
485
		cmp ted_fun_draw_panel_buttons,0
486
		je .end_key_fun
487
			call ted_fun_draw_panel_buttons
488
		jmp .end_key_fun
489
	@@:
490
 
491
	cmp ah,182 ;Delete
492
	jne @f
493
		call ted_set_undo
494
		stdcall ted_sel_text_del,ted_opt_ed_change_time
495
		cmp al,1
496
		je .del_one_d
497
			stdcall ted_text_del,edi,ted_opt_ed_change_time
498
		.del_one_d:
499
		stdcall ted_draw,edi
500
		cmp ted_fun_draw_panel_buttons,0
501
		je .end_key_fun
502
			call ted_fun_draw_panel_buttons
503
		jmp .end_key_fun
504
	@@:
505
 
506
	cmp ah,185 ;Ins
507
	jne @f
508
		call ted_draw_cursor_sumb
509
		xor ted_cur_ins,1
510
		call ted_draw_main_cursor
511
	@@:
512
 
513
	.end_key_fun:
514
	popad
515
	ret
516
endp
517
 
518
;output:
519
; al = 1 - can save
520
align 4
521
proc ted_can_save, edit:dword
522
	push ecx edi
523
	mov edi,dword[edit]
524
 
525
	mov ecx,ted_tim_ch
526
	sub ecx,ted_tim_undo
527
	mov al,1
528
	cmp ted_tim_ls,ecx
529
	jne @f
530
		dec al
531
	@@:
532
	pop edi ecx
533
	ret
534
endp
535
 
536
;input:
537
; edi = pointer to tedit struct
538
;output:
539
; al = 1 - selected
540
align 4
541
proc ted_is_select
542
  push ebx
543
  xor al,al
544
  cmp ted_drag_m,1
545
  je @f
546
    mov al,1
547
    mov ebx,ted_sel_x0
548
    cmp ebx,ted_sel_x1
549
    jne @f
550
    mov ebx,ted_sel_y0
551
    cmp ebx,ted_sel_y1
552
    jne @f
553
    xor al,al
554
  @@:
555
  pop ebx
556
  ret
557
endp
558
 
559
;input:
560
; edi = pointer to tedit struct
561
align 4
562
proc ted_sel_normalize
563
	push ecx esi
564
	push edi
565
		mov esi,edi
566
		add esi,ted_offs_sel
567
		add edi,ted_offs_seln
568
		mov ecx,sizeof.TexSelect
569
		rep movsb
570
	pop edi
571
 
572
	jmp @f
573
		.swp_f:
574
		mov ecx,ted_seln_x0
575
		m2m ted_seln_x0,ted_seln_x1
576
		mov ted_seln_x1,ecx
577
 
578
		mov ecx,ted_seln_y0
579
		cmp ecx,ted_seln_y1 ;(sel_y0>sel_y1)
580
		jle .end_f
581
		m2m ted_seln_y0,ted_seln_y1
582
		mov ted_seln_y1,ecx
583
 
584
		jmp .end_f
585
	@@:
586
 
587
	mov ecx,ted_seln_y0
588
	cmp ecx,ted_seln_y1 ;(sel_y0>sel_y1)
589
	jg .swp_f
590
 
591
	cmp ecx,ted_seln_y1 ;(sel_y0==sel_y1)
592
	jne .end_f
593
		mov ecx,ted_seln_x0
594
		cmp ecx,ted_seln_x1 ;(sel_x0>sel_x1)
595
		jg .swp_f
596
 
597
	.end_f:
598
	pop esi ecx
599
	ret
600
endp
601
 
602
;input:
603
; edi = pointer to tedit struct
604
;description:
605
; Функция вызываемая при начале выделения
606
align 4
607
proc ted_sel_start
608
	push eax ecx
609
		mov eax,ted_scr_h
610
		mov ecx,ted_cur_x
611
		add ecx,dword[eax+sb_offs_position]
612
		mov ted_sel_x0,ecx
613
		mov ted_sel_x1,ecx
614
 
615
		mov eax,ted_scr_w
616
		mov ecx,ted_cur_y
617
		add ecx,dword[eax+sb_offs_position]
618
		mov ted_sel_y0,ecx
619
		mov ted_sel_y1,ecx
620
	pop ecx eax
621
	ret
622
endp
623
 
624
;input:
625
; edi = pointer to tedit struct
626
;description:
627
; Функция вызываемая при перемещении выделения
628
align 4
629
proc ted_sel_move
630
	push eax ecx
631
		mov ecx,ted_cur_x
632
		mov eax,ted_scr_h
633
		add ecx,dword[eax+sb_offs_position]
634
		mov ted_sel_x1,ecx
635
 
636
		mov eax,ted_scr_w
637
		mov ecx,ted_cur_y
638
		add ecx,dword[eax+sb_offs_position]
639
		mov ted_sel_y1,ecx
640
	pop ecx eax
641
	cmp ted_fun_draw_panel_buttons,0 ;redraw toolbar (need to button Copy)
642
	je @f
643
		call ted_fun_draw_panel_buttons
644
	@@:
645
	ret
646
endp
647
 
648
;input:
649
; cl_al_mem = 1 - clear all memory
650
align 4
651
proc ted_clear, edit:dword, cl_al_mem:dword
1464 IgorA 652
	push ecx edi
653
	mov edi,dword[edit]
1457 IgorA 654
 
1464 IgorA 655
	mov ted_cur_x,0
656
	mov ted_cur_y,0
657
	mov ted_tim_ch,0
658
	mov ted_tim_ls,0
659
	mov ted_tim_co,0
660
	mov ted_tim_undo,0
661
	mov ted_help_id,-1
662
	mov ecx,sizeof.symbol
663
	shl ecx,1
664
	add ecx,ted_tex
665
	mov ted_ptr_free_symb,ecx
1457 IgorA 666
 
1464 IgorA 667
	mov ecx,ted_scr_w
668
	mov dword[ecx+sb_offs_position],0
669
	mov dword[ecx+sb_offs_max_area],100 ;число строк видимых в новом документе
670
	mov dword[ecx+sb_offs_redraw],1
671
	mov ecx,ted_scr_h
672
	mov dword[ecx+sb_offs_position],0
673
	mov dword[ecx+sb_offs_max_area],100 ;число символов видимых в новом документе
1457 IgorA 674
 
1464 IgorA 675
	mov ted_sel_x0,0
676
	mov ted_sel_y0,0
677
	mov ted_sel_x1,0
678
	mov ted_sel_y1,0
1457 IgorA 679
 
1464 IgorA 680
	cmp dword[cl_al_mem],0
681
	je .exit
1457 IgorA 682
 
1464 IgorA 683
	push edx
684
	mov ecx,sizeof.symbol
685
	imul ecx,ted_max_chars
686
	mov edx,ted_tex
687
	@@:
688
		mov byte [edx],0
689
		inc edx
690
	loop @b
691
	mov edx,ted_tex
692
	mov dword [edx+6],1
693
	pop edx
1457 IgorA 694
 
1464 IgorA 695
	.exit:
696
	pop edi ecx
697
	ret
1457 IgorA 698
endp
699
 
700
 
701
align 4
2707 IgorA 702
proc ted_init_syntax_file, edit:dword
1457 IgorA 703
	pushad
704
	mov edi,dword[edit]
705
 
706
	mov ecx,0x100
707
	mov edx,ted_arr_key_pos
708
	@@:
709
		mov dword[edx],-1
710
		add edx,4
711
	loop @b
712
 
713
	;init: ted_colors_text_count, ted_key_words_count, ...
714
	mov ted_colors_text_count,1
715
	mov ted_key_words_count,0
716
	mov ted_help_text_f1,0
717
	mov ted_help_id,-1 ;идентификатор слова для справки
718
 
719
	mov eax,edi ;сохраняем значение edi
720
	mov esi,ted_syntax_file
721
	add edi,ted_offs_count_colors
722
	mov ecx,9*4
723
	rep movsb
724
	mov edi,eax ;востанавливаем значение edi
725
 
726
	mov eax,ted_syntax_file
727
	add eax,32
728
	mov ted_text_colors,eax
729
 
730
	mov eax,ted_colors_text_count ;init: count_colors_text (offset to key words)
731
	add eax,8
732
	shl eax,2
733
	add eax,ted_syntax_file
734
	mov ted_key_words_data,eax
735
 
736
	mov ecx,ted_key_words_count ;init: ted_arr_key_pos (first key positions)
737
	xor eax,eax
738
	@@:
739
		ColToIndexOffset eax,edx
740
		xor ebx,ebx
741
		mov bl,byte[edx]
742
		shl bx,2
743
		mov esi,ted_arr_key_pos
744
		add esi,ebx
745
		cmp dword[esi],-1
746
		jne .no_ch_key
747
			mov dword[esi],eax
748
		.no_ch_key:
749
		inc eax
750
	loop @b
751
 
752
	;init: ted_help_text_f1
2102 IgorA 753
	mov ecx,ted_key_words_count ;количество ключевых слов
754
	imul ecx,sizeof.TexColViv   ;размер структуры с 1-м кл. сл.
755
	add ecx,ted_key_words_data  ;начало файла с кл. сл.
756
	mov ted_help_text_f1,ecx    ;метка в памяти, где начинется текст со справкой
1457 IgorA 757
 
1458 IgorA 758
	stdcall ted_init_scroll_bars,edi,1 ;меняем цвета скроллингов
1457 IgorA 759
	.no_colors:
760
	popad
761
	ret
762
endp
763
 
764
;input:
765
; ebx = file size
766
; edi = pointer to tedit struct
767
;description:
768
; Функция вызывается при открытии файла
769
align 4
770
proc ted_on_open_file
771
	push eax ;destination
772
	push ecx ;for cycle
773
	push edx ;source
774
	push esi
775
 
776
	stdcall ted_clear,edi,0 ;чистим не всю память, потому что ниже будем ее заполнять новыми даными
777
	mov eax,ebx
778
	mov ecx,ebx
779
	add eax,2
780
	ConvertIndexToPointer eax
781
	mov edx,ted_tex
782
	add edx,ebx
783
	push ebx
784
	@@:
785
		mov ebx,[edx]
786
		mov byte [eax],bl
787
		mov dword [eax+2],ecx
788
		inc dword [eax+2]
789
		mov dword [eax+6],ecx
790
		add dword [eax+6],3
791
		;mov byte[eax+1],0 ;col=0
792
		mov dword [eax+10],-1 ;tc=-1
793
		mov dword [eax+14],0 ;td=0
794
 
795
		cmp ecx,0
796
		je @f
797
		dec ecx
798
		dec edx
799
		sub eax,sizeof.symbol
800
		jmp @b
801
	@@:
802
	pop ebx
803
	add eax,2
804
	mov dword [eax],0 ; first sumbol 'perv=0'
805
 
2348 IgorA 806
	mov edx,ted_tex ; настройки начального служебного символа
1457 IgorA 807
	; begining sumbol 'perv=0' 'next=2'
808
	mov dword [edx+2],0
809
	mov dword [edx+6],2
810
 
2348 IgorA 811
	add edx,sizeof.symbol ; настройки конечного служебного символа
1457 IgorA 812
	mov dword [edx+6],0 ; last sumbol 'next=0'
813
	mov dword [edx+2],ebx ; last sumbol 'perv=last'
814
	inc dword [edx+2]
2348 IgorA 815
	mov dword [edx+10],0 ; ставим время создания равное 0, что бы символ правильно обрабатывался при открытии файлов больших 28 байт
1457 IgorA 816
 
817
	mov edx,ebx
818
	inc edx ;2 = rezerv sumbols
819
	imul edx,sizeof.symbol
820
	add edx,ted_tex
821
	mov dword [edx+6],1 ; last sumbol 'next=1'
822
 
823
	@@: ;clear memory, need if before was open big file
824
		add edx,sizeof.symbol
825
		cmp edx,ted_tex_end
826
		jge @f
827
			mov dword[edx+10],0
828
			mov dword[edx+14],0
829
		jmp @b
830
	@@:
831
 
832
	call ted_get_num_lines
833
	cmp eax,100
834
	jge @f
835
		mov eax,100
836
	@@:
837
	mov esi,ted_scr_w
838
	mov dword[esi+sb_offs_max_area],eax
839
	pop esi edx ecx eax
840
 
841
	call ted_text_colored
842
	stdcall ted_draw,edi
843
	cmp ted_fun_draw_panel_buttons,0
844
	je @f
845
		call ted_fun_draw_panel_buttons
846
	@@:
847
	ret
848
endp
849
 
850
;input:
851
; edx = pointer to symbol struct
852
; edi = pointer to tedit struct
853
;output:
854
; edx = pointer to 'perv' visible symbol struct
855
align 4
856
ted_iterat_perv:
2809 IgorA 857
	cmp ted_tim_undo,0
858
	je .else
859
	push ebx
860
	@@:
861
		mov edx,dword[edx+2]
862
		cmp edx,0
863
		je @f
864
		imul edx,sizeof.symbol
865
		add edx,ted_tex
866
		call ted_symbol_not_vis
867
		cmp bl,1
868
		je @b
869
		cmp byte[edx],10 ;пропуск символа с кодом 10
870
		je @b
871
	pop ebx
872
	ret
873
	@@:
874
	mov edx,ted_tex ;начало файла
875
	pop ebx
876
	ret
877
	.else:
878
		mov edx,dword[edx+2]
879
		cmp edx,0
880
		je @f
881
		imul edx,sizeof.symbol
882
		add edx,ted_tex
883
		cmp dword [edx+14],0
884
		jne .else
885
		cmp byte[edx],10 ;пропуск символа с кодом 10
886
		je .else
887
	ret
888
	@@:
889
	mov edx,ted_tex ;начало файла
890
	ret
1457 IgorA 891
 
892
 
893
;input:
894
; edx = pointer to symbol struct
895
; edi = pointer to tedit struct
896
;output:
897
; edx = pointer to 'next' visible symbol struct
898
align 4
899
ted_iterat_next:
2809 IgorA 900
	cmp ted_tim_undo,0
901
	je .else
902
	push ebx
903
	@@:
904
		mov edx,dword[edx+6]
905
		cmp edx,1
906
		jle @f
907
		imul edx,sizeof.symbol
908
		add edx,ted_tex
1457 IgorA 909
 
2809 IgorA 910
		call ted_symbol_not_vis
911
		cmp bl,1
912
		je @b
913
		cmp byte[edx],10 ;пропуск символа с кодом 10
914
		je @b
915
	pop ebx
916
	ret
917
	@@:
918
	mov edx,ted_tex_1 ;конец файла
919
	pop ebx
920
	ret
921
	.else:
922
		mov edx,dword[edx+6]
923
		cmp edx,1
924
		jle @f
925
		imul edx,sizeof.symbol
926
		add edx,ted_tex
927
 
928
		cmp dword [edx+14],0
929
		jne .else
930
		cmp byte[edx],10 ;пропуск символа с кодом 10
931
		je .else
932
	ret
933
	@@:
934
	mov edx,ted_tex_1 ;конец файла
935
	ret
936
 
1457 IgorA 937
;input:
938
; bl = symbol end of select
2102 IgorA 939
; bh = экранирующий символ (= 0 если нет проверки на них)
1457 IgorA 940
; edx = pointer to symbol struct
941
; edi = pointer to tedit struct
942
;description:
943
; найти следующую позицию указанного символа
944
align 4
945
ted_iterat_next_pos_char:
2102 IgorA 946
	push ax
947
	mov al,1 ;предыдущий символ, служит для сравнения с символом bh
1457 IgorA 948
	@@:
949
		cmp bl,byte[edx]
2102 IgorA 950
		je .found
951
		.no_found:
1457 IgorA 952
		cmp edx,ted_tex_1
953
		jle @f
2102 IgorA 954
			mov al,byte[edx]
1457 IgorA 955
			call ted_iterat_next
956
			jmp @b
2102 IgorA 957
	.found:
958
		cmp bh,al
959
		je .no_found
1457 IgorA 960
	@@:
961
	call ted_iterat_next
2102 IgorA 962
	pop ax
1457 IgorA 963
	ret
964
 
965
;input:
966
; edx = pointer to symbol struct
967
; edi = pointer to tedit struct
968
align 4
969
ted_iterat_perv_color_tag:
970
  @@:
971
    cmp byte[edx+1],0
972
    jne @f
973
    call ted_iterat_perv
974
    cmp edx,ted_tex_1
975
    jle @f
976
    jmp @b
977
  @@:
978
  ret
979
 
980
;input:
981
; edx = pointer to symbol struct
982
; edi = pointer to tedit struct
983
align 4
984
ted_iterat_next_color_tag:
985
  @@:
986
    call ted_iterat_next
987
    cmp byte[edx+1],0
988
    jne @f
989
    cmp edx,ted_tex_1
990
    jle @f
991
    jmp @b
992
  @@:
993
  ;call ted_iterat_next
994
  ret
995
 
996
;input:
997
; edx = pointer to symbol struct
998
; edi = pointer to tedit struct
999
;output:
1000
; bl = 1 if sumbol not visible
1001
; (tex[i].td+ted_tim_undo<=ted_tim_ch && tex[i].td) || (tex[i].tc>ted_tim_ch-ted_tim_undo)
1002
align 4
1003
ted_symbol_not_vis:
1004
  push eax
1005
 
1006
  xor bl,bl
1007
 
1008
  cmp dword [edx+14],0
1009
  je @f
1010
  mov eax,[edx+14] ;eax=tex[i].td
1011
  add eax,ted_tim_undo
1012
  cmp eax,ted_tim_ch
1013
  jg @f
1014
    mov bl,1
1015
    pop eax
1016
    ret
1017
  @@:
1018
 
1019
  mov eax,ted_tim_ch
1020
  sub eax,ted_tim_undo
1021
  cmp [edx+10],eax
1022
  jle @f
1023
    or bl,1
1024
  @@:
1025
 
1026
  pop eax
1027
  ret
1028
 
1029
;input:
1030
; text:dword - pointer to text string
1031
; add_opt:dword - options
1032
align 4
1033
proc ted_text_add, edit:dword, text:dword, t_len:dword, add_opt:dword
1034
	locals
1035
		new_spc dd ? ;count new spaces
1036
		new_lin dd ? ;count new lines
1037
	endl
1038
;использование регистров внутри функции:
1039
;eax - позиция для вставки текста
1040
;ebx - для временных нужд, длинна вставляемого текста
1041
;ecx - для временных нужд
1042
;edx - указатель на структуру символа
1043
	pushad
1667 IgorA 1044
	cmp dword[t_len],1 ;проверяем длинну добвляемого текста
1045
	jl .no_add ;когда длинна <1 прыгаем на конец функции, во избежание глюков
1046
 
1457 IgorA 1047
	mov edi,dword[edit]
1048
	mov esi,dword[text]
1049
 
1050
	call ted_get_pos_by_cursor
1051
	call ted_get_text_perv_pos
1052
	call ted_get_text_arr_index ;eax=po_t
1053
 
1054
	mov dword[new_spc],0
1055
	cmp ted_gp_opt,2
1056
	je @f
1057
		push eax ;c_sp=cur[cn].x+Scroller->XPos-StrLen(cur[cn].y+Scroller->YPos);
1058
			mov eax,ted_scr_h
1059
			mov eax,dword[eax+sb_offs_position]
1060
			add eax,ted_cur_x ;eax - номер символа
1061
			mov dword[new_spc],eax
1062
 
1063
			mov eax,ted_scr_w
1064
			mov eax,dword[eax+sb_offs_position]
1065
			add eax,ted_cur_y ;eax - номер строки
1066
			call ted_strlen ;ebx = line len
1067
			sub dword[new_spc],ebx ;от позиции курсора отнимаем длинну строки, узнаем колличество добавляемых пробелов
1068
		pop eax
1069
	@@:
1070
 
1071
	mov ebx,dword[t_len]
1072
 
1073
	mov dword[new_lin],0
1074
	cmp ted_gp_opt,0
1075
	jne @f
1076
		push eax
1077
			mov eax,ted_scr_w
1078
			mov eax,dword[eax+sb_offs_position]
1079
			add eax,ted_cur_y
1080
			inc eax
1081
			mov dword[new_lin],eax
1082
 
1083
			call ted_get_num_lines
1084
			sub dword[new_lin],eax
1085
		pop eax
1086
	@@:
1087
 
1464 IgorA 1088
	mov edx,ted_ptr_free_symb
1089
	.beg_cycle: ;for(i=...;i
1090
		cmp dword [edx+10],0 ;if(!tex[i].tc && !tex[i].td)
1091
		jne .u1f
1092
		cmp dword [edx+14],0
1093
		jne .u1f
1094
			test dword[add_opt],ted_opt_ed_change_time ;if(n_tim) ted_tim_ch++;
1095
			jz .no_tim
1096
				inc ted_tim_ch
1097
			.no_tim:
1098
			test dword[add_opt],ted_opt_ed_move_cursor
1099
			jz .no_cur_mov
1100
			cmp dword[new_lin],0 ;если есть добавочные строки, то курсор еще не двигаем
1101
			jg .no_cur_mov
1102
			cmp dword[new_spc],0 ;если нет добавочных пробелов, то курсор тоже не двигаем
1103
			jg .no_cur_mov
1104
				inc ted_cur_x ;move cursor
1105
				;call ted_go_to_pos
1106
				cmp byte [esi],13
1107
				jne .no_cur_mov
1108
					mov ted_cur_x,0
1109
					inc ted_cur_y
1110
			.no_cur_mov:
1457 IgorA 1111
 
1464 IgorA 1112
			mov ecx,ted_opt_ed_change_time
1113
			not ecx
1114
			and dword[add_opt],ecx ;n_tim=false;
1457 IgorA 1115
 
1464 IgorA 1116
			mov cl,byte [esi] ;tex[i].c=ta[ns];
1117
			mov byte [edx],cl
1118
			m2m dword [edx+10],ted_tim_ch ;tex[i].tc=ted_tim_ch;
1119
			mov [edx+2],eax ;tex[i].perv=po_t;
1457 IgorA 1120
 
1464 IgorA 1121
			mov ecx,eax
1122
			imul ecx,sizeof.symbol
1123
			add ecx,ted_tex ; *** ecx = tex[po_t] ***
1124
			add ecx,6   ; *** ecx = tex[po_t].next ***
1125
			m2m dword [edx+6],dword [ecx] ;tex[i].next=tex[po_t].next;
1457 IgorA 1126
 
1464 IgorA 1127
			call ted_get_text_arr_index ;*** eax = i ***
1128
			mov [ecx],eax ;tex[po_t].next=i; // ссылки перенаправляем
1129
			mov ecx,[edx+6] ; *** ecx = tex[i].next ***
1130
			imul ecx,sizeof.symbol
1131
			add ecx,ted_tex ; *** ecx = tex[tex[i].next] ***
1132
			mov [ecx+2],eax ;tex[tex[i].next].perv=i;
1457 IgorA 1133
 
1464 IgorA 1134
			cmp dword[new_lin],0 ;add lines or text
1135
			jle .spc_add
1136
				dec dword[new_lin]
1137
				mov byte [edx],13
1138
				jmp .u1f
1139
			.spc_add:
1140
			cmp dword[new_spc],0 ;add spaces or text
1141
			jle .tex_add
1142
				dec dword[new_spc]
1143
				mov byte [edx],' '
1144
				jmp .u1f
1145
			.tex_add:
1146
			inc esi
1147
			dec ebx
1148
		.u1f:
1149
		add edx,sizeof.symbol
1150
		cmp edx,ted_tex_end
1151
		jge @f ;out of memory
1152
		cmp ebx,0
1153
		jne .beg_cycle
1154
		mov ted_ptr_free_symb,edx ;меняем указатель на свободный символ, для более быстрого поиска памяти
1155
		jmp .add_all
1156
	@@:
1157
	cmp ted_increase_size,0
1158
	je .add_all
1159
		call ted_memory_increase
1160
		cmp ebx,0
1161
		jne .beg_cycle
1162
	.add_all: ;все символы добавлены
1457 IgorA 1163
 
1464 IgorA 1164
	call ted_text_colored
1667 IgorA 1165
	.no_add:
1464 IgorA 1166
	popad
1167
	ret
1457 IgorA 1168
endp
1169
 
1170
;input:
1464 IgorA 1171
;  edx = pointer to sumbol, when insert
1172
;  edi = pointer to tedit struct
1173
;output:
1174
;  edx = new pointer to sumbol, when insert
1175
align 4
1176
proc ted_memory_increase
1177
	cmp ted_increase_size,0
1178
	je @f
1179
		push eax ebx ecx
1180
		mov ecx,ted_increase_size
1181
		add ecx,ted_max_chars
1182
		mov ted_max_chars,ecx
1183
		imul ecx,sizeof.symbol
1489 IgorA 1184
		invoke mem.realloc, ted_tex,ecx
1464 IgorA 1185
		mov ebx,ted_tex
1186
		mov ted_tex,eax
1187
		mov ted_tex_1,eax
1188
		add ted_tex_1,sizeof.symbol
1189
			sub edx,ebx
1190
			add edx,eax
1191
			mov ted_ptr_free_symb,edx
1192
		add eax,ecx
1193
		mov ted_tex_end,eax
1194
		pop ecx ebx eax
1195
	@@:
1196
	ret
1197
endp
1198
 
1199
;input:
1457 IgorA 1200
;  ecx = position to free insert cell
1201
;  edx = pointer to sumbol, when insert
2324 IgorA 1202
;  esi = added symbol
1457 IgorA 1203
;  edi = pointer to tedit struct
1204
;output:
1205
;  ecx = position to inserted cell
1206
align 4
1207
ted_char_add:
1208
 
1209
  .loop_b:
1210
    cmp ecx,ted_tex_end
1211
    jge .end_f
1212
    cmp dword[ecx+10],0
1213
    jne @f
1214
      cmp dword[ecx+14],0
1215
      je .loop_e
1216
    @@:
1217
    add ecx,sizeof.symbol
1218
    jmp .loop_b
1219
  .loop_e:
1220
 
1221
  push eax ebx
1222
  mov eax,ted_tim_ch
1223
  mov dword[ecx+10],eax
2324 IgorA 1224
  mov ax,si
1457 IgorA 1225
  mov byte[ecx],al
1226
 
1227
  call ted_get_text_arr_index ; *** eax=pos ***
1228
  mov [ecx+2],eax ;tex[i].perv=pos;
1229
  m2m dword[ecx+6],dword[edx+6] ;tex[i].next=tex[pos].next;
1230
 
1231
  push edx
1232
    mov edx,ecx
1233
    call ted_get_text_arr_index ; *** eax=i ***
1234
  pop edx
1235
 
1236
  mov [edx+6],eax ;tex[pos].next=i; // ссылки перенаправляем
1237
  mov ebx,[ecx+6]
1238
  ConvertIndexToPointer ebx
1239
  mov [ebx+2],eax ;tex[tex[i].next].perv=i; // ...
1240
  pop ebx eax
1241
 
1242
  .end_f:
1243
  call ted_text_colored
1244
  ret
1245
 
1246
 
1247
;input:
1248
; edi = pointer to tedit struct
1249
;output:
1250
; esi = count converted symbols
1251
;description:
1252
; Функция используется для смены регистра выбранных символов
1253
align 4
2324 IgorA 1254
proc ted_convert_sel_text, conv_fun:dword
1457 IgorA 1255
  locals
1256
    conv_cou dd ?
1257
  endl
1258
  mov dword[conv_cou],0
1259
  pushad
1260
 
1261
  call ted_is_select
1262
  cmp al,0
1263
  je .end_f
1264
    call ted_set_undo
1265
    call ted_sel_normalize
1266
 
1267
    mov esi,ted_seln_x0
1268
    mov ecx,ted_seln_y0
1269
    call ted_get_pos_by_coords
1270
    mov eax,edx
1271
    mov esi,ted_seln_x1
1272
    mov ecx,ted_seln_y1
1273
    call ted_get_pos_by_coords
1274
    ;call ted_get_text_perv_pos
1275
    mov ebx,edx
1276
 
1277
    cmp eax,ebx
1278
    je .end_f
1279
 
1280
    inc ted_tim_ch
1281
    mov edx,eax ;i=p0;
1464 IgorA 1282
    mov ecx,ted_ptr_free_symb
1457 IgorA 1283
    @@:
2324 IgorA 1284
      push eax
1285
      mov al,byte[edx]
1286
      call dword[conv_fun] ;преобразование символа
1287
      mov esi,eax
1288
      cmp byte[edx],al
1289
      pop eax
1457 IgorA 1290
      je .no_change
1291
	m2m dword [edx+14],ted_tim_ch
1292
	call ted_char_add ;b_pos=ted_char_add(tex[i].c^32,i,false,b_pos);
1293
	call ted_get_text_next_pos ;go to added symbol
1294
	inc dword[conv_cou]
1295
      .no_change:
1296
 
1297
      call ted_iterat_next
1298
      cmp edx,ted_tex
1299
      je @f
1300
      cmp edx,ebx
1301
      je @f
1302
 
1303
      jmp @b
1304
    @@:
1305
    cmp dword[conv_cou],0
1306
    jne @f
1307
      dec ted_tim_ch
1308
    @@:
1309
  .end_f:
1310
  popad
1311
  mov esi,dword[conv_cou]
1312
  ret
1313
endp
1314
 
1315
;output:
1316
; bl = 0 - no delete
1317
; bl = 1 - delete
1318
align 4
1319
proc ted_text_del, edit:dword, del_opt:dword
1320
  push cx edx edi
1321
  mov edi,dword[edit]
1322
  mov ebx,dword[del_opt]
1323
 
1324
  xor cl,cl
1325
  test ebx,ted_opt_ed_move_cursor
1326
  jz @f
1327
    call ted_cur_move_left
1328
    cmp dl,0
1329
    je .no_del
1330
  @@:
1331
  call ted_get_pos_by_cursor
1332
  cmp ted_gp_opt,1
1333
  je .no_del
1334
    test ebx,ted_opt_ed_change_time
1335
    jz @f
1336
      inc ted_tim_ch
1337
    @@:
1338
    m2m dword [edx+14], ted_tim_ch
1339
    mov cl,1
1340
  .no_del:
1341
  mov bl,cl
1342
  pop edi edx cx
1343
  ret
1344
endp
1345
 
1346
;input:
1347
; edi = pointer to tedit struct
1348
;output:
1349
; al = 1 if delete
1350
;description:
1351
; Функция удаляет выделенный текст
1352
align 4
1353
proc ted_sel_text_del, del_opt:dword
1354
	push ebx ecx edx esi
1355
 
1356
	call ted_is_select
1357
	cmp al,0
1358
	je .end_f
1359
 
1360
		call ted_sel_normalize
1361
 
1362
		mov esi,ted_seln_x1
1363
		mov ecx,ted_seln_y1
1364
		call ted_get_pos_by_coords
1365
		mov ebx,edx
1366
 
1367
		mov esi,ted_seln_x0
1368
		mov ecx,ted_seln_y0
1369
		call ted_get_pos_by_coords
1370
 
1371
		test dword[del_opt],ted_opt_ed_change_time
1372
		jz @f
1373
			inc ted_tim_ch
1374
		@@:
1375
		cmp edx,ted_tex
1376
		je @f
1377
		cmp edx,ebx ;if(i==te)break;
1378
		je @f
1379
			m2m dword[edx+14],ted_tim_ch
1380
			mov esi,ted_opt_ed_change_time
1381
			not esi
1382
			and dword[del_opt],esi ;n_tim=false;
1383
			call ted_iterat_next
1384
			jmp @b
1385
		@@:
1386
		test dword[del_opt],ted_opt_ed_change_time
1387
		jz @f
1388
			dec ted_tim_ch
1389
			xor al,al
1390
		@@:
1391
		test dword[del_opt],ted_opt_ed_change_time
1392
		jnz @f
1393
			mov ecx,ted_seln_x0
1394
			mov edx,ted_seln_y0
1395
			call ted_go_to_pos
1396
			mov ted_sel_x0,0
1397
			mov ted_sel_y0,0
1398
			mov ted_sel_x1,0
1399
			mov ted_sel_y1,0
1400
		@@:
1401
	.end_f:
1402
	pop esi edx ecx ebx
1403
	ret
1404
endp
1405
 
1406
 
1407
;input:
1408
; eax = pointer to begin select
1409
; ebx = pointer to end select
1410
; edi = pointer to tedit struct
1411
align 4
1412
ted_revers:
1413
  cmp eax,ebx
1414
  jne @f
1415
    ret
1416
  @@:
1417
 
1418
  push ecx edx
1419
 
1420
  mov edx,ted_tex_1
1421
  cmp edx,ebx ;if(p1==1)p1=tex[1].perv;
1422
  jne @f
1423
    call ted_get_text_perv_pos
1424
    mov ebx,edx
1425
  @@:
1426
 
1427
  push esi
1428
    mov edx,[eax+2] ; *** edx = tex[p0].perv ***
1429
    ConvertIndexToPointer edx
1430
    add edx,6
1431
    mov ecx,[edx] ;tmp = tex[tex[p0].perv].next;
1432
 
1433
    mov esi,[ebx+6] ; *** esi = tex[p1].next ***
1434
    ConvertIndexToPointer esi
1435
    add esi,2
1436
    m2m dword[edx],dword[esi] ;tex[tex[p0].perv].next = tex[tex[p1].next].perv;
1437
 
1438
    mov [esi],ecx ;tex[tex[p1].next].perv = tmp;
1439
  pop esi
1440
 
1441
  mov ecx,[eax+2] ;tmp = tex[p0].perv;
1442
  m2m dword[eax+2],dword[ebx+6] ;tex[p0].perv = tex[p1].next;
1443
  mov [ebx+6],ecx ;tex[p1].next = tmp;
1444
 
1445
  mov edx,eax ;i=p0;
1446
  @@:
1447
    mov ecx,[edx+6] ;tmp = tex[i].next;
1448
    m2m dword[edx+6],dword[edx+2] ;tex[i].next = tex[i].perv;
1449
    mov [edx+2],ecx ;tex[i].perv = tmp;
1450
    cmp edx,ebx ;if(i==p1)break;
1451
    je @f
1452
; ---
1453
;cmp edx,ted_tex
1454
;je @f
1455
; ---
1456
    mov edx,ecx ;i = tmp;
1457
    ConvertIndexToPointer edx
1458
    jmp @b
1459
  @@:
1460
  pop edx ecx
1461
  call ted_text_colored
1462
  ret
1463
 
1464
 
1465
;input:
1466
; edi = pointer to tedit struct
1467
;output:
1468
; dl = 0 not move
1469
; dl = 2 if move up
1470
; dl = 8 if scroll move up
1471
align 4
1472
ted_cur_move_up:
1473
  cmp ted_cur_y,0
1474
  je @f
1475
    dec ted_cur_y
1476
    mov dl,2
1477
    ret
1478
  @@:
1479
  push eax
1480
  mov eax,ted_scr_w
1481
  cmp dword[eax+sb_offs_position],0
1482
  je @f
1483
    dec dword[eax+sb_offs_position]
1484
    mov dl,8
1485
    jmp .ret_f
1486
  @@:
1487
  mov dl,0
1488
  .ret_f:
1489
  pop eax
1490
  ret
1491
 
1492
;input:
1493
; edi = pointer to tedit struct
1494
;output:
1495
; dl = 0 not move
1496
; dl = 2 if move down
1497
; dl = 8 if scroll move down
1498
align 4
1499
ted_cur_move_down:
1500
  push eax ebx
1501
  mov ebx,ted_scr_w
1502
  mov dl,0
1503
  mov eax,dword[ebx+sb_offs_cur_area]
1504
  dec eax
1505
  cmp ted_cur_y,eax
1506
  jge @f
1507
    inc ted_cur_y
1508
    mov dl,2
1509
    jmp .ret_f
1510
  @@:
1511
  mov eax,ted_cur_y
1512
  add eax,dword[ebx+sb_offs_position]
1513
  inc eax
1514
  cmp dword[ebx+sb_offs_max_area],eax
1515
  jle @f
1516
    inc dword[ebx+sb_offs_position]
1517
    mov dl,8
1518
  @@:
1519
  .ret_f:
1520
  pop ebx eax
1521
  ret
1522
 
1523
 
1524
;input:
1525
; edi = pointer to tedit struct
1526
;output:
1527
; dl = 0 not move
1528
; dl = 1 if move up
1529
align 4
1530
ted_cur_move_page_up:
1531
  push eax ebx
1532
  mov ebx,ted_scr_w
1533
  mov eax,dword[ebx+sb_offs_cur_area]
1534
  xor dl,dl
1535
  cmp eax,dword[ebx+sb_offs_position]
1536
  jg @f
1537
    sub dword[ebx+sb_offs_position],eax
1538
    mov dl,1
1539
  @@:
1540
  cmp dword[ebx+sb_offs_position],0
1541
  je @f
1542
  cmp dl,1
1543
  je @f
1544
    mov dword[ebx+sb_offs_position],0
1545
    mov dl,1
1546
  @@:
1547
  pop ebx eax
1548
  ret
1549
 
1550
;input:
1551
; edi = pointer to tedit struct
1552
align 4
1553
ted_cur_move_page_down:
1554
	push eax ebx ecx
1555
	mov ecx,ted_scr_w
1556
 
1557
	xor dl,dl
1558
	mov eax,dword[ecx+sb_offs_max_area]
1559
	sub eax,dword[ecx+sb_offs_cur_area]
1560
	cmp dword[ecx+sb_offs_position],eax
1561
	jge @f
1562
		mov ebx,dword[ecx+sb_offs_cur_area]
1563
		add dword[ecx+sb_offs_position],ebx
1564
		mov dl,1
1565
		mov dword[ecx+sb_offs_redraw],1
1566
		cmp dword[ecx+sb_offs_position],eax
1567
		jle @f
1568
			mov dword[ecx+sb_offs_position],eax
1569
	@@:
1570
	pop ecx ebx eax
1571
	ret
1572
 
1573
;input:
1574
; edi = pointer to tedit struct
1575
;output:
1576
; dl = 0 not move
1577
; dl = 1 if move left
1578
; dl = 3 if move left and up
1579
; dl = 8 if scroll move up
1580
align 4
1581
ted_cur_move_left:
1582
	cmp ted_cur_x,0
1583
	je @f
1584
		dec ted_cur_x
1585
		mov dl,1
1586
		ret
1587
	@@:
1588
	push eax
1589
	mov eax,ted_scr_h
1590
	cmp dword[eax+sb_offs_position],0
1591
	je @f
1592
		dec dword[eax+sb_offs_position]
1593
		mov dl,8
1594
		jmp .ret_f
1595
	@@:
1596
	cmp ted_cur_y,0
1597
	jne @f
1598
		mov eax,ted_scr_w
1599
		mov dl,0
1600
		cmp dword[eax+sb_offs_position],0
1601
		je .ret_f
1602
			dec dword[eax+sb_offs_position]
1603
			call ted_scroll_set_redraw
1604
			call ted_cur_move_x_last_char
1605
			mov dl,8
1606
			jmp .ret_f
1607
	@@:
1608
	cmp ted_cur_y,0
1609
	je @f
1610
		dec ted_cur_y
1611
		call ted_cur_move_x_last_char
1612
		cmp dl,8
1613
		je .ret_f
1614
		mov dl,3
1615
		jmp .ret_f
1616
	@@:
1617
	mov dl,0
1618
	.ret_f:
1619
	pop eax
1620
	ret
1621
 
1622
;input:
1623
; edi = pointer to tedit struct
1624
align 4
1625
ted_cur_move_right:
1626
	push eax ebx
1627
	mov eax,ted_scr_h
1628
	xor dl,dl
1629
	mov ebx,dword[eax+sb_offs_cur_area]
1630
	cmp ted_cur_x,ebx
1631
	jge @f
1632
		inc ted_cur_x
1633
		mov dl,1
1634
		jmp .ret_f
1635
	@@:
1636
		inc dword[eax+sb_offs_position]
1637
		mov dl,8
1638
	.ret_f:
1639
	pop ebx eax
1640
	ret
1641
 
1642
;input:
1643
; edi = pointer to tedit struct
1644
align 4
1645
ted_cur_move_x_last_char:
1646
;[hScr.position]
1647
;[hScr.cur_area]
1648
;dl-???
1649
  push eax ebx ecx
1650
  mov eax,ted_cur_y
1651
  mov ecx,ted_scr_w
1652
  add eax,dword[ecx+sb_offs_position]
1653
  call ted_strlen
1654
  xor dl,dl
1655
 
1656
  mov ecx,ted_scr_h
1657
  cmp ebx,dword[ecx+sb_offs_position]
1658
  jge @f
1659
    mov dl,8
1660
    mov dword[ecx+sb_offs_position],ebx
1661
  @@:
1662
  sub ebx,dword[ecx+sb_offs_position]
1663
 
1664
  cmp ebx,dword[ecx+sb_offs_cur_area]
1665
  jle @f ; b---[---]---e
1666
    add dword[ecx+sb_offs_position],ebx
1667
    mov ebx,dword[ecx+sb_offs_cur_area]
1668
    sub dword[ecx+sb_offs_position],ebx
1669
    mov dl,8
1670
  @@:
1671
  mov ted_cur_x,ebx
1672
  pop ecx ebx eax
1673
  ret
1674
 
1675
;input:
1676
; edi = pointer to tedit struct
1677
;output:
1678
; dl = 0 not move
1679
; dl = 1 move cursor
1680
; dl = 8 move cursor and scroll
1681
align 4
1682
ted_cur_move_x_first_char:
1683
	xor dl,dl
1684
	cmp ted_cur_x,0
1685
	je @f
1686
		mov ted_cur_x,0
1687
		mov dl,1
1688
	@@:
1689
	push eax
1690
	mov eax,ted_scr_h
1691
	cmp dword[eax+sb_offs_position],0
1692
	je @f
1693
		mov dword[eax+sb_offs_position],0
1694
		mov dl,8
1695
	@@:
1696
	pop eax
1697
	ret
1698
 
1699
;input:
1700
; edx = pointer to symbol struct
1701
; edi = pointer to tedit struct
1702
;output:
1703
; eax = array index
1704
align 4
1705
ted_get_text_arr_index:
1706
	push ecx edx
1707
		mov eax,edx
1708
		sub eax,ted_tex
1709
		xor edx,edx
1710
		mov ecx,sizeof.symbol
1711
		div ecx
1712
	pop edx ecx
1713
	ret
1714
 
1715
;input:
1716
; edx = pointer to symbol struct
1717
; edi = pointer to tedit struct
1718
;output:
1719
; edx = pointer to 'perv' struct
1720
align 4
1721
ted_get_text_perv_pos:
1722
	mov edx,dword[edx+2]
1723
	imul edx,sizeof.symbol
1724
	add edx,ted_tex
1725
	ret
1726
 
1727
;input:
1728
; edx = pointer to symbol struct
1729
;output:
1730
; edx = pointer to 'next' symbol struct
1731
align 4
1732
ted_get_text_next_pos:
1733
	mov edx,dword[edx+6]
1734
	imul edx,sizeof.symbol
1735
	add edx,ted_tex
1736
	ret
1737
 
1738
;input:
1739
; edi = pointer to tedit struct
1740
;output:
1741
; edx = symbol under cursor
1742
; ted_gp_opt = 1,2
1743
; edx = tex[1].perv if error
1744
; ted_gp_opt = 0
1745
align 4
1746
ted_get_pos_by_cursor:
1747
	push eax ecx esi
1748
		mov esi,ted_cur_x
1749
		mov eax,ted_scr_h
1750
		add esi,dword[eax+sb_offs_position]
1751
		mov ecx,ted_cur_y
1752
		mov eax,ted_scr_w
1753
		add ecx,dword[eax+sb_offs_position]
1754
		call ted_get_pos_by_coords
1755
	pop esi ecx eax
1756
	ret
1757
 
1758
;input:
1759
; esi = XPos
1760
; ecx = YPos
1761
; edi = pointer to tedit struct
1762
;output:
1763
; edx = symbol under cursor
1764
; ted_gp_opt = 1 if found text line
1765
; ted_gp_opt = 2 if found text line and column
1766
; edx = tex[1] if error
1767
; ted_gp_opt = 0 if text no found
1768
align 4
1769
ted_get_pos_by_coords:
1770
  push eax ;Row
1771
  push ebx ;Col
1772
 
1773
  xor eax,eax
1774
  xor ebx,ebx
1775
  mov ted_gp_opt,0
1776
  mov edx,ted_tex
1777
  @@:
1778
    call ted_iterat_next
1779
    cmp edx,ted_tex_1
1780
    jle @f
1781
    cmp ebx,esi
1782
    jne .u1_0 ;Col <> ted_cur_x
1783
      mov ted_gp_opt,1
1784
      cmp eax,ecx
1785
      jge @f ; Row >= ted_cur_y
1786
    .u1_0:
1787
    mov ted_gp_opt,0
1788
    inc ebx
1789
    cmp byte [edx],13
1790
    jne @b
1791
    cmp eax,ecx
1792
    jge @f ; Row >= ted_cur_y
1793
    inc eax
1794
    xor ebx,ebx
1795
    jmp @b
1796
  @@:
1797
  cmp eax,ecx
1798
  jne @f ; Row = ted_cur_y
1799
    inc ted_gp_opt
1800
  @@:
1801
  cmp ted_gp_opt,0
1802
  jne @f
1803
    mov edx,ted_tex_1
1804
    ;call ted_get_text_perv_pos
1805
  @@:
1806
  pop ebx eax
1807
  ret
1808
 
1809
 
1810
;input:
1811
; eax = Row
1812
; edi = pointer to tedit struct
1813
;output:
1814
; ebx = str len
1815
align 4
1816
ted_strlen:
1817
  push edx ecx
1818
  ;ecx = Row, from cycle
1819
 
1820
  xor ebx,ebx
1821
  xor ecx,ecx
1822
  mov edx,ted_tex
1823
  @@:
1824
    call ted_iterat_next
1825
    cmp edx,ted_tex_1
1826
    jle @f
1827
    inc ebx
1828
    cmp byte [edx],13
1829
    jne @b
1830
    dec ebx ;lenght minus 1 sumbol to paragraph
1831
    cmp eax,ecx
1832
    je @f
1833
    xor ebx,ebx
1834
    inc ecx
1835
    jmp @b
1836
  @@:
1837
 
1838
  cmp eax,ecx
1839
  je @f
1840
    xor ebx,ebx
1841
  @@:
1842
 
1843
  pop ecx edx
1844
  ret
1845
 
1846
 
1847
;input:
1848
; edx = symbol position
1849
; edi = pointer to tedit struct
1850
;output:
1851
; eax = number of line
1852
; ebx = symbol position in line
1853
align 4
1854
ted_get_text_coords:
1855
  push edx
1856
  xor eax,eax
1857
  xor ebx,ebx
1858
  @@:
1859
    call ted_iterat_perv
1860
 
1861
    cmp eax,0
1862
    jne .no_col_mov
1863
    inc ebx
1864
    .no_col_mov:
1865
 
1866
    cmp edx,ted_tex_1
1867
    jle @f
1868
    cmp byte [edx],13
1869
    jne @b
1870
    inc eax
1871
    jmp @b
1872
  @@:
1873
  dec ebx
1874
  pop edx
1875
  ret
1876
 
1877
;input:
1878
; edi = pointer to tedit struct
1879
;output:
1880
; eax = num lines
1881
align 4
1882
ted_get_num_lines:
1883
  push edx
1884
  mov eax,1
1885
  mov edx,ted_tex
1886
  @@:
1887
    call ted_iterat_next
1888
    cmp edx,ted_tex_1
1889
    jle @f
1890
    cmp byte [edx],13
1891
    jne @b
1892
    inc eax
1893
    jmp @b
1894
  @@:
1895
;...
1896
;dec eax
1897
  pop edx
1898
  ret
1899
 
1900
 
1901
;input:
1902
; edi = pointer to tedit struct
1903
;description:
1904
; отменяет отмененные действия, перед изменением документа
1905
align 4
1906
proc ted_set_undo
2348 IgorA 1907
	mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
1908
	cmp ted_tim_undo,1
1909
	jl .no_work
1457 IgorA 1910
 
2348 IgorA 1911
	push eax ebx edx
1912
	mov edx,ted_tex
1913
	call ted_get_text_next_pos ;long i=tex[0].next;
1914
	mov eax,ted_tim_undo
1915
	sub ted_tim_ch,eax ;ted_tim_ch-=ted_tim_undo;
1916
	mov eax,ted_tim_ch
1917
	cmp ted_tim_ls,eax ;if(ted_tim_ls>ted_tim_ch)
1918
	jle @f
1919
		mov ted_tim_ls,0
1920
	@@:
1921
		cmp edx,ted_tex_1
1922
		jle @f
1457 IgorA 1923
 
2348 IgorA 1924
		;if(tex[i].tc>ted_tim_ch){ // если создание символа было отменено
1925
		cmp [edx+10],eax
1926
		jle .no_u1
1927
			mov dword [edx+10],0
1928
			mov dword [edx+14],0
1457 IgorA 1929
 
2348 IgorA 1930
			mov ebx,[edx+2]
1931
			imul ebx,sizeof.symbol
1932
			add ebx,ted_tex ;ebx=tex[i].perv
1933
			m2m dword [ebx+6],dword [edx+6] ;tex[tex[i].perv].next=tex[i].next;
1457 IgorA 1934
 
2348 IgorA 1935
			mov ebx,[edx+6]
1936
			imul ebx,sizeof.symbol
1937
			add ebx,ted_tex ;ebx=tex[i].next
1938
			m2m dword [ebx+2],dword [edx+2] ;tex[tex[i].next].perv=tex[i].perv;
1457 IgorA 1939
 
2348 IgorA 1940
			cmp ted_ptr_free_symb,edx
1941
			jle .no_cor_free
1942
				mov ted_ptr_free_symb,edx ;меняем указатель на свободный символ, для более быстрого поиска памяти
1943
			.no_cor_free:
1944
			mov edx,ebx ;оптимизируем по скорости (edx после вызова ted_get_text_next_pos будет равен ebx)
1945
			jmp @b
1946
		.no_u1:
1457 IgorA 1947
 
2348 IgorA 1948
		;else if(tex[i].td>ted_tim_ch) tex[i].td=0; // если удаление символа было отменено
1949
		cmp [edx+14],eax
1950
		jle .no_u2
1951
			mov dword [edx+14],0
1952
		.no_u2:
1457 IgorA 1953
 
2348 IgorA 1954
		call ted_get_text_next_pos
1955
		jmp @b
1956
	@@:
1957
	mov ted_tim_undo,0
1958
	mov eax,ted_tim_co
1959
	cmp ted_tim_ch,eax
1960
	jge @f
1961
		mov ted_tim_co,0
1962
	@@:
1963
	pop edx ebx eax
1964
	.no_work:
1965
	ret
1457 IgorA 1966
endp
1967
 
1968
;input:
1969
; ecx = Col
1970
; edx = Row
1971
; edi = pointer to tedit struct
1972
align 4
1973
ted_go_to_pos:
1974
	push eax
1975
	mov eax,ted_scr_w
1976
	mov ted_cur_x,ecx
1977
	sub edx,dword[eax+sb_offs_position]
1978
 
1979
	cmp edx,dword[eax+sb_offs_cur_area] ;ted_cur_y > [.cur_area]
1980
	jl @f
1981
		push ebx
1982
		mov ebx,edx
1983
		sub ebx,dword[eax+sb_offs_cur_area]
1984
		inc ebx
1985
		add dword[eax+sb_offs_position],ebx
1986
		sub edx,ebx
1987
		pop ebx
1988
		; ??? redrav
1989
	@@:
1990
	mov ted_cur_y,edx
1991
	pop eax
1992
	ret
1993
 
1994
;input:
1995
; edi = pointer to tedit struct
1996
align 4
1997
ted_text_colored:
1998
  push eax edx
1999
  mov eax,ted_tim_ch
2000
  sub eax,ted_tim_undo
2001
  mov ted_tim_co,eax
2002
  mov edx,ted_tex
2003
  @@:
2004
    call ted_iterat_next
2005
    cmp edx,ted_tex_1
2006
    jle @f
2007
    mov byte[edx+1],0
2008
    jmp @b
2009
  @@:
2010
 
2011
  cmp ted_key_words_count,1
2012
  jl .no_colors
2013
  mov edx,ted_tex
2014
  @@:
2015
    call ted_text_find_sel_color
2016
    cmp edx,ted_tex_1
2017
    jle .no_colors
2018
    jmp @b
2019
  .no_colors:
2020
  pop edx eax
2021
  ret
2022
 
2023
 
2024
;input:
2025
; edx = pointer to start symbol
2026
; edi = pointer to tedit struct
2027
;output:
2028
; edx = pointer to next symbol
2029
;description:
2030
; Функция для поиска и выделения подсвеченых слов
2031
align 4
2032
proc ted_text_find_sel_color
2033
locals
2034
  begPos dd ? ;начальная позиция
2035
  endPos dd ? ;конечная позиция
2036
  find db ? ;найдено / не найдено
2037
  f_color db ? ;индекс цвета найденого слова
2038
endl
2039
  push eax ebx ecx esi
2040
;eax = word_n текущий номер (позиция) проверяемого слова в списке
2041
;ebx = для разных целей
2042
;ecx = l_pos последний номер (позиция) подходящего слова в списке
2043
;esi = для разных целей, номер проверяемого символа в слове
2044
  mov dword[begPos],1
2045
  mov dword[endPos],1
2046
  mov byte[find],0
2047
  mov byte[f_color],1
2048
  @@:
2049
    call ted_iterat_next
2050
    cmp edx,ted_tex_1
2051
    jle @f
2052
 
2053
    xor eax,eax
2054
    mov al,byte[edx]
2055
    shl ax,2 ;eax*=4
2056
    add eax,ted_arr_key_pos
2057
    mov eax,dword[eax]
2058
    cmp eax,0
2059
    jl @b ;if( (word_n=ted_arr_key_pos[(unsigned char)tex[i].c])>-1 ){
2060
 
2061
    mov ecx,eax
2062
    ;while(l_pos
2063
    .wh_1b:
2064
      cmp ecx,ted_key_words_count
2065
      jge .wh_1e
2066
      ColToIndexOffset ecx,esi
2067
      mov bl,byte[esi]
2068
      ColToIndexOffset eax,esi
2069
      cmp bl,byte[esi]
2070
      jne .wh_1e
2071
	inc ecx
2072
      jmp .wh_1b
2073
    .wh_1e:
2074
 
2075
    mov dword[begPos],edx ;bP=i;
2076
    mov esi,1
2077
 
2078
    .wh_2b: ;while(1){
2079
      call ted_iterat_next
2080
 
2081
      ;while(l_pos>word_n && Col[l_pos-1].Text[pos]!=tex[i].c)
2082
      .wh_3b:
2083
	cmp ecx,eax
2084
	jle .wh_3e
2085
	dec ecx
2086
	ColToIndexOffset ecx,ebx
2087
	inc ecx
2088
	;cmp byte[ebx+esi],byte[edx]
2089
	mov bl,byte[ebx+esi]
2090
	cmp bl,byte[edx]
2091
	je .wh_3e
2092
	  dec ecx
2093
	jmp .wh_3b
2094
      .wh_3e:
2095
 
2096
      ColToIndexOffset eax,ebx
2097
      cmp byte[ebx+esi],0
2098
      jne .if_0 ;if(Col[word_n].Text[pos]==0){
2099
	mov dword[endPos],edx ;eP=i;
2100
	ColToIndexOffset eax,ebx
2102 IgorA 2101
	mov bl,byte[ebx+MAX_COLOR_WORD_LEN+7]
1457 IgorA 2102
	mov byte[f_color],bl ;f_color=Col[word_n].color;
2103
 
2104
mov byte[find],1
2105
	  ColToIndexOffset eax,ebx ;... ebx = Col[word_n]
2106
	  mov bl,byte[ebx+MAX_COLOR_WORD_LEN+4]
2107
	  cmp bl,0 ;if(Col[word_n].wwo)
2108
	  je .if_2n
2109
	    push edx
2110
	    mov edx,dword[begPos]
2111
     call ted_iterat_perv
2112
 
2113
	    btr bx,0 ;1-1
2114
	    jae .if_3e ;if(Col[word_n].wwo&1)
2115
	      ;u1= !(isalnum(cont_s)||cont_s=='_')
2116
	      call isalnum
2117
	      jae .if_3e
2118
		mov byte[find],0
2119
	    .if_3e:
2120
 
2121
	    btr bx,3 ;4-1
2122
	    jae .if_4e ;if(Col[word_n].wwo&8)
2123
	      ;u1= !isalpha(cont_s);
2124
	      call isalpha
2125
	      jae .if_4e
2126
		mov byte[find],0
2127
	    .if_4e:
2128
 
2129
	    mov edx,dword[endPos]
2130
;     call ted_iterat_next
2131
 
2132
	    btr bx,1 ;2-1
2133
	    jae .if_5e ;if(Col[word_n].wwo&2)
2134
	      ;u1= !(isalnum(cont_s)||cont_s=='_')
2135
	      call isalnum
2136
	      jae .if_5e
2137
		mov byte[find],0
2138
	    .if_5e:
2139
 
2140
	    btr bx,4 ;5-1
2141
	    jae .if_6e ;if(Col[word_n].wwo&16)
2142
	      ;u1= !isalpha(cont_s);
2143
	      call isalpha
2144
	      jae .if_6e
2145
		mov byte[find],0
2146
	    .if_6e:
2147
 
2148
	    btr bx,2 ;3-1
2149
	    jae .if_7e ;if(Col[word_n].wwo&4)
2150
	    ColToIndexOffset eax,ebx
2102 IgorA 2151
	    mov bx,word[ebx+MAX_COLOR_WORD_LEN+5]
1457 IgorA 2152
	    call ted_iterat_next_pos_char
2153
       cmp edx,ted_tex_1
2154
       jle .if_7e
2155
       mov dword[endPos],edx
2156
	    .if_7e:
2157
 
2158
	    pop edx
2159
	  .if_2n:
2160
;                 if(i!=1){ // не конец документа
2161
;                   cont_s=tex[eP].c;
2162
;                   if(Col[word_n].wwo&2) u2= !(isalnum(cont_s)||cont_s=='_');  // не букв.-числ. символ
2163
;                   if(u2 && Col[word_n].wwo&16) u2= !isalpha(cont_s); // не числ. символ
2164
;                   if(Col[word_n].wwo&4) eP=ted_iterat_next_pos_char(eP,Col[word_n].endc);
2165
 
2166
	cmp eax,ecx
2167
	je .wh_2e ;if(word_n==l_pos) break; // do double - если слово точно последнее
2168
      .if_0:
2169
 
2170
      cmp edx,ted_tex_1
2171
      jle .wh_2e ;if(i==1) break;
2172
 
2173
      ;while(l_pos>word_n && Col[word_n].Text[pos]!=tex[i].c)
2174
      .wh_4b:
2175
	cmp ecx,eax
2176
	jle .wh_4e
2177
	ColToIndexOffset eax,ebx
2178
	;cmp byte[ebx+esi],byte[edx]
2179
	mov bl,byte[ebx+esi]
2180
	cmp bl,byte[edx]
2181
	je .wh_4e
2182
	  inc eax
2183
	jmp .wh_4b
2184
      .wh_4e:
2185
 
2186
      cmp eax,ecx
2187
      je .wh_2e;if(word_n==l_pos) break;
2188
      inc esi ;pos++;
2189
      jmp .wh_2b
2190
    .wh_2e:
2191
 
2192
    cmp byte[find],1 ;if(fnd)break;
2193
    je @f
2194
    mov edx,dword[begPos];i=bP;
2195
    jmp @b
2196
  @@:
2197
 
2198
  cmp byte[find],1
2199
  jne .if_1e ;if(fnd){ // выделение найденого текста
2200
;    if(!mode_sf1 || (mode_sf1 && strlen(Col[word_n].f1->c_str())>0)){
2201
    mov eax,dword[begPos]
2202
    mov bl,byte[f_color]
2203
    mov byte[eax+1],bl ;tex[bP].col=f_color;
2204
    mov eax,dword[endPos]
2205
    mov byte[eax+1],0xff ;tex[eP].col=255;
2206
;    return ItPoPerv(eP); // возвращаем позицию конца вхождения
2207
    mov edx,dword[endPos]
2208
    call ted_get_text_perv_pos
2209
    jmp @f
2210
  .if_1e:
2211
    mov edx,ted_tex
2212
  @@:
2213
 
2214
  pop esi ecx ebx eax
2215
  ret
2216
endp
2217
 
2218
;input:
2219
; edx = pointer to char (byte)
2220
;output:
2221
; cf=1 if symbol is...
2222
align 4
2223
tab_all_num db 0,0,0,0,0,0,11111111b,11b,11111110b,0xff,0xff,111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0;,0,0,0,0,0,0,0,0 - tab_alpha_0,0,0,0,0,0,0,0
2224
tab_alpha db 0,0,0,0,0,0,0,0,11111110b,0xff,0xff,111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2225
 
2226
align 4
2227
isalnum:
2228
  push eax ebx
2229
  mov al,byte[edx] ;al=offset
2230
  shr al,3
2231
  and eax,11111b
2232
  lea ebx,[tab_all_num]
2233
  add ebx,eax
2234
  mov ah,byte[ebx]
2235
  mov al,byte[edx] ;al=bit
2236
  and ax,111b
2237
  mov bx,word[ebx]
2238
  btr bx,ax
2239
  pop ebx eax
2240
  ret
2241
align 4
2242
isalpha:
2243
  push eax ebx
2244
  mov al,byte[edx] ;al=offset
2245
  shr al,3
2246
  and eax,11111b
2247
  lea ebx,[tab_alpha]
2248
  add ebx,eax
2249
  mov ah,byte[ebx]
2250
  mov al,byte[edx] ;al=bit
2251
  and ax,111b
2252
  mov bx,word[ebx]
2253
  btr bx,ax
2254
  pop ebx eax
2255
  ret
2256
 
2257
align 4
2258
proc ted_show_help_f1, edit:dword
2259
  push eax edx edi
2260
  mov edi,dword[edit]
2261
 
2262
  call ted_get_pos_by_cursor
2263
  push edx
2264
    call ted_iterat_next_color_tag
2265
    mov eax,edx
2266
  pop edx
2267
  call ted_iterat_perv_color_tag
2268
 
2269
  cmp eax,ted_tex
2270
  jle @f
2271
  cmp edx,ted_tex_1
2272
  jle @f
2273
    stdcall ted_find_help_id,eax
2274
  @@:
2275
  ;call ted_draw_main_cursor
2276
  call ted_draw_help_f1
2277
  pop edi edx eax
2278
  ret
2279
endp
2280
 
2281
;input:
2282
; edx = position begin 'symbol' struct
2283
; edi = pointer to tedit struct
2284
; end_pos = position end 'symbol' struct
2285
align 4
2286
proc ted_find_help_id, end_pos:dword
2287
; ecx = word_n
2288
; ebx = l_pos
2289
  mov ted_help_id,-1
2290
 
2291
  push ebx ecx
2292
    xor ebx,ebx
2293
    mov bl,byte[edx]
2294
    shl bx,2 ;ebx*=4
2295
    add ebx,ted_arr_key_pos
2296
    mov ecx,dword[ebx]
2297
    cmp ecx,0
2298
    jl .if_0e ;if( (word_n=ted_arr_key_pos[(unsigned char)tf[0]])>-1 ){
2299
      push esi eax
2300
      mov ebx,ecx ;l_pos=word_n;
2301
      ColToIndexOffset ecx,esi
2302
      push cx
2303
      mov cl,byte[esi]
2304
      @@:
2305
	cmp ebx,ted_key_words_count ;while(l_pos
2306
	jge @f
2307
	;ColToIndexOffset ecx,esi
2308
	ColToIndexOffset ebx,eax
2309
	cmp cl,byte[eax] ;&& Col[l_pos].Text[0]==Col[word_n].Text[0])
2310
	jne @f
2311
	  inc ebx ;l_pos++;
2312
	  jmp @b
2313
      @@:
2314
      pop cx
2315
      call ted_iterat_next ;pos=1;
2316
      mov esi,1
2317
      @@:
2318
	push dx
2319
	push word[edx]
2320
	pop dx
2321
	  .wh_0b:
2322
	    cmp ebx,ecx ;while(l_pos>word_n
2323
	    jle .wh_0e
2324
	    dec ebx
2325
	    ColToIndexOffset ebx,eax
2326
	    inc ebx
2327
	    cmp byte[eax+esi],dl ;&& Col[l_pos-1].Text[pos]!=tf[i])
2328
	    je .wh_0e
2329
	      dec ebx ;l_pos--;
2330
	    jmp .wh_0b
2331
	  .wh_0e:
2332
 
2333
	  .wh_1b:
2334
	    cmp ebx,ecx ;while(l_pos>word_n
2335
	    jle .wh_1e
2336
	    ColToIndexOffset ecx,eax
2337
	    cmp byte[eax+esi],dl
2338
	    je .wh_1e
2339
	      inc ecx ;word_n++;
2340
	    jmp .wh_1b
2341
	  .wh_1e:
2342
	pop dx
2343
 
2344
	cmp ecx,ebx ;if(word_n==l_pos) break;
2345
	je @f
2346
	call ted_iterat_next ;pos++;
2347
	cmp edx,dword[end_pos] ;for(...;i
2348
	je @f ;jge
2349
	inc esi
2350
	jmp @b
2351
      @@:
2352
      pop eax esi
2353
 
2354
      mov ted_help_id,ecx
2355
      ;return word_n;
2356
 
2357
    .if_0e:
2358
  pop ecx ebx
2359
  ret
2360
endp
2361
 
2362
;output:
2363
; eax = код ошибки
2364
; ebx = колличество прочитанных байт
2365
align 4
2366
proc ted_open_file, edit:dword, file:dword, f_name:dword ;функция открытия файла
2808 IgorA 2367
	push ecx edx edi
1457 IgorA 2368
	mov edi,dword[edit]
2369
 
2808 IgorA 2370
	; *** проверяем размер памяти и если не хватает то увеличиваем ***
2371
	;пробуем получить информацию о файле
1457 IgorA 2372
	mov eax,70
2373
	mov ebx,dword[file]
2808 IgorA 2374
	mov dword[ebx], 5
2375
	mov dword[ebx+4], 0
2376
	mov dword[ebx+8], 0
2377
	mov dword[ebx+12], 0
2378
	m2m dword[ebx+16], ted_tex
2379
	mov  byte[ebx+20], 0
2380
	push dword[f_name]
2381
	pop dword[ebx+21]
2382
	int 0x40
2383
	cmp eax,0
2384
	je .end_0
2385
		mov edx,ted_max_chars
2386
		cmp eax,2 ;функция не поддерживается для данной файловой системы
2387
		je @f
2388
		jmp .ret_f
2389
	.end_0:
2390
	;проверяем хватит ли памяти для загрузки файла
2391
	mov ecx,ted_max_chars
2392
	sub ecx,2 ;ecx = максимальное число байт, для которых была выделена память
2393
	mov edx,ted_tex
2394
	mov edx,dword[edx+32] ;+32 = +0x20: qword: размер файла в байтах
2395
	cmp edx,ecx
2396
	jl @f
2397
		;увеличиваем память если не хватило
2398
		mov ecx,edx ;память необходимая для открытия файла
2399
		add ecx,2  ;память для служебных начального и конечного символов
2400
		add ecx,ted_increase_size ;память для редактирования файла
2401
		mov ted_max_chars,ecx
2402
		imul ecx,sizeof.symbol
2403
		invoke mem.realloc, ted_tex,ecx
2404
		mov ted_tex,eax
2405
		mov ted_tex_1,eax
2406
		add ted_tex_1,sizeof.symbol
2407
		add eax,ecx
2408
		mov ted_tex_end,eax
2409
		mov ecx,ted_tex_1
2410
		add ecx,sizeof.symbol
2411
		mov ted_ptr_free_symb,ecx
2412
	@@:
2413
 
2414
	; *** пробуем открыть файл ***
2415
	mov eax,70
2416
	mov ebx,dword[file]
1457 IgorA 2417
	mov dword[ebx], 0
2418
	mov dword[ebx+4], 0
2419
	mov dword[ebx+8], 0
2808 IgorA 2420
	m2m dword[ebx+12], edx ;число байт, которые могут быть считаны с файла (не больше чем ted_max_chars)
1457 IgorA 2421
	m2m dword[ebx+16], ted_tex
2422
	mov  byte[ebx+20], 0
2423
	push dword[f_name]
2424
	pop dword[ebx+21]
2425
	int 0x40
2426
 
2427
	cmp eax,0
2428
	je @f
2429
	cmp eax,6
2430
	je @f
2431
		jmp .ret_f
2432
	@@:
2433
	cmp ebx,-1
2434
	je .ret_f
2435
		;if open file
2436
		call ted_on_open_file
2437
	.ret_f:
2808 IgorA 2438
	pop edi edx ecx
1457 IgorA 2439
	ret
2440
endp
2441
 
2442
align 4
2443
proc ted_but_select_word, edit:dword
2444
	pushad
2445
	mov edi,dword[edit]
2446
 
2447
	call ted_get_pos_by_cursor
2448
	push edx
2449
		call ted_iterat_perv_color_tag
2450
		cmp edx,ted_tex_1
2451
		jle @f
2452
			call ted_get_text_coords
2453
			mov ted_sel_x0,ebx
2454
			mov ted_sel_y0,eax
2455
		@@:
2456
	pop edx
2457
	call ted_iterat_next_color_tag
2458
	cmp edx,ted_tex_1
2459
	jle @f
2460
		call ted_get_text_coords
2461
		mov ted_sel_x1,ebx
2462
		mov ted_sel_y1,eax
2463
	@@:
2464
 
2465
	cmp ted_fun_draw_panel_buttons,0
2466
	je @f
2467
		call ted_fun_draw_panel_buttons
2468
	@@:
2469
	stdcall ted_draw,edi
2470
	popad
2471
	ret
2472
endp
2473
 
2474
align 4
2475
proc ted_but_cut, edit:dword
2476
	push edi
2477
	mov edi,dword[edit]
2478
 
2479
	stdcall ted_but_copy,edi
2480
	call ted_set_undo
2481
	stdcall ted_sel_text_del,ted_opt_ed_change_time
2482
 
2483
	cmp al,1
2484
	jne @f
2485
		stdcall ted_draw,edi
2486
		cmp ted_fun_draw_panel_buttons,0
2487
		je @f
2488
			call ted_fun_draw_panel_buttons
2489
	@@:
2490
	pop edi
2491
	ret
2492
endp
2493
 
2494
;output:
2495
; al = 1 if copy text
2496
align 4
2497
proc ted_but_copy, edit:dword
2498
	pushad
2499
	mov edi,dword[edit]
2500
 
2501
	call ted_is_select
2502
	cmp al,0
2503
	je .end_f ;if not selected text
2504
	call ted_sel_normalize
2505
 
2506
	mov esi,ted_seln_x1
2507
	mov ecx,ted_seln_y1
2508
	call ted_get_pos_by_coords
2509
	mov ebx,edx
2510
	mov esi,ted_seln_x0
2511
	mov ecx,ted_seln_y0
2512
	call ted_get_pos_by_coords
2513
	mov esi,ebx
2514
 
4228 IgorA 2515
	mov ecx,12 ;system buffer header size
1457 IgorA 2516
	mov ebx,ted_buffer
4228 IgorA 2517
	mov dword[ebx+4],0 ;text data
2518
	mov dword[ebx+8],1 ;code 866
2519
	add ebx,ecx
1457 IgorA 2520
	@@:
2521
		cmp edx,ted_tex_1 ;end of file
2522
		jle @f
2523
		cmp edx,esi ;end of select
2524
		je @f
2525
		inc ecx
2526
		cmp ecx,ted_buffer_size ;owerflow bufer
2527
		je @f
2528
 
2529
		mov al,byte[edx]
2530
		mov byte[ebx],al
2531
		inc ebx
2532
 
2533
		call ted_iterat_next
2534
		jmp @b
2535
	@@:
2536
	add ecx,ted_buffer
2537
	mov byte[ebx],0
2538
 
2539
	cmp ecx,0
2540
	je .end_f
4228 IgorA 2541
		mov ebx,ted_buffer
2542
		mov eax,ted_buffer_size
2543
		mov dword[ebx],eax
2544
		mcall 54,2,ted_buffer_size,ted_buffer
1457 IgorA 2545
		call ted_draw_buffer
2546
		cmp ted_fun_draw_panel_buttons,0
2547
		je .end_f
2548
			call ted_fun_draw_panel_buttons
2549
	.end_f:
2550
	popad
2551
	ret
2552
endp
2553
 
2554
 
2555
align 4
2556
proc ted_but_paste, edit:dword
4228 IgorA 2557
	pushad
1457 IgorA 2558
	mov edi,dword[edit]
2559
 
4228 IgorA 2560
	mcall 54,0
2561
	cmp eax,1
2562
	jl .no_buf_r
2563
 
2564
	mov esi,eax
2565
	.cycle: ;обратный цикл по слотам
2566
	dec esi ;номер текущего, проверяемого слота
2567
	mcall 54,1,esi ;read system buffer
2568
	cmp eax,1
2569
	je .no_buf_r
2570
	cmp eax,-1
2571
	je .no_buf_r
2572
		mov ecx,dword[eax]
2573
		cmp ecx,1 ;size
2574
		jl .no_buf_r
2575
		cmp dword[eax+4],0 ;text
2576
		je @f
2577
			cmp esi,1
2578
			jge .cycle ;если в буфере не текст, а слотов в буфере несколько, пробуем перейти к верхнему слоту
2579
			jmp .no_buf_r
2580
		@@:
2581
		cmp dword[eax+8],1 ;866
2582
		je @f
2583
			cmp esi,1
2584
			jge .cycle ;если в буфере текст не в кодировке 866 ... пробуем перейти к верхнему слоту
2585
			jmp .no_buf_r
2586
		@@:
2587
		;копирование текста из системного буфера во внутренний
2588
		cmp ecx,ted_buffer_size
2589
		jle @f
2590
			mov ecx,ted_buffer_size
2591
		@@:
2592
		mov edi,ted_buffer
2593
		mov esi,eax
2594
		add	esi,4 ;12
2595
		mov dword[edi],ecx
2596
		add edi,4 ;12
2597
		sub ecx,4 ;12
2598
		rep movsb
2599
		mov edi,dword[edit]
2600
 
2601
		mov esi,eax
2602
		add	esi,12
2603
		jmp .buf_r
2604
	.no_buf_r:
2605
 
2606
	;если не удалось прочитать данные из системного буфера, попадаем сюда
1457 IgorA 2607
	mov esi,ted_buffer
4228 IgorA 2608
	cmp dword[esi],1 ;проверяем есть ли данные во внутреннем буфере
2609
	jl .no_paste ;если вообще ничего не удалось прочитать идем на выход
2610
	add esi,12 ;system buffer header size
2611
	.buf_r:
2612
 
2613
	mov edx,esi
1457 IgorA 2614
	call tl_strlen
2615
	cmp eax,1
4228 IgorA 2616
	jl .no_paste
1457 IgorA 2617
		mov esi,eax
2618
		call ted_set_undo
2619
		mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
2620
		stdcall ted_sel_text_del,ebx
2621
		cmp al,1
2622
		jne .del
2623
			mov ebx,ted_opt_ed_move_cursor
2624
		.del:
4228 IgorA 2625
		stdcall ted_text_add,edi,edx,esi,ebx
1457 IgorA 2626
		stdcall ted_draw,edi
2627
		cmp ted_fun_draw_panel_buttons,0
4228 IgorA 2628
		je .no_paste
1457 IgorA 2629
			call ted_fun_draw_panel_buttons
4228 IgorA 2630
	.no_paste:
2631
	popad
1457 IgorA 2632
	ret
2633
endp
2634
 
2635
align 4
2324 IgorA 2636
proc ted_but_sumb_upper uses edi esi, edit:dword
2637
	mov edi,dword[edit]
1457 IgorA 2638
 
2324 IgorA 2639
	stdcall ted_convert_sel_text,fb_char_toupper
2640
	cmp esi,0
2641
	je @f
2642
		stdcall ted_draw,edi
2643
	@@:
2644
	ret
1457 IgorA 2645
endp
2646
 
2647
align 4
2324 IgorA 2648
proc ted_but_sumb_lover uses edi esi, edit:dword
2649
	mov edi,dword[edit]
1457 IgorA 2650
 
2324 IgorA 2651
	stdcall ted_convert_sel_text,fb_char_todown
2652
	cmp esi,0
2653
	je @f
2654
		stdcall ted_draw,edi
2655
	@@:
2656
	ret
1457 IgorA 2657
endp
2658
 
2659
align 4
2660
proc ted_but_reverse, edit:dword
2661
  push eax ebx edi
2662
  mov edi,dword[edit]
2663
 
2664
  call ted_is_select
2665
  cmp al,0
2666
  je @f
2667
    call ted_sel_normalize
2668
    push esi ecx edx
2669
      mov esi,ted_seln_x0
2670
      mov ecx,ted_seln_y0
2671
      call ted_get_pos_by_coords
2672
      mov eax,edx
2673
      mov esi,ted_seln_x1
2674
      cmp esi,0
2675
      je .beg_str
2676
	dec esi
2677
      .beg_str:
2678
      mov ecx,ted_seln_y1
2679
      call ted_get_pos_by_coords
2680
      ;call ted_get_text_perv_pos
2681
      mov ebx,edx
2682
    pop edx ecx esi
2683
    ;cmp eax,...
2684
    ;je @f
2685
    call ted_revers
2686
  @@:
2687
  stdcall ted_draw,edi
2688
  pop edi ebx eax
2689
  ret
2690
endp
2691
 
2692
align 4
2693
proc ted_but_undo, edit:dword
2694
	push eax edi
2695
	mov edi,dword[edit]
2696
 
2697
	mov eax,ted_tim_undo
2698
	cmp ted_tim_ch,eax
2699
	jbe @f
2700
		inc ted_tim_undo
2701
		;call ted_text_colored
2702
		stdcall ted_draw,edi
2703
		cmp ted_fun_draw_panel_buttons,0
2704
		je @f
2705
			call ted_fun_draw_panel_buttons
2706
	@@:
2707
	pop edi eax
2708
	ret
2709
endp
2710
 
2711
align 4
2712
proc ted_but_redo, edit:dword
2713
	push edi
2714
	mov edi,dword[edit]
2715
 
2716
	cmp ted_tim_undo,1
2717
	jb @f
2718
		dec ted_tim_undo
2719
		;call ted_text_colored
2720
		stdcall ted_draw,edi
2721
		cmp ted_fun_draw_panel_buttons,0
2722
		je @f
2723
			call ted_fun_draw_panel_buttons
2724
	@@:
2725
	pop edi
2726
	ret
2727
endp
2728
 
2729
align 4
2730
proc ted_but_find_next, edit:dword
2731
	pushad
2732
	mov edi,dword[edit]
2733
 
2734
	call ted_get_pos_by_cursor
2735
	mov eax,ted_buffer_find
2736
	mov bl,byte[eax]
2737
	@@:
2738
		call ted_get_find_rezult
2739
		cmp bh,1
2740
		je @f ; find
2741
			call ted_iterat_next
2742
			cmp edx,ted_tex_1
2743
			jle @f
2744
			jmp @b
2745
	@@:
2746
	cmp bh,0
2747
	je @f
2748
		call ted_get_text_coords
2749
		inc ebx ;move cursor right
2750
		mov ted_sel_x1,ebx
2751
		mov ted_sel_y1,eax
2752
		mov edx,eax
2753
		mov ecx,ebx
2754
		call ted_go_to_pos
2755
		mov edx,esi ;esi было установлео в ted_get_find_rezult
2756
		call ted_get_text_coords
2757
		mov ted_sel_x0,ebx
2758
		mov ted_sel_y0,eax
2759
		stdcall ted_draw,edi
2760
		jmp .end_find
2761
	@@:
2762
		;попадаем сюда если текст не найден
2763
		cmp ted_fun_find_err,0
2764
		je .end_find
2765
			call ted_fun_find_err ;пользовательская функция
2766
	.end_find:
2767
	popad
2768
	ret
2769
endp
2770
 
2771
;input:
2772
; edi = pointer to tedit struct
2773
align 4
2774
ted_key_ctrl_home:
2775
	mov ted_cur_x,0
2776
	mov ted_cur_y,0
2777
	push eax
2778
		mov eax,ted_scr_w
2779
		mov dword[eax+sb_offs_position],0
2780
		mov eax,ted_scr_h
2781
		mov dword[eax+sb_offs_position],0
2782
	pop eax
2783
	stdcall ted_draw,edi
2784
	cmp ted_fun_draw_panel_buttons,0
2785
	je @f
2786
		call ted_fun_draw_panel_buttons
2787
	@@:
2788
	ret
2789
 
2790
;input:
2791
; edi = pointer to tedit struct
2792
align 4
2793
proc ted_sel_key_up
2794
  cmp ted_drag_k,1
2795
  je @f
2796
    call ted_sel_start
2797
    mov ted_drag_k,1
2798
  @@:
2799
  push dx
2800
    call ted_cur_move_up
2801
    cmp dl,8
2802
    jne @f
2803
      call ted_scroll_set_redraw
2804
    @@:
2805
  pop dx
2806
  call ted_sel_move
2807
  stdcall ted_draw,edi
2808
  ret
2809
endp
2810
 
2811
;input:
2812
; edi = pointer to tedit struct
2813
align 4
2814
proc ted_sel_key_down
2815
  cmp ted_drag_k,1
2816
  je @f
2817
    call ted_sel_start
2818
    mov ted_drag_k,1
2819
  @@:
2820
  push dx
2821
    call ted_cur_move_down
2822
    cmp dl,8
2823
    jne @f
2824
      call ted_scroll_set_redraw
2825
    @@:
2826
  pop dx
2827
  call ted_sel_move
2828
  stdcall ted_draw,edi
2829
  ret
2830
endp
2831
 
2832
;input:
2833
; edi = pointer to tedit struct
2834
align 4
2835
proc ted_sel_key_left
2836
  cmp ted_drag_k,1
2837
  je @f
2838
    call ted_sel_start
2839
  @@:
2840
  push dx
2841
    call ted_cur_move_left
2842
    call ted_sel_move
2843
    cmp ted_drag_k,1
2844
    je @f
2845
      mov ted_drag_k,1
2846
      mov dl,8
2847
    @@:
2848
    cmp dl,8
2849
    jne @f
2850
      call ted_scroll_set_redraw
2851
      stdcall ted_draw,edi
2852
      jmp .end_f
2853
    @@:
2854
      stdcall ted_draw_cur_line,edi
2855
    .end_f:
2856
  pop dx
2857
  ret
2858
endp
2859
 
2860
;input:
2861
; edi = pointer to tedit struct
2862
align 4
2863
proc ted_sel_key_right
2864
  cmp ted_drag_k,1
2865
  je @f
2866
    call ted_sel_start
2867
  @@:
2868
  push dx
2869
    call ted_cur_move_right
2870
    call ted_sel_move
2871
    cmp ted_drag_k,1
2872
    je @f
2873
      mov ted_drag_k,1
2874
      mov dl,8
2875
    @@:
2876
    cmp dl,8
2877
    jne @f
2878
      call ted_scroll_set_redraw
2879
      stdcall ted_draw,edi
2880
      jmp .end_f
2881
    @@:
2882
      stdcall ted_draw_cur_line,edi
2883
    .end_f:
2884
  pop dx
2885
  ret
2886
endp
2887
 
2888
;input:
2889
; edi = pointer to tedit struct
2890
;description:
2891
; this function need to optimize output
2892
align 4
2893
proc ted_draw_cursor_sumb
2894
  pushad
2895
 
2896
  mov eax,13 ;rect
2897
  mov ebx,ted_wnd_l
2898
  add ebx,ted_rec_l
2899
  mov edx,ted_cur_x
2900
  imul edx,ted_rec_w
2901
  add ebx,edx
2902
  shl ebx,16
2903
  add ebx,ted_rec_w
2904
 
2905
  mov ecx,ted_wnd_t ;calc rect -> y0,y1
2906
  add ecx,ted_rec_t
2907
  mov edx,ted_cur_y
2908
  imul edx,ted_rec_h
2909
  add ecx,edx
2910
  shl ecx,16
2911
  add ecx,ted_rec_h
2912
 
2913
  mov edx,ted_color_wnd_work
2914
  push ecx
2915
    call ted_sel_normalize
2916
 
2917
    mov esi,ted_scr_w
2918
	mov ecx,dword[esi+sb_offs_position]
2919
    sub ted_seln_y0,ecx
2920
    sub ted_seln_y1,ecx
2921
 
2922
    mov ecx,ted_cur_y
2923
    cmp ecx,ted_seln_y0
2924
    jl .no_cur_sel
2925
    cmp ecx,ted_seln_y1
2926
    jg .no_cur_sel
2927
    mov edx,ted_color_select ;меняем цвет фона на цвет выделения
2928
 
2929
    mov esi,ted_scr_h
2930
	cmp ecx,ted_seln_y0
2931
    jne @f
2932
      mov ecx,ted_cur_x
2933
      add ecx,dword[esi+sb_offs_position]
2934
      cmp ecx,ted_seln_x0
2935
      jge @f
2936
      mov edx,ted_color_wnd_work
2937
    @@:
2938
 
2939
    mov ecx,ted_cur_y
2940
    cmp ecx,ted_seln_y1
2941
    jne .no_cur_sel
2942
      mov ecx,ted_cur_x
2943
      add ecx,dword[esi+sb_offs_position]
2944
      cmp ecx,ted_seln_x1
2945
      jl .no_cur_sel
2946
      mov edx,ted_color_wnd_work
2947
 
2948
    .no_cur_sel:
2949
  pop ecx
2950
  int 0x40 ;рисование прямоугольника
2951
 
2952
  call ted_get_pos_by_cursor ;берем позицию символа
2953
  cmp ted_gp_opt,2
2954
  jne @f
2955
    mov eax,4
2956
    mov esi,1
2957
    ror ecx,16
2958
    mov bx,cx
2959
    add ebx,0x10001
2960
    call ted_get_symb_color
2961
    call ted_convert_invis_symb
2962
    int 0x40 ;рисование символа
2963
  @@:
2964
 
2965
  popad
2966
  ret
2967
endp
2968
 
2969
;input:
2970
; edx -> pointer to text
2971
; edi -> указатель на структуру tedit
2972
;output:
2973
; ecx = color
2974
; if ted_mode_color=0 then ecx=ted_color_wnd_text
2975
align 4
2976
ted_get_symb_color:
2977
  mov ecx,ted_color_wnd_text ;задаем цвет текста по умолчанию
2978
 
2979
  push eax edx
2980
  cmp ted_mode_color,0
2981
  je .exit
2982
    jmp .on_first
2983
    @@:
2984
      call ted_iterat_perv
2985
      cmp edx,ted_tex_1
2986
      jle .exit
2987
    .on_first:
2988
      xor eax,eax
2989
      mov al,byte[edx+1]
2990
      cmp al,0 ;если al=0 то цвет не меняется
2991
    je @b
2992
 
2993
    cmp eax,ted_colors_text_count
2994
    jge .exit
2995
 
2996
    shl ax,2 ;умножаем индекс цвета на 4 байта
2997
    mov ecx,ted_text_colors ;прибавляем смещение 1-го цвета
2998
    add ecx,eax
2999
    mov ecx,dword[ecx] ;устанавливаем текущий цвет текста по смещению
3000
  .exit:
3001
  pop edx eax
3002
  ret
3003
 
3004
;input:
3005
; edx = pointer to text
3006
; edi = pointer to tedit struct
3007
;description:
3008
; Функция преобразует невидимые символы в печатаемые на экране
3009
align 4
3010
ted_convert_invis_symb:
1458 IgorA 3011
	cmp ted_mode_invis,1
3012
	jne .end_f
3013
		cmp byte[edx],9
3014
		jne @f
3015
			lea edx,[ted_symbol_tab]
3016
		@@:
3017
		cmp byte[edx],13
3018
		jne @f
3019
			mov edx,edi
3020
			add edx,ted_offs_symbol_new_line
3021
		@@:
3022
	.end_f:
3023
	ret
1457 IgorA 3024
 
3025
;input:
3026
; edi = pointer to tedit struct
3027
align 4
3028
ted_scroll_set_redraw:
3029
	push eax
3030
	mov eax,ted_scr_w
3031
	mov dword[eax+sb_offs_redraw],1
3032
	mov eax,ted_scr_h
3033
	mov dword[eax+sb_offs_redraw],1
3034
	pop eax
3035
	ret
3036
 
3037
align 4
3038
proc ted_draw, edit:dword
1458 IgorA 3039
	locals
3040
		line_num dd ?
3041
	endl
3042
	pushad
3043
	mov edi,dword[edit]
1457 IgorA 3044
 
1458 IgorA 3045
	mov eax,4 ;draw text
3046
	mov ecx,ted_text_colors
3047
	mov ecx,dword[ecx]
1457 IgorA 3048
 
1458 IgorA 3049
	mov ebx,ted_wnd_l
3050
	add ebx,ted_rec_l
3051
	shl ebx,16
3052
	add ebx,ted_wnd_t
3053
	add ebx,ted_rec_t
3054
	add ebx,0x10001 ;добавляем отступы для выравнивания буквы по центру
1457 IgorA 3055
 
1458 IgorA 3056
	call ted_sel_normalize ;need before draw select
3057
	mov esi,ted_scr_w
3058
	mov esi,dword[esi+sb_offs_position]
3059
	mov dword[line_num],esi
1457 IgorA 3060
 
1458 IgorA 3061
	stdcall ted_clear_line_before_draw, edi,ebx,1,esi
3062
	call ted_get_first_visible_pos
3063
	cmp edx,0
3064
	je .no_draw_text
3065
	mov esi,1 ;длинна выводимого текста по 1-му символу
3066
	@@:
3067
		call ted_iterat_next
3068
		cmp edx,ted_tex_1
3069
		jle .no_draw_text
1457 IgorA 3070
 
1458 IgorA 3071
		; *** цветовая разметка
3072
		cmp ted_mode_color,0
3073
		je .no_col_change
3074
		cmp byte[edx+1],0
3075
		je .no_col_change
3076
			call ted_get_symb_color
3077
		.no_col_change:
1457 IgorA 3078
 
1458 IgorA 3079
		cmp byte [edx],13
3080
		jne .no_13
3081
			cmp ted_mode_invis,1
3082
			jne .no_invis
3083
				push edx
3084
				mov edx,edi
3085
				add edx,ted_offs_symbol_new_line
3086
				int 0x40
3087
				pop edx
3088
			.no_invis:
3089
			add ebx,ted_rec_h
3090
			;optimized output \/
3091
			mov eax,ted_wnd_h
3092
			add eax,ted_wnd_t
3093
			cmp bx,ax
3094
			jg .no_draw_text
3095
			mov eax,4
3096
			;optimized output /\
3097
			and ebx,0xffff
3098
			ror ebx,16
3099
			add ebx,ted_wnd_l
3100
			add ebx,ted_rec_l
3101
			inc ebx
3102
			ror ebx,16
3103
			inc dword[line_num] ;increment line number
3104
			stdcall ted_clear_line_before_draw,edi,ebx,1,dword[line_num]
3105
			call ted_opt_draw_line_left
3106
			jmp @b
3107
		.no_13:
1457 IgorA 3108
 
1458 IgorA 3109
		int 0x40
3110
		ror ebx,16
3111
		add ebx,ted_rec_w
3112
		mov esi,ted_wnd_l
3113
		add esi,ted_wnd_w
3114
		cmp bx,si
3115
		jl .no_opt
3116
			call ted_opt_draw_line_right
3117
		.no_opt:
3118
		mov si,1
3119
		ror ebx,16
3120
		jmp @b
3121
	.no_draw_text:
1457 IgorA 3122
 
1458 IgorA 3123
	stdcall ted_clear_line_before_draw,edi,ebx,0,dword[line_num]
3124
	call ted_draw_line_numbers
3125
	call ted_draw_main_cursor
1457 IgorA 3126
 
3127
;---------------------------------------------
3128
; set all_redraw flag for draw all ScrollBar
3129
; In some cases it is necessity to draw only the area
3130
; of moving of a "runner", for acceleration of output -
3131
; in this case the flag needs to be reset to 0 (zero).
3132
	mov eax,ted_scr_h
3133
	mov esi,ted_scr_w
3134
	mov dword[eax+sb_offs_all_redraw],1
3135
	mov dword[esi+sb_offs_all_redraw],1
3136
 
3137
; рисование полос прокрутки
3138
	stdcall scroll_bar_horizontal.draw,eax ;[scrollbar_hor_draw]
3139
	stdcall scroll_bar_vertical.draw,esi ;[scrollbar_ver_draw]
3140
; reset all_redraw flag
3141
	mov dword[eax+sb_offs_all_redraw],0
3142
	mov dword[esi+sb_offs_all_redraw],0
3143
;---------------------------------------------
3144
 
3145
  ;left-bottom square
3146
  mov ebx,ted_wnd_l
3147
  shl ebx,16
3148
  add ebx,ted_rec_l
3149
  mov ecx,ted_wnd_t
3150
  add ecx,ted_wnd_h
3151
  shl ecx,16
3152
  mov cx,word[eax+sb_offs_size_y]
3153
  inc cx
3154
  mov edx,ted_color_wnd_capt ;[sc.work]
3155
  mov eax,13
3156
  int 0x40
3157
 
3158
	;right-bottom square
3159
	mov ebx,ted_wnd_l
3160
	add ebx,ted_wnd_w
3161
	shl ebx,16
3162
	mov bx,word[esi+sb_offs_size_x]
3163
	inc bx
3164
	int 0x40
3165
 
3166
	cmp ted_fun_draw_panel_find,0
3167
	je @f
3168
		call ted_fun_draw_panel_find
3169
	@@:
3170
	cmp ted_fun_draw_panel_syntax,0
3171
	je @f
3172
		call ted_fun_draw_panel_syntax
3173
	@@:
3174
	popad
3175
	ret
3176
endp
3177
 
3178
;input:
3179
; edi = pointer to tedit struct
3180
align 4
3181
proc ted_draw_main_cursor
3182
  pushad
3183
 
3184
  mov eax,13 ;draw cursor
3185
  mov ecx,ted_wnd_t ;calc rect -> y0,y1
3186
  add ecx,ted_rec_t
3187
  mov edx,ted_cur_y
3188
  imul edx,ted_rec_h
3189
  add ecx,edx
3190
 
3191
  cmp ted_cur_ins,1 ;проверка режима работы курсора (обычный или вставка)
3192
  jne @f
3193
    mov edx,ted_rec_h
3194
    inc edx   ;1->1, 3->2, 5->3, ...
3195
    shr edx,1 ;edx = высота строки деленная на 2 (когда курсор не полный)
3196
    add ecx,edx
3197
  @@:
3198
  shl ecx,16
3199
  add ecx,ted_rec_h
3200
  cmp ted_cur_ins,1
3201
  jne @f
3202
    shr cx,1 ;делим высоту курсора на 2
3203
  @@:
3204
 
3205
  mov ebx,ted_wnd_l ;calc rect -> x0,x1
3206
  add ebx,ted_rec_l
3207
  mov edx,ted_cur_x
3208
  imul edx,ted_rec_w
3209
  add ebx,edx
3210
  shl ebx,16
3211
  add ebx,ted_rec_w
3212
 
3213
  mov edx,ted_color_cursor
3214
  int 0x40 ;вывод курсора
3215
 
3216
  call ted_get_pos_by_cursor
3217
  cmp ted_gp_opt,2
3218
  jne @f
3219
    mov eax,4 ;draw text
3220
    mov esi,1
3221
    ror ecx,16
3222
    mov bx,cx
3223
    add ebx,0x10001
3224
    cmp ted_cur_ins,1
3225
    jne .no_up_tetx
3226
      mov ecx,ted_rec_h
3227
      inc cx ; 1->1, 3->2, 5->3, ...
3228
      shr cx,1
3229
      sub bx,cx
3230
    .no_up_tetx:
3231
    mov ecx,ted_color_cur_text
3232
    call ted_convert_invis_symb
3233
    int 0x40
3234
  @@:
3235
 
3236
  mov eax,4
3237
  mov ebx,ted_wnd_l
3238
  add ebx,ted_rec_l
3239
  shl ebx,16
3240
  add ebx,ted_wnd_t
3241
  add ebx,3
3242
  mov ecx,ted_color_wnd_bord
3243
  or  ecx,0x80000000
3244
  lea edx,[txtRow]
3245
  int 0x40 ;вывод подписи 'Строка'
3246
 
3247
  add ebx,0x500000
3248
  lea edx,[txtCol]
3249
  int 0x40 ;вывод подписи 'Знак'
3250
 
3251
  cmp ted_tim_undo,0
3252
  je @f
3253
    add ebx,0x500000
3254
    lea edx,[txtOtm]
3255
    int 0x40
3256
    sub ebx,0x500000
3257
  @@:
3258
 
3259
  call ted_draw_buffer
3260
  call ted_draw_help_f1
3261
 
3262
  mov eax,47 ;draw cursor coords
3263
  mov esi,ted_color_wnd_bord
3264
  or  esi,0x40000000
3265
 
3266
  mov edx,ebx
3267
  ror edx,16
3268
  sub edx,35
3269
  ror edx,16
3270
  ;add edx,3
3271
  mov ebx,0x40000 ;Row=...
3272
  mov ecx,ted_scr_w
3273
  mov ecx,dword[ecx+sb_offs_position]
3274
  add ecx,ted_cur_y
3275
  inc ecx
3276
 
3277
push edi
3278
  mov edi,ted_color_wnd_work
3279
  int 0x40 ;вывод числа текущей строки
3280
pop edi
3281
 
3282
  ;mov ebx,0x40000 ;Col=...
3283
  mov ecx,ted_scr_h
3284
  mov ecx,dword[ecx+sb_offs_position]
3285
  add ecx,ted_cur_x
3286
  inc ecx
3287
  add edx,0x500000
3288
push edi
3289
  mov edi,ted_color_wnd_work
3290
  int 0x40 ;вывод числа знаков
3291
pop edi
3292
 
3293
  cmp ted_tim_undo,0
3294
  je @f
3295
    mov ecx,ted_tim_undo
3296
    add edx,0x500000
1458 IgorA 3297
	mov edi,ted_color_wnd_work ;портим регистр edi, но в конце функции это уже не важно
3298
    int 0x40 ;вывод числа отмененных действий
1457 IgorA 3299
  @@:
3300
 
3301
  popad
3302
  ret
3303
endp
3304
 
3305
;input:
3306
; edi = pointer to tedit struct
3307
proc ted_draw_buffer
3308
	pushad
3309
 
3310
	mov eax,ted_buffer
4228 IgorA 3311
	cmp dword[eax],1 ;смотрим размер буфера
3312
	jl @f
1458 IgorA 3313
		mov ebx,ted_rec_l
1457 IgorA 3314
		add bx,300
1458 IgorA 3315
		cmp ebx,ted_wnd_w ;сравниваем координату для вывод текста
3316
		jge @f ;подпись не влазит в окно
3317
 
3318
		add ebx,ted_wnd_l
1457 IgorA 3319
		shl ebx,16
3320
		add ebx,ted_wnd_t
3321
		add ebx,3
3322
		mov ecx,ted_color_wnd_bord
3323
		or ecx,0x40000000
3324
 
3325
		mov edx,ted_buffer
4228 IgorA 3326
		add edx,12
1457 IgorA 3327
		mov esi,edx
3328
		mov edi,ted_color_wnd_work ;edi - destroy not pointer to tedit
3329
		call tl_strlen
3330
		;cmp eax,0 ;буфер пуст
3331
		;je @f
3332
		cmp eax,20
3333
		jle .crop_buf
3334
			mov eax,20 ;обрезка подписи до 20 символов
3335
		.crop_buf:
3336
		mov esi,eax
3337
		mov eax,4
3338
		int 0x40 ;вывод содержимого буфера
3339
 
3340
		sub ebx,50 shl 16
3341
		lea edx,[txtBuf]
3342
		mov esi,edx
3343
		call tl_strlen
3344
		mov esi,eax
3345
		mov eax,4
3346
		xor ecx,0x40000000 ;убираем цвет фона
3347
		int 0x40 ;вывод подписи для буфера
3348
	@@:
3349
	popad
3350
	ret
3351
endp
3352
 
3353
;input:
3354
; edi = pointer to tedit struct
3355
align 4
3356
proc ted_draw_help_f1
1458 IgorA 3357
	pushad
3358
	cmp ted_rec_t,13 ;минимальная высота для рисования справки
3359
	jle @f
3360
		mov eax,13 ;clear place before draw help
3361
		mov ebx,ted_wnd_l
3362
		add ebx,ted_rec_l
3363
		shl ebx,16
3364
		add ebx,ted_wnd_w
3365
		sub ebx,ted_rec_l
3366
		mov ecx,ted_wnd_t
3367
		add ecx,13
3368
		shl ecx,16
3369
		add ecx,ted_rec_h
3370
		mov edx,ted_color_wnd_capt
3371
		int 0x40
1457 IgorA 3372
 
1458 IgorA 3373
	cmp ted_help_id,-1
3374
	je @f
3375
		mov eax,ted_help_id
3376
		ColToIndexOffset eax,edx
1457 IgorA 3377
 
1458 IgorA 3378
		;SetCoordinates
3379
		mov ebx,ted_wnd_l
3380
		add ebx,ted_rec_l
3381
		shl ebx,16
3382
		add ebx,ted_wnd_t
3383
		add ebx,13 ;=3+10
1457 IgorA 3384
 
1458 IgorA 3385
		;SetTextColor
3386
		xor eax,eax
2102 IgorA 3387
		mov al,byte[edx+MAX_COLOR_WORD_LEN+7]
1458 IgorA 3388
		shl ax,2
3389
		mov ecx,ted_text_colors
3390
		add ecx,eax
3391
		mov ecx,dword[ecx]
3392
		or	ecx,0xc0000000 ;SetTextStyles
3393
		mov esi,edi
3394
			mov edi,ted_color_wnd_work
3395
			mov eax,4
3396
			int 0x40
3397
		mov edi,esi
1457 IgorA 3398
 
1458 IgorA 3399
		;*** draw help string ***
3400
		mov ecx,ted_color_wnd_bord
3401
		or ecx,0x80000000
3402
		mov edx,dword[edx+MAX_COLOR_WORD_LEN]
3403
		cmp edx,0
3404
		je @f
3405
			add edx,ted_help_text_f1
3406
			add ebx,0x500000
3407
			int 0x40
3408
	@@:
3409
	popad
3410
	ret
1457 IgorA 3411
endp
3412
 
3413
;input:
3414
; edi = pointer to tedit struct
3415
align 4
3416
proc ted_draw_line_numbers
3417
  pushad
3418
 
3419
  ;top panel with caption
3420
  mov ebx,ted_wnd_l
3421
;  add ebx,ted_rec_l
3422
  shl ebx,16
3423
  add ebx,ted_wnd_w
3424
;  sub ebx,ted_rec_l
3425
  mov edx,ted_color_wnd_work
3426
  mov ecx,ted_wnd_t
3427
  shl ecx,16
3428
  add ecx,ted_rec_t
3429
  mov eax,13
3430
  mov edx,ted_color_wnd_capt
3431
  int 0x40
3432
 
3433
  ;line numbers
3434
  mov ebx,0x40000 ;format
3435
  mov ecx,ted_scr_w
3436
  mov ecx,dword[ecx+sb_offs_position]
3437
  inc ecx
3438
  mov edx,3
3439
  add edx,ted_wnd_l
3440
  rol edx,16
3441
  add edx,ted_wnd_t
3442
  add edx,ted_rec_t
3443
  @@:
3444
 
3445
push ebx ecx edx
3446
  ;left panel with numbers
3447
  mov ebx,ted_wnd_l
3448
  shl ebx,16
3449
  add ebx,ted_rec_l
3450
  mov ecx,ted_rec_h
3451
  rol ecx,16
3452
  mov cx,dx
3453
  rol ecx,16
3454
  mov eax,13
3455
  mov edx,ted_color_wnd_capt
3456
  int 0x40 ;рисуем прямоугольник под номером строки
3457
pop edx ecx ebx
3458
 
3459
    mov eax,47
3460
    mov esi,ted_color_wnd_bord
3461
    int 0x40 ;рисуем номер строки
3462
    inc ecx
3463
    add edx,ted_rec_h
3464
    sub edx,ted_wnd_t
3465
	mov esi,edx
3466
	and esi,0xffff
3467
    cmp esi,ted_wnd_h
3468
    jge @f
3469
    add edx,ted_wnd_t
3470
    jmp @b
3471
  @@:
3472
 
3473
  popad
3474
  ret
3475
endp
3476
 
3477
;output:
3478
; ah = symbol
3479
align 4
3480
proc KeyConvertToASCII, table:dword
1464 IgorA 3481
	push ebx
3482
	mov ebx,dword[table] ;convert scan to ascii
3483
	ror ax,8
3484
	xor ah,ah
3485
	add bx,ax ;? ebx,eax
3486
	mov ah,byte[ebx]
3487
	pop ebx
3488
	ret
1457 IgorA 3489
endp
3490
 
3491
align 4
3492
proc ted_draw_cur_line, edit:dword
3493
  pushad
3494
    mov edi,dword[edit]
3495
 
3496
    mov ebx,ted_wnd_l
3497
    add ebx,ted_rec_l
3498
    shl ebx,16
3499
    mov eax,ted_cur_y
3500
    imul eax,ted_rec_h
3501
	mov bx,ax
3502
    add ebx,ted_wnd_t
3503
    add ebx,ted_rec_t ;ebx - координаты для прямоугольника очистки линии
3504
	add ebx,0x10001   ;добавляем отступы для выравнивания буквы по центру
3505
 
3506
    call ted_sel_normalize ;need before draw select
3507
	mov ecx,ted_cur_y
3508
	mov eax,ted_scr_w
3509
    add ecx,dword[eax+sb_offs_position]
3510
    stdcall ted_clear_line_before_draw,edi,ebx,1,ecx
3511
 
3512
    mov eax,ted_scr_h
3513
	mov esi,dword[eax+sb_offs_position]
3514
    call ted_get_pos_by_coords
3515
 
3516
  cmp ted_gp_opt,2
3517
  jne .no_draw_text
3518
;  mov eax,4 ;draw text
3519
  call ted_get_symb_color
3520
  mov esi,1 ;draw 1 symbol
3521
  @@:
3522
    ;call ted_iterat_next
3523
    cmp edx,ted_tex_1
3524
    jle .no_draw_text
3525
 
3526
    ; *** цветовая разметка
3527
    cmp ted_mode_color,0
3528
    je .no_col_change
3529
    cmp byte[edx+1],0
3530
    je .no_col_change
3531
      call ted_get_symb_color
3532
    .no_col_change:
3533
 
3534
    mov eax,4 ;draw text
3535
    cmp byte [edx],13
3536
    jne .no_13
3537
      cmp ted_mode_invis,1
3538
      jne .no_draw_text
3539
 push edx
3540
 mov edx,edi
3541
 add edx,ted_offs_symbol_new_line
3542
 int 0x40
3543
 pop edx
3544
      jmp .no_draw_text
3545
    .no_13:
3546
 
3547
    int 0x40
3548
    ror ebx,16
3549
    add ebx,ted_rec_w
3550
    mov eax,ted_wnd_w
3551
    add eax,ted_wnd_l ;ax = отступ по оси x
3552
    cmp bx,ax
3553
    jge .no_draw_text ;Opt
3554
    ror ebx,16
3555
    call ted_iterat_next
3556
    jmp @b
3557
  .no_draw_text:
3558
 
3559
  call ted_draw_main_cursor
3560
  popad
3561
  ret
3562
endp
3563
 
3564
;input:
3565
; eax - text need find
3566
; bl - first symbol to find
3567
; edx - first symbol pointer
3568
; edi - pointer to tedit struct
3569
;output:
3570
; bh - rezult
3571
; edx - last text position (if find sucess)
3572
; esi - first symbol pointer
3573
;description:
3574
; Функция проверяет совпадает ли текст в буфере eax
3575
; с текстом редактора по указателю edx.
3576
; Стандартные функции (напр. strcmp) тут не подойдут, потому что
3577
; в памяти редактора текст содержится не в виде ascii строк.
3578
align 4
3579
ted_get_find_rezult:
3580
  push eax
3581
    mov bh,1
3582
    mov esi,edx ;copy edx
3583
    @@:
3584
      cmp byte[edx],bl
3585
      jne .no_text
3586
 
3587
      inc eax ;*** get next symbol (in find text) ***
3588
      mov bl,byte[eax]
3589
      cmp bl,0
3590
      je @f ;end of find text
3591
 
3592
      call ted_iterat_next ;*** get next symbol (in editor text) ***
3593
      cmp edx,ted_tex_1
3594
      jle @f ;end of editor text
3595
 
3596
      jmp @b
3597
      .no_text:
3598
	xor bh,bh
3599
	mov edx,esi ;restore edx
3600
    @@:
3601
  pop eax
3602
  mov bl,byte[eax] ;restore bl
3603
  ret
3604
 
3605
;input:
3606
;  clear_o - если =1 очистить одну строку, =0 очистить все строки окна до низу
3607
align 4
3608
proc ted_clear_line_before_draw, edit:dword, coords:dword, clear_o:dword, numb_lin:dword
3609
	pushad
3610
	mov edi,dword[edit]
3611
	mov ebx,dword[coords]	;ebx = x*2^16+y coords to left up point clear line
3612
	mov esi,dword[numb_lin] ;esi - number text line
3613
 
3614
	sub ebx,0x10001 ;отнимаем отступы для выравнивания буквы по центру
3615
	cmp dword[clear_o],0
3616
	jne @f
3617
		add ebx,ted_rec_h
3618
		inc esi
3619
		ror ebx,16
3620
		xor bx,bx
3621
		add ebx,ted_wnd_l
3622
		add ebx,ted_rec_l ;bx = ted_wnd_l+ted_rec_l
3623
		ror ebx,16
3624
	@@:
3625
 
3626
	mov eax,ted_wnd_h
3627
	add eax,ted_wnd_t
3628
	cmp ax,bx
3629
	jl .no_clear
3630
	sub ax,bx
3631
 
3632
	mov cx,bx
3633
	shl ecx,16
3634
 
3635
	xor bx,bx
3636
	add ebx,ted_wnd_w
3637
	sub ebx,ted_rec_l
3638
	xor cx,cx
3639
	add ecx,ted_rec_h
3640
	mov edx,ted_color_wnd_work
3641
 
3642
	cmp dword[clear_o],0
3643
	je .pusto
3644
	cmp ax,cx
3645
	jge @f
3646
	.pusto:
3647
		mov cx,ax
3648
	@@:
3649
 
3650
	call ted_is_select
3651
	cmp al,0
3652
	je @f
3653
	cmp ted_seln_y0,esi
3654
	jg @f
3655
	cmp ted_seln_y1,esi
3656
	jl @f
3657
		mov edx,ted_color_select ;draw selected line
3658
	@@:
3659
 
3660
	mov eax,13 ;rect
3661
	int 0x40
3662
 
3663
	call ted_is_select
3664
	cmp al,0
3665
	je .no_clear
3666
 
3667
	mov al,13 ;rect
3668
	xor cx,cx
3669
	add ecx,ted_rec_h
3670
	cmp ted_seln_y0,esi
3671
	jne @f
3672
		push bx esi
3673
		mov edx,ted_seln_x0 ; верхняя полоса (затирает слева)
3674
		mov esi,ted_scr_h
3675
		cmp edx,dword[esi+sb_offs_position]
3676
		jle .in_wnd
3677
			sub edx,dword[esi+sb_offs_position]
3678
			imul edx,ted_rec_w
3679
			mov bx,dx
3680
			jmp .no_wnd
3681
		.in_wnd:
3682
		mov bx,0
3683
		.no_wnd:
3684
		mov edx,ted_color_wnd_work
3685
		int 0x40
3686
		pop esi bx
3687
	@@:
3688
	cmp ted_seln_y1,esi
3689
	jne @f
3690
		push esi
3691
		mov edx,ted_seln_x1 ; нижняя полоса (затирает справа)
3692
		mov esi,ted_scr_h
3693
		cmp edx,dword[esi+sb_offs_position]
3694
		jle .in_wnd2
3695
			sub edx,dword[esi+sb_offs_position]
3696
			imul edx,ted_rec_w
3697
			sub bx,dx
3698
			shl edx,16
3699
			add ebx,edx
3700
		.in_wnd2:
3701
 
3702
		mov edx,ted_color_wnd_work
3703
		int 0x40
3704
		pop esi
3705
	@@:
3706
 
3707
	.no_clear:
3708
	popad
3709
	ret
3710
endp
3711
 
3712
;input:
3713
; edi = pointer to tedit struct
3714
;output:
3715
; ecx = новый цвет символа
3716
; edx = pointer to symbol
3717
; edx = 0 if text not in screen
3718
align 4
3719
ted_get_first_visible_pos:
3720
	push eax ecx
3721
	mov eax,ted_scr_w
3722
	mov edx,ted_tex
3723
	xor ecx,ecx
3724
	@@:
3725
		cmp ecx,dword[eax+sb_offs_position]
3726
		je @f
3727
		call ted_iterat_next
3728
		cmp edx,ted_tex_1
3729
		jle @f
3730
		cmp byte [edx],13
3731
		jne @b
3732
		inc ecx
3733
		jmp @b
3734
	@@:
3735
 
3736
	cmp ecx,dword[eax+sb_offs_position]
3737
	je @f
3738
		xor edx,edx
3739
	@@:
3740
	cmp ecx,dword[eax+sb_offs_max_area]
3741
	jle @f
3742
		mov dword[eax+sb_offs_max_area],ecx
3743
	@@:
3744
	pop ecx eax
3745
	call ted_opt_draw_line_left
3746
	ret
3747
 
3748
;input:
3749
; edx = pointer to symbol
3750
; edi = pointer to tedit struct
3751
;output:
3752
; ecx = цвет символа
3753
; edx = указатель на первый левый символ
3754
;description:
3755
; функция нужна для оптимизации вывода текста
3756
align 4
3757
proc ted_opt_draw_line_left
3758
  push ebx
3759
 
3760
  mov ebx,ted_scr_h
3761
  mov ebx,dword[ebx+sb_offs_position]
3762
  cmp ebx,0
3763
  je .ret_f
3764
  push eax
3765
  mov eax,edx
3766
 
3767
  cmp edx,ted_tex
3768
  jne @f
3769
    call ted_iterat_next
3770
    jmp .beg_cycle
3771
  @@:
3772
 
3773
  cmp ebx,0
3774
  je @f
3775
 
3776
  cmp byte[edx],13
3777
  jne @f
3778
    call ted_iterat_next
3779
    .beg_cycle:
3780
  @@:
3781
    cmp edx,ted_tex_1
3782
    jle @f
3783
    cmp byte[edx],13
3784
    je @f
3785
    cmp ebx,0
3786
    je @f
3787
;--------------------------------------
3788
xor eax,eax ;eax будет меняться
3789
mov al,byte[edx+1]
3790
cmp al,0
3791
je .no_color
3792
cmp eax,ted_colors_text_count
3793
jge .no_color
3794
  xor ecx,ecx
3795
  mov cl,byte[edx+1]
3796
  shl cx,2
3797
  add ecx,ted_text_colors
3798
  mov ecx,dword[ecx]
3799
.no_color:
3800
;--------------------------------------
3801
    mov eax,edx
3802
    call ted_iterat_next
3803
    dec ebx
3804
    jmp @b
3805
  @@:
3806
    mov edx,eax
3807
  pop eax
3808
  .ret_f:
3809
  call ted_get_symb_color
3810
  pop ebx
3811
  ret
3812
endp
3813
 
3814
;input:
3815
; edx = pointer to symbol
3816
; edi = pointer to tedit struct
3817
;output:
3818
; ecx = symbol color
3819
; edx = pointer to 13 symbol
3820
;description:
3821
; функция нужна для оптимизации вывода текста
3822
align 4
3823
proc ted_opt_draw_line_right
3824
	push eax
3825
	mov eax,edx
3826
	@@:
3827
		cmp edx,ted_tex_1
3828
		jle @f
3829
		cmp byte[edx],13
3830
		je @f
3831
		mov eax,edx
3832
		call ted_iterat_next
3833
		jmp @b
3834
	@@:
3835
	mov edx,eax ;perv sumbol
3836
	call ted_get_symb_color
3837
 
3838
	pop eax
3839
	ret
3840
endp
3841
 
3842
align 4
3843
proc ted_mouse, edit:dword
3844
	pushad
3845
	mov edi,dword[edit]
3846
 
3847
	;обрабатываем скроллинги
3848
	mov edx,ted_scr_h
3849
	mov ecx,ted_scr_w
3850
 
3851
	cmp word[edx+sb_offs_delta2],0
3852
	jne .horizontal
3853
 
3854
	mov eax,dword[ecx+sb_offs_max_area]
3855
	cmp eax,dword[ecx+sb_offs_cur_area]
3856
	jbe .horizontal
3857
	; mouse event for Vertical ScrollBar
3858
	stdcall scroll_bar_vertical.mouse,ecx ;[scrollbar_ver_mouse]
3859
	cmp dword[ecx+sb_offs_redraw],0
3860
	je @f
3861
		mov dword[ecx+sb_offs_redraw],0
3862
		stdcall ted_draw,edi
3863
		jmp .no_in_wnd
3864
	@@:
3865
	cmp word[ecx+sb_offs_delta2],0
3866
	jne .no_in_wnd
3867
	.horizontal:
3868
	mov eax,dword[edx+sb_offs_max_area]
3869
	cmp eax,dword[edx+sb_offs_cur_area]
3870
	jbe .other
3871
	; mouse event for Horizontal ScrollBar
3872
	stdcall scroll_bar_horizontal.mouse,edx ;[scrollbar_hor_mouse]
3873
	cmp dword[edx+sb_offs_redraw],0
3874
	je .other
3875
		mov dword[edx+sb_offs_redraw],0
3876
		stdcall ted_draw,edi
3877
		jmp .no_in_wnd
3878
	.other:
3879
	cmp word[ecx+sb_offs_delta2],0
3880
	jne .no_in_wnd
3881
	cmp word[edx+sb_offs_delta2],0
3882
	jne .no_in_wnd
3883
 
3884
	;обрабатываем окно редактора
3885
	mcall 37,2 ;get mouse buttons
3886
	cmp al,1
3887
	jne @f
3888
		mcall 37,1 ;get mouse coords
3889
		mov ebx,ted_wnd_t
3890
		add ebx,ted_rec_t
3891
		cmp ax,bx
3892
		jl @f ;y_mouse
3893
 
3894
		sub ebx,ted_rec_t
3895
		add ebx,ted_wnd_h
3896
		cmp bx,ax
3897
		jl @f ;y_mouse>y_wnd
3898
 
3899
		mov ebx,ted_wnd_l
3900
		add ebx,ted_rec_l
3901
		mov ecx,eax
3902
		shr ecx,16
3903
		cmp cx,bx
3904
		jl @f ;x_mouse
3905
 
3906
		sub ebx,ted_rec_l
3907
		add ebx,ted_wnd_w
3908
		cmp bx,cx
3909
		jl @f ;x_mouse>x_wnd
3910
 
3911
		call ted_draw_cursor_sumb
3912
		call ted_wnd_main_click
3913
		jmp .no_in_wnd
3914
	@@:
1458 IgorA 3915
	mov edx,ted_el_focus
3916
	cmp dword[edx],edi
3917
	jne @f
3918
		call ted_wnd_main_mouse_scroll ;смотрим на прокрутку колеса мыши
3919
	@@:
1457 IgorA 3920
	cmp ted_drag_m,0
3921
	je .no_in_wnd
3922
		mov ted_drag_m,0
3923
		stdcall ted_draw,edi
3924
		cmp ted_fun_draw_panel_buttons,0
3925
		je .no_in_wnd
3926
			call ted_fun_draw_panel_buttons
3927
	.no_in_wnd:
3928
	popad
3929
	ret
3930
endp
3931
 
3932
;input:
3933
; eax -> (x,y)
3934
; edi -> указатель на структуру tedit
3935
;description:
3936
; функция вызывется при нажатии кнопкой мыши и попадении курсором в окно редактора
3937
align 4
3938
ted_wnd_main_click:
1458 IgorA 3939
	push ebx ecx edx
3940
	mov ebx,ted_el_focus
3941
	mov dword[ebx],edi ;ставим фокус
1457 IgorA 3942
 
3943
  push eax
3944
    shr eax,16
3945
    and eax,0xffff
3946
    sub eax,ted_wnd_l
3947
    sub eax,ted_rec_l
3948
 
3949
    xor edx,edx
3950
    mov ecx,ted_rec_w
3951
    div cx
3952
    ;inc eax
3953
	mov ebx,ted_scr_h
3954
    cmp eax,dword[ebx+sb_offs_cur_area]
3955
    jle @f
3956
      mov eax,dword[ebx+sb_offs_cur_area]
3957
    @@:
3958
    ;dec eax
3959
    mov ted_cur_x,eax
3960
  pop eax
3961
 
3962
  push eax
3963
    and eax,0xffff
3964
    sub eax,ted_wnd_t
3965
    sub eax,ted_rec_t
3966
 
3967
    xor edx,edx
3968
    mov ecx,ted_rec_h
3969
    div cx
3970
    inc eax
3971
	mov ebx,ted_scr_w
3972
    cmp eax,dword[ebx+sb_offs_cur_area]
3973
    jle @f
3974
      mov eax,dword[ebx+sb_offs_cur_area]
3975
    @@:
3976
    dec eax
3977
    mov ted_cur_y,eax
3978
  pop eax
3979
 
1458 IgorA 3980
	cmp ted_drag_m,0
3981
	je @f
3982
		call ted_sel_move
3983
		jmp .sel_move
3984
	@@:
3985
		mov ted_drag_m,1
3986
		call ted_sel_start
3987
	.sel_move:
3988
	pop edx ecx ebx
3989
	ret
1457 IgorA 3990
 
3991
;input:
3992
; edi = pointer to tedit struct
3993
align 4
3994
ted_wnd_main_mouse_scroll:
3995
	push eax ebx ecx
1458 IgorA 3996
	mcall 37,7 ;прокрутка колеса мыши
1457 IgorA 3997
	cmp ax,0
3998
	je .no_scroll
3999
		mov ecx,ted_scr_w
4000
		mov ebx,dword[ecx+sb_offs_position] ;copy old scroll position
4001
		and eax,0xffff
4002
		btr ax,15
4003
		jae @f
4004
			or eax,0xffff8000
1458 IgorA 4005
		@@:
4006
		add dword[ecx+sb_offs_position],eax
1457 IgorA 4007
 
1458 IgorA 4008
		mov eax,[ecx+sb_offs_position]
4009
		cmp eax,[ecx+sb_offs_max_area]
4010
		jb @f
4011
			mov dword[ecx+sb_offs_position],ebx ;if scroll position out of range
4012
			jmp .no_scroll
4013
		@@:
4014
		stdcall ted_draw,edi
1457 IgorA 4015
	.no_scroll:
4016
	pop ecx ebx eax
4017
	ret
4018
 
4019
align 4
4020
proc ted_but_save_file, edit:dword, file:dword, f_name:dword
4021
  pushad
4022
  mov edi,dword[edit]
4023
 
4024
  stdcall ted_can_save,edi
4025
  cmp al,0
2102 IgorA 4026
;  je .no_save
1457 IgorA 4027
 
4028
  mov ecx,ted_max_chars
1489 IgorA 4029
  invoke mem.alloc,ecx
1457 IgorA 4030
  push eax ;запоминаем указатель на выделенную память
4031
 
4032
  mov edx,ted_tex
4033
  xor ecx,ecx
4034
  @@:
4035
    call ted_iterat_next
4036
    cmp edx,ted_tex_1
4037
    jle @f ;edx = ted_tex or edx = ted_tex+sizeof.symbol
4038
    mov bl,[edx]
4039
    mov byte[eax],bl
4040
    inc eax
4041
    inc ecx
4042
    jmp @b
4043
  @@:
4044
 
4045
  cmp ecx,0
4046
  je @f
4047
    mov ebx,dword[file]
4048
    pop eax ;записываем указатель на выделенную память
4049
    mov dword[ebx+16],eax
4050
    push eax ;обратно запоминаем указатель на выделенную память
4051
    mov eax,70
4052
    mov dword[ebx], 2
4053
    mov dword[ebx+4], 0
4054
    mov dword[ebx+8], 0
4055
    mov dword[ebx+12], ecx
4056
    mov  byte[ebx+20], 0
4057
    push dword[f_name]
4058
    pop dword[ebx+21]
4059
    int 0x40
4060
 
4061
    mov ted_err_save,al
4062
 
4063
    cmp eax,0
4064
    je .no_msg
4065
;    cmp eax,6
4066
;    je @f
4067
      cmp ax,10
4068
      jl .zifra_0_9
4069
	mov al,'?'
4070
	sub ax,48
4071
      .zifra_0_9:
4072
      add ax,48
4073
cmp ted_fun_save_err,0
4074
je @f
4075
call ted_fun_save_err
4076
      jmp @f
4077
    .no_msg:
4078
    m2m ted_tim_ls,ted_tim_ch
4079
  @@:
4080
 
4081
  pop ecx ;записываем указатель на выделенную память
1489 IgorA 4082
  invoke mem.free,ecx
1457 IgorA 4083
  .no_save:
4084
  popad
4085
  ret
4086
endp
4087
}