Subversion Repositories Kolibri OS

Rev

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