Subversion Repositories Kolibri OS

Rev

Rev 8036 | Rev 8532 | 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
8036 IgorA 3
; файл последний раз изменялся 10.06.2020 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
1233
		cmp ebx,0
1234
		jne .beg_cycle
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
1241
		cmp ebx,0
1242
		jne .beg_cycle
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:
1957
  push edx
1958
  xor eax,eax
1959
  xor ebx,ebx
1960
  @@:
1961
    call ted_iterat_perv
1962
 
1963
    cmp eax,0
1964
    jne .no_col_mov
1965
    inc ebx
1966
    .no_col_mov:
1967
 
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
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 ? ;конечная позиция
2204
	find db ? ;найдено / не найдено
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
 
6086 IgorA 2220
		xor eax,eax
2221
		mov al,byte[edx]
2222
		shl ax,2 ;eax*=4
2223
		add eax,ted_arr_key_pos
7497 IgorA 2224
		mov eax,[eax]
6086 IgorA 2225
		cmp eax,0
7877 IgorA 2226
		jl .cycle0 ;if( (word_n=ted_arr_key_pos[(unsigned char)tex[i].c])>-1 ){
1457 IgorA 2227
 
6086 IgorA 2228
		mov ecx,eax
2229
		;while(l_pos
2230
		.wh_1b:
2231
			cmp ecx,ted_key_words_count
2232
			jge .wh_1e
2233
			ColToIndexOffset ecx,esi
2234
			mov bl,byte[esi]
2235
			ColToIndexOffset eax,esi
2236
			cmp bl,byte[esi]
2237
			jne .wh_1e
2238
				inc ecx
2239
			jmp .wh_1b
2240
		.wh_1e:
1457 IgorA 2241
 
7497 IgorA 2242
		mov [begPos],edx ;bP=i;
6086 IgorA 2243
		mov esi,1
2244
align 4
2245
		.wh_2b: ;while(1){
2246
		call ted_iterat_next
1457 IgorA 2247
 
6086 IgorA 2248
		;while(l_pos>word_n && Col[l_pos-1].Text[pos]!=tex[i].c)
7877 IgorA 2249
		@@:
6086 IgorA 2250
			cmp ecx,eax
7877 IgorA 2251
			jle @f
6086 IgorA 2252
			dec ecx
2253
			ColToIndexOffset ecx,ebx
2254
			inc ecx
2255
			;cmp byte[ebx+esi],byte[edx]
2256
			mov bl,byte[ebx+esi]
2257
			cmp bl,byte[edx]
7877 IgorA 2258
			je @f
6086 IgorA 2259
				dec ecx
7877 IgorA 2260
			jmp @b
2261
		@@:
1457 IgorA 2262
 
6086 IgorA 2263
		ColToIndexOffset eax,ebx
2264
		cmp byte[ebx+esi],0
2265
		jne .if_0 ;if(Col[word_n].Text[pos]==0){
7497 IgorA 2266
		mov [endPos],edx ;eP=i;
6086 IgorA 2267
		ColToIndexOffset eax,ebx
7497 IgorA 2268
		mov bl,[ebx+MAX_COLOR_WORD_LEN+7]
2269
		mov [f_color],bl ;f_color=Col[word_n].color;
1457 IgorA 2270
 
6086 IgorA 2271
		mov byte[find],1
2272
		ColToIndexOffset eax,ebx ;... ebx = Col[word_n]
7497 IgorA 2273
		mov bl,[ebx+MAX_COLOR_WORD_LEN+4]
6086 IgorA 2274
		cmp bl,0 ;if(Col[word_n].wwo)
2275
		je .if_2n
2276
			push edx
7497 IgorA 2277
			mov edx,[begPos]
6086 IgorA 2278
			call ted_iterat_perv
1457 IgorA 2279
 
6086 IgorA 2280
			btr bx,0 ;1-1
7877 IgorA 2281
			jae @f ;if(Col[word_n].wwo&1)
6086 IgorA 2282
				;u1= !(isalnum(cont_s)||cont_s=='_')
2283
				call isalnum
7877 IgorA 2284
				jae @f
6086 IgorA 2285
					mov byte[find],0
2286
					jmp .if_4e
7877 IgorA 2287
			@@:
1457 IgorA 2288
 
6086 IgorA 2289
			btr bx,3 ;4-1
2290
			jae .if_4e ;if(Col[word_n].wwo&8)
2291
				;u1= !isalpha(cont_s);
2292
				call isalpha
2293
				jae .if_4e
2294
					mov byte[find],0
2295
			.if_4e:
1457 IgorA 2296
 
7497 IgorA 2297
			mov edx,[endPos]
6086 IgorA 2298
			;call ted_iterat_next
1457 IgorA 2299
 
6086 IgorA 2300
			btr bx,1 ;2-1
7877 IgorA 2301
			jae @f ;if(Col[word_n].wwo&2)
6086 IgorA 2302
				;u1= !(isalnum(cont_s)||cont_s=='_')
2303
				call isalnum
7877 IgorA 2304
				jae @f
6086 IgorA 2305
					mov byte[find],0
2306
					jmp .if_6e
7877 IgorA 2307
			@@:
1457 IgorA 2308
 
6086 IgorA 2309
			btr bx,4 ;5-1
2310
			jae .if_6e ;if(Col[word_n].wwo&16)
2311
				;u1= !isalpha(cont_s);
2312
				call isalpha
2313
				jae .if_6e
2314
					mov byte[find],0
2315
			.if_6e:
1457 IgorA 2316
 
6086 IgorA 2317
			btr bx,2 ;3-1
2318
			jae .if_7e ;if(Col[word_n].wwo&4)
2319
				ColToIndexOffset eax,ebx
2320
				mov bx,word[ebx+MAX_COLOR_WORD_LEN+5]
2321
				call ted_iterat_next_pos_char
2322
				cmp edx,ted_tex_1
7877 IgorA 2323
				jg @f
2324
					;если дошли до конца файла и не нашли символ конца разметки
2325
					call ted_iterat_perv
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
 
6086 IgorA 2364
		cmp byte[find],1 ;if(fnd)break;
7877 IgorA 2365
		je .cycle0end
7497 IgorA 2366
			mov edx,[begPos];i=bP;
7877 IgorA 2367
		jmp .cycle0
2368
	.cycle0end:
1457 IgorA 2369
 
6086 IgorA 2370
	cmp byte[find],1
2371
	jne .if_1e ;if(fnd){ // выделение найденого текста
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;
2378
		;return ItPoPerv(eP); // возвращаем позицию конца вхождения
7497 IgorA 2379
		mov edx,[endPos]
6086 IgorA 2380
		call ted_get_text_perv_pos
2381
		jmp @f
2382
	.if_1e:
2383
		mov edx,ted_tex
2384
	@@:
1457 IgorA 2385
 
6086 IgorA 2386
	ret
1457 IgorA 2387
endp
2388
 
2389
;input:
2390
; edx = pointer to char (byte)
2391
;output:
2392
; cf=1 if symbol is...
6274 IgorA 2393
align 16
6086 IgorA 2394
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
2395
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 2396
 
6086 IgorA 2397
;output:
2398
; cf=1 если в [edx] буква, цифра или '_'
6274 IgorA 2399
align 16
1457 IgorA 2400
isalnum:
6086 IgorA 2401
	push eax ebx
2402
	movzx eax,byte[edx] ;al=offset
2403
	shr eax,3
2404
	lea ebx,[tab_all_num]
2405
	add ebx,eax
2406
	movzx ax,byte[edx] ;al=bit
2407
	and ax,111b
2408
	bt word[ebx],ax
2409
	pop ebx eax
2410
	ret
2411
 
2412
;output:
2413
; cf=1 если в [edx] буква или '_'
6274 IgorA 2414
align 16
1457 IgorA 2415
isalpha:
6086 IgorA 2416
	push eax ebx
2417
	movzx eax,byte[edx] ;al=offset
2418
	shr eax,3
2419
	lea ebx,[tab_alpha]
2420
	add ebx,eax
2421
	movzx ax,byte[edx] ;al=bit
2422
	and ax,111b
2423
	bt word[ebx],ax
2424
	pop ebx eax
2425
	ret
1457 IgorA 2426
 
6274 IgorA 2427
align 16
6086 IgorA 2428
proc ted_show_help_f1 uses eax edx edi, edit:dword
6274 IgorA 2429
	mov edi,[edit]
1457 IgorA 2430
 
6086 IgorA 2431
	call ted_get_pos_by_cursor
2432
	push edx
2433
		call ted_iterat_next_color_tag
2434
		mov eax,edx
2435
	pop edx
2436
	call ted_iterat_perv_color_tag
1457 IgorA 2437
 
6086 IgorA 2438
	cmp eax,ted_tex
2439
	jle @f
2440
	cmp edx,ted_tex_1
2441
	jle @f
2442
		stdcall ted_find_help_id,eax
2443
	@@:
2444
	;call ted_draw_main_cursor
2445
	call ted_draw_help_f1
2446
	ret
1457 IgorA 2447
endp
2448
 
2449
;input:
2450
; edx = position begin 'symbol' struct
2451
; edi = pointer to tedit struct
2452
; end_pos = position end 'symbol' struct
6274 IgorA 2453
align 16
8262 IgorA 2454
proc ted_find_help_id uses ebx ecx, end_pos:dword
1457 IgorA 2455
; ecx = word_n
2456
; ebx = l_pos
2457
  mov ted_help_id,-1
2458
 
2459
    xor ebx,ebx
7497 IgorA 2460
    mov bl,[edx]
1457 IgorA 2461
    shl bx,2 ;ebx*=4
2462
    add ebx,ted_arr_key_pos
7497 IgorA 2463
    mov ecx,[ebx]
1457 IgorA 2464
    cmp ecx,0
2465
    jl .if_0e ;if( (word_n=ted_arr_key_pos[(unsigned char)tf[0]])>-1 ){
2466
      push esi eax
2467
      mov ebx,ecx ;l_pos=word_n;
2468
      ColToIndexOffset ecx,esi
2469
      push cx
7497 IgorA 2470
      mov cl,[esi]
1457 IgorA 2471
      @@:
2472
	cmp ebx,ted_key_words_count ;while(l_pos
2473
	jge @f
2474
	;ColToIndexOffset ecx,esi
2475
	ColToIndexOffset ebx,eax
7497 IgorA 2476
	cmp cl,[eax] ;&& Col[l_pos].Text[0]==Col[word_n].Text[0])
1457 IgorA 2477
	jne @f
2478
	  inc ebx ;l_pos++;
2479
	  jmp @b
2480
      @@:
2481
      pop cx
2482
      call ted_iterat_next ;pos=1;
2483
      mov esi,1
2484
      @@:
2485
	push dx
2486
	push word[edx]
2487
	pop dx
2488
	  .wh_0b:
2489
	    cmp ebx,ecx ;while(l_pos>word_n
2490
	    jle .wh_0e
2491
	    dec ebx
2492
	    ColToIndexOffset ebx,eax
2493
	    inc ebx
2494
	    cmp byte[eax+esi],dl ;&& Col[l_pos-1].Text[pos]!=tf[i])
2495
	    je .wh_0e
2496
	      dec ebx ;l_pos--;
2497
	    jmp .wh_0b
2498
	  .wh_0e:
2499
 
2500
	  .wh_1b:
2501
	    cmp ebx,ecx ;while(l_pos>word_n
2502
	    jle .wh_1e
2503
	    ColToIndexOffset ecx,eax
2504
	    cmp byte[eax+esi],dl
2505
	    je .wh_1e
2506
	      inc ecx ;word_n++;
2507
	    jmp .wh_1b
2508
	  .wh_1e:
2509
	pop dx
2510
 
2511
	cmp ecx,ebx ;if(word_n==l_pos) break;
2512
	je @f
2513
	call ted_iterat_next ;pos++;
7497 IgorA 2514
	cmp edx,[end_pos] ;for(...;i
1457 IgorA 2515
	je @f ;jge
2516
	inc esi
2517
	jmp @b
2518
      @@:
2519
      pop eax esi
2520
 
2521
      mov ted_help_id,ecx
2522
      ;return word_n;
2523
 
2524
    .if_0e:
2525
  ret
2526
endp
2527
 
2528
;output:
2529
; eax = код ошибки
2530
; ebx = колличество прочитанных байт
6274 IgorA 2531
align 16
6087 IgorA 2532
proc ted_open_file uses ecx edx edi, edit:dword, file:dword, f_name:dword ;функция открытия файла
6274 IgorA 2533
	mov edi,[edit]
1457 IgorA 2534
 
2808 IgorA 2535
	; *** проверяем размер памяти и если не хватает то увеличиваем ***
2536
	;пробуем получить информацию о файле
6274 IgorA 2537
	mov ebx,[file]
2538
	mov dword[ebx], SSF_GET_INFO
2808 IgorA 2539
	mov dword[ebx+4], 0
2540
	mov dword[ebx+8], 0
2541
	mov dword[ebx+12], 0
2542
	m2m dword[ebx+16], ted_tex
2543
	mov  byte[ebx+20], 0
2544
	push dword[f_name]
2545
	pop dword[ebx+21]
6274 IgorA 2546
	mcall SF_FILE
2547
	or eax,eax
2548
	jz .end_0
2808 IgorA 2549
		mov edx,ted_max_chars
2550
		cmp eax,2 ;функция не поддерживается для данной файловой системы
2551
		je @f
2552
		jmp .ret_f
6274 IgorA 2553
align 4
2808 IgorA 2554
	.end_0:
2555
	;проверяем хватит ли памяти для загрузки файла
2556
	mov ecx,ted_max_chars
2557
	sub ecx,2 ;ecx = максимальное число байт, для которых была выделена память
2558
	mov edx,ted_tex
6274 IgorA 2559
	mov edx,[edx+32] ;+32 = +0x20: qword: размер файла в байтах
2808 IgorA 2560
	cmp edx,ecx
2561
	jl @f
2562
		;увеличиваем память если не хватило
2563
		mov ecx,edx ;память необходимая для открытия файла
2564
		add ecx,2  ;память для служебных начального и конечного символов
2565
		add ecx,ted_increase_size ;память для редактирования файла
2566
		mov ted_max_chars,ecx
2567
		imul ecx,sizeof.symbol
2568
		invoke mem.realloc, ted_tex,ecx
2569
		mov ted_tex,eax
2570
		mov ted_tex_1,eax
2571
		add ted_tex_1,sizeof.symbol
2572
		add eax,ecx
2573
		mov ted_tex_end,eax
2574
		mov ecx,ted_tex_1
2575
		add ecx,sizeof.symbol
2576
		mov ted_ptr_free_symb,ecx
2577
	@@:
2578
 
2579
	; *** пробуем открыть файл ***
6274 IgorA 2580
	mov ebx,[file]
2581
	mov dword[ebx], SSF_READ_FILE
1457 IgorA 2582
	mov dword[ebx+4], 0
2583
	mov dword[ebx+8], 0
2808 IgorA 2584
	m2m dword[ebx+12], edx ;число байт, которые могут быть считаны с файла (не больше чем ted_max_chars)
1457 IgorA 2585
	m2m dword[ebx+16], ted_tex
2586
	mov  byte[ebx+20], 0
2587
	push dword[f_name]
2588
	pop dword[ebx+21]
6274 IgorA 2589
	mcall SF_FILE
1457 IgorA 2590
 
6274 IgorA 2591
	or eax,eax
2592
	jz @f
1457 IgorA 2593
	cmp eax,6
8262 IgorA 2594
	jne .ret_f
1457 IgorA 2595
	@@:
2596
	cmp ebx,-1
2597
	je .ret_f
2598
		;if open file
2599
		call ted_on_open_file
2600
	.ret_f:
2601
	ret
2602
endp
2603
 
6274 IgorA 2604
align 16
1457 IgorA 2605
proc ted_but_select_word, edit:dword
2606
	pushad
6274 IgorA 2607
	mov edi,[edit]
1457 IgorA 2608
 
2609
	call ted_get_pos_by_cursor
2610
	push edx
2611
		call ted_iterat_perv_color_tag
2612
		cmp edx,ted_tex_1
2613
		jle @f
2614
			call ted_get_text_coords
2615
			mov ted_sel_x0,ebx
2616
			mov ted_sel_y0,eax
2617
		@@:
2618
	pop edx
2619
	call ted_iterat_next_color_tag
2620
	cmp edx,ted_tex_1
2621
	jle @f
2622
		call ted_get_text_coords
2623
		mov ted_sel_x1,ebx
2624
		mov ted_sel_y1,eax
2625
	@@:
2626
 
2627
	cmp ted_fun_draw_panel_buttons,0
2628
	je @f
2629
		call ted_fun_draw_panel_buttons
2630
	@@:
2631
	stdcall ted_draw,edi
2632
	popad
2633
	ret
2634
endp
2635
 
7497 IgorA 2636
;output:
2637
; al = 1 if delete
6274 IgorA 2638
align 16
6087 IgorA 2639
proc ted_but_cut uses edi, edit:dword
6274 IgorA 2640
	mov edi,[edit]
1457 IgorA 2641
 
2642
	stdcall ted_but_copy,edi
2643
	call ted_set_undo
2644
	stdcall ted_sel_text_del,ted_opt_ed_change_time
2645
 
2646
	cmp al,1
2647
	jne @f
2648
		stdcall ted_draw,edi
2649
		cmp ted_fun_draw_panel_buttons,0
2650
		je @f
2651
			call ted_fun_draw_panel_buttons
2652
	@@:
2653
	ret
2654
endp
2655
 
6274 IgorA 2656
align 16
1457 IgorA 2657
proc ted_but_copy, edit:dword
2658
	pushad
6274 IgorA 2659
	mov edi,[edit]
1457 IgorA 2660
 
2661
	call ted_is_select
6274 IgorA 2662
	or al,al
2663
	jz .end_f ;if not selected text
1457 IgorA 2664
	call ted_sel_normalize
2665
 
2666
	mov esi,ted_seln_x1
2667
	mov ecx,ted_seln_y1
2668
	call ted_get_pos_by_coords
2669
	mov ebx,edx
2670
	mov esi,ted_seln_x0
2671
	mov ecx,ted_seln_y0
2672
	call ted_get_pos_by_coords
2673
	mov esi,ebx
2674
 
4228 IgorA 2675
	mov ecx,12 ;system buffer header size
1457 IgorA 2676
	mov ebx,ted_buffer
4228 IgorA 2677
	mov dword[ebx+4],0 ;text data
2678
	mov dword[ebx+8],1 ;code 866
2679
	add ebx,ecx
1457 IgorA 2680
	@@:
2681
		cmp edx,ted_tex_1 ;end of file
2682
		jle @f
2683
		cmp edx,esi ;end of select
2684
		je @f
2685
		inc ecx
2686
		cmp ecx,ted_buffer_size ;owerflow bufer
2687
		je @f
2688
 
2689
		mov al,byte[edx]
2690
		mov byte[ebx],al
2691
		inc ebx
5832 IgorA 2692
		cmp al,13
2693
		jne .no_13
2694
			mov byte[ebx],10 ;делаем конец строки в буфере 13,10 для совместимости с другими программами
2695
			inc ebx
2696
			inc ecx
2697
		.no_13:
2698
 
1457 IgorA 2699
		call ted_iterat_next
2700
		jmp @b
2701
	@@:
2702
	mov byte[ebx],0
2703
 
4542 IgorA 2704
	cmp ecx,12
1457 IgorA 2705
	je .end_f
4228 IgorA 2706
		mov ebx,ted_buffer
6274 IgorA 2707
		mov [ebx],ecx
2708
		mcall SF_CLIPBOARD,SSF_WRITE_CB,ecx,ted_buffer
1457 IgorA 2709
		call ted_draw_buffer
2710
		cmp ted_fun_draw_panel_buttons,0
2711
		je .end_f
2712
			call ted_fun_draw_panel_buttons
2713
	.end_f:
2714
	popad
2715
	ret
2716
endp
2717
 
2718
 
6274 IgorA 2719
align 16
1457 IgorA 2720
proc ted_but_paste, edit:dword
4228 IgorA 2721
	pushad
6274 IgorA 2722
	mov edi,[edit]
1457 IgorA 2723
 
6274 IgorA 2724
	mcall SF_CLIPBOARD,SSF_GET_SLOT_COUNT
4228 IgorA 2725
	cmp eax,1
2726
	jl .no_buf_r
2727
 
2728
	mov esi,eax
2729
	.cycle: ;обратный цикл по слотам
2730
	dec esi ;номер текущего, проверяемого слота
6274 IgorA 2731
	mcall SF_CLIPBOARD,SSF_READ_CB,esi
4228 IgorA 2732
	cmp eax,1
2733
	je .no_buf_r
2734
	cmp eax,-1
2735
	je .no_buf_r
7497 IgorA 2736
		mov ecx,[eax]
4228 IgorA 2737
		cmp ecx,1 ;size
2738
		jl .no_buf_r
2739
		cmp dword[eax+4],0 ;text
2740
		je @f
2741
			cmp esi,1
2742
			jge .cycle ;если в буфере не текст, а слотов в буфере несколько, пробуем перейти к верхнему слоту
2743
			jmp .no_buf_r
2744
		@@:
2745
		cmp dword[eax+8],1 ;866
2746
		je @f
2747
			cmp esi,1
2748
			jge .cycle ;если в буфере текст не в кодировке 866 ... пробуем перейти к верхнему слоту
2749
			jmp .no_buf_r
2750
		@@:
2751
		;копирование текста из системного буфера во внутренний
2752
		cmp ecx,ted_buffer_size
2753
		jle @f
2754
			mov ecx,ted_buffer_size
2755
		@@:
2756
		mov edi,ted_buffer
2757
		mov esi,eax
2758
		add	esi,4 ;12
2759
		mov dword[edi],ecx
2760
		add edi,4 ;12
2761
		sub ecx,4 ;12
2762
		rep movsb
6274 IgorA 2763
		mov edi,[edit]
4228 IgorA 2764
 
2765
		mov esi,eax
2766
		add	esi,12
2767
		jmp .buf_r
2768
	.no_buf_r:
2769
 
2770
	;если не удалось прочитать данные из системного буфера, попадаем сюда
1457 IgorA 2771
	mov esi,ted_buffer
4228 IgorA 2772
	cmp dword[esi],1 ;проверяем есть ли данные во внутреннем буфере
2773
	jl .no_paste ;если вообще ничего не удалось прочитать идем на выход
2774
	add esi,12 ;system buffer header size
2775
	.buf_r:
2776
 
2777
	mov edx,esi
1457 IgorA 2778
	call tl_strlen
2779
	cmp eax,1
4228 IgorA 2780
	jl .no_paste
1457 IgorA 2781
		mov esi,eax
2782
		call ted_set_undo
2783
		mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
2784
		stdcall ted_sel_text_del,ebx
2785
		cmp al,1
2786
		jne .del
2787
			mov ebx,ted_opt_ed_move_cursor
2788
		.del:
4228 IgorA 2789
		stdcall ted_text_add,edi,edx,esi,ebx
1457 IgorA 2790
		stdcall ted_draw,edi
2791
		cmp ted_fun_draw_panel_buttons,0
4228 IgorA 2792
		je .no_paste
1457 IgorA 2793
			call ted_fun_draw_panel_buttons
4228 IgorA 2794
	.no_paste:
2795
	popad
1457 IgorA 2796
	ret
2797
endp
2798
 
6274 IgorA 2799
align 16
2324 IgorA 2800
proc ted_but_sumb_upper uses edi esi, edit:dword
6274 IgorA 2801
	mov edi,[edit]
1457 IgorA 2802
 
2324 IgorA 2803
	stdcall ted_convert_sel_text,fb_char_toupper
6274 IgorA 2804
	or esi,esi
2805
	jz @f
2324 IgorA 2806
		stdcall ted_draw,edi
2807
	@@:
2808
	ret
1457 IgorA 2809
endp
2810
 
6274 IgorA 2811
align 16
2324 IgorA 2812
proc ted_but_sumb_lover uses edi esi, edit:dword
6274 IgorA 2813
	mov edi,[edit]
1457 IgorA 2814
 
2324 IgorA 2815
	stdcall ted_convert_sel_text,fb_char_todown
6274 IgorA 2816
	or esi,esi
2817
	jz @f
2324 IgorA 2818
		stdcall ted_draw,edi
2819
	@@:
2820
	ret
1457 IgorA 2821
endp
2822
 
6274 IgorA 2823
align 16
6087 IgorA 2824
proc ted_but_reverse uses eax ebx edi, edit:dword
6274 IgorA 2825
	mov edi,[edit]
1457 IgorA 2826
 
6087 IgorA 2827
	call ted_is_select
6274 IgorA 2828
	or al,al
2829
	jz @f
6087 IgorA 2830
		call ted_sel_normalize
2831
		push esi ecx edx
2832
			mov esi,ted_seln_x0
2833
			mov ecx,ted_seln_y0
2834
			call ted_get_pos_by_coords
2835
			mov eax,edx
2836
			mov esi,ted_seln_x1
2837
			cmp esi,0
2838
			je .beg_str
2839
				dec esi
2840
			.beg_str:
2841
			mov ecx,ted_seln_y1
2842
			call ted_get_pos_by_coords
2843
			;call ted_get_text_perv_pos
2844
			mov ebx,edx
2845
		pop edx ecx esi
2846
		;cmp eax,...
2847
		;je @f
2848
		call ted_revers
2849
	@@:
2850
	stdcall ted_draw,edi
2851
	ret
1457 IgorA 2852
endp
2853
 
6274 IgorA 2854
align 16
6087 IgorA 2855
proc ted_but_undo uses eax edi, edit:dword
6274 IgorA 2856
	mov edi,[edit]
1457 IgorA 2857
 
2858
	mov eax,ted_tim_undo
2859
	cmp ted_tim_ch,eax
2860
	jbe @f
2861
		inc ted_tim_undo
2862
		;call ted_text_colored
2863
		stdcall ted_draw,edi
2864
		cmp ted_fun_draw_panel_buttons,0
2865
		je @f
2866
			call ted_fun_draw_panel_buttons
2867
	@@:
2868
	ret
2869
endp
2870
 
6274 IgorA 2871
align 16
6087 IgorA 2872
proc ted_but_redo uses edi, edit:dword
6274 IgorA 2873
	mov edi,[edit]
1457 IgorA 2874
 
2875
	cmp ted_tim_undo,1
2876
	jb @f
2877
		dec ted_tim_undo
2878
		;call ted_text_colored
2879
		stdcall ted_draw,edi
2880
		cmp ted_fun_draw_panel_buttons,0
2881
		je @f
2882
			call ted_fun_draw_panel_buttons
2883
	@@:
2884
	ret
2885
endp
2886
 
7576 IgorA 2887
;description:
2888
; функция находит текст на который указывает ted_buffer_find
2889
;input:
2890
; f_opt = параметры поиска:
7577 IgorA 2891
;   (0 - искать ниже курсора, 1 - искать выше курсора, 2 - искать от начала файла)
2892
;   если установлен 31-й бит, то не обновляется окно
7583 IgorA 2893
;   если установлен 30-й бит, то поиск идет без учета регистра символов
7577 IgorA 2894
;output:
2895
; eax = был ли найден искомый текст (0 - нет, 1 - да)
6274 IgorA 2896
align 16
7577 IgorA 2897
proc ted_but_find uses ebx ecx edx edi esi, edit:dword, f_opt:dword
7583 IgorA 2898
	mov eax,[f_opt]
2899
	push eax
7576 IgorA 2900
	push [edit]
7583 IgorA 2901
	cmp al,2
7576 IgorA 2902
	jne @f
7577 IgorA 2903
		call _but_find_first
2904
		jmp .end0
7576 IgorA 2905
	@@:
7583 IgorA 2906
	cmp al,0
7576 IgorA 2907
	jne @f
7577 IgorA 2908
		call _but_find_next
2909
		jmp .end0
7576 IgorA 2910
	@@:
7583 IgorA 2911
	cmp al,1
2912
	jne @f
7577 IgorA 2913
		call _but_find_perv
7583 IgorA 2914
		jmp .end0
2915
	@@:
2916
	add esp,8
7577 IgorA 2917
	.end0:
2918
 
2919
	bt dword[f_opt],31
2920
	jc .end1
2921
	or eax,eax
2922
	jz @f
2923
		;текст найден, обновляем окно
2924
		stdcall ted_draw,edi
2925
		jmp .end1
2926
	@@:
2927
		;текст не найден, пробуем вызвать сообщение
2928
		cmp ted_fun_find_err,0
2929
		je .end1
2930
			call ted_fun_find_err ;пользовательская функция
2931
	.end1:
7576 IgorA 2932
	ret
2933
endp
2934
 
2935
;description:
7577 IgorA 2936
; функция находит текст от начала файла, или от конца текущего выделения
7583 IgorA 2937
;input:
2938
; f_opt = опции для поиска
7577 IgorA 2939
;output:
2940
; eax = был ли найден искомый текст (0 - нет, 1 - да)
2941
; ebx, ecx, edx, edi, edi - портятся
7576 IgorA 2942
align 16
7583 IgorA 2943
proc _but_find_first, edit:dword, f_opt:dword
7576 IgorA 2944
	mov edi,[edit]
2945
 
2946
	call ted_is_select
2947
	or al,al
2948
	jz @f
2949
		call ted_sel_normalize
2950
		mov edx,ted_sel_y1
2951
		mov ecx,ted_sel_x1
2952
		call ted_go_to_pos ;переход на конец выделения
2953
		call ted_get_pos_by_cursor
2954
		jmp .end0
2955
	@@:
2956
		mov edx,ted_tex
2957
		call ted_iterat_next
2958
	.end0:
7583 IgorA 2959
	mov ebx,ted_buffer_find
7576 IgorA 2960
	@@:
7583 IgorA 2961
		mov eax,[f_opt]
7576 IgorA 2962
		call ted_get_find_rezult
7583 IgorA 2963
		cmp ah,1
7576 IgorA 2964
		je @f ; find
2965
			call ted_iterat_next
2966
			cmp edx,ted_tex_1
2967
			jle @f
2968
			jmp @b
2969
	@@:
7577 IgorA 2970
	call _but_find_select
7576 IgorA 2971
	ret
2972
endp
2973
 
2974
;description:
7577 IgorA 2975
; функция находит текст выше курсора
7583 IgorA 2976
;input:
2977
; f_opt = опции для поиска
7577 IgorA 2978
;output:
2979
; eax = был ли найден искомый текст (0 - нет, 1 - да)
2980
; ebx, ecx, edx, edi, edi - портятся
7576 IgorA 2981
align 16
7583 IgorA 2982
proc _but_find_perv, edit:dword, f_opt:dword
7576 IgorA 2983
	mov edi,[edit]
7583 IgorA 2984
 
7576 IgorA 2985
	call ted_is_select
2986
	or al,al
2987
	jz @f
2988
		call ted_sel_normalize
2989
		mov edx,ted_sel_y0
2990
		mov ecx,ted_sel_x0
2991
		call ted_go_to_pos ;переход на начало выделения
2992
		call ted_get_pos_by_cursor
2993
		call ted_iterat_perv ;переход на 1-й символ перед выделением
2994
		jmp .end0
2995
	@@:
2996
	call ted_get_pos_by_cursor
2997
	.end0:
7583 IgorA 2998
	mov ebx,ted_buffer_find
7576 IgorA 2999
	@@:
7583 IgorA 3000
		mov eax,[f_opt]
7576 IgorA 3001
		call ted_get_find_rezult
7583 IgorA 3002
		cmp ah,1
7576 IgorA 3003
		je @f ; find
3004
			call ted_iterat_perv
3005
			cmp edx,ted_tex_1
3006
			jle @f
3007
			jmp @b
3008
	@@:
7577 IgorA 3009
	call _but_find_select
7576 IgorA 3010
	ret
3011
endp
3012
 
3013
;description:
7577 IgorA 3014
; функция находит текст ниже курсора
7583 IgorA 3015
;input:
3016
; f_opt = опции для поиска
7577 IgorA 3017
;output:
3018
; eax = был ли найден искомый текст (0 - нет, 1 - да)
7583 IgorA 3019
; ebx, ecx, edx, edi, esi - портятся
7576 IgorA 3020
align 16
7583 IgorA 3021
proc _but_find_next, edit:dword, f_opt:dword
6274 IgorA 3022
	mov edi,[edit]
1457 IgorA 3023
 
3024
	call ted_get_pos_by_cursor
7583 IgorA 3025
	mov ebx,ted_buffer_find
1457 IgorA 3026
	@@:
7583 IgorA 3027
		mov eax,[f_opt]
1457 IgorA 3028
		call ted_get_find_rezult
7583 IgorA 3029
		cmp ah,1
1457 IgorA 3030
		je @f ; find
3031
			call ted_iterat_next
3032
			cmp edx,ted_tex_1
3033
			jle @f
3034
			jmp @b
3035
	@@:
7577 IgorA 3036
	call _but_find_select
7576 IgorA 3037
	ret
3038
endp
3039
 
7577 IgorA 3040
;description:
3041
; вспомогательная функция, выделяет найденный текст
7576 IgorA 3042
;input:
7583 IgorA 3043
; ah = был ли найден искомый текст (0 - нет, 1 - да)
7576 IgorA 3044
; esi = first symbol pointer
3045
align 16
7577 IgorA 3046
_but_find_select:
7583 IgorA 3047
	or ah,ah
7576 IgorA 3048
	jz @f
1457 IgorA 3049
		call ted_get_text_coords
3050
		inc ebx ;move cursor right
3051
		mov ted_sel_x1,ebx
3052
		mov ted_sel_y1,eax
3053
		mov edx,eax
3054
		mov ecx,ebx
3055
		call ted_go_to_pos
7576 IgorA 3056
		mov edx,esi
1457 IgorA 3057
		call ted_get_text_coords
3058
		mov ted_sel_x0,ebx
3059
		mov ted_sel_y0,eax
7577 IgorA 3060
		xor eax,eax
3061
		inc eax
3062
		jmp .end0
1457 IgorA 3063
	@@:
7577 IgorA 3064
		xor eax,eax ;текст не найден
3065
	.end0:
1457 IgorA 3066
	ret
7576 IgorA 3067
 
3068
;input:
3069
; rpl_text = текст для замены
3070
; r_opt = параметры поиска:
7577 IgorA 3071
;   (0 - искать ниже курсора, 1 - искать выше курсора, 2 - искать от начала файла)
7576 IgorA 3072
; n_tim = фиксировать замену в изменениях (0 - нет, 1 - да)
3073
;output:
3074
; eax = 0 - не удачно, 1 - удачно
3075
align 16
3076
proc ted_but_replace uses edx edi esi, edit:dword, rpl_text:dword, r_opt:dword, n_tim:dword
3077
	mov edi,[edit]
7577 IgorA 3078
	mov eax,[r_opt]
3079
	bts eax,31
3080
	stdcall ted_but_find, edi,eax
3081
	or eax,eax
3082
	jz .end0
7576 IgorA 3083
 
3084
	xor edx,edx
3085
	cmp dword[n_tim],0
3086
	je @f
7577 IgorA 3087
		call ted_set_undo
7576 IgorA 3088
		mov edx,ted_opt_ed_change_time
3089
	@@:
3090
	stdcall ted_sel_text_del, edx
3091
	or eax,0xff
7577 IgorA 3092
	jz .end0
7576 IgorA 3093
		mov esi,[rpl_text]
3094
		stdcall tl_strlen
3095
		or eax,eax
7577 IgorA 3096
		jz .end0
7576 IgorA 3097
		stdcall ted_text_add, edi,esi,eax,ted_opt_ed_move_cursor
3098
		xor eax,eax
3099
		inc eax
7577 IgorA 3100
	.end0:
7576 IgorA 3101
	ret
1457 IgorA 3102
endp
3103
 
7583 IgorA 3104
;description:
3105
; Функция проверяет совпадает ли текст в буфере ebx
3106
; с текстом редактора по указателю edx.
3107
; Стандартные функции (напр. strcmp) тут не подойдут, потому что
3108
; в памяти редактора текст содержится не в виде ascii строк.
1457 IgorA 3109
;input:
7583 IgorA 3110
; eax - options to find
3111
; ebx - text need find
7577 IgorA 3112
; edx - first symbol pointer
3113
; edi - pointer to tedit struct
3114
;output:
7583 IgorA 3115
; ah - rezult
7577 IgorA 3116
; edx - last text position (if find sucess)
3117
; esi - first symbol pointer
3118
align 16
7583 IgorA 3119
proc ted_get_find_rezult uses ebx
3120
	mov al,byte[ebx]
3121
	bt eax,30
3122
	jnc @f
3123
		call fb_char_toupper
3124
	@@:
3125
	mov ah,1
7577 IgorA 3126
	mov esi,edx ;copy edx
7583 IgorA 3127
	.cycle0:
3128
		mov cl,al
3129
		mov al,byte[edx]
3130
		bt eax,30
3131
		jnc @f
3132
			call fb_char_toupper
3133
		@@:
3134
		cmp al,cl
7577 IgorA 3135
		jne .no_text
3136
 
7583 IgorA 3137
		inc ebx ;*** get next symbol (in find text) ***
3138
		mov al,byte[ebx]
3139
		or al,al
3140
		jz .end_f ;end of find text
3141
		bt eax,30
3142
		jnc @f
3143
			call fb_char_toupper
3144
		@@:
7577 IgorA 3145
 
3146
		call ted_iterat_next ;*** get next symbol (in editor text) ***
3147
		cmp edx,ted_tex_1
7583 IgorA 3148
		jg .cycle0
7577 IgorA 3149
align 4
3150
		.no_text:
7583 IgorA 3151
	xor ah,ah
7577 IgorA 3152
	mov edx,esi ;restore edx
7583 IgorA 3153
	.end_f:
7577 IgorA 3154
	ret
7583 IgorA 3155
endp
7577 IgorA 3156
 
3157
;input:
1457 IgorA 3158
; edi = pointer to tedit struct
6274 IgorA 3159
align 16
1457 IgorA 3160
ted_key_ctrl_home:
3161
	mov ted_cur_x,0
3162
	mov ted_cur_y,0
3163
	push eax
3164
		mov eax,ted_scr_w
3165
		mov dword[eax+sb_offs_position],0
3166
		mov eax,ted_scr_h
3167
		mov dword[eax+sb_offs_position],0
3168
	pop eax
3169
	stdcall ted_draw,edi
3170
	cmp ted_fun_draw_panel_buttons,0
3171
	je @f
3172
		call ted_fun_draw_panel_buttons
3173
	@@:
3174
	ret
3175
 
3176
;input:
3177
; edi = pointer to tedit struct
6274 IgorA 3178
align 16
4988 IgorA 3179
ted_key_ctrl_end:
3180
	push eax ebx
3181
		call ted_get_num_lines
3182
		mov ebx,ted_scr_w
7497 IgorA 3183
		mov [ebx+sb_offs_position],eax ;ставим ползунок на последнюю строку документа
3184
		cmp eax,[ebx+sb_offs_cur_area]
4988 IgorA 3185
		jle @f
7497 IgorA 3186
			mov eax,[ebx+sb_offs_cur_area] ;получаем число строк влазящих в окно
4988 IgorA 3187
		@@:
7497 IgorA 3188
		sub [ebx+sb_offs_position],eax ;отнимаем от ползунка число строк влазящих в окно (но не больше тех, что есть в документе)
4988 IgorA 3189
		dec eax
3190
		mov ted_cur_y,eax ;ставим курсор на последнюю строку документа
3191
	pop ebx eax
3192
	call ted_cur_move_x_last_char
3193
	stdcall ted_draw,edi
3194
	cmp ted_fun_draw_panel_buttons,0
3195
	je @f
3196
		call ted_fun_draw_panel_buttons
3197
	@@:
3198
	ret
3199
 
3200
;input:
3201
; edi = pointer to tedit struct
6274 IgorA 3202
align 16
1457 IgorA 3203
proc ted_sel_key_up
3204
  cmp ted_drag_k,1
3205
  je @f
3206
    call ted_sel_start
3207
    mov ted_drag_k,1
3208
  @@:
3209
  push dx
3210
    call ted_cur_move_up
3211
    cmp dl,8
3212
    jne @f
3213
      call ted_scroll_set_redraw
3214
    @@:
3215
  pop dx
3216
  call ted_sel_move
3217
  stdcall ted_draw,edi
3218
  ret
3219
endp
3220
 
3221
;input:
3222
; edi = pointer to tedit struct
6274 IgorA 3223
align 16
1457 IgorA 3224
proc ted_sel_key_down
3225
  cmp ted_drag_k,1
3226
  je @f
3227
    call ted_sel_start
3228
    mov ted_drag_k,1
3229
  @@:
3230
  push dx
3231
    call ted_cur_move_down
3232
    cmp dl,8
3233
    jne @f
3234
      call ted_scroll_set_redraw
3235
    @@:
3236
  pop dx
3237
  call ted_sel_move
3238
  stdcall ted_draw,edi
3239
  ret
3240
endp
3241
 
3242
;input:
3243
; edi = pointer to tedit struct
6274 IgorA 3244
align 16
1457 IgorA 3245
proc ted_sel_key_left
8036 IgorA 3246
	cmp ted_drag_k,1
3247
	je @f
3248
		call ted_sel_start
3249
	@@:
3250
	push dx
3251
		call ted_cur_move_left
3252
		call ted_sel_move
3253
		cmp ted_drag_k,1
3254
		je @f
3255
			mov ted_drag_k,1
3256
			mov dl,8
3257
		@@:
3258
		cmp dl,8
3259
		jne @f
3260
			call ted_scroll_set_redraw
3261
			stdcall ted_draw,edi
3262
			jmp .end_f
3263
		@@:
3264
		stdcall ted_draw_cur_line,edi
3265
		.end_f:
3266
	pop dx
3267
	ret
1457 IgorA 3268
endp
3269
 
3270
;input:
3271
; edi = pointer to tedit struct
6274 IgorA 3272
align 16
1457 IgorA 3273
proc ted_sel_key_right
8036 IgorA 3274
	cmp ted_drag_k,1
3275
	je @f
3276
		call ted_sel_start
3277
	@@:
3278
	push dx
3279
		call ted_cur_move_right
3280
		call ted_sel_move
3281
		cmp ted_drag_k,1
3282
		je @f
3283
			mov ted_drag_k,1
3284
			mov dl,8
3285
		@@:
3286
		cmp dl,8
3287
		jne @f
3288
			call ted_scroll_set_redraw
3289
			stdcall ted_draw,edi
3290
			jmp .end_f
3291
		@@:
3292
		stdcall ted_draw_cur_line,edi
3293
		.end_f:
3294
	pop dx
3295
	ret
1457 IgorA 3296
endp
3297
 
3298
;input:
3299
; edi = pointer to tedit struct
3300
;description:
3301
; this function need to optimize output
6274 IgorA 3302
align 16
1457 IgorA 3303
proc ted_draw_cursor_sumb
6256 IgorA 3304
pushad
3305
	mov ebx,ted_wnd_l
3306
	add ebx,ted_rec_l
3307
	mov edx,ted_cur_x
3308
	imul edx,ted_rec_w
3309
	add ebx,edx
3310
	shl ebx,16
3311
	add ebx,ted_rec_w
1457 IgorA 3312
 
6256 IgorA 3313
	mov ecx,ted_wnd_t ;calc rect -> y0,y1
3314
	add ecx,ted_rec_t
3315
	mov edx,ted_cur_y
3316
	imul edx,ted_rec_h
3317
	add ecx,edx
3318
	shl ecx,16
3319
	add ecx,ted_rec_h
1457 IgorA 3320
 
6256 IgorA 3321
	mov edx,ted_color_wnd_work
6274 IgorA 3322
	call ted_sel_normalize
1457 IgorA 3323
 
6274 IgorA 3324
	mov esi,ted_scr_w
3325
	mov eax,[esi+sb_offs_position]
3326
	sub ted_seln_y0,eax
3327
	sub ted_seln_y1,eax
1457 IgorA 3328
 
6274 IgorA 3329
	mov eax,ted_cur_y
3330
	cmp eax,ted_seln_y0
3331
	jl .no_cur_sel
3332
	cmp eax,ted_seln_y1
3333
	jg .no_cur_sel
6256 IgorA 3334
		mov edx,ted_color_select ;меняем цвет фона на цвет выделения
3335
		mov esi,ted_scr_h
6274 IgorA 3336
		cmp eax,ted_seln_y0
6256 IgorA 3337
		jne @f
6274 IgorA 3338
			mov eax,ted_cur_x
3339
			add eax,[esi+sb_offs_position]
3340
			cmp eax,ted_seln_x0
6256 IgorA 3341
			jge @f
3342
			mov edx,ted_color_wnd_work
3343
		@@:
6274 IgorA 3344
		mov eax,ted_cur_y
3345
		cmp eax,ted_seln_y1
6256 IgorA 3346
		jne .no_cur_sel
6274 IgorA 3347
			mov eax,ted_cur_x
3348
			add eax,[esi+sb_offs_position]
3349
			cmp eax,ted_seln_x1
6256 IgorA 3350
			jl .no_cur_sel
3351
			mov edx,ted_color_wnd_work
6274 IgorA 3352
	.no_cur_sel:
3353
	mcall SF_DRAW_RECT
1457 IgorA 3354
 
6256 IgorA 3355
	call ted_get_pos_by_cursor ;берем позицию символа
3356
	cmp ted_gp_opt,2
3357
	jne @f
3358
		mov esi,1
3359
		ror ecx,16
3360
		mov bx,cx
3361
		add ebx,0x10001
3362
		call ted_get_symb_color
3363
		call ted_convert_invis_symb
3364
		mcall SF_DRAW_TEXT ;рисование символа
3365
	@@:
3366
popad
3367
	ret
1457 IgorA 3368
endp
3369
 
3370
;input:
3371
; edx -> pointer to text
3372
; edi -> указатель на структуру tedit
3373
;output:
3374
; ecx = color
3375
; if ted_mode_color=0 then ecx=ted_color_wnd_text
6274 IgorA 3376
align 16
1457 IgorA 3377
ted_get_symb_color:
6256 IgorA 3378
	mov ecx,ted_color_wnd_text ;задаем цвет текста по умолчанию
1457 IgorA 3379
 
6256 IgorA 3380
	push eax edx
3381
	cmp ted_mode_color,0
3382
	je .exit
3383
		jmp .on_first
3384
		@@:
3385
			call ted_iterat_perv
3386
			cmp edx,ted_tex_1
3387
			jle .exit
3388
		.on_first:
3389
			xor eax,eax
3390
			mov al,byte[edx+1]
3391
			or al,al ;если al=0 то цвет не меняется
3392
			jz @b
1457 IgorA 3393
 
6256 IgorA 3394
		cmp eax,ted_colors_text_count
3395
		jge .exit
1457 IgorA 3396
 
6256 IgorA 3397
		shl ax,2 ;умножаем индекс цвета на 4 байта
3398
		mov ecx,ted_text_colors ;прибавляем смещение 1-го цвета
3399
		add ecx,eax
7497 IgorA 3400
		mov ecx,[ecx] ;устанавливаем текущий цвет текста по смещению
6256 IgorA 3401
	.exit:
3402
	or ecx,ted_font_size
3403
	pop edx eax
3404
	ret
1457 IgorA 3405
 
3406
;input:
3407
; edx = pointer to text
3408
; edi = pointer to tedit struct
3409
;description:
3410
; Функция преобразует невидимые символы в печатаемые на экране
6274 IgorA 3411
align 16
1457 IgorA 3412
ted_convert_invis_symb:
1458 IgorA 3413
	cmp ted_mode_invis,1
6274 IgorA 3414
	jne .else
1458 IgorA 3415
		cmp byte[edx],9
3416
		jne @f
3417
			lea edx,[ted_symbol_tab]
6274 IgorA 3418
			jmp .end_f
3419
align 4
1458 IgorA 3420
		@@:
3421
		cmp byte[edx],13
3422
		jne @f
3423
			mov edx,edi
3424
			add edx,ted_offs_symbol_new_line
3425
		@@:
6274 IgorA 3426
		jmp .end_f
3427
align 4
3428
	.else:
3429
		cmp byte[edx],9
3430
		je @f
3431
		cmp byte[edx],13
8262 IgorA 3432
		jne .end_f
6274 IgorA 3433
		@@:
3434
			lea edx,[ted_symbol_space]
1458 IgorA 3435
	.end_f:
3436
	ret
1457 IgorA 3437
 
3438
;input:
3439
; edi = pointer to tedit struct
6274 IgorA 3440
align 16
1457 IgorA 3441
ted_scroll_set_redraw:
3442
	push eax
3443
	mov eax,ted_scr_w
3444
	mov dword[eax+sb_offs_redraw],1
3445
	mov eax,ted_scr_h
3446
	mov dword[eax+sb_offs_redraw],1
3447
	pop eax
3448
	ret
3449
 
6274 IgorA 3450
align 16
1457 IgorA 3451
proc ted_draw, edit:dword
1458 IgorA 3452
	locals
3453
		line_num dd ?
3454
	endl
3455
	pushad
6274 IgorA 3456
	mov edi,[edit]
1457 IgorA 3457
 
6256 IgorA 3458
	mov eax,SF_DRAW_TEXT
1458 IgorA 3459
	mov ecx,ted_text_colors
7497 IgorA 3460
	mov ecx,[ecx]
1457 IgorA 3461
 
1458 IgorA 3462
	mov ebx,ted_wnd_l
3463
	add ebx,ted_rec_l
3464
	shl ebx,16
3465
	add ebx,ted_wnd_t
3466
	add ebx,ted_rec_t
3467
	add ebx,0x10001 ;добавляем отступы для выравнивания буквы по центру
1457 IgorA 3468
 
1458 IgorA 3469
	call ted_sel_normalize ;need before draw select
3470
	mov esi,ted_scr_w
6274 IgorA 3471
	mov esi,[esi+sb_offs_position]
3472
	mov [line_num],esi
1457 IgorA 3473
 
1458 IgorA 3474
	stdcall ted_clear_line_before_draw, edi,ebx,1,esi
3475
	call ted_get_first_visible_pos
8262 IgorA 3476
	or edx,edx
3477
	jz .no_draw_text
1458 IgorA 3478
	mov esi,1 ;длинна выводимого текста по 1-му символу
3479
	@@:
3480
		call ted_iterat_next
3481
		cmp edx,ted_tex_1
3482
		jle .no_draw_text
1457 IgorA 3483
 
1458 IgorA 3484
		; *** цветовая разметка
3485
		cmp ted_mode_color,0
3486
		je .no_col_change
3487
		cmp byte[edx+1],0
3488
		je .no_col_change
3489
			call ted_get_symb_color
3490
		.no_col_change:
1457 IgorA 3491
 
6274 IgorA 3492
		cmp byte[edx],13
1458 IgorA 3493
		jne .no_13
3494
			cmp ted_mode_invis,1
3495
			jne .no_invis
3496
				push edx
3497
				mov edx,edi
3498
				add edx,ted_offs_symbol_new_line
3499
				int 0x40
3500
				pop edx
3501
			.no_invis:
3502
			add ebx,ted_rec_h
3503
			;optimized output \/
3504
			mov eax,ted_wnd_h
3505
			add eax,ted_wnd_t
3506
			cmp bx,ax
3507
			jg .no_draw_text
6256 IgorA 3508
			mov eax,SF_DRAW_TEXT
1458 IgorA 3509
			;optimized output /\
3510
			and ebx,0xffff
3511
			ror ebx,16
3512
			add ebx,ted_wnd_l
3513
			add ebx,ted_rec_l
3514
			inc ebx
3515
			ror ebx,16
3516
			inc dword[line_num] ;increment line number
3517
			stdcall ted_clear_line_before_draw,edi,ebx,1,dword[line_num]
3518
			call ted_opt_draw_line_left
3519
			jmp @b
6256 IgorA 3520
align 4
1458 IgorA 3521
		.no_13:
1457 IgorA 3522
 
1458 IgorA 3523
		int 0x40
3524
		ror ebx,16
3525
		add ebx,ted_rec_w
3526
		mov esi,ted_wnd_l
3527
		add esi,ted_wnd_w
3528
		cmp bx,si
3529
		jl .no_opt
3530
			call ted_opt_draw_line_right
3531
		.no_opt:
3532
		mov si,1
3533
		ror ebx,16
3534
		jmp @b
3535
	.no_draw_text:
1457 IgorA 3536
 
4988 IgorA 3537
	inc dword[line_num]
1458 IgorA 3538
	stdcall ted_clear_line_before_draw,edi,ebx,0,dword[line_num]
3539
	call ted_draw_line_numbers
3540
	call ted_draw_main_cursor
1457 IgorA 3541
 
3542
;---------------------------------------------
3543
; set all_redraw flag for draw all ScrollBar
3544
; In some cases it is necessity to draw only the area
3545
; of moving of a "runner", for acceleration of output -
3546
; in this case the flag needs to be reset to 0 (zero).
3547
	mov eax,ted_scr_h
3548
	mov esi,ted_scr_w
3549
	mov dword[eax+sb_offs_all_redraw],1
3550
	mov dword[esi+sb_offs_all_redraw],1
3551
 
3552
; рисование полос прокрутки
3553
	stdcall scroll_bar_horizontal.draw,eax ;[scrollbar_hor_draw]
3554
	stdcall scroll_bar_vertical.draw,esi ;[scrollbar_ver_draw]
3555
; reset all_redraw flag
3556
	mov dword[eax+sb_offs_all_redraw],0
3557
	mov dword[esi+sb_offs_all_redraw],0
3558
;---------------------------------------------
3559
 
6087 IgorA 3560
	;left-bottom square
3561
	mov ebx,ted_wnd_l
3562
	shl ebx,16
3563
	add ebx,ted_rec_l
3564
	mov ecx,ted_wnd_t
3565
	add ecx,ted_wnd_h
3566
	shl ecx,16
3567
	mov cx,word[eax+sb_offs_size_y]
3568
	inc cx
6256 IgorA 3569
	mcall SF_DRAW_RECT,,,ted_color_wnd_capt ;[sc.work]
1457 IgorA 3570
 
3571
	;right-bottom square
3572
	mov ebx,ted_wnd_l
3573
	add ebx,ted_wnd_w
3574
	shl ebx,16
3575
	mov bx,word[esi+sb_offs_size_x]
3576
	inc bx
3577
	int 0x40
3578
 
7579 IgorA 3579
	cmp ted_fun_draw_panels,0
1457 IgorA 3580
	je @f
7579 IgorA 3581
		stdcall ted_fun_draw_panels, edi
1457 IgorA 3582
	@@:
3583
	popad
3584
	ret
3585
endp
3586
 
3587
;input:
3588
; edi = pointer to tedit struct
6274 IgorA 3589
align 16
1457 IgorA 3590
proc ted_draw_main_cursor
6274 IgorA 3591
pushad
3592
	mov eax,SF_DRAW_RECT ;draw cursor
3593
	mov ecx,ted_wnd_t ;calc rect -> y0,y1
3594
	add ecx,ted_rec_t
3595
	mov edx,ted_cur_y
3596
	imul edx,ted_rec_h
3597
	add ecx,edx
1457 IgorA 3598
 
6274 IgorA 3599
	cmp ted_cur_ins,1 ;проверка режима работы курсора (обычный или вставка)
3600
	jne @f
3601
		mov edx,ted_rec_h
3602
		inc edx   ;1->1, 3->2, 5->3, ...
3603
		shr edx,1 ;edx = высота строки деленная на 2 (когда курсор не полный)
3604
		add ecx,edx
3605
	@@:
3606
	shl ecx,16
3607
	add ecx,ted_rec_h
3608
	cmp ted_cur_ins,1
3609
	jne @f
3610
		shr cx,1 ;делим высоту курсора на 2
3611
	@@:
1457 IgorA 3612
 
6274 IgorA 3613
	mov ebx,ted_wnd_l ;calc rect -> x0,x1
3614
	add ebx,ted_rec_l
3615
	mov edx,ted_cur_x
3616
	imul edx,ted_rec_w
3617
	add ebx,edx
3618
	shl ebx,16
3619
	add ebx,ted_rec_w
1457 IgorA 3620
 
6274 IgorA 3621
	mov edx,ted_color_cursor
3622
	int 0x40 ;вывод курсора
1457 IgorA 3623
 
6274 IgorA 3624
	call ted_get_pos_by_cursor
3625
	cmp ted_gp_opt,2
3626
	jne @f
3627
		mov esi,1
3628
		ror ecx,16
3629
		mov bx,cx
3630
		add ebx,0x10001
3631
		cmp ted_cur_ins,1
3632
		jne .no_up_tetx
3633
			mov ecx,ted_rec_h
3634
			inc cx ; 1->1, 3->2, 5->3, ...
3635
			shr cx,1
3636
			sub bx,cx
3637
		.no_up_tetx:
3638
		mov ecx,ted_color_cur_text
3639
		or ecx,ted_font_size
3640
		call ted_convert_invis_symb
3641
		mcall SF_DRAW_TEXT
3642
	@@:
1457 IgorA 3643
 
6274 IgorA 3644
	mov ebx,ted_wnd_l
3645
	add ebx,ted_rec_l
3646
	shl ebx,16
3647
	add ebx,ted_wnd_t
3648
	add ebx,3
3649
	mov ecx,ted_color_wnd_bord
3650
	or  ecx,0x80000000
3651
	lea edx,[txtRow]
3652
	mcall SF_DRAW_TEXT ;вывод подписи 'Строка'
1457 IgorA 3653
 
6274 IgorA 3654
	add ebx,0x500000
3655
	lea edx,[txtCol]
3656
	int 0x40 ;вывод подписи 'Знак'
1457 IgorA 3657
 
6274 IgorA 3658
	cmp ted_tim_undo,0
3659
	je @f
3660
		add ebx,0x500000
3661
		lea edx,[txtOtm]
3662
		int 0x40
3663
		sub ebx,0x500000
3664
	@@:
1457 IgorA 3665
 
6274 IgorA 3666
	call ted_draw_buffer
3667
	call ted_draw_help_f1
1457 IgorA 3668
 
6274 IgorA 3669
	mov eax,47 ;draw cursor coords
3670
	mov esi,ted_color_wnd_bord
3671
	or  esi,0x40000000
1457 IgorA 3672
 
6274 IgorA 3673
	mov edx,ebx
3674
	ror edx,16
3675
	sub edx,35
3676
	ror edx,16
3677
	;add edx,3
3678
	mov ebx,0x40000 ;Row=...
3679
	mov ecx,ted_scr_w
3680
	mov ecx,[ecx+sb_offs_position]
3681
	add ecx,ted_cur_y
3682
	inc ecx
1457 IgorA 3683
 
3684
push edi
6274 IgorA 3685
	mov edi,ted_color_wnd_work
3686
	int 0x40 ;вывод числа текущей строки
1457 IgorA 3687
pop edi
3688
 
6274 IgorA 3689
	;mov ebx,0x40000 ;Col=...
3690
	mov ecx,ted_scr_h
3691
	mov ecx,[ecx+sb_offs_position]
3692
	add ecx,ted_cur_x
3693
	inc ecx
3694
	add edx,0x500000
1457 IgorA 3695
push edi
6274 IgorA 3696
	mov edi,ted_color_wnd_work
3697
	int 0x40 ;вывод числа знаков
1457 IgorA 3698
pop edi
3699
 
6274 IgorA 3700
	cmp ted_tim_undo,0
3701
	je @f
3702
		mov ecx,ted_tim_undo
3703
		add edx,0x500000
3704
		mov edi,ted_color_wnd_work ;портим регистр edi, но в конце функции это уже не важно
3705
		int 0x40 ;вывод числа отмененных действий
3706
	@@:
1457 IgorA 3707
 
6274 IgorA 3708
popad
3709
	ret
1457 IgorA 3710
endp
3711
 
3712
;input:
3713
; edi = pointer to tedit struct
6274 IgorA 3714
align 16
1457 IgorA 3715
proc ted_draw_buffer
3716
	pushad
3717
 
3718
	mov eax,ted_buffer
4228 IgorA 3719
	cmp dword[eax],1 ;смотрим размер буфера
3720
	jl @f
1458 IgorA 3721
		mov ebx,ted_rec_l
1457 IgorA 3722
		add bx,300
1458 IgorA 3723
		cmp ebx,ted_wnd_w ;сравниваем координату для вывод текста
3724
		jge @f ;подпись не влазит в окно
3725
 
3726
		add ebx,ted_wnd_l
1457 IgorA 3727
		shl ebx,16
3728
		add ebx,ted_wnd_t
3729
		add ebx,3
3730
		mov ecx,ted_color_wnd_bord
3731
		or ecx,0x40000000
3732
 
3733
		mov edx,ted_buffer
4228 IgorA 3734
		add edx,12
1457 IgorA 3735
		mov esi,edx
3736
		mov edi,ted_color_wnd_work ;edi - destroy not pointer to tedit
3737
		call tl_strlen
3738
		;cmp eax,0 ;буфер пуст
3739
		;je @f
3740
		cmp eax,20
3741
		jle .crop_buf
3742
			mov eax,20 ;обрезка подписи до 20 символов
3743
		.crop_buf:
3744
		mov esi,eax
6256 IgorA 3745
		mcall SF_DRAW_TEXT ;вывод содержимого буфера
1457 IgorA 3746
 
3747
		sub ebx,50 shl 16
3748
		lea edx,[txtBuf]
3749
		mov esi,edx
3750
		call tl_strlen
3751
		mov esi,eax
3752
		xor ecx,0x40000000 ;убираем цвет фона
6256 IgorA 3753
		mcall SF_DRAW_TEXT ;вывод подписи для буфера
1457 IgorA 3754
	@@:
3755
	popad
3756
	ret
3757
endp
3758
 
3759
;input:
3760
; edi = pointer to tedit struct
6274 IgorA 3761
align 16
1457 IgorA 3762
proc ted_draw_help_f1
1458 IgorA 3763
	pushad
3764
	cmp ted_rec_t,13 ;минимальная высота для рисования справки
3765
	jle @f
6087 IgorA 3766
		;clear place before draw help
1458 IgorA 3767
		mov ebx,ted_wnd_l
3768
		add ebx,ted_rec_l
3769
		shl ebx,16
3770
		add ebx,ted_wnd_w
3771
		sub ebx,ted_rec_l
3772
		mov ecx,ted_wnd_t
3773
		add ecx,13
3774
		shl ecx,16
6256 IgorA 3775
		add ecx,9 ;9 - высота 0-го шрифта, ставить ted_rec_h пока еще рано
3776
		mcall SF_DRAW_RECT,,,ted_color_wnd_capt
1457 IgorA 3777
 
1458 IgorA 3778
	cmp ted_help_id,-1
3779
	je @f
3780
		mov eax,ted_help_id
3781
		ColToIndexOffset eax,edx
1457 IgorA 3782
 
1458 IgorA 3783
		;SetCoordinates
3784
		mov ebx,ted_wnd_l
3785
		add ebx,ted_rec_l
3786
		shl ebx,16
3787
		add ebx,ted_wnd_t
3788
		add ebx,13 ;=3+10
1457 IgorA 3789
 
1458 IgorA 3790
		;SetTextColor
3791
		xor eax,eax
2102 IgorA 3792
		mov al,byte[edx+MAX_COLOR_WORD_LEN+7]
1458 IgorA 3793
		shl ax,2
3794
		mov ecx,ted_text_colors
3795
		add ecx,eax
6274 IgorA 3796
		mov ecx,[ecx]
1458 IgorA 3797
		or	ecx,0xc0000000 ;SetTextStyles
3798
		mov esi,edi
6256 IgorA 3799
		mcall SF_DRAW_TEXT,,,,,ted_color_wnd_work
1458 IgorA 3800
		mov edi,esi
1457 IgorA 3801
 
6087 IgorA 3802
		mov esi,edx
3803
		call tl_strlen
3804
 
1458 IgorA 3805
		;*** draw help string ***
3806
		mov ecx,ted_color_wnd_bord
3807
		or ecx,0x80000000
6274 IgorA 3808
		mov edx,[edx+MAX_COLOR_WORD_LEN]
3809
		or edx,edx
3810
		jz @f
1458 IgorA 3811
			add edx,ted_help_text_f1
6087 IgorA 3812
			inc eax
3813
			imul eax,6 ;ширина символа в сист. шрифте
3814
			shl eax,16
3815
			add ebx,eax
6256 IgorA 3816
			mcall SF_DRAW_TEXT
1458 IgorA 3817
	@@:
3818
	popad
3819
	ret
1457 IgorA 3820
endp
3821
 
3822
;input:
3823
; edi = pointer to tedit struct
6274 IgorA 3824
align 16
1457 IgorA 3825
proc ted_draw_line_numbers
6256 IgorA 3826
pushad
3827
	;top panel with caption
3828
	mov ebx,ted_wnd_l
6274 IgorA 3829
	;add ebx,ted_rec_l
6256 IgorA 3830
	shl ebx,16
3831
	add ebx,ted_wnd_w
6274 IgorA 3832
	;sub ebx,ted_rec_l
6256 IgorA 3833
	mov edx,ted_color_wnd_work
3834
	mov ecx,ted_wnd_t
3835
	shl ecx,16
3836
	add ecx,ted_rec_t
3837
	mov edx,ted_color_wnd_capt
3838
	mcall SF_DRAW_RECT
1457 IgorA 3839
 
6256 IgorA 3840
	;line numbers
3841
	mov ebx,0x40000 ;format
3842
	mov ecx,ted_scr_w
6274 IgorA 3843
	mov ecx,[ecx+sb_offs_position]
6256 IgorA 3844
	inc ecx
3845
	mov edx,3
3846
	add edx,ted_wnd_l
3847
	rol edx,16
3848
	add edx,ted_wnd_t
3849
	add edx,ted_rec_t
3850
	@@:
1457 IgorA 3851
 
3852
push ebx ecx edx
6256 IgorA 3853
	;left panel with numbers
3854
	mov ebx,ted_wnd_l
3855
	shl ebx,16
3856
	add ebx,ted_rec_l
3857
	mov ecx,ted_rec_h
3858
	rol ecx,16
3859
	mov cx,dx
3860
	rol ecx,16
3861
	mov edx,ted_color_wnd_capt
3862
	mcall SF_DRAW_RECT ;рисуем прямоугольник под номером строки
1457 IgorA 3863
pop edx ecx ebx
3864
 
6256 IgorA 3865
		mov esi,ted_color_wnd_bord
6274 IgorA 3866
		mcall SF_DRAW_NUMBER ;рисуем номер строки
6256 IgorA 3867
		inc ecx
3868
		add edx,ted_rec_h
3869
		sub edx,ted_wnd_t
3870
		mov esi,edx
3871
		and esi,0xffff
3872
		cmp esi,ted_wnd_h
3873
		jge @f
3874
		add edx,ted_wnd_t
3875
		jmp @b
3876
align 4
3877
	@@:
3878
popad
3879
	ret
1457 IgorA 3880
endp
3881
 
3882
;output:
3883
; ah = symbol
6274 IgorA 3884
align 16
3885
proc KeyConvertToASCII uses ebx, table:dword
3886
	mov ebx,[table] ;convert scan to ascii
7579 IgorA 3887
	shr ax,8
1464 IgorA 3888
	add bx,ax ;? ebx,eax
3889
	mov ah,byte[ebx]
3890
	ret
1457 IgorA 3891
endp
3892
 
6274 IgorA 3893
align 16
1457 IgorA 3894
proc ted_draw_cur_line, edit:dword
6274 IgorA 3895
pushad
3896
	mov edi,[edit]
1457 IgorA 3897
 
6274 IgorA 3898
	mov ebx,ted_wnd_l
3899
	add ebx,ted_rec_l
3900
	shl ebx,16
3901
	mov eax,ted_cur_y
3902
	imul eax,ted_rec_h
1457 IgorA 3903
	mov bx,ax
6274 IgorA 3904
	add ebx,ted_wnd_t
3905
	add ebx,ted_rec_t ;ebx - координаты для прямоугольника очистки линии
1457 IgorA 3906
	add ebx,0x10001   ;добавляем отступы для выравнивания буквы по центру
3907
 
6274 IgorA 3908
	call ted_sel_normalize ;need before draw select
1457 IgorA 3909
	mov ecx,ted_cur_y
3910
	mov eax,ted_scr_w
6274 IgorA 3911
	add ecx,[eax+sb_offs_position]
3912
	stdcall ted_clear_line_before_draw,edi,ebx,1,ecx
1457 IgorA 3913
 
6274 IgorA 3914
	mov eax,ted_scr_h
3915
	mov esi,[eax+sb_offs_position]
3916
	call ted_get_pos_by_coords
1457 IgorA 3917
 
6274 IgorA 3918
	cmp ted_gp_opt,2
3919
	jne .no_draw_text
3920
	call ted_get_symb_color
3921
	mov esi,1 ;draw 1 symbol
3922
	@@:
3923
		;call ted_iterat_next
3924
		cmp edx,ted_tex_1
3925
		jle .no_draw_text
1457 IgorA 3926
 
6274 IgorA 3927
		; *** цветовая разметка
3928
		cmp ted_mode_color,0
3929
		je .no_col_change
3930
		cmp byte[edx+1],0
3931
		je .no_col_change
3932
			call ted_get_symb_color
3933
		.no_col_change:
1457 IgorA 3934
 
6274 IgorA 3935
		mov eax,SF_DRAW_TEXT
3936
		cmp byte [edx],13
3937
		jne .no_13
3938
			cmp ted_mode_invis,1
3939
			jne .no_draw_text
3940
			push edx
3941
			mov edx,edi
3942
			add edx,ted_offs_symbol_new_line
3943
			int 0x40
3944
			pop edx
3945
			jmp .no_draw_text
3946
align 4
3947
		.no_13:
1457 IgorA 3948
 
6274 IgorA 3949
		int 0x40
3950
		ror ebx,16
3951
		add ebx,ted_rec_w
3952
		mov eax,ted_wnd_w
3953
		add eax,ted_wnd_l ;ax = отступ по оси x
3954
		cmp bx,ax
3955
		jge .no_draw_text ;Opt
3956
		ror ebx,16
3957
		call ted_iterat_next
3958
		jmp @b
3959
align 4
3960
	.no_draw_text:
1457 IgorA 3961
 
6274 IgorA 3962
	call ted_draw_main_cursor
3963
popad
3964
	ret
1457 IgorA 3965
endp
3966
 
3967
;input:
3968
;  clear_o - если =1 очистить одну строку, =0 очистить все строки окна до низу
6274 IgorA 3969
align 16
1457 IgorA 3970
proc ted_clear_line_before_draw, edit:dword, coords:dword, clear_o:dword, numb_lin:dword
3971
	pushad
6274 IgorA 3972
	mov edi,[edit]
3973
	mov ebx,[coords] ;ebx = x*2^16+y coords to left up point clear line
3974
	mov esi,[numb_lin] ;esi - number text line
1457 IgorA 3975
 
3976
	sub ebx,0x10001 ;отнимаем отступы для выравнивания буквы по центру
3977
	cmp dword[clear_o],0
3978
	jne @f
3979
		add ebx,ted_rec_h
3980
		ror ebx,16
3981
		xor bx,bx
3982
		add ebx,ted_wnd_l
3983
		add ebx,ted_rec_l ;bx = ted_wnd_l+ted_rec_l
3984
		ror ebx,16
3985
	@@:
3986
 
3987
	mov eax,ted_wnd_h
3988
	add eax,ted_wnd_t
3989
	cmp ax,bx
3990
	jl .no_clear
3991
	sub ax,bx
3992
 
3993
	mov cx,bx
3994
	shl ecx,16
3995
 
3996
	xor bx,bx
3997
	add ebx,ted_wnd_w
3998
	sub ebx,ted_rec_l
3999
	xor cx,cx
4000
	add ecx,ted_rec_h
4001
	mov edx,ted_color_wnd_work
4002
 
4003
	cmp dword[clear_o],0
4004
	je .pusto
4005
	cmp ax,cx
4006
	jge @f
4007
	.pusto:
4008
		mov cx,ax
4988 IgorA 4009
		jmp .no_select ;если очистка окна до низу, то всегда фоновым цветом
1457 IgorA 4010
	@@:
4011
 
4012
	call ted_is_select
7576 IgorA 4013
	or al,al
4014
	jz .no_select
1457 IgorA 4015
	cmp ted_seln_y0,esi
4988 IgorA 4016
	jg .no_select
1457 IgorA 4017
	cmp ted_seln_y1,esi
4988 IgorA 4018
	jl .no_select
1457 IgorA 4019
		mov edx,ted_color_select ;draw selected line
4988 IgorA 4020
	.no_select:
1457 IgorA 4021
 
6256 IgorA 4022
	mcall SF_DRAW_RECT ;закраска полной строки цветом фона или цветом выделения
1457 IgorA 4023
 
4024
	call ted_is_select
6256 IgorA 4025
	or al,al
4026
	jz .no_clear
1457 IgorA 4027
 
6256 IgorA 4028
	mov al,SF_DRAW_RECT
1457 IgorA 4029
	xor cx,cx
4030
	add ecx,ted_rec_h
4031
	cmp ted_seln_y0,esi
4032
	jne @f
4033
		push bx esi
4034
		mov edx,ted_seln_x0 ; верхняя полоса (затирает слева)
4035
		mov esi,ted_scr_h
6274 IgorA 4036
		cmp edx,[esi+sb_offs_position]
1457 IgorA 4037
		jle .in_wnd
6274 IgorA 4038
			sub edx,[esi+sb_offs_position]
1457 IgorA 4039
			imul edx,ted_rec_w
4040
			mov bx,dx
4041
			jmp .no_wnd
4042
		.in_wnd:
7497 IgorA 4043
		xor bx,bx
1457 IgorA 4044
		.no_wnd:
4045
		mov edx,ted_color_wnd_work
4046
		int 0x40
4047
		pop esi bx
4048
	@@:
4049
	cmp ted_seln_y1,esi
4050
	jne @f
4988 IgorA 4051
		;push esi
4052
		;если выделен весь файл тут можно сделать выход, но тогда нужно выше убрать jmp .no_select
1457 IgorA 4053
		mov edx,ted_seln_x1 ; нижняя полоса (затирает справа)
4054
		mov esi,ted_scr_h
6274 IgorA 4055
		cmp edx,[esi+sb_offs_position]
1457 IgorA 4056
		jle .in_wnd2
6274 IgorA 4057
			sub edx,[esi+sb_offs_position]
1457 IgorA 4058
			imul edx,ted_rec_w
4059
			sub bx,dx
4060
			shl edx,16
4061
			add ebx,edx
4062
		.in_wnd2:
4063
		mov edx,ted_color_wnd_work
4064
		int 0x40
4988 IgorA 4065
		;pop esi
1457 IgorA 4066
	@@:
4067
 
4068
	.no_clear:
4069
	popad
4070
	ret
4071
endp
4072
 
4073
;input:
4074
; edi = pointer to tedit struct
4075
;output:
4076
; ecx = новый цвет символа
4077
; edx = pointer to symbol
4078
; edx = 0 if text not in screen
6274 IgorA 4079
align 16
1457 IgorA 4080
ted_get_first_visible_pos:
4081
	push eax ecx
4082
	mov eax,ted_scr_w
4083
	mov edx,ted_tex
4084
	xor ecx,ecx
4085
	@@:
6274 IgorA 4086
		cmp ecx,[eax+sb_offs_position]
1457 IgorA 4087
		je @f
4088
		call ted_iterat_next
4089
		cmp edx,ted_tex_1
4090
		jle @f
6256 IgorA 4091
		cmp byte[edx],13
1457 IgorA 4092
		jne @b
4093
		inc ecx
4094
		jmp @b
6256 IgorA 4095
align 4
1457 IgorA 4096
	@@:
4097
 
6274 IgorA 4098
	cmp ecx,[eax+sb_offs_position]
1457 IgorA 4099
	je @f
4100
		xor edx,edx
4101
	@@:
6274 IgorA 4102
	cmp ecx,[eax+sb_offs_max_area]
1457 IgorA 4103
	jle @f
6274 IgorA 4104
		mov [eax+sb_offs_max_area],ecx
1457 IgorA 4105
	@@:
4106
	pop ecx eax
4107
	call ted_opt_draw_line_left
4108
	ret
4109
 
4110
;input:
4111
; edx = pointer to symbol
4112
; edi = pointer to tedit struct
4113
;output:
4114
; ecx = цвет символа
4115
; edx = указатель на первый левый символ
4116
;description:
4117
; функция нужна для оптимизации вывода текста
6274 IgorA 4118
align 16
6256 IgorA 4119
proc ted_opt_draw_line_left uses ebx
4120
	mov ebx,ted_scr_h
6274 IgorA 4121
	mov ebx,[ebx+sb_offs_position]
6256 IgorA 4122
	or ebx,ebx
4123
	jz .ret_f
4124
	push eax
4125
	mov eax,edx
1457 IgorA 4126
 
6256 IgorA 4127
	cmp edx,ted_tex
4128
	jne @f
4129
		call ted_iterat_next
4130
		jmp .beg_cycle
4131
	@@:
1457 IgorA 4132
 
6256 IgorA 4133
	or ebx,ebx
4134
	jz @f
1457 IgorA 4135
 
6256 IgorA 4136
	cmp byte[edx],13
4137
	jne @f
4138
		call ted_iterat_next
4139
		.beg_cycle:
4140
	@@:
4141
		cmp edx,ted_tex_1
4142
		jle @f
4143
		cmp byte[edx],13
4144
		je @f
4145
		or ebx,ebx
4146
		jz @f
1457 IgorA 4147
;--------------------------------------
4148
xor eax,eax ;eax будет меняться
4149
mov al,byte[edx+1]
6256 IgorA 4150
or al,al
4151
jz .no_color
1457 IgorA 4152
cmp eax,ted_colors_text_count
4153
jge .no_color
6256 IgorA 4154
	xor ecx,ecx
4155
	mov cl,byte[edx+1]
4156
	shl cx,2
4157
	add ecx,ted_text_colors
6274 IgorA 4158
	mov ecx,[ecx]
1457 IgorA 4159
.no_color:
4160
;--------------------------------------
6256 IgorA 4161
		mov eax,edx
4162
		call ted_iterat_next
4163
		dec ebx
4164
		jmp @b
4165
align 4
4166
	@@:
4167
		mov edx,eax
4168
	pop eax
4169
	.ret_f:
4170
	call ted_get_symb_color
4171
	ret
1457 IgorA 4172
endp
4173
 
4174
;input:
4175
; edx = pointer to symbol
4176
; edi = pointer to tedit struct
4177
;output:
4178
; ecx = symbol color
4179
; edx = pointer to 13 symbol
4180
;description:
4181
; функция нужна для оптимизации вывода текста
6274 IgorA 4182
align 16
7583 IgorA 4183
proc ted_opt_draw_line_right uses eax
1457 IgorA 4184
	mov eax,edx
4185
	@@:
4186
		cmp edx,ted_tex_1
4187
		jle @f
4188
		cmp byte[edx],13
4189
		je @f
4190
		mov eax,edx
4191
		call ted_iterat_next
4192
		jmp @b
4193
	@@:
4194
	mov edx,eax ;perv sumbol
4195
	call ted_get_symb_color
4196
	ret
4197
endp
4198
 
6274 IgorA 4199
align 16
1457 IgorA 4200
proc ted_mouse, edit:dword
4201
	pushad
6274 IgorA 4202
	mov edi,[edit]
1457 IgorA 4203
 
4204
	;обрабатываем скроллинги
4205
	mov edx,ted_scr_h
4206
	mov ecx,ted_scr_w
4207
 
4208
	cmp word[edx+sb_offs_delta2],0
4209
	jne .horizontal
4210
 
6274 IgorA 4211
	mov eax,[ecx+sb_offs_max_area]
4212
	cmp eax,[ecx+sb_offs_cur_area]
1457 IgorA 4213
	jbe .horizontal
4214
	; mouse event for Vertical ScrollBar
4215
	stdcall scroll_bar_vertical.mouse,ecx ;[scrollbar_ver_mouse]
4216
	cmp dword[ecx+sb_offs_redraw],0
4217
	je @f
4218
		mov dword[ecx+sb_offs_redraw],0
4219
		stdcall ted_draw,edi
4220
		jmp .no_in_wnd
4221
	@@:
4222
	cmp word[ecx+sb_offs_delta2],0
4223
	jne .no_in_wnd
4224
	.horizontal:
6274 IgorA 4225
	mov eax,[edx+sb_offs_max_area]
4226
	cmp eax,[edx+sb_offs_cur_area]
1457 IgorA 4227
	jbe .other
4228
	; mouse event for Horizontal ScrollBar
4229
	stdcall scroll_bar_horizontal.mouse,edx ;[scrollbar_hor_mouse]
4230
	cmp dword[edx+sb_offs_redraw],0
4231
	je .other
4232
		mov dword[edx+sb_offs_redraw],0
4233
		stdcall ted_draw,edi
4234
		jmp .no_in_wnd
4235
	.other:
4236
	cmp word[ecx+sb_offs_delta2],0
4237
	jne .no_in_wnd
4238
	cmp word[edx+sb_offs_delta2],0
4239
	jne .no_in_wnd
4240
 
4241
	;обрабатываем окно редактора
6274 IgorA 4242
	mcall SF_MOUSE_GET,SSF_BUTTON
1457 IgorA 4243
	cmp al,1
4244
	jne @f
6274 IgorA 4245
		mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
1457 IgorA 4246
		mov ebx,ted_wnd_t
4247
		add ebx,ted_rec_t
4248
		cmp ax,bx
4249
		jl @f ;y_mouse
4250
 
4251
		sub ebx,ted_rec_t
4252
		add ebx,ted_wnd_h
4253
		cmp bx,ax
4254
		jl @f ;y_mouse>y_wnd
4255
 
4256
		mov ebx,ted_wnd_l
4257
		add ebx,ted_rec_l
4258
		mov ecx,eax
4259
		shr ecx,16
4260
		cmp cx,bx
4261
		jl @f ;x_mouse
4262
 
4263
		sub ebx,ted_rec_l
4264
		add ebx,ted_wnd_w
4265
		cmp bx,cx
4266
		jl @f ;x_mouse>x_wnd
4267
 
4268
		call ted_draw_cursor_sumb
4269
		call ted_wnd_main_click
4270
		jmp .no_in_wnd
4271
	@@:
1458 IgorA 4272
	mov edx,ted_el_focus
6274 IgorA 4273
	cmp [edx],edi
1458 IgorA 4274
	jne @f
4275
		call ted_wnd_main_mouse_scroll ;смотрим на прокрутку колеса мыши
4276
	@@:
1457 IgorA 4277
	cmp ted_drag_m,0
4278
	je .no_in_wnd
4279
		mov ted_drag_m,0
4280
		stdcall ted_draw,edi
4281
		cmp ted_fun_draw_panel_buttons,0
4282
		je .no_in_wnd
4283
			call ted_fun_draw_panel_buttons
4284
	.no_in_wnd:
4285
	popad
4286
	ret
4287
endp
4288
 
4289
;input:
4290
; eax -> (x,y)
4291
; edi -> указатель на структуру tedit
4292
;description:
4293
; функция вызывется при нажатии кнопкой мыши и попадении курсором в окно редактора
6274 IgorA 4294
align 16
1457 IgorA 4295
ted_wnd_main_click:
1458 IgorA 4296
	push ebx ecx edx
4297
	mov ebx,ted_el_focus
6274 IgorA 4298
	mov [ebx],edi ;ставим фокус
1457 IgorA 4299
 
6087 IgorA 4300
	push eax
4301
		shr eax,16
4302
		sub eax,ted_wnd_l
4303
		sub eax,ted_rec_l
1457 IgorA 4304
 
6087 IgorA 4305
		xor edx,edx
4306
		mov ecx,ted_rec_w
4307
		div cx
4308
		;inc eax
4309
		mov ebx,ted_scr_h
6274 IgorA 4310
		cmp eax,[ebx+sb_offs_cur_area]
6087 IgorA 4311
		jle @f
6274 IgorA 4312
			mov eax,[ebx+sb_offs_cur_area]
6087 IgorA 4313
		@@:
4314
		;dec eax
4315
		mov ted_cur_x,eax
4316
	pop eax
1457 IgorA 4317
 
6087 IgorA 4318
	push eax
4319
		and eax,0xffff
4320
		sub eax,ted_wnd_t
4321
		sub eax,ted_rec_t
1457 IgorA 4322
 
6087 IgorA 4323
		xor edx,edx
4324
		mov ecx,ted_rec_h
4325
		div cx
4326
		inc eax
4327
		mov ebx,ted_scr_w
6274 IgorA 4328
		cmp eax,[ebx+sb_offs_cur_area]
6087 IgorA 4329
		jle @f
6274 IgorA 4330
			mov eax,[ebx+sb_offs_cur_area]
6087 IgorA 4331
		@@:
4332
		dec eax
4333
		mov ted_cur_y,eax
4334
	pop eax
1457 IgorA 4335
 
1458 IgorA 4336
	cmp ted_drag_m,0
4337
	je @f
4338
		call ted_sel_move
4339
		jmp .sel_move
4340
	@@:
4341
		mov ted_drag_m,1
4342
		call ted_sel_start
4343
	.sel_move:
4344
	pop edx ecx ebx
4345
	ret
1457 IgorA 4346
 
4347
;input:
4348
; edi = pointer to tedit struct
6274 IgorA 4349
align 16
1457 IgorA 4350
ted_wnd_main_mouse_scroll:
4351
	push eax ebx ecx
6274 IgorA 4352
	mcall SF_MOUSE_GET,SSF_SCROLL_DATA
4353
	or ax,ax
4354
	jz .no_scroll
1457 IgorA 4355
		mov ecx,ted_scr_w
7877 IgorA 4356
		movsx eax,ax
4357
		lea eax,[eax+eax*2] ;умножаем на 3 (число строк прокрутки за одно движение колеса мыши)
4358
		add eax,[ecx+sb_offs_position]
4359
		mov ebx,[ecx+sb_offs_max_area]
4360
		shl ebx,1
4361
		sub ebx,[ecx+sb_offs_cur_area] ;отнимаем половину высоты окна
4362
		shr ebx,1
4363
		cmp eax,ebx
4364
		jae .no_scroll
4365
		mov [ecx+sb_offs_position],eax
1458 IgorA 4366
		stdcall ted_draw,edi
1457 IgorA 4367
	.no_scroll:
4368
	pop ecx ebx eax
4369
	ret
4370
 
6274 IgorA 4371
align 16
4308 IgorA 4372
proc ted_save_file, edit:dword, file:dword, f_name:dword
6274 IgorA 4373
pushad
4374
	mov edi,[edit]
1457 IgorA 4375
 
6274 IgorA 4376
	stdcall ted_can_save,edi
4377
	;or al,al
4378
	;jz .no_save
1457 IgorA 4379
 
6274 IgorA 4380
	mov ecx,ted_max_chars
4381
	invoke mem.alloc,ecx
4382
	push eax ;запоминаем указатель на выделенную память
1457 IgorA 4383
 
6274 IgorA 4384
	mov edx,ted_tex
4385
	xor ecx,ecx
4386
	@@:
4387
		call ted_iterat_next
4388
		cmp edx,ted_tex_1
4389
		jle @f ;edx = ted_tex or edx = ted_tex+sizeof.symbol
4390
		mov bl,[edx]
4391
		mov byte[eax],bl
4392
		inc eax
4393
		inc ecx
4394
		jmp @b
4395
align 4
4396
	@@:
1457 IgorA 4397
 
6274 IgorA 4398
	or ecx,ecx
4399
	jz @f
4400
		mov ebx,[file]
4401
		pop eax ;записываем указатель на выделенную память
4402
		mov [ebx+16],eax
4403
		push eax ;обратно запоминаем указатель на выделенную память
4404
		mov dword[ebx], SSF_CREATE_FILE
4405
		mov dword[ebx+4], 0
4406
		mov dword[ebx+8], 0
4407
		mov [ebx+12], ecx
4408
		mov  byte[ebx+20], 0
4409
		push dword[f_name]
4410
		pop dword[ebx+21]
4411
		mcall SF_FILE
1457 IgorA 4412
 
6274 IgorA 4413
		mov ted_err_save,al
1457 IgorA 4414
 
6274 IgorA 4415
		or eax,eax
4416
		jz .no_msg
4417
		cmp ax,10
4418
		jl .zifra_0_9
4419
			mov al,'?'
4420
			sub ax,48
4421
		.zifra_0_9:
4422
		add ax,48
4423
		cmp ted_fun_save_err,0
4424
		je @f
4425
		call ted_fun_save_err
4426
		jmp @f
4427
		.no_msg:
4428
		m2m ted_tim_ls,ted_tim_ch
4429
	@@:
1457 IgorA 4430
 
6274 IgorA 4431
	pop ecx ;записываем указатель на выделенную память
4432
	invoke mem.free,ecx
4433
	.no_save:
4434
popad
4435
	ret
1457 IgorA 4436
endp