Subversion Repositories Kolibri OS

Rev

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