Subversion Repositories Kolibri OS

Rev

Rev 4487 | Rev 4566 | 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
4487 mario79 485
        mov     [copy_size],0
486
        cmp     [sel.selected],0
487
        je      .exit
4274 tserj 488
 
4487 mario79 489
        call    get_selection_size
490
	push	eax
491
        stdcall mem.ReAlloc,[copy_buf],eax
492
        mov     [copy_buf],eax
493
	pop	eax
494
        stdcall mem.ReAlloc,[clipboard_buf],eax
495
        mov     [clipboard_buf],eax
4274 tserj 496
 
4487 mario79 497
        cld
498
        mov     eax,[sel.begin.y]
499
        cmp     eax,[sel.end.y]
500
        je      .single_line
501
        mov     ecx,[sel.begin.y]
502
        call    get_line_offset
503
        inc     ecx
504
        push    ecx
505
        mov     edi,[copy_buf]
506
        call    get_real_length
507
        sub     eax,[sel.begin.x]
508
        jge     @f
509
        xor     eax,eax
510
    @@: add     esi,[sel.begin.x]
511
        add     esi,sizeof.EDITOR_LINE_DATA
512
        mov     [edi+EDITOR_LINE_DATA.Size],eax
513
        add     edi,sizeof.EDITOR_LINE_DATA
514
        mov     ecx,eax
515
        jecxz   @f
516
        rep     movsb
517
    @@: mov     ecx,[sel.end.y]
518
        call    get_line_offset
519
        pop     ecx
520
        cmp     ecx,[sel.end.y]
521
        je      @f
522
        mov     eax,esi
523
        call    get_line_offset
524
        sub     eax,esi
525
        mov     ecx,eax
526
        rep     movsb
527
        mov     ecx,[sel.end.y]
528
    @@: call    get_line_offset
529
        mov     eax,[esi+EDITOR_LINE_DATA.Size]
530
        add     esi,sizeof.EDITOR_LINE_DATA
531
        cmp     eax,[sel.end.x]
532
        jle     @f
533
        mov     eax,[sel.end.x]
534
    @@: mov     ebx,edi
535
        mov     [edi+EDITOR_LINE_DATA.Size],eax
536
        add     edi,sizeof.EDITOR_LINE_DATA
537
        mov     ecx,eax
538
        jecxz   @f
539
        rep     movsb
540
        sub     eax,[sel.end.x]
541
        jz      @f
542
        neg     eax
543
        mov     ecx,eax
544
        add     [ebx],eax
545
        mov     al,' '
546
        rep     stosb
547
    @@: sub     edi,[copy_buf]
548
        mov     [copy_size],edi
549
        mov     eax,[sel.end.y]
550
        sub     eax,[sel.begin.y]
551
        inc     eax
552
        mov     [copy_count],eax
553
	call	put_to_clipboard
4274 tserj 554
  .exit:
4487 mario79 555
        ret
4274 tserj 556
 
557
  .single_line:
558
	mov	eax,[sel.end.x]
559
	sub	eax,[sel.begin.x]
560
	mov	edi,[copy_buf]
561
	mov	[edi+EDITOR_LINE_DATA.Size],eax
562
	add	edi,sizeof.EDITOR_LINE_DATA
563
	mov	ecx,[sel.begin.y]
564
	call	get_line_offset
565
	mov	ebx,[sel.begin.x]
566
	mov	ecx,[sel.end.x]
567
	cmp	ebx,[esi+EDITOR_LINE_DATA.Size]
568
	jge	.add_spaces
569
	cmp	ecx,[esi+EDITOR_LINE_DATA.Size]
570
	jle	.lp1
571
	mov	ecx,[esi+EDITOR_LINE_DATA.Size]
572
  .lp1: sub	ecx,[sel.begin.x]
573
	sub	eax,ecx
574
	lea	esi,[esi+ebx+sizeof.EDITOR_LINE_DATA]
575
	rep	movsb
576
 
577
  .add_spaces:
578
	mov	ecx,eax
579
	mov	al,' '
580
	jecxz	@b
581
	rep	stosb
582
	jmp	@b
583
endp
584
 
585
;-----------------------------------------------------------------------------
586
proc key.ctrl_v
4490 mario79 587
	cmp	[replace_mode],0
588
	jne	@f
4487 mario79 589
	call	get_from_clipboard
4490 mario79 590
@@:
4274 tserj 591
	cmp	[copy_size],0
592
	je	.exit
593
 
594
	call	delete_selection
595
 
596
	mov	eax,[copy_size]
597
	call	editor_realloc_lines
598
 
599
	mov	ebx,[cur_editor.Lines.Size]
600
	add	ebx,[copy_size]
601
	mov	[cur_editor.Lines.Size],ebx
602
	stdcall mem.ReAlloc,[cur_editor.Lines],ebx
603
	mov	[cur_editor.Lines],eax
604
 
605
	mov	ecx,[cur_editor.Caret.Y]
606
	call	get_line_offset
607
	pushd	[esi+EDITOR_LINE_DATA.Size] esi
608
	mov	ecx,[cur_editor.Caret.X]
609
	call	line_add_spaces
610
	add	[esp],eax
611
	add	esi,eax
612
	mov	ecx,[copy_size]
613
	sub	ecx,sizeof.EDITOR_LINE_DATA
614
	mov	edi,[cur_editor.Lines]
615
	add	edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
616
	dec	edi
617
	mov	eax,esi
618
	mov	esi,edi
619
	sub	esi,ecx
620
	lea	ecx,[eax+sizeof.EDITOR_LINE_DATA]
621
	add	ecx,[cur_editor.Caret.X]
622
	neg	ecx
623
	lea	ecx,[esi+ecx+1]
624
	std
625
	rep	movsb
626
 
627
	mov	ecx,[copy_count]
628
	dec	ecx
629
	jz	.single_line
630
 
631
	cld
632
	pop	edi
633
	add	edi,sizeof.EDITOR_LINE_DATA
634
	mov	esi,[copy_buf]
635
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
636
	add	esi,sizeof.EDITOR_LINE_DATA
637
 
638
	mov	ebx,[cur_editor.Caret.X]
639
	add	eax,ebx
640
	mov	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],eax
641
	mov	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
642
	sub	eax,ebx
643
	call	.check_columns
644
	add	edi,ebx
645
    @@: push	ecx
646
	mov	ecx,eax
647
	rep	movsb
648
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
649
	add	esi,sizeof.EDITOR_LINE_DATA
650
	mov	[edi+EDITOR_LINE_DATA.Size],eax
651
	mov	[edi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
652
	add	edi,sizeof.EDITOR_LINE_DATA
653
	pop	ecx
654
	loop	@b
655
 
656
	pop	ecx
657
	sub	ecx,ebx
658
	add	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],ecx
659
	call	.check_columns
660
	mov	ecx,eax
661
	rep	movsb
662
 
663
	mov	[cur_editor.Caret.X],eax
664
	mov	[cur_editor.SelStart.X],eax
665
	mov	eax,[copy_count]
666
	dec	eax
667
	add	[cur_editor.Caret.Y],eax
668
	add	[cur_editor.SelStart.Y],eax
669
	add	[cur_editor.Lines.Count],eax
670
 
671
	mov	[cur_editor.Modified],1
672
	jmp	.exit
673
 
674
  .single_line:
675
	cld
676
	pop	edi
677
	add	edi,sizeof.EDITOR_LINE_DATA
678
	mov	esi,[copy_buf]
679
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
680
	add	esi,sizeof.EDITOR_LINE_DATA
681
	add	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],eax
682
	and	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
683
	or	[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
684
	call	.check_columns
685
	add	edi,[cur_editor.Caret.X]
686
	add	esp,4
687
	mov	ecx,eax
688
	rep	movsb
689
 
690
	add	[cur_editor.Caret.X],eax
691
	add	[cur_editor.SelStart.X],eax
692
 
693
	mov	[cur_editor.Modified],1
694
 
695
  .exit:
4490 mario79 696
	cmp	[replace_mode],0
697
	jne	.exit_1
698
 
4487 mario79 699
	cmp	[copy_size],0
700
	je	.exit_1
701
; remove unnecessary memory area
702
	xor	eax,eax
703
	mov	[copy_size],eax
704
        mov     [copy_count],eax
705
        stdcall mem.ReAlloc,[copy_buf],eax
706
        mov     [copy_buf],eax
707
.exit_1:
4274 tserj 708
	ret
709
 
710
  .check_columns:
711
	push	eax
712
	mov	eax,[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
713
	cmp	eax,[cur_editor.Columns.Count]
714
	jbe	@f
715
	mov	[cur_editor.Columns.Count],eax
716
    @@: pop	eax
717
	ret
718
endp
719
 
720
;-----------------------------------------------------------------------------
721
proc key.ctrl_d ;///// INSERT SEPARATOR //////////////////////////////////////
722
;-----------------------------------------------------------------------------
723
	mov	eax,90+sizeof.EDITOR_LINE_DATA
724
	call	editor_realloc_lines
725
 
726
	mov	ecx,[cur_editor.Caret.Y]
727
	call	get_line_offset
728
	mov	ebx,esi
729
 
730
	mov	ecx,[cur_editor.Lines.Count]
731
	call	get_line_offset
732
	lea	edi,[esi+90+sizeof.EDITOR_LINE_DATA]
733
	lea	ecx,[esi+sizeof.EDITOR_LINE_DATA]
734
	sub	ecx,ebx
735
	std
736
	rep	movsb
737
 
738
	lea	edi,[ebx+sizeof.EDITOR_LINE_DATA+1]
739
	mov	[ebx+EDITOR_LINE_DATA.Size],90
740
	mov	al,ASEPC
741
	mov	ecx,79
742
	cld
743
	rep	stosb
744
	mov	al,' '
745
	mov	ecx,10
746
	rep	stosb
747
	mov	byte[ebx+sizeof.EDITOR_LINE_DATA],';'
748
 
749
	inc	[cur_editor.Lines.Count]
750
	inc	[cur_editor.Caret.Y]
751
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
752
 
753
	mov	[cur_editor.Modified],1
754
 
755
  .exit:
756
	ret
757
endp
758
 
759
;-----------------------------------------------------------------------------
760
proc key.ctrl_y ;///// DELETE CURRENT LINE ///////////////////////////////////
761
;-----------------------------------------------------------------------------
762
	mov	eax,[cur_editor.Caret.Y]
763
	inc	eax
764
	cmp	eax,[cur_editor.Lines.Count]
765
	jge	.exit
766
 
767
	mov	ecx,[cur_editor.Caret.Y]
768
	call	get_line_offset
769
	mov	edi,esi
770
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
771
	lea	esi,[esi+eax+sizeof.EDITOR_LINE_DATA]
772
	push	eax
773
 
774
	dec	[cur_editor.Lines.Count]
775
	mov	ecx,[cur_editor.Lines]
776
	add	ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
777
	sub	ecx,esi
778
	shr	ecx,2
779
	cld
780
	rep	movsd
781
 
782
	pop	eax
783
	add	eax,sizeof.EDITOR_LINE_DATA
784
	neg	eax
785
	call	editor_realloc_lines
786
 
787
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
788
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
789
 
790
	mov	[cur_editor.Modified],1
791
 
792
  .exit:
793
	ret
794
endp
795
 
796
;-----------------------------------------------------------------------------
797
proc key.up ;///// GO TO PREVIOUS LINE ///////////////////////////////////////
798
;-----------------------------------------------------------------------------
799
	call	clear_selection
800
 
801
;-----------------------------------------------------------------------------
802
     key.shift_up: ;///// GO TO PREVIOUS LINE, WITH SELECTION ////////////////
803
;-----------------------------------------------------------------------------
804
	mov	eax,[cur_editor.Caret.Y]
805
	dec	eax
806
	jns	@f
807
	xor	eax,eax
808
    @@: mov	ecx,[cur_editor.TopLeft.Y]
809
	cmp	eax,ecx
810
	jae	@f
811
	dec	ecx
812
	jns	@f
813
	xor	ecx,ecx
814
    @@: test	[chr],KM_SHIFT
815
	jnz	@f
816
	mov	[cur_editor.SelStart.Y],eax
817
    @@: mov	[cur_editor.Caret.Y],eax
818
	mov	[cur_editor.TopLeft.Y],ecx
819
 
820
  .exit:
821
	ret
822
endp
823
 
824
;-----------------------------------------------------------------------------
825
proc key.down ;///// GO TO NEXT LINE /////////////////////////////////////////
826
;-----------------------------------------------------------------------------
827
	call	clear_selection
828
 
829
;-----------------------------------------------------------------------------
830
     key.shift_down: ;///// GO TO NEXT LINE, WITH SELECTION //////////////////
831
;-----------------------------------------------------------------------------
832
 
833
	mov	eax,[cur_editor.Caret.Y]
834
	inc	eax
835
	cmp	eax,[cur_editor.Lines.Count]
836
	jb	@f
837
	dec	eax
838
    @@: mov	ecx,[cur_editor.TopLeft.Y]
839
	mov	edx,eax
840
	sub	edx,ecx
841
	cmp	edx,[lines.scr]
842
	jb	@f
843
	inc	ecx
844
    @@: test	[chr],KM_SHIFT
845
	jnz	@f
846
	mov	[cur_editor.SelStart.Y],eax
847
    @@: mov	[cur_editor.Caret.Y],eax
848
	mov	[cur_editor.TopLeft.Y],ecx
849
 
850
  .exit:
851
	ret
852
endp
853
 
854
;-----------------------------------------------------------------------------
855
proc key.left ;///// GO TO PREVIOUS CHAR /////////////////////////////////////
856
;-----------------------------------------------------------------------------
857
	call	clear_selection
858
 
859
;-----------------------------------------------------------------------------
860
     key.shift_left: ;///// GO TO PREVIOUS CHAR, WITH SELECTION //////////////
861
;-----------------------------------------------------------------------------
862
	mov	eax,[cur_editor.Caret.X]
863
	dec	eax
864
	jns	@f
865
	inc	eax
866
    @@: test	[chr],KM_SHIFT
867
	jnz	@f
868
	mov	[cur_editor.SelStart.X],eax
869
    @@: mov	[cur_editor.Caret.X],eax
870
 
871
  .exit:
872
	ret
873
endp
874
 
875
;-----------------------------------------------------------------------------
876
proc key.right ;///// GO TO NEXT CHAR ////////////////////////////////////////
877
;-----------------------------------------------------------------------------
878
	call	clear_selection
879
 
880
;-----------------------------------------------------------------------------
881
     key.shift_right: ;///// GO TO NEXT CHAR, WITH SELECTION /////////////////
882
;-----------------------------------------------------------------------------
883
	mov	eax,[cur_editor.Caret.X]
884
	inc	eax
885
	cmp	eax,[cur_editor.Columns.Count]
886
	jbe	@f
887
	dec	eax
888
    @@: test	[chr],KM_SHIFT
889
	jnz	@f
890
	mov	[cur_editor.SelStart.X],eax
891
    @@: mov	[cur_editor.Caret.X],eax
892
 
893
  .exit:
894
	ret
895
endp
896
 
897
;-----------------------------------------------------------------------------
898
proc key.pgup ;///// GO TO PREVIOUS PAGE /////////////////////////////////////
899
;-----------------------------------------------------------------------------
900
	call	clear_selection
901
 
902
;-----------------------------------------------------------------------------
903
     key.shift_pgup: ;///// GO TO PREVIOUS PAGE, WITH SELECTION //////////////
904
;-----------------------------------------------------------------------------
905
	mov	edx,[lines.scr]
906
	dec	edx
907
	mov	eax,[cur_editor.Caret.Y]
908
	mov	ecx,[cur_editor.TopLeft.Y]
909
	sub	eax,edx
910
	jns	@f
911
	xor	eax,eax
912
    @@: sub	ecx,edx
913
	jns	@f
914
	xor	ecx,ecx
915
    @@: test	[chr],KM_SHIFT
916
	jnz	@f
917
	mov	[cur_editor.SelStart.Y],eax
918
    @@: mov	[cur_editor.Caret.Y],eax
919
	mov	[cur_editor.TopLeft.Y],ecx
920
 
921
  .exit:
922
	ret
923
endp
924
 
925
;-----------------------------------------------------------------------------
926
proc key.pgdn ;///// GO TO NEXT PAGE /////////////////////////////////////////
927
;-----------------------------------------------------------------------------
928
	call	clear_selection
929
 
930
;-----------------------------------------------------------------------------
931
     key.shift_pgdn: ;///// GO TO NEXT PAGE, WITH SELECTION //////////////////
932
;-----------------------------------------------------------------------------
933
	mov	edx,[lines.scr]
934
	dec	edx
935
	mov	eax,[cur_editor.Caret.Y]
936
	mov	ecx,[cur_editor.TopLeft.Y]
937
	add	eax,edx
938
	add	ecx,edx
939
	cmp	eax,[cur_editor.Lines.Count]
940
	jb	@f
941
	mov	eax,[cur_editor.Lines.Count]
942
	dec	eax
943
    @@: test	[chr],KM_SHIFT
944
	jnz	@f
945
	mov	[cur_editor.SelStart.Y],eax
946
    @@: mov	[cur_editor.Caret.Y],eax
947
	mov	[cur_editor.TopLeft.Y],ecx
948
 
949
  .exit:
950
	ret
951
endp
952
 
953
;-----------------------------------------------------------------------------
954
proc key.home ;///// GO TO LINE START ////////////////////////////////////////
955
;-----------------------------------------------------------------------------
956
	call	clear_selection
957
 
958
;-----------------------------------------------------------------------------
959
     key.shift_home: ;///// GO TO LINE START, WITH SELECTION /////////////////
960
;-----------------------------------------------------------------------------
961
	mov	[cur_editor.Caret.X],0
962
	test	[chr],KM_SHIFT
963
	jnz	@f
964
	mov	[cur_editor.SelStart.X],0
965
    @@:
966
 
967
  .exit:
968
	ret
969
endp
970
 
971
;-----------------------------------------------------------------------------
972
proc key.end ;///// GO TO LINE END ///////////////////////////////////////////
973
;-----------------------------------------------------------------------------
974
	call	clear_selection
975
 
976
;-----------------------------------------------------------------------------
977
     key.shift_end: ;///// GO TO LINE END, WITH SELECTION ////////////////////
978
;-----------------------------------------------------------------------------
979
	mov	ecx,[cur_editor.Caret.Y]
980
	call	get_line_offset
981
	call	get_real_length
982
	mov	[cur_editor.Caret.X],eax
983
	test	[chr],KM_SHIFT
984
	jnz	@f
985
	mov	[cur_editor.SelStart.X],eax
986
    @@:
987
 
988
  .exit:
989
	ret
990
endp
991
 
992
;-----------------------------------------------------------------------------
993
proc key.ctrl_home ;///// GO TO PAGE START ///////////////////////////////////
994
;-----------------------------------------------------------------------------
995
	call	clear_selection
996
 
997
;-----------------------------------------------------------------------------
998
     key.shift_ctrl_home: ;///// GO TO PAGE START, WITH SELECTION ////////////
999
;-----------------------------------------------------------------------------
1000
	mov	eax,[cur_editor.TopLeft.Y]
1001
	mov	ecx,eax
1002
	test	[chr],KM_SHIFT
1003
	jnz	@f
1004
	mov	[cur_editor.SelStart.Y],eax
1005
    @@: mov	[cur_editor.Caret.Y],eax
1006
	mov	[cur_editor.TopLeft.Y],ecx
1007
 
1008
  .exit:
1009
	ret
1010
endp
1011
 
1012
;-----------------------------------------------------------------------------
1013
proc key.ctrl_end ;///// GO TO PAGE END //////////////////////////////////////
1014
;-----------------------------------------------------------------------------
1015
	call	clear_selection
1016
 
1017
;-----------------------------------------------------------------------------
1018
     key.shift_ctrl_end: ;///// GO TO PAGE END, WITH SELECTION ///////////////
1019
;-----------------------------------------------------------------------------
1020
	mov	ecx,[cur_editor.TopLeft.Y]
1021
	mov	eax,[lines.scr]
1022
	cmp	eax,[cur_editor.Lines.Count]
1023
	jle	@f
1024
	mov	eax,[cur_editor.Lines.Count]
1025
    @@: add	eax,ecx
1026
	dec	eax
1027
	test	[chr],KM_SHIFT
1028
	jnz	@f
1029
	mov	[cur_editor.SelStart.Y],eax
1030
    @@: mov	[cur_editor.Caret.Y],eax
1031
	mov	[cur_editor.TopLeft.Y],ecx
1032
 
1033
  .exit:
1034
	ret
1035
endp
1036
 
1037
;-----------------------------------------------------------------------------
1038
proc key.ctrl_pgup ;///// GO TO DOCUMENT START ///////////////////////////////
1039
;-----------------------------------------------------------------------------
1040
	call	clear_selection
1041
 
1042
;-----------------------------------------------------------------------------
1043
     key.shift_ctrl_pgup: ;///// GO TO DOCUMENT START, WITH SELECTION ////////
1044
;-----------------------------------------------------------------------------
1045
	xor	eax,eax
1046
	mov	[cur_editor.TopLeft.Y],eax
1047
	mov	[cur_editor.Caret.Y],eax
1048
	test	[chr],KM_SHIFT
1049
	jnz	@f
1050
	mov	[cur_editor.SelStart.Y],eax
1051
    @@:
1052
 
1053
  .exit:
1054
	ret
1055
endp
1056
 
1057
;-----------------------------------------------------------------------------
1058
proc key.ctrl_pgdn ;///// GO TO DOCUMENT END /////////////////////////////////
1059
;-----------------------------------------------------------------------------
1060
	call	clear_selection
1061
 
1062
;-----------------------------------------------------------------------------
1063
     key.shift_ctrl_pgdn: ;///// GO TO DOCUMENT END, WITH SELECTION //////////
1064
;-----------------------------------------------------------------------------
1065
	mov	eax,[cur_editor.Lines.Count]
1066
	mov	[cur_editor.Caret.Y],eax
1067
	sub	eax,[lines.scr]
1068
	jns	@f
1069
	xor	eax,eax
1070
    @@: mov	[cur_editor.TopLeft.Y],eax
1071
	dec	[cur_editor.Caret.Y]
1072
	test	[chr],KM_SHIFT
1073
	jnz	@f
1074
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
1075
    @@:
1076
 
1077
  .exit:
1078
	ret
1079
endp
1080
 
1081
;-----------------------------------------------------------------------------
1082
proc key.del ;///// DELETE NEXT CHAR OR SELECTION ////////////////////////////
1083
;-----------------------------------------------------------------------------
1084
	call	delete_selection
1085
	jnc	.exit
1086
 
1087
	mov	ecx,[cur_editor.Caret.Y]
1088
	call	get_line_offset
1089
	and	[esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
1090
	or	[esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1091
	lea	ebx,[esi+sizeof.EDITOR_LINE_DATA]
1092
	mov	ebp,esi
1093
 
1094
	call	get_real_length
1095
	or	eax,eax
1096
	je	.line_up
1097
 
1098
	mov	ecx,[cur_editor.Caret.X]
1099
	cmp	ecx,eax
1100
	jae	.line_up
1101
	lea	edi,[ebx+ecx]
1102
	neg	ecx
1103
	mov	eax,[ebp+EDITOR_LINE_DATA.Size]
1104
	add	ecx,eax;[ebp]
1105
	repe	scasb
1106
	je	.line_up
1107
 
1108
	mov	edi,ebx
1109
	mov	ecx,[cur_editor.Caret.X]
1110
	add	edi,ecx
1111
	lea	esi,[edi+1]
1112
	neg	ecx
1113
	mov	eax,[ebp+EDITOR_LINE_DATA.Size]
1114
	add	ecx,eax;[ebp]
1115
	dec	ecx
1116
	rep	movsb
1117
	mov	byte[edi],' '
1118
 
1119
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1120
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
1121
	mov	[cur_editor.Modified],1
1122
	ret
1123
 
1124
  .line_up:
1125
	mov	eax,[cur_editor.Lines.Count]
1126
	dec	eax
1127
	cmp	eax,[cur_editor.Caret.Y]
1128
	je	.exit
1129
	mov	edi,[temp_buf]
1130
	add	edi,sizeof.EDITOR_LINE_DATA
1131
	mov	esi,ebx
1132
	mov	ecx,[cur_editor.Caret.X]
1133
	rep	movsb
1134
	mov	ecx,[cur_editor.Caret.X]
1135
	mov	eax,[temp_buf]
1136
	mov	[eax+EDITOR_LINE_DATA.Size],ecx
1137
	cmp	ecx,[ebp+EDITOR_LINE_DATA.Size]
1138
	jbe	@f
1139
	mov	eax,[ebp+EDITOR_LINE_DATA.Size]
1140
	sub	ecx,eax
1141
	sub	edi,ecx
1142
	mov	al,' '
1143
	rep	stosb
1144
    @@: lea	esi,[ebx+sizeof.EDITOR_LINE_DATA]
1145
	mov	eax,[ebp+EDITOR_LINE_DATA.Size]
1146
	add	esi,eax
1147
	mov	ecx,[esi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
1148
	mov	eax,[temp_buf]
1149
	add	[eax+EDITOR_LINE_DATA.Size],ecx
1150
	or	[eax+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1151
	rep	movsb
1152
 
1153
	mov	ecx,edi
1154
	sub	ecx,[temp_buf]
1155
 
1156
	mov	esi,[temp_buf]
1157
	call	get_real_length
1158
	cmp	eax,[cur_editor.Columns.Count]
1159
	jbe	@f
1160
	mov	[cur_editor.Columns.Count],eax
1161
    @@:
1162
	push	ecx
1163
	mov	edi,[cur_editor.Lines]
1164
	add	edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
1165
	dec	edi
1166
	lea	esi,[edi+sizeof.EDITOR_LINE_DATA*2] ; !!! CHECK THIS !!!
1167
	sub	esi,ecx
1168
	mov	eax,[ebp+EDITOR_LINE_DATA.Size]
1169
	add	esi,eax
1170
	mov	eax,[ebp+eax+sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
1171
	add	esi,eax
1172
	lea	ecx,[esi-sizeof.EDITOR_LINE_DATA]
1173
	sub	ecx,ebp
1174
	std
1175
	cmp	esi,edi
1176
	jb	@f
1177
	jz	.lp1
1178
	mov	edi,ebp
1179
	add	edi,[esp]
1180
	lea	esi,[ebp+sizeof.EDITOR_LINE_DATA*2] ; !!! CHECK THIS !!!
1181
	mov	eax,[esi-sizeof.EDITOR_LINE_DATA*2+EDITOR_LINE_DATA.Size] ; !!! CHECK THIS !!!
1182
	add	esi,eax
1183
	mov	eax,[esi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size] ; !!! CHECK THIS !!!
1184
	add	esi,eax
1185
	mov	ecx,[cur_editor.Lines]
1186
	add	ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
1187
	sub	ecx,esi
1188
	cld
1189
    @@: rep	movsb
1190
  .lp1: pop	ecx
1191
	mov	esi,[temp_buf]
1192
	mov	edi,ebp
1193
	cld
1194
	rep	movsb
1195
 
1196
  .ok.dec.lines:
1197
	dec	[cur_editor.Lines.Count]
1198
	mov	eax,[cur_editor.Lines.Count]
1199
	cmp	[cur_editor.Caret.Y],eax
1200
	jb	@f
1201
	dec	eax
1202
	mov	[cur_editor.Caret.Y],eax
1203
    @@: m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1204
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
1205
 
1206
	mov	ecx,[cur_editor.Lines.Count]
1207
	call	get_line_offset
1208
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
1209
	lea	esi,[esi+eax+sizeof.EDITOR_LINE_DATA]
1210
	mov	eax,[cur_editor.Lines]
1211
	add	eax,[cur_editor.Lines.Size] ;*** add eax,[eax-4]
1212
	sub	esi,eax
1213
	lea	eax,[esi+4096]
1214
	call	editor_realloc_lines
1215
 
1216
	mov	[cur_editor.Modified],1
1217
 
1218
  .exit:
1219
	ret
1220
endp
1221
 
1222
;-----------------------------------------------------------------------------
1223
proc key.ins ;///// TOGGLE INSERT/OVERWRITE MODE /////////////////////////////
1224
;-----------------------------------------------------------------------------
1225
	xor	[ins_mode],1
1226
	mov	eax,[cur_editor.Caret.Y]
1227
	mov	ebx,eax
1228
	call	draw_editor_text.part
1229
	call	draw_editor_caret
1230
	ret
1231
endp
1232
 
1233
;-----------------------------------------------------------------------------
1234
proc key.bkspace ;///// DELETE PREVIOUS CHAR OR SELECTION ////////////////////
1235
;-----------------------------------------------------------------------------
1236
	call	delete_selection
1237
	jnc	key.del.exit
1238
 
1239
	mov	eax,[cur_editor.Caret.X]
1240
	dec	eax
1241
	js	.line_up
1242
 
1243
	dec	[cur_editor.Caret.X]
1244
	mov	ecx,[cur_editor.Caret.Y]
1245
	call	get_line_offset
1246
	and	[esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
1247
	or	[esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1248
 
1249
	mov	ebx,eax
1250
	call	get_real_length
1251
	cmp	eax,[cur_editor.Caret.X]
1252
	jae	@f
1253
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1254
	mov	[cur_editor.Modified],1
1255
	ret
1256
 
1257
    @@: lea	edi,[esi+sizeof.EDITOR_LINE_DATA+ebx]
1258
	mov	ecx,ebx
1259
	neg	ecx
1260
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
1261
	add	ecx,eax
1262
	dec	ecx
1263
	lea	esi,[edi+1]
1264
	cld
1265
	rep	movsb
1266
	mov	byte[edi],' '
1267
 
1268
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1269
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
1270
	mov	[cur_editor.Modified],1
1271
	ret
1272
 
1273
  .line_up:
1274
	cmp	[cur_editor.Caret.Y],0
1275
	jne	@f
1276
	ret
1277
    @@: mov	ecx,[cur_editor.Caret.Y]
1278
	dec	ecx
1279
	call	get_line_offset
1280
	and	[esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
1281
	or	[esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1282
 
1283
	mov	ebp,esi
1284
	lea	ebx,[esi+sizeof.EDITOR_LINE_DATA]
1285
	mov	ecx,[ebp+EDITOR_LINE_DATA.Size]
1286
    @@: cmp	byte[ebx+ecx-1],' '
1287
	jne	@f
1288
	dec	ecx
1289
	jg	@b
1290
    @@: mov	[cur_editor.Caret.X],ecx
1291
	dec	[cur_editor.Caret.Y]
1292
	cld
1293
	jmp	key.del.line_up
1294
endp
1295
 
1296
;-----------------------------------------------------------------------------
1297
proc key.tab ;///// TABULATE /////////////////////////////////////////////////
1298
;-----------------------------------------------------------------------------
1299
	call	delete_selection
1300
	mov	eax,[cur_editor.Caret.X]
1301
 
1302
	mov	ecx,eax
1303
	add	eax,ATABW
1304
	and	eax,not(ATABW-1)
1305
	push	eax ' '
1306
	sub	eax,ecx
1307
  .direct:
1308
	push	eax
1309
	call	editor_realloc_lines
1310
	pop	eax
1311
	mov	ecx,[cur_editor.Caret.Y]
1312
	call	get_line_offset
1313
	and	[esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
1314
	or	[esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1315
 
1316
	xchg	eax,ecx
1317
 
1318
	call	get_real_length
1319
	cmp	eax,[cur_editor.Caret.X]
1320
	jae	@f
1321
	mov	eax,[cur_editor.Caret.X]
1322
    @@: mov	edx,[esi+EDITOR_LINE_DATA.Size]
1323
	sub	edx,eax
1324
	cmp	ecx,edx
1325
	jl	@f
1326
	push	eax
1327
	mov	eax,10
1328
	call	editor_realloc_lines
1329
	add	esi,eax
1330
	pop	eax
1331
	pushad
1332
	mov	ecx,[cur_editor.Lines]
1333
	add	ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
1334
	dec	ecx
1335
	mov	edi,ecx
1336
	add	ecx,-10+1
1337
	mov	eax,[esi+EDITOR_LINE_DATA.Size]
1338
	lea	eax,[esi+eax+sizeof.EDITOR_LINE_DATA]
1339
	sub	ecx,eax
1340
	lea	esi,[edi-10]
1341
	std
1342
	rep	movsb
1343
	mov	ecx,10
1344
	mov	al,' '
1345
	rep	stosb
1346
	popad
1347
	add	[esi+EDITOR_LINE_DATA.Size],10
1348
	jmp	@b
1349
    @@: lea	ebx,[esi+sizeof.EDITOR_LINE_DATA]
1350
	push	ecx
1351
	mov	edi,[esi+EDITOR_LINE_DATA.Size]
1352
	lea	edi,[ebx+edi-1]
1353
	mov	esi,edi
1354
	sub	esi,ecx
1355
	lea	ecx,[esi+1]
1356
	sub	ecx,ebx
1357
	sub	ecx,[cur_editor.Caret.X]
1358
	std
1359
	rep	movsb
1360
  .ok:	pop	ecx
1361
	pop	eax
1362
	rep	stosb
1363
	cld
1364
	pop	[cur_editor.Caret.X]
1365
	lea	esi,[ebx-sizeof.EDITOR_LINE_DATA]
1366
	call	get_real_length
1367
	cmp	eax,[cur_editor.Caret.X]
1368
	jae	@f
1369
	mov	eax,[cur_editor.Caret.X]
1370
    @@: cmp	eax,[cur_editor.Columns.Count]
1371
	jbe	@f
1372
	mov	[cur_editor.Columns.Count],eax
1373
    @@: m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1374
	m2m	[cur_editor.SelStart.Y],[cur_editor.Caret.Y]
1375
	mov	[cur_editor.Modified],1
1376
 
1377
  .exit:
1378
	ret
1379
endp
1380
 
1381
;-----------------------------------------------------------------------------
1382
proc key.return ;///// CARRIAGE RETURN ///////////////////////////////////////
1383
;-----------------------------------------------------------------------------
1384
	call	delete_selection
4316 mario79 1385
; unknown how many times the user wants to press "Enter",
1386
; so you should do a little more value
1387
	mov	eax,14*100
4274 tserj 1388
	call	editor_realloc_lines
1389
 
1390
	mov	ecx,[cur_editor.Caret.Y]
1391
	call	get_line_offset
1392
 
1393
	mov	ebx,[cur_editor.Caret.X]
1394
	cmp	ebx,[esi+EDITOR_LINE_DATA.Size]
1395
	jb	@f
1396
	mov	ebx,[esi+EDITOR_LINE_DATA.Size]
1397
	dec	ebx
1398
	jns	@f
1399
	xor	ebx,ebx
1400
    @@:
1401
	cld
1402
 
1403
	mov	edi,[temp_buf]
1404
	mov	ebp,esi
1405
	lea	ecx,[ebx+1]
1406
    @@: dec	ecx
1407
	jz	@f
1408
	cmp	byte[esi+ecx+sizeof.EDITOR_LINE_DATA-1],' '
1409
	je	@b
1410
    @@: lea	eax,[ecx+10]
1411
	mov	[edi+EDITOR_LINE_DATA.Size],eax
1412
	mov	[edi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1413
	add	edi,sizeof.EDITOR_LINE_DATA
1414
	jecxz	@f
1415
	push	esi
1416
	add	esi,sizeof.EDITOR_LINE_DATA
1417
	rep	movsb
1418
	pop	esi
1419
    @@: mov	al,' '
1420
	mov	ecx,10
1421
	rep	stosb
1422
 
1423
	mov	ecx,[esi+EDITOR_LINE_DATA.Size]
1424
	sub	ecx,ebx
1425
	add	esi,ebx
1426
	add	esi,sizeof.EDITOR_LINE_DATA
1427
	inc	ecx
1428
    @@: dec	ecx
1429
	jz	@f
1430
	cmp	byte[esi+ecx-1],' '
1431
	je	@b
1432
    @@: jz	.lp1
1433
    @@: cmp	byte[esi],' '
1434
	jne	.lp1
1435
	inc	esi
1436
	loop	@b
1437
  .lp1: test	[auto_indent],1
1438
	jz	.lp2
1439
	push	edi ecx
1440
	mov	ecx,[ebp+EDITOR_LINE_DATA.Size]
1441
	lea	edi,[ebp+sizeof.EDITOR_LINE_DATA]
1442
	mov	al,' '
1443
	repe	scasb
1444
	mov	eax,ecx
1445
	pop	ecx edi
1446
	je	.lp2
1447
	neg	eax
1448
	mov	edx,[ebp+EDITOR_LINE_DATA.Size]
1449
	add	eax,edx;[ebp]
1450
	dec	eax
1451
	jmp	@f
1452
  .lp2: xor	eax,eax
1453
    @@: mov	edx,edi
1454
	add	edi,sizeof.EDITOR_LINE_DATA
1455
	mov	[cur_editor.Caret.X],eax
1456
	jecxz	@f
1457
	push	ecx
1458
	mov	ecx,eax
1459
	mov	al,' '
1460
	rep	stosb
1461
	pop	ecx
1462
    @@: jecxz	@f
1463
	rep	movsb
1464
    @@: mov	ecx,10
1465
	mov	al,' '
1466
	rep	stosb
1467
 
1468
	lea	eax,[edi-sizeof.EDITOR_LINE_DATA]
1469
	sub	eax,edx
1470
	mov	[edx+EDITOR_LINE_DATA.Size],eax
1471
	mov	[edx+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
1472
 
1473
	mov	ecx,edi
1474
	sub	ecx,[temp_buf]
1475
 
1476
	push	ecx
1477
	mov	edi,[cur_editor.Lines]
1478
	add	edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
1479
	dec	edi
1480
	lea	esi,[edi+sizeof.EDITOR_LINE_DATA]
1481
	sub	esi,ecx
1482
	mov	ecx,[ebp+EDITOR_LINE_DATA.Size]
1483
	add	esi,ecx
1484
	lea	ecx,[esi-sizeof.EDITOR_LINE_DATA]
1485
	sub	ecx,ebp
1486
	std
1487
	cmp	esi,edi
1488
	jb	@f
1489
	je	.lp3
1490
	lea	esi,[ebp+sizeof.EDITOR_LINE_DATA]
1491
	mov	eax,[esp]
1492
	lea	edi,[esi+eax-sizeof.EDITOR_LINE_DATA]
1493
	mov	ecx,[ebp+EDITOR_LINE_DATA.Size]
1494
	add	esi,ecx
1495
	mov	ecx,[cur_editor.Lines]
1496
	add	ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
1497
	sub	ecx,esi
1498
	cld
1499
    @@: rep	movsb
1500
  .lp3: pop	ecx
1501
	mov	esi,[temp_buf]
1502
	mov	edi,ebp
1503
	cld
1504
	rep	movsb
1505
 
1506
	inc	[cur_editor.Caret.Y]
1507
	inc	[cur_editor.SelStart.Y]
1508
	inc	[cur_editor.Lines.Count]
1509
 
1510
	m2m	[cur_editor.SelStart.X],[cur_editor.Caret.X]
1511
 
1512
	mov	[cur_editor.Modified],1
1513
 
1514
  .exit:
1515
	ret
1516
endp
1517
 
1518
;-----------------------------------------------------------------------------
1519
proc key.ctrl_tab ;///// SWITCH TO NEXT TAB //////////////////////////////////
1520
;-----------------------------------------------------------------------------
1521
	cmp	[tab_bar.Items.Count],1
1522
	je	.exit
1523
	xor	eax,eax
1524
	mov	ebp,[tab_bar.Items]
1525
    @@: cmp	ebp,[tab_bar.Current.Ptr]
1526
	je	@f
1527
	inc	eax
1528
	add	ebp,sizeof.TABITEM
1529
	jmp	@b
1530
    @@: add	ebp,sizeof.TABITEM
1531
	inc	eax
1532
	cmp	eax,[tab_bar.Items.Count]
1533
	jb	@f
1534
	mov	ebp,[tab_bar.Items]
1535
    @@: call	set_cur_tab
1536
	call	make_tab_visible
1537
	call	align_editor_in_tab
1538
	call	draw_editor
1539
	call	draw_tabctl
1540
	call	update_caption
1541
  .exit:
1542
	ret
1543
endp
1544
 
1545
;-----------------------------------------------------------------------------
1546
proc key.shift_ctrl_tab ;///// SWITCH TO PREVIOUS TAB ////////////////////////
1547
;-----------------------------------------------------------------------------
1548
	cmp	[tab_bar.Items.Count],1
1549
	je	.exit
1550
	xor	eax,eax
1551
	mov	ebp,[tab_bar.Items]
1552
    @@: cmp	ebp,[tab_bar.Current.Ptr]
1553
	je	@f
1554
	inc	eax
1555
	add	ebp,sizeof.TABITEM
1556
	jmp	@b
1557
    @@: add	ebp,-sizeof.TABITEM
1558
	dec	eax
1559
	jge	@f
1560
	imul	eax,[tab_bar.Items.Count],sizeof.TABITEM
1561
	add	eax,[tab_bar.Items]
1562
	lea	ebp,[eax-sizeof.TABITEM]
1563
    @@: call	set_cur_tab
1564
	call	make_tab_visible
1565
	call	align_editor_in_tab
1566
	call	draw_editor
1567
	call	draw_tabctl
1568
	call	update_caption
1569
  .exit:
1570
	ret
1571
endp
1572
 
1573
;-----------------------------------------------------------------------------
1574
proc key.ctrl_f4 ;///// CLOSE CURRENT TAB ////////////////////////////////////
1575
;-----------------------------------------------------------------------------
1576
	cmp	[cur_editor.Modified],0
1577
	je	.close
1578
	mov	[bot_mode2],2
1579
	jmp	key.ctrl_o.direct
1580
 .close:
1581
	mov	[do_not_draw],1
1582
	push	[tab_bar.Current.Ptr]
1583
	cmp	[tab_bar.Items.Count],1
1584
	jne	@f
1585
	;call    create_tab
1586
	jmp	key.alt_x.close 	; close program
1587
    @@: pop	ebp
1588
	call	delete_tab
1589
	dec	[do_not_draw]
1590
	call	align_editor_in_tab
1591
	call	draw_editor
1592
	call	draw_tabctl
1593
	call	draw_statusbar
1594
	ret
1595
endp
1596
 
1597
;-----------------------------------------------------------------------------
1598
proc key.shift_f9 ;///// SET DEFAULT TAB /////////////////////////////////////
1599
;-----------------------------------------------------------------------------
1600
	mov	eax,[tab_bar.Current.Ptr]
1601
	cmp	eax,[tab_bar.Default.Ptr]
1602
	jne	@f
1603
	xor	eax,eax
1604
    @@: mov	[tab_bar.Default.Ptr],eax
1605
	mov	ebp,[tab_bar.Current.Ptr]
1606
	call	make_tab_visible
1607
	cmp	[tab_bar.Style],2
1608
	jbe	@f
1609
	call	align_editor_in_tab
1610
	call	draw_editor
1611
    @@: call	draw_tabctl
1612
	ret
1613
endp
1614
 
1615
;-----------------------------------------------------------------------------
1616
proc key.f3 ;///// FIND NEXT MATCH ///////////////////////////////////////////
1617
;-----------------------------------------------------------------------------
1618
	call	search
1619
	jc	@f
1620
    @@: ret
1621
endp
1622
 
1623
;-----------------------------------------------------------------------------
1624
proc key.f9 ;///// COMPILE AND RUN ///////////////////////////////////////////
1625
;-----------------------------------------------------------------------------
1626
	mov	bl,1
1627
	call	start_fasm
1628
	ret
1629
endp
1630
 
1631
;-----------------------------------------------------------------------------
1632
proc key.f10 ;///// COMPILE AND RUN UNDER DEBUG //////////////////////////////
1633
;-----------------------------------------------------------------------------
1634
	mov	bl,2
1635
	call	start_fasm
1636
	ret
1637
endp
1638
 
1639
;-----------------------------------------------------------------------------
1640
proc key.ctrl_f9 ;///// COMPILE //////////////////////////////////////////////
1641
;-----------------------------------------------------------------------------
1642
	mov	bl,0
1643
	call	start_fasm
1644
	ret
1645
endp
1646
 
1647
;-----------------------------------------------------------------------------
1648
proc key.alt_x ;///// EXIT PROGRAM ///////////////////////////////////////////
1649
;-----------------------------------------------------------------------------
1650
	mov	[main_closing],1
1651
	mov	eax,[tab_bar.Items]
1652
	mov	[exit_tab_item],eax
1653
	mov	eax,[tab_bar.Items.Count]
1654
	mov	[exit_tab_num],eax
1655
  .direct:
1656
	call	try_to_close_tabs
1657
	or	eax,eax
1658
	jz	@f
1659
	mov	[bot_mode2],2
1660
	jmp	key.ctrl_o.direct
1661
 
1662
    @@: stdcall save_settings
1663
 
1664
  .close:
1665
	mov	[main_closed],1
1666
	mcall	-1
1667
endp
1668
 
1669
;-----------------------------------------------------------------------------
1670
proc try_to_close_tabs ;///// FIND TABS TO BE SAVED BEFORE CLOSE /////////////
1671
;-----------------------------------------------------------------------------
1672
	push	ecx ebp
1673
	call	flush_cur_tab
1674
	mov	ebp,[exit_tab_item] ; [tab_bar.Items]
1675
	add	ebp,-sizeof.TABITEM
1676
    @@: dec	[exit_tab_num]
1677
	js	.ok
1678
	add	ebp,sizeof.TABITEM
1679
	mov	al,[ebp+TABITEM.Editor.Modified]
1680
	cmp	[ebp+TABITEM.Editor.Modified],0
1681
	je	@b
1682
	mov	[exit_tab_item],ebp
1683
	call	set_cur_tab
1684
	call	make_tab_visible
1685
	xor	eax,eax
1686
	inc	eax
1687
    @@: pop	ebp ecx
1688
	ret
1689
  .ok:	xor	eax,eax
1690
	jmp	@b
1691
endp