Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
4274 tserj 1
diff16 'tp-key.asm',0,$
2
 
3
key:
4
	mov	ecx,1
5
	mcall	66,3		; Get status of the control keys
6
	mov	[shi],eax
7
	xor	ebx,ebx
8
	test	al,0x03 	; Left or right shift
9
	jz	@f
10
	or	ebx,KM_SHIFT
11
    @@: test	al,0x0C 	; Left or right control
12
	jz	@f
13
	or	ebx,KM_CTRL
14
    @@: test	al,0x10 	; Left alt
15
	jz	@f
16
	or	ebx,KM_ALT
17
    @@: mov	edx,ebx
18
	test	al,0x03
19
	jz	@f
20
	inc	cl
21
    @@:
22
	mcall	2
23
	cmp	al,0
24
	jne	still.skip_write
25
	shr	eax,8
26
;--------------------------------------
27
; this code for Win-keys, works with
28
; kernel SVN r.3356 or later
29
	test	[shi],0x200	; LWin
30
	jnz	still.skip_write
31
	test	[shi],0x400	; RWin
32
	jnz	still.skip_write
33
;--------------------------------------
34
	cmp	al,224
35
	jne	@f
36
	mov	[ext],0x01
37
	jmp	still.skip_write
38
    @@: cmp	al,225
39
	jne	@f
40
	mov	[ext],0x02
41
	jmp	still.skip_write
42
    @@:
43
	mov	ah,[ext]
44
	mov	[ext],0
45
 
46
	mov	esi,numpad_table_off
47
	test	[shi], 0x00000080 ; NumLock is on?
48
	jz	.num
49
	mov	esi,numpad_table_on
50
  .num: cmp	eax,[esi]
51
	jne	@f
52
	mov	eax,[esi+4]
53
	mov	ebx,eax
54
	or	eax,edx
55
	shr	ebx,8
56
	or	ebx,0x0000FFFF
57
	and	eax,ebx
58
	mov	ecx,eax
59
	shr	ecx,16
60
	and	cl,1
61
	inc	cl
62
	jmp	.lp0
63
    @@: add	esi,8
64
	cmp	dword[esi],0
65
	jne	.num
66
 
67
	or	eax,edx
68
 
69
  .lp0: test	al,0x80
70
	jnz	still.skip_write
71
;--------------------------------------
72
; it is CAPS LOCK correct processing for chars
73
	test	[shi], 0x00000040 ; CAPS LOCK is on?
74
	jz	.no_caps_lock
75
	cmp	ecx,1
76
	jnz	@f
77
	inc	ecx
78
	jmp	.no_caps_lock
79
@@:
80
	cmp	ecx,2
81
	jnz	.no_caps_lock
82
	dec	ecx
83
.no_caps_lock:
84
;--------------------------------------
85
; alt gr pressed?
86
	test	[shi], 0x00000020
87
	jz	.no_alt_gr
88
	mov	ecx, 3
89
  .no_alt_gr:
90
;--------------------------------------
91
	push	eax
92
	mcall	26,2,,key1
93
	pop	eax
94
 
95
	mov	[chr],eax
96
 
97
	cmp	[bot_mode],0
98
	je	@f
99
	mov	ebx,eax
100
	mov	al,2
101
	call	[bot_dlg_handler]
102
	jmp	still.skip_write
103
    @@:
104
 
105
	mov	esi,accel_table_main
106
  .acc: cmp	eax,[esi]
107
	jne	@f
108
	test	[secure_sel],1
109
	jz	.lp1
110
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
111
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
112
  .lp1: mov	[s_status],0
113
	call	dword[esi+4]
114
	call	editor_check_for_changes
115
	jmp	still
116
    @@: add	esi,8
117
	cmp	dword[esi],0
118
	jne	.acc
119
 
120
	test	[chr],KM_CTRLALT
121
	jnz	still.skip_write
122
 
123
	mov	[s_status],0
124
 
125
	movzx	eax,byte[chr]
126
	movzx	eax,[eax+key0]
127
	or	al,al
128
	jz	still.skip_write
129
	movzx	eax,[eax+key1]
130
	push	eax
131
 
132
	test	[secure_sel],1
133
	jz	.lp2
134
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
135
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
136
	jmp	.put
137
  .lp2: call	delete_selection
138
 
139
	test	[auto_braces],1
140
	jz	.put
141
	cmp	al,'['
142
	jne	@f
143
	mov	al,']'
144
	call	.lp3
145
	dec	[cur_editor.Caret.X]
146
	jmp	.put
147
    @@: cmp	al,'('
148
	jne	@f
149
	mov	al,')'
150
	call	.lp3
151
	dec	[cur_editor.Caret.X]
152
	jmp	.put
153
    @@: cmp	al,'{'
154
	jne	.put
155
	mov	al,'}'
156
	call	.lp3
157
	dec	[cur_editor.Caret.X]
158
 
159
  .put: pop	eax
160
	push	still editor_check_for_changes
161
	inc	[cur_editor.SelStart.X]
162
  .lp3: push	[cur_editor.Caret.X] eax
163
	inc	dword[esp+4]
164
	mov	eax,1
165
	jmp	key.tab.direct
166
 
167
;-----------------------------------------------------------------------------
168
proc key.ctrl_a ;///// SELECT ALL DOCUMENT ///////////////////////////////////
169
;-----------------------------------------------------------------------------
170
	xor	eax,eax
171
	mov	[cur_editor.SelStart.X],eax
172
	mov	[cur_editor.SelStart.Y],eax
173
	mov	ecx,[cur_editor.Lines.Count]
174
	dec	ecx
175
	mov	[cur_editor.Caret.Y],ecx
176
	call	get_line_offset
177
	call	get_real_length
178
	mov	[cur_editor.Caret.X],eax
179
	call	draw_editor
180
	ret
181
endp
182
 
183
;-----------------------------------------------------------------------------
184
proc key.ctrl_o ;///// ENTER OPEN FILENAME ///////////////////////////////////
185
;-----------------------------------------------------------------------------
186
	mov	[bot_mode2],0
187
 
188
  .direct:
189
	cmp	[bot_mode2], 2
190
	je	.ask
191
	mov	[s_status],s_enter_filename
192
	jmp	.ask1
193
 
194
   .ask:
195
	mov	[s_status],s_ask_save
196
  .ask1:
197
	mov	[bot_mode],1
198
	mov	[bot_dlg_height],16*2+4*2-1
199
	mov	[bot_dlg_handler],osdlg_handler
200
	mov	[focused_tb],tb_opensave
201
 
202
    @@: mov	al,[tb_opensave.length]
203
	mov	[tb_opensave.pos.x],al
204
	mov	[tb_opensave.sel.x],0
205
	mov	[tb_casesen],0;1
206
	call	drawwindow
207
	ret
208
endp
209
 
210
;-----------------------------------------------------------------------------
211
proc key.ctrl_s ;///// ENTER SAVE FILENAME ///////////////////////////////////
212
;-----------------------------------------------------------------------------
213
	cmp	[cur_editor.FilePath], 0
214
	je	key.shift_ctrl_s
215
	cmp	[cur_editor.Modified],0
216
	je	.exit
217
	call	save_file
218
	call	drawwindow
219
  .exit:
220
	ret
221
 
222
    key.shift_ctrl_s:
223
	mov	[bot_mode2],1
224
	jmp	key.ctrl_o.direct
225
endp
226
 
227
;-----------------------------------------------------------------------------
228
proc key.ctrl_n ;///// CREATE NEW FILE (TAB) /////////////////////////////////
229
;-----------------------------------------------------------------------------
230
	call	create_tab
231
	ret
232
endp
233
 
234
;-----------------------------------------------------------------------------
235
proc key.ctrl_f ;///// ENTER KEYWORD TO FIND /////////////////////////////////
236
;-----------------------------------------------------------------------------
237
	mov	[bot_mode2],0
238
	mov	[bot_dlg_height],16*2+4*2-1
239
 
240
	mov	[s_status],s_enter_text_to_find
241
 
242
  .direct:
243
	mov	[bot_mode],1
244
	mov	[bot_dlg_handler],finddlg_handler
245
	mov	[focused_tb],tb_find
246
 
247
	mov	ecx,[s_search.size]
248
	mov	[tb_find.length],cl
249
	jecxz	@f
250
	mov	esi,s_search
251
	mov	edi,tb_find.text
252
	cld
253
	rep	movsb
254
 
255
    @@: mov	al,[tb_find.length]
256
	mov	[tb_find.pos.x],al
257
	mov	[tb_find.sel.x],0
258
	mov	[tb_casesen],0
259
	call	drawwindow
260
	ret
261
endp
262
 
263
proc key.ctrl_h
264
	mov	[bot_mode2],1
265
	mov	[bot_dlg_height],16*3+4*2+1
266
 
267
	mov	[s_status],s_enter_text_to_replace
268
 
269
	jmp	key.ctrl_f.direct
270
endp
271
 
272
proc key.ctrl_g
273
	ret
274
@^
275
	mov	[bot_mode2],0
276
	mov	[bot_dlg_height],16*2+4*2-1
277
 
278
	mov	[bot_mode],1
279
	mov	[bot_dlg_handler],gotodlg_handler
280
	mov	[focused_tb],tb_gotorow
281
 
282
	mov	al,[tb_gotorow.length]
283
	mov	[tb_gotorow.pos.x],al
284
	mov	[tb_gotorow.sel.x],0
285
	mov	[tb_casesen],0
286
	call	drawwindow
287
	ret
288
^@
289
endp
290
 
291
;-----------------------------------------------------------------------------
292
proc key.ctrl_left ;///// GO TO PREVIOUS WORD ////////////////////////////////
293
;-----------------------------------------------------------------------------
294
	call	clear_selection
295
 
296
;-----------------------------------------------------------------------------
297
     key.shift_ctrl_left: ;///// GO TO PREVIOUS WORD, WITH SELECTION /////////
298
;-----------------------------------------------------------------------------
299
	mov	ebx,[cur_editor.Caret.Y]
300
	mov	edx,[cur_editor.Caret.X]
301
	cld
302
	mov	ecx,ebx
303
	call	get_line_offset
304
  .lp1: cmp	edx,[esi+EDITOR_LINE_DATA.Size]
305
	jle	@f
306
	mov	edx,[esi+EDITOR_LINE_DATA.Size]
307
    @@: dec	edx
308
	jl	.nx1
309
	add	esi,sizeof.EDITOR_LINE_DATA
310
	add	esi,edx
311
	mov	ecx,edx
312
    @@: push	ecx
313
	mov	edi,symbols_ex
314
	mov	ecx,symbols_ex.size+symbols.size
315
	mov	al,[esi]
316
	dec	esi
317
	repne	scasb
318
	pop	ecx
319
	jne	@f
320
	dec	edx
321
	dec	ecx
322
	jnz	@b
323
  .nx1: dec	ebx
324
	js	.exit.2
325
	mov	ecx,ebx
326
	call	get_line_offset
327
	mov	edx,[esi+EDITOR_LINE_DATA.Size]
328
	dec	edx
329
	jmp	.lp1
330
    @@:
331
	mov	ecx,ebx
332
	call	get_line_offset
333
  .lp2: cmp	edx,[esi+EDITOR_LINE_DATA.Size]
334
	jle	@f
335
	mov	edx,[esi+EDITOR_LINE_DATA.Size]
336
    @@: or	edx,edx
337
	jl	.nx2
338
	add	esi,sizeof.EDITOR_LINE_DATA
339
	add	esi,edx
340
    @@: mov	edi,symbols_ex
341
	mov	ecx,symbols_ex.size+symbols.size
342
	mov	al,[esi]
343
	dec	esi
344
	repne	scasb
345
	je	@f
346
	dec	edx
347
	jns	@b
348
	jmp	@f
349
  .nx2: dec	ebx
350
	js	.exit.2
351
	mov	ecx,ebx
352
	call	get_line_offset
353
	mov	edx,[esi+EDITOR_LINE_DATA.Size]
354
	dec	edx
355
	jmp	.lp2
356
    @@:
357
	inc	edx
358
	mov	[cur_editor.Caret.Y],ebx
359
	mov	[cur_editor.Caret.X],edx
360
	test	[chr],KM_SHIFT
361
	jnz	@f
362
	mov	[cur_editor.SelStart.Y],ebx
363
	mov	[cur_editor.SelStart.X],edx
364
    @@: sub	ebx,[cur_editor.TopLeft.Y]
365
	jge	@f
366
	add	[cur_editor.TopLeft.Y],ebx
367
    @@: mov	eax,edx
368
	sub	eax,[cur_editor.TopLeft.X]
369
	cmp	eax,[columns.scr]
370
	jl	@f
371
	sub	eax,[columns.scr]
372
	inc	eax
373
	add	[cur_editor.TopLeft.X],eax
374
	jmp	.exit
375
    @@: cmp	edx,[cur_editor.TopLeft.X]
376
	jge	.exit
377
	mov	[cur_editor.TopLeft.X],edx
378
  .exit:
379
	call	editor_check_for_changes
380
  .exit.2:
381
	ret
382
endp
383
 
384
;-----------------------------------------------------------------------------
385
proc key.ctrl_right ;///// GO TO NEXT WORD ///////////////////////////////////
386
;-----------------------------------------------------------------------------
387
	call	clear_selection
388
 
389
;-----------------------------------------------------------------------------
390
     key.shift_ctrl_right: ;///// GO TO NEXT WORD, WITH SELECTION ////////////
391
;-----------------------------------------------------------------------------
392
	mov	ebx,[cur_editor.Caret.Y]
393
	mov	edx,[cur_editor.Caret.X]
394
	cld
395
  .lp1: mov	ecx,ebx
396
	call	get_line_offset
397
	mov	ecx,[esi+EDITOR_LINE_DATA.Size]
398
	cmp	edx,ecx
399
	jge	.nx1
400
	add	esi,sizeof.EDITOR_LINE_DATA
401
	add	esi,edx
402
	sub	ecx,edx
403
    @@: push	ecx
404
	mov	edi,symbols_ex
405
	mov	ecx,symbols_ex.size+symbols.size
406
	lodsb
407
	repne	scasb
408
	pop	ecx
409
	je	@f
410
	inc	edx
411
	dec	ecx
412
	jnz	@b
413
  .nx1: inc	ebx
414
	cmp	ebx,[cur_editor.Lines.Count]
415
	jge	.exit.2
416
	xor	edx,edx
417
	jmp	.lp1
418
    @@:
419
 
420
  .lp2: mov	ecx,ebx
421
	call	get_line_offset
422
	mov	ecx,[esi+EDITOR_LINE_DATA.Size]
423
	cmp	edx,ecx
424
	jge	.nx2
425
	add	esi,sizeof.EDITOR_LINE_DATA
426
	add	esi,edx
427
	sub	ecx,edx
428
    @@: push	ecx
429
	mov	edi,symbols_ex
430
	mov	ecx,symbols_ex.size+symbols.size
431
	lodsb
432
	repne	scasb
433
	pop	ecx
434
	jne	@f
435
	inc	edx
436
	dec	ecx
437
	jnz	@b
438
  .nx2: inc	ebx
439
	cmp	ebx,[cur_editor.Lines.Count]
440
	jge	.exit.2
441
	xor	edx,edx
442
	jmp	.lp2
443
    @@:
444
	mov	[cur_editor.Caret.Y],ebx
445
	mov	[cur_editor.Caret.X],edx
446
	test	[chr],KM_SHIFT
447
	jnz	@f
448
	mov	[cur_editor.SelStart.Y],ebx
449
	mov	[cur_editor.SelStart.X],edx
450
    @@: sub	ebx,[cur_editor.TopLeft.Y]
451
	cmp	ebx,[lines.scr]
452
	jl	@f
453
	sub	ebx,[lines.scr]
454
	inc	ebx
455
	add	[cur_editor.TopLeft.Y],ebx
456
    @@: mov	eax,edx
457
	sub	eax,[cur_editor.TopLeft.X]
458
	cmp	eax,[columns.scr]
459
	jl	@f
460
	sub	eax,[columns.scr]
461
	inc	eax
462
	add	[cur_editor.TopLeft.X],eax
463
	jmp	.exit
464
    @@: cmp	edx,[cur_editor.TopLeft.X]
465
	jge	.exit
466
	mov	[cur_editor.TopLeft.X],edx
467
  .exit:
468
	call	editor_check_for_changes
469
  .exit.2:
470
	ret
471
endp
472
 
473
;-----------------------------------------------------------------------------
474
proc key.ctrl_x
475
	cmp	[sel.selected],0
476
	je	@f
477
	call	key.ctrl_c
478
	call	key.del
479
	mov	[cur_editor.Modified],1
480
    @@: ret
481
endp
482
 
483
;-----------------------------------------------------------------------------
484
proc key.ctrl_c
485
	mov	[copy_size],0
486
	cmp	[sel.selected],0
487
	je	.exit
488
 
489
	call	get_selection_size
490
	stdcall mem.ReAlloc,[copy_buf],eax
491
	mov	[copy_buf],eax
492
 
493
	cld
494
	mov	eax,[sel.begin.y]
495
	cmp	eax,[sel.end.y]
496
	je	.single_line
497
	mov	ecx,[sel.begin.y]
498
	call	get_line_offset
499
	inc	ecx
500
	push	ecx
501
	mov	edi,[copy_buf]
502
	call	get_real_length
503
	sub	eax,[sel.begin.x]
504
	jge	@f
505
	xor	eax,eax
506
    @@: add	esi,[sel.begin.x]
507
	add	esi,sizeof.EDITOR_LINE_DATA
508
	mov	[edi+EDITOR_LINE_DATA.Size],eax
509
	add	edi,sizeof.EDITOR_LINE_DATA
510
	mov	ecx,eax
511
	jecxz	@f
512
	rep	movsb
513
    @@: mov	ecx,[sel.end.y]
514
	call	get_line_offset
515
	pop	ecx
516
	cmp	ecx,[sel.end.y]
517
	je	@f
518
	mov	eax,esi
519
	call	get_line_offset
520
	sub	eax,esi
521
	mov	ecx,eax
522
	rep	movsb
523
	mov	ecx,[sel.end.y]
524
    @@: call	get_line_offset
525
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
526
	add	esi,sizeof.EDITOR_LINE_DATA
527
	cmp	eax,[sel.end.x]
528
	jle	@f
529
	mov	eax,[sel.end.x]
530
    @@: mov	ebx,edi
531
	mov	[edi+EDITOR_LINE_DATA.Size],eax
532
	add	edi,sizeof.EDITOR_LINE_DATA
533
	mov	ecx,eax
534
	jecxz	@f
535
	rep	movsb
536
	sub	eax,[sel.end.x]
537
	jz	@f
538
	neg	eax
539
	mov	ecx,eax
540
	add	[ebx],eax
541
	mov	al,' '
542
	rep	stosb
543
    @@: sub	edi,[copy_buf]
544
	mov	[copy_size],edi
545
	mov	eax,[sel.end.y]
546
	sub	eax,[sel.begin.y]
547
	inc	eax
548
	mov	[copy_count],eax
549
  .exit:
550
	ret
551
 
552
  .single_line:
553
	mov	eax,[sel.end.x]
554
	sub	eax,[sel.begin.x]
555
	mov	edi,[copy_buf]
556
	mov	[edi+EDITOR_LINE_DATA.Size],eax
557
	add	edi,sizeof.EDITOR_LINE_DATA
558
	mov	ecx,[sel.begin.y]
559
	call	get_line_offset
560
	mov	ebx,[sel.begin.x]
561
	mov	ecx,[sel.end.x]
562
	cmp	ebx,[esi+EDITOR_LINE_DATA.Size]
563
	jge	.add_spaces
564
	cmp	ecx,[esi+EDITOR_LINE_DATA.Size]
565
	jle	.lp1
566
	mov	ecx,[esi+EDITOR_LINE_DATA.Size]
567
  .lp1: sub	ecx,[sel.begin.x]
568
	sub	eax,ecx
569
	lea	esi,[esi+ebx+sizeof.EDITOR_LINE_DATA]
570
	rep	movsb
571
 
572
  .add_spaces:
573
	mov	ecx,eax
574
	mov	al,' '
575
	jecxz	@b
576
	rep	stosb
577
	jmp	@b
578
endp
579
 
580
;-----------------------------------------------------------------------------
581
proc key.ctrl_v
582
	cmp	[copy_size],0
583
	je	.exit
584
 
585
	call	delete_selection
586
 
587
	mov	eax,[copy_size]
588
	call	editor_realloc_lines
589
 
590
	mov	ebx,[cur_editor.Lines.Size]
591
	add	ebx,[copy_size]
592
	mov	[cur_editor.Lines.Size],ebx
593
	stdcall mem.ReAlloc,[cur_editor.Lines],ebx
594
	mov	[cur_editor.Lines],eax
595
 
596
	mov	ecx,[cur_editor.Caret.Y]
597
	call	get_line_offset
598
	pushd	[esi+EDITOR_LINE_DATA.Size] esi
599
	mov	ecx,[cur_editor.Caret.X]
600
	call	line_add_spaces
601
	add	[esp],eax
602
	add	esi,eax
603
	mov	ecx,[copy_size]
604
	sub	ecx,sizeof.EDITOR_LINE_DATA
605
	mov	edi,[cur_editor.Lines]
606
	add	edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
607
	dec	edi
608
	mov	eax,esi
609
	mov	esi,edi
610
	sub	esi,ecx
611
	lea	ecx,[eax+sizeof.EDITOR_LINE_DATA]
612
	add	ecx,[cur_editor.Caret.X]
613
	neg	ecx
614
	lea	ecx,[esi+ecx+1]
615
	std
616
	rep	movsb
617
 
618
	mov	ecx,[copy_count]
619
	dec	ecx
620
	jz	.single_line
621
 
622
	cld
623
	pop	edi
624
	add	edi,sizeof.EDITOR_LINE_DATA
625
	mov	esi,[copy_buf]
626
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
627
	add	esi,sizeof.EDITOR_LINE_DATA
628
 
629
	mov	ebx,[cur_editor.Caret.X]
630
	add	eax,ebx
631
	mov	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],eax
632
	mov	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
633
	sub	eax,ebx
634
	call	.check_columns
635
	add	edi,ebx
636
    @@: push	ecx
637
	mov	ecx,eax
638
	rep	movsb
639
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
640
	add	esi,sizeof.EDITOR_LINE_DATA
641
	mov	[edi+EDITOR_LINE_DATA.Size],eax
642
	mov	[edi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
643
	add	edi,sizeof.EDITOR_LINE_DATA
644
	pop	ecx
645
	loop	@b
646
 
647
	pop	ecx
648
	sub	ecx,ebx
649
	add	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],ecx
650
	call	.check_columns
651
	mov	ecx,eax
652
	rep	movsb
653
 
654
	mov	[cur_editor.Caret.X],eax
655
	mov	[cur_editor.SelStart.X],eax
656
	mov	eax,[copy_count]
657
	dec	eax
658
	add	[cur_editor.Caret.Y],eax
659
	add	[cur_editor.SelStart.Y],eax
660
	add	[cur_editor.Lines.Count],eax
661
 
662
	mov	[cur_editor.Modified],1
663
	jmp	.exit
664
 
665
  .single_line:
666
	cld
667
	pop	edi
668
	add	edi,sizeof.EDITOR_LINE_DATA
669
	mov	esi,[copy_buf]
670
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
671
	add	esi,sizeof.EDITOR_LINE_DATA
672
	add	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],eax
673
	and	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
674
	or	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
675
	call	.check_columns
676
	add	edi,[cur_editor.Caret.X]
677
	add	esp,4
678
	mov	ecx,eax
679
	rep	movsb
680
 
681
	add	[cur_editor.Caret.X],eax
682
	add	[cur_editor.SelStart.X],eax
683
 
684
	mov	[cur_editor.Modified],1
685
 
686
  .exit:
687
	ret
688
 
689
  .check_columns:
690
	push	eax
691
	mov	eax,[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
692
	cmp	eax,[cur_editor.Columns.Count]
693
	jbe	@f
694
	mov	[cur_editor.Columns.Count],eax
695
    @@: pop	eax
696
	ret
697
endp
698
 
699
;-----------------------------------------------------------------------------
700
proc key.ctrl_d ;///// INSERT SEPARATOR //////////////////////////////////////
701
;-----------------------------------------------------------------------------
702
	mov	eax,90+sizeof.EDITOR_LINE_DATA
703
	call	editor_realloc_lines
704
 
705
	mov	ecx,[cur_editor.Caret.Y]
706
	call	get_line_offset
707
	mov	ebx,esi
708
 
709
	mov	ecx,[cur_editor.Lines.Count]
710
	call	get_line_offset
711
	lea	edi,[esi+90+sizeof.EDITOR_LINE_DATA]
712
	lea	ecx,[esi+sizeof.EDITOR_LINE_DATA]
713
	sub	ecx,ebx
714
	std
715
	rep	movsb
716
 
717
	lea	edi,[ebx+sizeof.EDITOR_LINE_DATA+1]
718
	mov	[ebx+EDITOR_LINE_DATA.Size],90
719
	mov	al,ASEPC
720
	mov	ecx,79
721
	cld
722
	rep	stosb
723
	mov	al,' '
724
	mov	ecx,10
725
	rep	stosb
726
	mov	byte[ebx+sizeof.EDITOR_LINE_DATA],';'
727
 
728
	inc	[cur_editor.Lines.Count]
729
	inc	[cur_editor.Caret.Y]
730
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
731
 
732
	mov	[cur_editor.Modified],1
733
 
734
  .exit:
735
	ret
736
endp
737
 
738
;-----------------------------------------------------------------------------
739
proc key.ctrl_y ;///// DELETE CURRENT LINE ///////////////////////////////////
740
;-----------------------------------------------------------------------------
741
	mov	eax,[cur_editor.Caret.Y]
742
	inc	eax
743
	cmp	eax,[cur_editor.Lines.Count]
744
	jge	.exit
745
 
746
	mov	ecx,[cur_editor.Caret.Y]
747
	call	get_line_offset
748
	mov	edi,esi
749
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
750
	lea	esi,[esi+eax+sizeof.EDITOR_LINE_DATA]
751
	push	eax
752
 
753
	dec	[cur_editor.Lines.Count]
754
	mov	ecx,[cur_editor.Lines]
755
	add	ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
756
	sub	ecx,esi
757
	shr	ecx,2
758
	cld
759
	rep	movsd
760
 
761
	pop	eax
762
	add	eax,sizeof.EDITOR_LINE_DATA
763
	neg	eax
764
	call	editor_realloc_lines
765
 
766
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
767
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
768
 
769
	mov	[cur_editor.Modified],1
770
 
771
  .exit:
772
	ret
773
endp
774
 
775
;-----------------------------------------------------------------------------
776
proc key.up ;///// GO TO PREVIOUS LINE ///////////////////////////////////////
777
;-----------------------------------------------------------------------------
778
	call	clear_selection
779
 
780
;-----------------------------------------------------------------------------
781
     key.shift_up: ;///// GO TO PREVIOUS LINE, WITH SELECTION ////////////////
782
;-----------------------------------------------------------------------------
783
	mov	eax,[cur_editor.Caret.Y]
784
	dec	eax
785
	jns	@f
786
	xor	eax,eax
787
    @@: mov	ecx,[cur_editor.TopLeft.Y]
788
	cmp	eax,ecx
789
	jae	@f
790
	dec	ecx
791
	jns	@f
792
	xor	ecx,ecx
793
    @@: test	[chr],KM_SHIFT
794
	jnz	@f
795
	mov	[cur_editor.SelStart.Y],eax
796
    @@: mov	[cur_editor.Caret.Y],eax
797
	mov	[cur_editor.TopLeft.Y],ecx
798
 
799
  .exit:
800
	ret
801
endp
802
 
803
;-----------------------------------------------------------------------------
804
proc key.down ;///// GO TO NEXT LINE /////////////////////////////////////////
805
;-----------------------------------------------------------------------------
806
	call	clear_selection
807
 
808
;-----------------------------------------------------------------------------
809
     key.shift_down: ;///// GO TO NEXT LINE, WITH SELECTION //////////////////
810
;-----------------------------------------------------------------------------
811
 
812
	mov	eax,[cur_editor.Caret.Y]
813
	inc	eax
814
	cmp	eax,[cur_editor.Lines.Count]
815
	jb	@f
816
	dec	eax
817
    @@: mov	ecx,[cur_editor.TopLeft.Y]
818
	mov	edx,eax
819
	sub	edx,ecx
820
	cmp	edx,[lines.scr]
821
	jb	@f
822
	inc	ecx
823
    @@: test	[chr],KM_SHIFT
824
	jnz	@f
825
	mov	[cur_editor.SelStart.Y],eax
826
    @@: mov	[cur_editor.Caret.Y],eax
827
	mov	[cur_editor.TopLeft.Y],ecx
828
 
829
  .exit:
830
	ret
831
endp
832
 
833
;-----------------------------------------------------------------------------
834
proc key.left ;///// GO TO PREVIOUS CHAR /////////////////////////////////////
835
;-----------------------------------------------------------------------------
836
	call	clear_selection
837
 
838
;-----------------------------------------------------------------------------
839
     key.shift_left: ;///// GO TO PREVIOUS CHAR, WITH SELECTION //////////////
840
;-----------------------------------------------------------------------------
841
	mov	eax,[cur_editor.Caret.X]
842
	dec	eax
843
	jns	@f
844
	inc	eax
845
    @@: test	[chr],KM_SHIFT
846
	jnz	@f
847
	mov	[cur_editor.SelStart.X],eax
848
    @@: mov	[cur_editor.Caret.X],eax
849
 
850
  .exit:
851
	ret
852
endp
853
 
854
;-----------------------------------------------------------------------------
855
proc key.right ;///// GO TO NEXT CHAR ////////////////////////////////////////
856
;-----------------------------------------------------------------------------
857
	call	clear_selection
858
 
859
;-----------------------------------------------------------------------------
860
     key.shift_right: ;///// GO TO NEXT CHAR, WITH SELECTION /////////////////
861
;-----------------------------------------------------------------------------
862
	mov	eax,[cur_editor.Caret.X]
863
	inc	eax
864
	cmp	eax,[cur_editor.Columns.Count]
865
	jbe	@f
866
	dec	eax
867
    @@: test	[chr],KM_SHIFT
868
	jnz	@f
869
	mov	[cur_editor.SelStart.X],eax
870
    @@: mov	[cur_editor.Caret.X],eax
871
 
872
  .exit:
873
	ret
874
endp
875
 
876
;-----------------------------------------------------------------------------
877
proc key.pgup ;///// GO TO PREVIOUS PAGE /////////////////////////////////////
878
;-----------------------------------------------------------------------------
879
	call	clear_selection
880
 
881
;-----------------------------------------------------------------------------
882
     key.shift_pgup: ;///// GO TO PREVIOUS PAGE, WITH SELECTION //////////////
883
;-----------------------------------------------------------------------------
884
	mov	edx,[lines.scr]
885
	dec	edx
886
	mov	eax,[cur_editor.Caret.Y]
887
	mov	ecx,[cur_editor.TopLeft.Y]
888
	sub	eax,edx
889
	jns	@f
890
	xor	eax,eax
891
    @@: sub	ecx,edx
892
	jns	@f
893
	xor	ecx,ecx
894
    @@: test	[chr],KM_SHIFT
895
	jnz	@f
896
	mov	[cur_editor.SelStart.Y],eax
897
    @@: mov	[cur_editor.Caret.Y],eax
898
	mov	[cur_editor.TopLeft.Y],ecx
899
 
900
  .exit:
901
	ret
902
endp
903
 
904
;-----------------------------------------------------------------------------
905
proc key.pgdn ;///// GO TO NEXT PAGE /////////////////////////////////////////
906
;-----------------------------------------------------------------------------
907
	call	clear_selection
908
 
909
;-----------------------------------------------------------------------------
910
     key.shift_pgdn: ;///// GO TO NEXT PAGE, WITH SELECTION //////////////////
911
;-----------------------------------------------------------------------------
912
	mov	edx,[lines.scr]
913
	dec	edx
914
	mov	eax,[cur_editor.Caret.Y]
915
	mov	ecx,[cur_editor.TopLeft.Y]
916
	add	eax,edx
917
	add	ecx,edx
918
	cmp	eax,[cur_editor.Lines.Count]
919
	jb	@f
920
	mov	eax,[cur_editor.Lines.Count]
921
	dec	eax
922
    @@: test	[chr],KM_SHIFT
923
	jnz	@f
924
	mov	[cur_editor.SelStart.Y],eax
925
    @@: mov	[cur_editor.Caret.Y],eax
926
	mov	[cur_editor.TopLeft.Y],ecx
927
 
928
  .exit:
929
	ret
930
endp
931
 
932
;-----------------------------------------------------------------------------
933
proc key.home ;///// GO TO LINE START ////////////////////////////////////////
934
;-----------------------------------------------------------------------------
935
	call	clear_selection
936
 
937
;-----------------------------------------------------------------------------
938
     key.shift_home: ;///// GO TO LINE START, WITH SELECTION /////////////////
939
;-----------------------------------------------------------------------------
940
	mov	[cur_editor.Caret.X],0
941
	test	[chr],KM_SHIFT
942
	jnz	@f
943
	mov	[cur_editor.SelStart.X],0
944
    @@:
945
 
946
  .exit:
947
	ret
948
endp
949
 
950
;-----------------------------------------------------------------------------
951
proc key.end ;///// GO TO LINE END ///////////////////////////////////////////
952
;-----------------------------------------------------------------------------
953
	call	clear_selection
954
 
955
;-----------------------------------------------------------------------------
956
     key.shift_end: ;///// GO TO LINE END, WITH SELECTION ////////////////////
957
;-----------------------------------------------------------------------------
958
	mov	ecx,[cur_editor.Caret.Y]
959
	call	get_line_offset
960
	call	get_real_length
961
	mov	[cur_editor.Caret.X],eax
962
	test	[chr],KM_SHIFT
963
	jnz	@f
964
	mov	[cur_editor.SelStart.X],eax
965
    @@:
966
 
967
  .exit:
968
	ret
969
endp
970
 
971
;-----------------------------------------------------------------------------
972
proc key.ctrl_home ;///// GO TO PAGE START ///////////////////////////////////
973
;-----------------------------------------------------------------------------
974
	call	clear_selection
975
 
976
;-----------------------------------------------------------------------------
977
     key.shift_ctrl_home: ;///// GO TO PAGE START, WITH SELECTION ////////////
978
;-----------------------------------------------------------------------------
979
	mov	eax,[cur_editor.TopLeft.Y]
980
	mov	ecx,eax
981
	test	[chr],KM_SHIFT
982
	jnz	@f
983
	mov	[cur_editor.SelStart.Y],eax
984
    @@: mov	[cur_editor.Caret.Y],eax
985
	mov	[cur_editor.TopLeft.Y],ecx
986
 
987
  .exit:
988
	ret
989
endp
990
 
991
;-----------------------------------------------------------------------------
992
proc key.ctrl_end ;///// GO TO PAGE END //////////////////////////////////////
993
;-----------------------------------------------------------------------------
994
	call	clear_selection
995
 
996
;-----------------------------------------------------------------------------
997
     key.shift_ctrl_end: ;///// GO TO PAGE END, WITH SELECTION ///////////////
998
;-----------------------------------------------------------------------------
999
	mov	ecx,[cur_editor.TopLeft.Y]
1000
	mov	eax,[lines.scr]
1001
	cmp	eax,[cur_editor.Lines.Count]
1002
	jle	@f
1003
	mov	eax,[cur_editor.Lines.Count]
1004
    @@: add	eax,ecx
1005
	dec	eax
1006
	test	[chr],KM_SHIFT
1007
	jnz	@f
1008
	mov	[cur_editor.SelStart.Y],eax
1009
    @@: mov	[cur_editor.Caret.Y],eax
1010
	mov	[cur_editor.TopLeft.Y],ecx
1011
 
1012
  .exit:
1013
	ret
1014
endp
1015
 
1016
;-----------------------------------------------------------------------------
1017
proc key.ctrl_pgup ;///// GO TO DOCUMENT START ///////////////////////////////
1018
;-----------------------------------------------------------------------------
1019
	call	clear_selection
1020
 
1021
;-----------------------------------------------------------------------------
1022
     key.shift_ctrl_pgup: ;///// GO TO DOCUMENT START, WITH SELECTION ////////
1023
;-----------------------------------------------------------------------------
1024
	xor	eax,eax
1025
	mov	[cur_editor.TopLeft.Y],eax
1026
	mov	[cur_editor.Caret.Y],eax
1027
	test	[chr],KM_SHIFT
1028
	jnz	@f
1029
	mov	[cur_editor.SelStart.Y],eax
1030
    @@:
1031
 
1032
  .exit:
1033
	ret
1034
endp
1035
 
1036
;-----------------------------------------------------------------------------
1037
proc key.ctrl_pgdn ;///// GO TO DOCUMENT END /////////////////////////////////
1038
;-----------------------------------------------------------------------------
1039
	call	clear_selection
1040
 
1041
;-----------------------------------------------------------------------------
1042
     key.shift_ctrl_pgdn: ;///// GO TO DOCUMENT END, WITH SELECTION //////////
1043
;-----------------------------------------------------------------------------
1044
	mov	eax,[cur_editor.Lines.Count]
1045
	mov	[cur_editor.Caret.Y],eax
1046
	sub	eax,[lines.scr]
1047
	jns	@f
1048
	xor	eax,eax
1049
    @@: mov	[cur_editor.TopLeft.Y],eax
1050
	dec	[cur_editor.Caret.Y]
1051
	test	[chr],KM_SHIFT
1052
	jnz	@f
1053
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
1054
    @@:
1055
 
1056
  .exit:
1057
	ret
1058
endp
1059
 
1060
;-----------------------------------------------------------------------------
1061
proc key.del ;///// DELETE NEXT CHAR OR SELECTION ////////////////////////////
1062
;-----------------------------------------------------------------------------
1063
	call	delete_selection
1064
	jnc	.exit
1065
 
1066
	mov	ecx,[cur_editor.Caret.Y]
1067
	call	get_line_offset
1068
	and	[esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
1069
	or	[esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1070
	lea	ebx,[esi+sizeof.EDITOR_LINE_DATA]
1071
	mov	ebp,esi
1072
 
1073
	call	get_real_length
1074
	or	eax,eax
1075
	je	.line_up
1076
 
1077
	mov	ecx,[cur_editor.Caret.X]
1078
	cmp	ecx,eax
1079
	jae	.line_up
1080
	lea	edi,[ebx+ecx]
1081
	neg	ecx
1082
	mov	eax,[ebp+EDITOR_LINE_DATA.Size]
1083
	add	ecx,eax;[ebp]
1084
	repe	scasb
1085
	je	.line_up
1086
 
1087
	mov	edi,ebx
1088
	mov	ecx,[cur_editor.Caret.X]
1089
	add	edi,ecx
1090
	lea	esi,[edi+1]
1091
	neg	ecx
1092
	mov	eax,[ebp+EDITOR_LINE_DATA.Size]
1093
	add	ecx,eax;[ebp]
1094
	dec	ecx
1095
	rep	movsb
1096
	mov	byte[edi],' '
1097
 
1098
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1099
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
1100
	mov	[cur_editor.Modified],1
1101
	ret
1102
 
1103
  .line_up:
1104
	mov	eax,[cur_editor.Lines.Count]
1105
	dec	eax
1106
	cmp	eax,[cur_editor.Caret.Y]
1107
	je	.exit
1108
	mov	edi,[temp_buf]
1109
	add	edi,sizeof.EDITOR_LINE_DATA
1110
	mov	esi,ebx
1111
	mov	ecx,[cur_editor.Caret.X]
1112
	rep	movsb
1113
	mov	ecx,[cur_editor.Caret.X]
1114
	mov	eax,[temp_buf]
1115
	mov	[eax+EDITOR_LINE_DATA.Size],ecx
1116
	cmp	ecx,[ebp+EDITOR_LINE_DATA.Size]
1117
	jbe	@f
1118
	mov	eax,[ebp+EDITOR_LINE_DATA.Size]
1119
	sub	ecx,eax
1120
	sub	edi,ecx
1121
	mov	al,' '
1122
	rep	stosb
1123
    @@: lea	esi,[ebx+sizeof.EDITOR_LINE_DATA]
1124
	mov	eax,[ebp+EDITOR_LINE_DATA.Size]
1125
	add	esi,eax
1126
	mov	ecx,[esi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
1127
	mov	eax,[temp_buf]
1128
	add	[eax+EDITOR_LINE_DATA.Size],ecx
1129
	or	[eax+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1130
	rep	movsb
1131
 
1132
	mov	ecx,edi
1133
	sub	ecx,[temp_buf]
1134
 
1135
	mov	esi,[temp_buf]
1136
	call	get_real_length
1137
	cmp	eax,[cur_editor.Columns.Count]
1138
	jbe	@f
1139
	mov	[cur_editor.Columns.Count],eax
1140
    @@:
1141
	push	ecx
1142
	mov	edi,[cur_editor.Lines]
1143
	add	edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
1144
	dec	edi
1145
	lea	esi,[edi+sizeof.EDITOR_LINE_DATA*2] ; !!! CHECK THIS !!!
1146
	sub	esi,ecx
1147
	mov	eax,[ebp+EDITOR_LINE_DATA.Size]
1148
	add	esi,eax
1149
	mov	eax,[ebp+eax+sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
1150
	add	esi,eax
1151
	lea	ecx,[esi-sizeof.EDITOR_LINE_DATA]
1152
	sub	ecx,ebp
1153
	std
1154
	cmp	esi,edi
1155
	jb	@f
1156
	jz	.lp1
1157
	mov	edi,ebp
1158
	add	edi,[esp]
1159
	lea	esi,[ebp+sizeof.EDITOR_LINE_DATA*2] ; !!! CHECK THIS !!!
1160
	mov	eax,[esi-sizeof.EDITOR_LINE_DATA*2+EDITOR_LINE_DATA.Size] ; !!! CHECK THIS !!!
1161
	add	esi,eax
1162
	mov	eax,[esi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size] ; !!! CHECK THIS !!!
1163
	add	esi,eax
1164
	mov	ecx,[cur_editor.Lines]
1165
	add	ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
1166
	sub	ecx,esi
1167
	cld
1168
    @@: rep	movsb
1169
  .lp1: pop	ecx
1170
	mov	esi,[temp_buf]
1171
	mov	edi,ebp
1172
	cld
1173
	rep	movsb
1174
 
1175
  .ok.dec.lines:
1176
	dec	[cur_editor.Lines.Count]
1177
	mov	eax,[cur_editor.Lines.Count]
1178
	cmp	[cur_editor.Caret.Y],eax
1179
	jb	@f
1180
	dec	eax
1181
	mov	[cur_editor.Caret.Y],eax
1182
    @@: m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1183
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
1184
 
1185
	mov	ecx,[cur_editor.Lines.Count]
1186
	call	get_line_offset
1187
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
1188
	lea	esi,[esi+eax+sizeof.EDITOR_LINE_DATA]
1189
	mov	eax,[cur_editor.Lines]
1190
	add	eax,[cur_editor.Lines.Size] ;*** add eax,[eax-4]
1191
	sub	esi,eax
1192
	lea	eax,[esi+4096]
1193
	call	editor_realloc_lines
1194
 
1195
	mov	[cur_editor.Modified],1
1196
 
1197
  .exit:
1198
	ret
1199
endp
1200
 
1201
;-----------------------------------------------------------------------------
1202
proc key.ins ;///// TOGGLE INSERT/OVERWRITE MODE /////////////////////////////
1203
;-----------------------------------------------------------------------------
1204
	xor	[ins_mode],1
1205
	mov	eax,[cur_editor.Caret.Y]
1206
	mov	ebx,eax
1207
	call	draw_editor_text.part
1208
	call	draw_editor_caret
1209
	ret
1210
endp
1211
 
1212
;-----------------------------------------------------------------------------
1213
proc key.bkspace ;///// DELETE PREVIOUS CHAR OR SELECTION ////////////////////
1214
;-----------------------------------------------------------------------------
1215
	call	delete_selection
1216
	jnc	key.del.exit
1217
 
1218
	mov	eax,[cur_editor.Caret.X]
1219
	dec	eax
1220
	js	.line_up
1221
 
1222
	dec	[cur_editor.Caret.X]
1223
	mov	ecx,[cur_editor.Caret.Y]
1224
	call	get_line_offset
1225
	and	[esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
1226
	or	[esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1227
 
1228
	mov	ebx,eax
1229
	call	get_real_length
1230
	cmp	eax,[cur_editor.Caret.X]
1231
	jae	@f
1232
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1233
	mov	[cur_editor.Modified],1
1234
	ret
1235
 
1236
    @@: lea	edi,[esi+sizeof.EDITOR_LINE_DATA+ebx]
1237
	mov	ecx,ebx
1238
	neg	ecx
1239
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
1240
	add	ecx,eax
1241
	dec	ecx
1242
	lea	esi,[edi+1]
1243
	cld
1244
	rep	movsb
1245
	mov	byte[edi],' '
1246
 
1247
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1248
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
1249
	mov	[cur_editor.Modified],1
1250
	ret
1251
 
1252
  .line_up:
1253
	cmp	[cur_editor.Caret.Y],0
1254
	jne	@f
1255
	ret
1256
    @@: mov	ecx,[cur_editor.Caret.Y]
1257
	dec	ecx
1258
	call	get_line_offset
1259
	and	[esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
1260
	or	[esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1261
 
1262
	mov	ebp,esi
1263
	lea	ebx,[esi+sizeof.EDITOR_LINE_DATA]
1264
	mov	ecx,[ebp+EDITOR_LINE_DATA.Size]
1265
    @@: cmp	byte[ebx+ecx-1],' '
1266
	jne	@f
1267
	dec	ecx
1268
	jg	@b
1269
    @@: mov	[cur_editor.Caret.X],ecx
1270
	dec	[cur_editor.Caret.Y]
1271
	cld
1272
	jmp	key.del.line_up
1273
endp
1274
 
1275
;-----------------------------------------------------------------------------
1276
proc key.tab ;///// TABULATE /////////////////////////////////////////////////
1277
;-----------------------------------------------------------------------------
1278
	call	delete_selection
1279
	mov	eax,[cur_editor.Caret.X]
1280
 
1281
	mov	ecx,eax
1282
	add	eax,ATABW
1283
	and	eax,not(ATABW-1)
1284
	push	eax ' '
1285
	sub	eax,ecx
1286
  .direct:
1287
	push	eax
1288
	call	editor_realloc_lines
1289
	pop	eax
1290
	mov	ecx,[cur_editor.Caret.Y]
1291
	call	get_line_offset
1292
	and	[esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
1293
	or	[esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1294
 
1295
	xchg	eax,ecx
1296
 
1297
	call	get_real_length
1298
	cmp	eax,[cur_editor.Caret.X]
1299
	jae	@f
1300
	mov	eax,[cur_editor.Caret.X]
1301
    @@: mov	edx,[esi+EDITOR_LINE_DATA.Size]
1302
	sub	edx,eax
1303
	cmp	ecx,edx
1304
	jl	@f
1305
	push	eax
1306
	mov	eax,10
1307
	call	editor_realloc_lines
1308
	add	esi,eax
1309
	pop	eax
1310
	pushad
1311
	mov	ecx,[cur_editor.Lines]
1312
	add	ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
1313
	dec	ecx
1314
	mov	edi,ecx
1315
	add	ecx,-10+1
1316
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
1317
	lea	eax,[esi+eax+sizeof.EDITOR_LINE_DATA]
1318
	sub	ecx,eax
1319
	lea	esi,[edi-10]
1320
	std
1321
	rep	movsb
1322
	mov	ecx,10
1323
	mov	al,' '
1324
	rep	stosb
1325
	popad
1326
	add	[esi+EDITOR_LINE_DATA.Size],10
1327
	jmp	@b
1328
    @@: lea	ebx,[esi+sizeof.EDITOR_LINE_DATA]
1329
	push	ecx
1330
	mov	edi,[esi+EDITOR_LINE_DATA.Size]
1331
	lea	edi,[ebx+edi-1]
1332
	mov	esi,edi
1333
	sub	esi,ecx
1334
	lea	ecx,[esi+1]
1335
	sub	ecx,ebx
1336
	sub	ecx,[cur_editor.Caret.X]
1337
	std
1338
	rep	movsb
1339
  .ok:	pop	ecx
1340
	pop	eax
1341
	rep	stosb
1342
	cld
1343
	pop	[cur_editor.Caret.X]
1344
	lea	esi,[ebx-sizeof.EDITOR_LINE_DATA]
1345
	call	get_real_length
1346
	cmp	eax,[cur_editor.Caret.X]
1347
	jae	@f
1348
	mov	eax,[cur_editor.Caret.X]
1349
    @@: cmp	eax,[cur_editor.Columns.Count]
1350
	jbe	@f
1351
	mov	[cur_editor.Columns.Count],eax
1352
    @@: m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1353
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
1354
	mov	[cur_editor.Modified],1
1355
 
1356
  .exit:
1357
	ret
1358
endp
1359
 
1360
;-----------------------------------------------------------------------------
1361
proc key.return ;///// CARRIAGE RETURN ///////////////////////////////////////
1362
;-----------------------------------------------------------------------------
1363
	call	delete_selection
1364
 
1365
	mov	eax,14
1366
	call	editor_realloc_lines
1367
 
1368
	mov	ecx,[cur_editor.Caret.Y]
1369
	call	get_line_offset
1370
 
1371
	mov	ebx,[cur_editor.Caret.X]
1372
	cmp	ebx,[esi+EDITOR_LINE_DATA.Size]
1373
	jb	@f
1374
	mov	ebx,[esi+EDITOR_LINE_DATA.Size]
1375
	dec	ebx
1376
	jns	@f
1377
	xor	ebx,ebx
1378
    @@:
1379
	cld
1380
 
1381
	mov	edi,[temp_buf]
1382
	mov	ebp,esi
1383
	lea	ecx,[ebx+1]
1384
    @@: dec	ecx
1385
	jz	@f
1386
	cmp	byte[esi+ecx+sizeof.EDITOR_LINE_DATA-1],' '
1387
	je	@b
1388
    @@: lea	eax,[ecx+10]
1389
	mov	[edi+EDITOR_LINE_DATA.Size],eax
1390
	mov	[edi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1391
	add	edi,sizeof.EDITOR_LINE_DATA
1392
	jecxz	@f
1393
	push	esi
1394
	add	esi,sizeof.EDITOR_LINE_DATA
1395
	rep	movsb
1396
	pop	esi
1397
    @@: mov	al,' '
1398
	mov	ecx,10
1399
	rep	stosb
1400
 
1401
	mov	ecx,[esi+EDITOR_LINE_DATA.Size]
1402
	sub	ecx,ebx
1403
	add	esi,ebx
1404
	add	esi,sizeof.EDITOR_LINE_DATA
1405
	inc	ecx
1406
    @@: dec	ecx
1407
	jz	@f
1408
	cmp	byte[esi+ecx-1],' '
1409
	je	@b
1410
    @@: jz	.lp1
1411
    @@: cmp	byte[esi],' '
1412
	jne	.lp1
1413
	inc	esi
1414
	loop	@b
1415
  .lp1: test	[auto_indent],1
1416
	jz	.lp2
1417
	push	edi ecx
1418
	mov	ecx,[ebp+EDITOR_LINE_DATA.Size]
1419
	lea	edi,[ebp+sizeof.EDITOR_LINE_DATA]
1420
	mov	al,' '
1421
	repe	scasb
1422
	mov	eax,ecx
1423
	pop	ecx edi
1424
	je	.lp2
1425
	neg	eax
1426
	mov	edx,[ebp+EDITOR_LINE_DATA.Size]
1427
	add	eax,edx;[ebp]
1428
	dec	eax
1429
	jmp	@f
1430
  .lp2: xor	eax,eax
1431
    @@: mov	edx,edi
1432
	add	edi,sizeof.EDITOR_LINE_DATA
1433
	mov	[cur_editor.Caret.X],eax
1434
	jecxz	@f
1435
	push	ecx
1436
	mov	ecx,eax
1437
	mov	al,' '
1438
	rep	stosb
1439
	pop	ecx
1440
    @@: jecxz	@f
1441
	rep	movsb
1442
    @@: mov	ecx,10
1443
	mov	al,' '
1444
	rep	stosb
1445
 
1446
	lea	eax,[edi-sizeof.EDITOR_LINE_DATA]
1447
	sub	eax,edx
1448
	mov	[edx+EDITOR_LINE_DATA.Size],eax
1449
	mov	[edx+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1450
 
1451
	mov	ecx,edi
1452
	sub	ecx,[temp_buf]
1453
 
1454
	push	ecx
1455
	mov	edi,[cur_editor.Lines]
1456
	add	edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
1457
	dec	edi
1458
	lea	esi,[edi+sizeof.EDITOR_LINE_DATA]
1459
	sub	esi,ecx
1460
	mov	ecx,[ebp+EDITOR_LINE_DATA.Size]
1461
	add	esi,ecx
1462
	lea	ecx,[esi-sizeof.EDITOR_LINE_DATA]
1463
	sub	ecx,ebp
1464
	std
1465
	cmp	esi,edi
1466
	jb	@f
1467
	je	.lp3
1468
	lea	esi,[ebp+sizeof.EDITOR_LINE_DATA]
1469
	mov	eax,[esp]
1470
	lea	edi,[esi+eax-sizeof.EDITOR_LINE_DATA]
1471
	mov	ecx,[ebp+EDITOR_LINE_DATA.Size]
1472
	add	esi,ecx
1473
	mov	ecx,[cur_editor.Lines]
1474
	add	ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
1475
	sub	ecx,esi
1476
	cld
1477
    @@: rep	movsb
1478
  .lp3: pop	ecx
1479
	mov	esi,[temp_buf]
1480
	mov	edi,ebp
1481
	cld
1482
	rep	movsb
1483
 
1484
	inc	[cur_editor.Caret.Y]
1485
	inc	[cur_editor.SelStart.Y]
1486
	inc	[cur_editor.Lines.Count]
1487
 
1488
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1489
 
1490
	mov	[cur_editor.Modified],1
1491
 
1492
  .exit:
1493
	ret
1494
endp
1495
 
1496
;-----------------------------------------------------------------------------
1497
proc key.ctrl_tab ;///// SWITCH TO NEXT TAB //////////////////////////////////
1498
;-----------------------------------------------------------------------------
1499
	cmp	[tab_bar.Items.Count],1
1500
	je	.exit
1501
	xor	eax,eax
1502
	mov	ebp,[tab_bar.Items]
1503
    @@: cmp	ebp,[tab_bar.Current.Ptr]
1504
	je	@f
1505
	inc	eax
1506
	add	ebp,sizeof.TABITEM
1507
	jmp	@b
1508
    @@: add	ebp,sizeof.TABITEM
1509
	inc	eax
1510
	cmp	eax,[tab_bar.Items.Count]
1511
	jb	@f
1512
	mov	ebp,[tab_bar.Items]
1513
    @@: call	set_cur_tab
1514
	call	make_tab_visible
1515
	call	align_editor_in_tab
1516
	call	draw_editor
1517
	call	draw_tabctl
1518
	call	update_caption
1519
  .exit:
1520
	ret
1521
endp
1522
 
1523
;-----------------------------------------------------------------------------
1524
proc key.shift_ctrl_tab ;///// SWITCH TO PREVIOUS TAB ////////////////////////
1525
;-----------------------------------------------------------------------------
1526
	cmp	[tab_bar.Items.Count],1
1527
	je	.exit
1528
	xor	eax,eax
1529
	mov	ebp,[tab_bar.Items]
1530
    @@: cmp	ebp,[tab_bar.Current.Ptr]
1531
	je	@f
1532
	inc	eax
1533
	add	ebp,sizeof.TABITEM
1534
	jmp	@b
1535
    @@: add	ebp,-sizeof.TABITEM
1536
	dec	eax
1537
	jge	@f
1538
	imul	eax,[tab_bar.Items.Count],sizeof.TABITEM
1539
	add	eax,[tab_bar.Items]
1540
	lea	ebp,[eax-sizeof.TABITEM]
1541
    @@: call	set_cur_tab
1542
	call	make_tab_visible
1543
	call	align_editor_in_tab
1544
	call	draw_editor
1545
	call	draw_tabctl
1546
	call	update_caption
1547
  .exit:
1548
	ret
1549
endp
1550
 
1551
;-----------------------------------------------------------------------------
1552
proc key.ctrl_f4 ;///// CLOSE CURRENT TAB ////////////////////////////////////
1553
;-----------------------------------------------------------------------------
1554
	cmp	[cur_editor.Modified],0
1555
	je	.close
1556
	mov	[bot_mode2],2
1557
	jmp	key.ctrl_o.direct
1558
 .close:
1559
	mov	[do_not_draw],1
1560
	push	[tab_bar.Current.Ptr]
1561
	cmp	[tab_bar.Items.Count],1
1562
	jne	@f
1563
	;call    create_tab
1564
	jmp	key.alt_x.close 	; close program
1565
    @@: pop	ebp
1566
	call	delete_tab
1567
	dec	[do_not_draw]
1568
	call	align_editor_in_tab
1569
	call	draw_editor
1570
	call	draw_tabctl
1571
	call	draw_statusbar
1572
	ret
1573
endp
1574
 
1575
;-----------------------------------------------------------------------------
1576
proc key.shift_f9 ;///// SET DEFAULT TAB /////////////////////////////////////
1577
;-----------------------------------------------------------------------------
1578
	mov	eax,[tab_bar.Current.Ptr]
1579
	cmp	eax,[tab_bar.Default.Ptr]
1580
	jne	@f
1581
	xor	eax,eax
1582
    @@: mov	[tab_bar.Default.Ptr],eax
1583
	mov	ebp,[tab_bar.Current.Ptr]
1584
	call	make_tab_visible
1585
	cmp	[tab_bar.Style],2
1586
	jbe	@f
1587
	call	align_editor_in_tab
1588
	call	draw_editor
1589
    @@: call	draw_tabctl
1590
	ret
1591
endp
1592
 
1593
;-----------------------------------------------------------------------------
1594
proc key.f3 ;///// FIND NEXT MATCH ///////////////////////////////////////////
1595
;-----------------------------------------------------------------------------
1596
	call	search
1597
	jc	@f
1598
    @@: ret
1599
endp
1600
 
1601
;-----------------------------------------------------------------------------
1602
proc key.f9 ;///// COMPILE AND RUN ///////////////////////////////////////////
1603
;-----------------------------------------------------------------------------
1604
	mov	bl,1
1605
	call	start_fasm
1606
	ret
1607
endp
1608
 
1609
;-----------------------------------------------------------------------------
1610
proc key.f10 ;///// COMPILE AND RUN UNDER DEBUG //////////////////////////////
1611
;-----------------------------------------------------------------------------
1612
	mov	bl,2
1613
	call	start_fasm
1614
	ret
1615
endp
1616
 
1617
;-----------------------------------------------------------------------------
1618
proc key.ctrl_f9 ;///// COMPILE //////////////////////////////////////////////
1619
;-----------------------------------------------------------------------------
1620
	mov	bl,0
1621
	call	start_fasm
1622
	ret
1623
endp
1624
 
1625
;-----------------------------------------------------------------------------
1626
proc key.alt_x ;///// EXIT PROGRAM ///////////////////////////////////////////
1627
;-----------------------------------------------------------------------------
1628
	mov	[main_closing],1
1629
	mov	eax,[tab_bar.Items]
1630
	mov	[exit_tab_item],eax
1631
	mov	eax,[tab_bar.Items.Count]
1632
	mov	[exit_tab_num],eax
1633
  .direct:
1634
	call	try_to_close_tabs
1635
	or	eax,eax
1636
	jz	@f
1637
	mov	[bot_mode2],2
1638
	jmp	key.ctrl_o.direct
1639
 
1640
    @@: stdcall save_settings
1641
 
1642
  .close:
1643
	mov	[main_closed],1
1644
	mcall	-1
1645
endp
1646
 
1647
;-----------------------------------------------------------------------------
1648
proc try_to_close_tabs ;///// FIND TABS TO BE SAVED BEFORE CLOSE /////////////
1649
;-----------------------------------------------------------------------------
1650
	push	ecx ebp
1651
	call	flush_cur_tab
1652
	mov	ebp,[exit_tab_item] ; [tab_bar.Items]
1653
	add	ebp,-sizeof.TABITEM
1654
    @@: dec	[exit_tab_num]
1655
	js	.ok
1656
	add	ebp,sizeof.TABITEM
1657
	mov	al,[ebp+TABITEM.Editor.Modified]
1658
	cmp	[ebp+TABITEM.Editor.Modified],0
1659
	je	@b
1660
	mov	[exit_tab_item],ebp
1661
	call	set_cur_tab
1662
	call	make_tab_visible
1663
	xor	eax,eax
1664
	inc	eax
1665
    @@: pop	ebp ecx
1666
	ret
1667
  .ok:	xor	eax,eax
1668
	jmp	@b
1669
endp