Subversion Repositories Kolibri OS

Rev

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