Subversion Repositories Kolibri OS

Rev

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

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