Subversion Repositories Kolibri OS

Rev

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