Tinypad 4.0.4 in progress (further fixing)

git-svn-id: svn://kolibrios.org@280 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Mihail Semenyako (mike.dld) 2007-01-18 21:14:15 +00:00
parent 14256358ea
commit c6080c59e9
10 changed files with 457 additions and 197 deletions

View File

@ -3,8 +3,8 @@
; compiler: flat assembler 1.67.15
; memory to compile: 2.0/7.0 MBytes (without/with size optimizations)
; version: 4.0.4 pre
; last update: 2007-01-07 (Jan 7, 2007)
; minimal kernel: revision #138 (svn://kolibrios.org/kernel)
; last update: 2007-01-18 (Jan 18, 2007)
; minimal kernel: revision #270 (svn://kolibrios.org/kernel)
;-----------------------------------------------------------------------------
; originally by: Ville Michael Turjanmaa >> villemt@aton.co.jyu.fi
; maintained by: Mike Semenyako >> mike.dld@gmail.com
@ -17,23 +17,23 @@
; - other bug-fixes and speed/size optimizations
; - save settings to ini file, not to executable
;
; TODO (FOR 4.0.4, PLANNED FOR 2007-01-21):
; - finish tabbed interface (some bug with tab switching) [critical]
; - add memory reallocation to keys handler [critical]
; - rework save_file (memory manager) [critical]
; - fix scrollbars dragging coordinates calculation [critical]
; - fix parameters parsing (incl. DOCPAK) [average]
; - reduce flickering (introduce changes checker) [normal]
; - fix incorrect saved/modified lines flags on copy/paste [normal]
; - add prompt to save file before closing/opening [low]
; TODO (4.0.4, PLANNED FOR 2007-01-21):
; normal:
; - finish tabbed interface (tab switching, Ctrl+F4)
; - reduce flickering (introduce changes checker)
; - compile default file if selected
; low:
; - add prompt to save file before closing/opening
;
; HISTORY:
; 4.0.4 pre (mike.dld)
; bug-fixes:
; - statusbar contained hint after dialog operation cancelled
; - small drawing fix for gutter and line saved/modified markers
; - incorrect lines marking on Ctrl+V
; changes:
; - editor and other modifications to ease parts placement changing
; - editor and other modifications to ease parts placement changing,
; including changes in look
; - modified/saved colors now match those in MSVS
; - function 70 for *all* file operations (including diamond's fixes)
; - use memory manager instead of statically allocated region
@ -43,7 +43,8 @@
; new features:
; - recode tables between CP866, CP1251 and KOI8-R (suggested by Victor)
; - tabbed interface, ability to open several files in one app instance
; (thanks IRC guys for ideas and testing)
; (thanks IRC guys for ideas and testing
; - make any tab default to compile it disregarding currently active tab
; 4.0.3 (mike.dld)
; bug-fixes:
; - 1-char selection if pressing <BS> out of real line length
@ -163,18 +164,21 @@ header '01',1,@CODE,TINYPAD_END,STATIC_MEM_END,MAIN_STACK,@PARAMS,self_path
APP_VERSION equ '4.0.4 pre'
;include 'debug.inc'
;define __DEBUG__ 1
;define __DEBUG_LEVEL__ 1
;include 'debug-fdo.inc'
ASEPC = '-' ; separator character (char)
ATOPH = POP_IHEIGHT+2 ; menu bar height (pixels)
ATOPH = 19 ; menu bar height (pixels)
SCRLW = 16 ; scrollbar widht/height (pixels)
ATABW = 8 ; tab width (chars)
ATABW = 8 ; tab key indent width (chars)
LINEH = 10 ; line height (pixels)
PATHL = 256 ; maximum path length (chars) !!! don't change !!!
AMINS = 8 ; minimal scroll thumb size (pixels)
LCHGW = 3 ; changed/saved marker width
LCHGW = 3 ; changed/saved marker width (pixels)
STATH = 16 ; status bar height
TBARH = 18 ; tab bar height
STATH = 16 ; status bar height (pixels)
TBARH = 18 ; tab bar height (pixels)
;-----------------------------------------------------------------------------
section @OPTIONS ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ -199,8 +203,8 @@ options db OPTS_AUTOINDENT+OPTS_OPTIMSAVE+OPTS_SMARTTAB
mainwnd_pos:
.x dd 250
.y dd 75
.w dd 6*80+6+SCRLW+5
.h dd 402
.w dd 6*80+6+SCRLW+5 ;- 220
.h dd 402 ;- 220
;-----------------------------------------------------------------------------
section @CODE ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ -235,17 +239,8 @@ section @CODE ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
call mem.Alloc
mov [temp_buf],eax
mov eax,65536
call mem.Alloc
mov [cur_editor.Lines],eax
inc [do_not_draw]
mov [left_ofs],40+1
; mov [f_info+4],0
; mov [f_info+12],AREA_TEMP
; mov [f_info+16],AREA_EDIT-AREA_TEMP
mov esi,s_example
mov edi,tb_opensave.text
mov ecx,s_example.size
@ -258,6 +253,8 @@ section @CODE ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
mov [s_search.size],ecx
rep movsb
; DEBUGF 1,"params: '%s'\n",@PARAMS
cmp byte[@PARAMS],0
jz no_params
@ -266,6 +263,8 @@ section @CODE ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
cmp byte[@PARAMS],'*'
jne .noipc
; DEBUGF 1," started by DOCPAK\n"
;// diamond [ (convert size from decimal representation to dword)
;-- mov edx,dword[@PARAMS+1]
mov esi,@PARAMS+1
@ -282,16 +281,26 @@ section @CODE ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
add edx,20
; DEBUGF 1," data size (+20) = %d\n",edx
mov eax,edx
call mem.Alloc
mov ebp,eax
push eax
; DEBUGF 1," mem.Alloc() returned 0x%x, allocated size = %d\n",eax,[eax-4]
;! mcall 60,1,AREA_TEMP-16 ; 0x10000-16
;! mov dword[AREA_TEMP-16+4],8 ; [0x10000-16+4],8
mcall 60,1,ebp
mov dword[ebp+0],0
mov dword[ebp+4],8
mcall 60,1,ebp
mcall 40,1000000b
; DEBUGF 1," got IPC message within 2 secs? "
mcall 23,200
; DEBUGF 1,"%b\n",eax == 7
cmp eax,7
jne key.alt_x.close
;! mov esi,AREA_TEMP-16 ; 0x10000-16
@ -302,14 +311,19 @@ section @CODE ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;! inc eax
;! call load_file.file_found
; DEBUGF 1," creating new document\n"
mov ecx,[ebp+12]
mov esi,ebp
lea esi,[ebp+16]
call create_tab
call load_from_memory
pop ebp
mov eax,ebp
call mem.Free
; DEBUGF 1," mem.Free(0x%x) returned %d\n",ebp,eax
jmp @f
.noipc:
@ -327,13 +341,14 @@ section @CODE ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
jne key.alt_x.close
lea eax,[edi-tb_opensave.text-1]
mov [tb_opensave.length],al
call btn.load_file
jnc @f
no_params:
;call btn.load_file;do_load_file
;jnc @f
call create_tab
@@:
mov [s_status],0
dec [do_not_draw]
mcall 66,1,1
mcall 40,00100111b
@ -514,12 +529,6 @@ set_opt:
.main:
xor [options],al
; test [options],al
; je @f
; not al
; and [options],al
; ret
; @@: or [options],al
ret
;-----------------------------------------------------------------------------
@ -578,6 +587,7 @@ accel_table_main dd \
0x00000151,key.pgdn ,\ ; PageDown
0x00000152,key.ins ,\ ; Insert
0x00000153,key.del ,\ ; Delete
0x00010043,key.shift_f9 ,\ ; Shift+F9
0x00010147,key.shift_home ,\ ; Shift+Home
0x00010148,key.shift_up ,\ ; Shift+Up
0x00010149,key.shift_pgup ,\ ; Shift+PageUp
@ -712,6 +722,8 @@ sz ini_window_left ,'Left',0
sz ini_window_right ,'Right',0
sz ini_window_bottom,'Bottom',0
;include_debug_strings
TINYPAD_END: ; end of file
self_path rb PATHL
@ -746,8 +758,6 @@ copy_count dd ? ; number of lines for copying (Ctrl+E)
copy_size dd ? ; size of data to copy
s_title.size dd ? ; caption length
draw_blines dd ? ; last line to draw
cur_line_len dd ?
h_popup dd ?
bot_dlg_handler dd ?

View File

@ -21,6 +21,7 @@ struct EDITOR
FileName dd ?
Bounds RECT
Lines dd ?
Lines.Size dd ?
Lines.Count dd ?
Columns.Count dd ?
Caret POINT
@ -46,6 +47,7 @@ struct TABCTL
Items.Left dd ?
Current TABITEM
Current.Ptr dd ?
Default.Ptr dd ?
Buttons.First dd ?
Buttons.Last dd ?
Style db ?

View File

@ -499,14 +499,22 @@ endf
;-----------------------------------------------------------------------------
func line_add_spaces ;////////////////////////////////////////////////////////
;-----------------------------------------------------------------------------
; esi = line offset
; ecx = needed line length
; Input:
; ESI = line offset
; ECX = needed line length
; Output:
; EAX = delta
;-----------------------------------------------------------------------------
xor eax,eax
pushad
movzx edx,word[esi]
cmp ecx,edx
jbe .exit
sub ecx,edx
lea eax,[ecx+4]
call editor_realloc_lines
mov [esp+4*7],eax
add esi,eax
push ecx
mov edi,[cur_editor.Lines] ;! AREA_TEMP2
add edi,[edi-4]
@ -520,7 +528,6 @@ func line_add_spaces ;////////////////////////////////////////////////////////
neg ecx
lea ecx,[esi+ecx+1]
std
diff16 '32DC',0,$
rep movsb
pop edi ecx
add [eax],cx
@ -549,6 +556,7 @@ func delete_selection ;///////////////////////////////////////////////////////
or dword[esi],0x00010000
mov ecx,[sel.begin.x]
call line_add_spaces
add esi,eax
lea edi,[esi+4]
mov ecx,[sel.end.y]
call get_line_offset
@ -602,6 +610,17 @@ func delete_selection ;///////////////////////////////////////////////////////
mov eax,[sel.begin.y]
mov [cur_editor.Caret.Y],eax ;! [pos.y],eax
mov [cur_editor.SelStart.Y],eax ;! [sel.y],eax
mov ecx,[cur_editor.Lines.Count]
call get_line_offset
movzx eax,word[esi]
lea esi,[esi+eax+4]
mov eax,[cur_editor.Lines]
add eax,[eax-4]
sub esi,eax
lea eax,[esi+4096]
call editor_realloc_lines
popad
mov [cur_editor.Modified],1 ;! [modified],1
clc
@ -630,28 +649,44 @@ endf
;-----------------------------------------------------------------------------
func get_lines_in_file ;//////////////////////////////////////////////////////
;-----------------------------------------------------------------------------
; Input:
; ESI = data pointer
; ECX = data length
; Output:
; EAX = lines number
; EBX = extra length after tabs expansion
;-----------------------------------------------------------------------------
push ebx ecx esi
push ecx edx esi 0
or ebx,-1
xor edx,edx
.lp0: inc ebx
.lp1: dec ecx
jle .lp2
lodsb
cmp al,0
je .lp2
cmp al,9
je .TB
cmp al,10
je .LF
cmp al,13
je .CR
inc edx
jmp .lp1
.lp2: mov eax,ebx
pop esi ecx ebx
.lp2: lea eax,[ebx+1]
pop ebx esi edx ecx
ret
.CR: cmp byte[esi],10
jne .lp0
jne .LF
lodsb
.LF: jmp .lp0
.LF: xor edx,edx
jmp .lp0
.TB: and edx,00000111b
add dword[esp],ATABW
sub [esp],edx
xor edx,edx
jmp .lp1
endf
;-----------------------------------------------------------------------------

View File

@ -48,22 +48,7 @@ func drawwindow ;///// DRAW WINDOW ///////////////////////////////////////////
mov [top_ofs],ATOPH;+1
mov eax,[cur_editor.Bounds.Right]
sub eax,[cur_editor.Bounds.Left]
sub eax,[cur_editor.Gutter.Width]
sub eax,SCRLW+LCHGW+4
cdq
mov ebx,6
div ebx
mov [columns.scr],eax
mov eax,[cur_editor.Bounds.Bottom]
sub eax,[cur_editor.Bounds.Top]
sub eax,SCRLW+3
cdq
mov ebx,LINEH
div ebx
mov [lines.scr],eax
;// --- columns.scr and lines.scr calculation ---
mov eax,[p_info.client_box.height]
add eax,-STATH+1;*3-2-2
@ -187,22 +172,34 @@ func draw_main_menu ;/////////////////////////////////////////////////////////
inc ebx
mcall 13,,ATOPH-1,[cl_3d_normal]
mcall 38,[p_info.client_box.width],<ATOPH-1,ATOPH-1>,[sc.frame];[cl_3d_pushed]
mcall 38,[p_info.client_box.width],<ATOPH-1,ATOPH-1>,[cl_3d_inset]
mov edx,main_menu
mov ebx,9*65536+ATOPH/2-4
mov ecx,[sc.work_text]
mov ebx,9*65536+ATOPH/2-3;4
;mov ecx,[sc.work_text]
mov [mi_sel],0
mov edi,[mi_cur]
@@: inc [mi_sel]
cmp [mi_sel],main_menu.cnt_item
ja .exit
mov ecx,[sc.work_text]
cmp edi,[mi_sel]
jne .lp1
pushad
push edx
mcall 13,[edx+0],[edx+4],[cl_3d_pushed]
;mov ebx,[edx+0]
mov ecx,[edx+4]
add ecx,2*65536-2
mcall 13,[edx+0],,[sc.work];[cl_3d_pushed]
mov edx,[esp]
mov cx,[edx+6]
add ecx,-1*65536+1
add bx,[edx+2]
mcall 38,,,[cl_3d_inset]
mov edx,[esp]
add cx,[edx+4]
add cx,-2
mov bx,[edx+2]
mcall 38,,,[cl_3d_inset]
pop edx
@ -212,6 +209,7 @@ func draw_main_menu ;/////////////////////////////////////////////////////////
add ebx,eax
mcall 38,,,[cl_3d_inset]
popad
mov ecx,[color_tbl+4*0]
.lp1: add edx,8+1
movzx esi,byte[edx-1]
mcall 4
@ -1128,7 +1126,7 @@ func draw_statusbar ;///// WRITE POSITION ////////////////////////////////////
mov ecx,[p_info.client_box.height-2]
mov cx,word[p_info.client_box.height]
sub ecx,STATH*65536+STATH
mcall 38,[p_info.client_box.width],,[sc.frame];[cl_3d_pushed]
mcall 38,[p_info.client_box.width],,[cl_3d_inset]
; mcall 9,p_info,-1
@ -1235,6 +1233,29 @@ func draw_framerect ; ebx,ecx,edx
ret
endf
func draw_check
push bx
shl ebx,16
pop bx
add ebx,0x00010000
push cx
shl ecx,16
pop cx
add ecx,0x00020001
; add ecx,0x00040003
; sub ebx,0x000A000B
mcall 38
add ecx,0x00010001
mcall
add ebx,4
sub ecx,2
mcall
sub ecx,0x00010001
mcall
ret
endf
func calc_middle
shr eax,1
shr ebx,1
@ -1262,6 +1283,8 @@ func calc_3d_colors
mov eax,[cl_3d_inset]
mov ebx,[cl_3d_outset]
call calc_middle
mov ebx,[cl_3d_normal]
call calc_middle
mov [cl_3d_pushed],eax
mov eax,[cl_3d_normal]
mov ebx,[sc.work_text]

View File

@ -13,23 +13,7 @@ func draw_editor ;///// DRAW EDITOR //////////////////////////////////////////
inc ecx
mov edx,[cl_3d_inset]
call draw_framerect
@^
mov ebx,[cur_editor.Bounds.Left-2]
mov bx,word[cur_editor.Bounds.Right]
mov ecx,[cur_editor.Bounds.Top-2]
mov cx,word[cur_editor.Bounds.Top]
mcall 38,,,[cl_3d_inset]
mov ecx,[cur_editor.Bounds.Bottom-2]
mov cx,word[cur_editor.Bounds.Bottom]
mcall
mov bx,word[cur_editor.Bounds.Left]
mov cx,word[cur_editor.Bounds.Top]
mcall
mov ebx,[cur_editor.Bounds.Right-2]
mov bx,word[cur_editor.Bounds.Right]
mov cx,word[cur_editor.Bounds.Top]
mcall
^@
mov [cur_editor.Gutter.Visible],0
test [options],OPTS_LINENUMS
jnz @f
@ -49,12 +33,33 @@ func draw_editor ;///// DRAW EDITOR //////////////////////////////////////////
.lp1: mov [cur_editor.Gutter.Width],eax ;! [left_ofs],eax
mov [left_ofs],eax
mov eax,[cur_editor.Bounds.Right]
sub eax,[cur_editor.Bounds.Left]
sub eax,[cur_editor.Gutter.Width]
sub eax,SCRLW+LCHGW+4
js .exit
cdq
mov ebx,6
div ebx
mov [columns.scr],eax
mov eax,[cur_editor.Bounds.Bottom]
sub eax,[cur_editor.Bounds.Top]
sub eax,SCRLW+3
js .exit
cdq
mov ebx,LINEH
div ebx
mov [lines.scr],eax
call draw_editor_gutter
call draw_editor_vscroll
call draw_editor_hscroll
call draw_editor_text
call draw_editor_caret
.exit:
ret
endf
@ -171,7 +176,7 @@ func draw_editor_vscroll ;///// DRAW EDITOR VERTICAL SCROLL BAR //////////////
mov ecx,[cur_editor.TopLeft.Y]
mov edx,[cur_editor.Bounds.Bottom]
sub edx,[cur_editor.Bounds.Top]
add edx,-SCRLW*3+1
add edx,-SCRLW*3;+1
call get_scroll_vars
mov [cur_editor.VScroll.Top],eax
mov [cur_editor.VScroll.Size],ebx
@ -273,6 +278,7 @@ func draw_editor_hscroll ;///// DRAW EDITOR HORIZONTAL SCROLL BAR ////////////
mov ebx,[columns.scr]
mov ecx,[cur_editor.TopLeft.X]
mov edx,[cur_editor.Bounds.Right]
sub edx,[cur_editor.Bounds.Left]
add edx,-(SCRLW*3)
call get_scroll_vars
mov [cur_editor.HScroll.Top],eax
@ -329,7 +335,10 @@ endf
;-----------------------------------------------------------------------------
func draw_editor_text ;///// DRAW EDITOR TEXT ////////////////////////////////
;-----------------------------------------------------------------------------
mov eax,[cur_editor.Bounds.Bottom]
cmp [cur_editor.Lines],0
jne @f
ret
@@: mov eax,[cur_editor.Bounds.Bottom]
sub eax,[cur_editor.Bounds.Top]
cmp eax,LINEH
jge @f
@ -363,9 +372,6 @@ func draw_editor_text ;///// DRAW EDITOR TEXT ////////////////////////////////
add esp,-4
imul ebp,[cur_editor.TopLeft.X],6*65536 ;! ebp,[left_col],6*65536
mov eax,[lines.scr]
sub eax,[cur_editor.Lines.Count] ;! eax,[lines]
mov [draw_blines],eax
.next_line:
@ -683,13 +689,6 @@ func draw_editor_text ;///// DRAW EDITOR TEXT ////////////////////////////////
.exit:
cmp [draw_blines],0
jl @f
mov ecx,[esp-8]
shl ecx,16
mov cx,word[cur_editor.Bounds.Bottom]
sub cx,[esp-8]
add cx,-SCRLW
mov eax,[cur_editor.Bounds.Left]
add eax,[cur_editor.Gutter.Width]
inc eax
@ -698,8 +697,27 @@ func draw_editor_text ;///// DRAW EDITOR TEXT ////////////////////////////////
mov bx,word[cur_editor.Bounds.Right]
sub bx,ax
add ebx,-SCRLW
mcall 13,,,[color_tbl+4*5]
@@:
mov edx,[color_tbl+4*5]
mov eax,13
mov ecx,[esp-8]
add ecx,LINEH
shl ecx,16
mov cx,word[cur_editor.Bounds.Bottom]
sub cx,[esp-8]
add cx,-SCRLW-LINEH
jle @f
mcall
@@: mov ecx,[cur_editor.Bounds.Top-2]
mov cx,2
add ecx,0x00010000
mcall
mov ebx,[cur_editor.Bounds.Right]
mov ecx,[cur_editor.Bounds.Bottom]
shl ebx,16
shl ecx,16
add ebx,-(SCRLW-1)*65536+SCRLW-1
add ecx,-(SCRLW-1)*65536+SCRLW-1
mcall
popad
add esp,4
@ -745,3 +763,21 @@ func draw_editor_caret ;///// DRAW EDITOR TEXT CARET /////////////////////////
@@:
ret
endf
;-----------------------------------------------------------------------------
func editor_realloc_lines ;///// ADD $DELTA$ TO LINES SIZE ///////////////////
;-----------------------------------------------------------------------------
; EAX = delta
;-----------------------------------------------------------------------------
push ebx ecx
mov ebx,[cur_editor.Lines.Size]
add ebx,eax
mov eax,[cur_editor.Lines]
mov [cur_editor.Lines.Size],ebx
mov ecx,eax
call mem.ReAlloc
mov [cur_editor.Lines],eax
sub eax,ecx
pop ecx ebx
ret
endf

View File

@ -1,8 +1,6 @@
;-----------------------------------------------------------------------------
func save_file ;//////////////////////////////////////////////////////////////
;-----------------------------------------------------------------------------
ret ; DISALLOW FOR NOW
mov esi,tb_opensave.text
mov edi,f_info.path
movzx ecx,[tb_opensave.length]
@ -12,26 +10,45 @@ func save_file ;//////////////////////////////////////////////////////////////
mov byte[edi],0
mov esi,[cur_editor.Lines] ;! AREA_EDIT ; 0x70000 = 448 Kbytes (maximum)
mov edi,0 ;!!! AREA_TEMP
xor ebx,ebx
mov ecx,[cur_editor.Lines.Count]
@@: call get_real_length
add ebx,eax
movzx eax,word[esi]
lea esi,[esi+eax+4]
loop @b
mov eax,[cur_editor.Lines.Count]
shl eax,1
lea eax,[eax+ebx+1024]
call mem.Alloc
push eax
mov esi,[cur_editor.Lines]
mov edi,eax ;!!! AREA_TEMP
; pop eax
; ret ; DISALLOW FOR NOW
.new_string:
call save_string
cmp dword[esi],0
jne .new_string
sub edi,0 ;!!! AREA_TEMP+2 ; minus last CRLF
pop eax
sub edi,eax ;!!! AREA_TEMP+2 ; minus last CRLF
add edi,-2
;! mov [filelen],edi
cmp byte[f_info.path],'/'
je .systree_save
mcall 33,f_info.path,0,edi,0 ;!!! AREA_TEMP,edi,0;[filelen],0
or eax,eax
jz .exit
; cmp byte[f_info.path],'/'
; je .systree_save
; mcall 33,f_info.path,0,edi,0 ;!!! AREA_TEMP,edi,0;[filelen],0
; or eax,eax
; jz .exit
; call file_not_found
jmp .exit.2
; jmp .exit.2
.systree_save:
mov [f_info70+0],2
mov [f_info70+12],edi
mov [f_info70+16],0 ;!!! AREA_TEMP
mov [f_info70+16],eax ;!!! AREA_TEMP
mov byte[f_info70+20],0
mov [f_info70+21],f_info.path
mcall 70,f_info70
@ -143,7 +160,12 @@ endf
;-----------------------------------------------------------------------------
func load_file ;//////////////////////////////////////////////////////////////
;-----------------------------------------------------------------------------
mov esi,tb_opensave.text
cmp [tb_opensave.text],0
jne @f
stc
ret
@@: mov esi,tb_opensave.text
mov edi,f_info.path
movzx ecx,[tb_opensave.length]
mov [f_info.length],ecx
@ -214,13 +236,22 @@ func load_from_memory ;///////////////////////////////////////////////////////
; ESI = data pointer
; EBP = EDITOR*
;-----------------------------------------------------------------------------
; DEBUGF 1,<">>> load_from_memory\n" # \
; " data length = %d\n" # \
; " data pointer = 0x%x\n" # \
; " EDITOR* = 0x%x\n">,ecx,esi,ebp
call get_lines_in_file
inc eax
; DEBUGF 1,"lines in file: %d\n",eax
mov [ebp+EDITOR.Lines.Count],eax
lea edx,[ebx+ecx]
imul ebx,eax,14
add ebx,ecx
add ebx,edx
; DEBUGF 1,"36522: %d\n",ebx
mov eax,[ebp+EDITOR.Lines]
mov [ebp+EDITOR.Lines.Size],ebx
call mem.ReAlloc
; DEBUGF 1,"mem.ReAlloc: 0x%x\n",eax
mov [ebp+EDITOR.Lines],eax
mov [ebp+EDITOR.Columns.Count],0

View File

@ -155,10 +155,12 @@ endf
;-----------------------------------------------------------------------------
func key.ctrl_s ;///// ENTER SAVE FILENAME ///////////////////////////////////
;-----------------------------------------------------------------------------
cmp [cur_editor.FilePath],'/'
jne key.shift_ctrl_s
cmp [cur_editor.Modified],0 ;! [modified],0
je .exit
cmp [f_info.length],0
je key.shift_ctrl_s
;cmp [f_info.length],0
;je key.shift_ctrl_s
call save_file
call drawwindow
.exit:
@ -537,11 +539,23 @@ func key.ctrl_v
call delete_selection
mov eax,[copy_size]
call editor_realloc_lines
mov eax,[cur_editor.Lines]
mov ebx,[cur_editor.Lines.Size]
add ebx,[copy_size]
mov [cur_editor.Lines.Size],ebx
call mem.ReAlloc
mov [cur_editor.Lines],eax
mov ecx,[cur_editor.Caret.Y] ;! ecx,[pos.y]
call get_line_offset
pushd [esi] esi
mov ecx,[cur_editor.Caret.X] ;! ecx,[pos.x]
call line_add_spaces
add [esp],eax ;!!!
add esi,eax ;!!!
mov ecx,[copy_size]
sub ecx,4
mov edi,[cur_editor.Lines] ;! AREA_TEMP2
@ -570,6 +584,7 @@ func key.ctrl_v
mov ebx,[cur_editor.Caret.X] ;! ebx,[pos.x]
add eax,ebx
mov [edi-4],ax
mov byte[edi-4+2],0x0001
sub eax,ebx
call .check_columns
add edi,ebx
@ -579,7 +594,7 @@ func key.ctrl_v
lodsd
and eax,0x0000FFFF
stosd
or dword[edi-4],0x00010000
mov byte[edi-4+2],0x0001
pop ecx
loop @b
@ -656,6 +671,9 @@ endf
;-----------------------------------------------------------------------------
func key.ctrl_d ;///// INSERT SEPARATOR //////////////////////////////////////
;-----------------------------------------------------------------------------
mov eax,94
call editor_realloc_lines
mov ecx,[cur_editor.Caret.Y] ;! ecx,[pos.y]
call get_line_offset
mov ebx,esi
@ -702,14 +720,27 @@ func key.ctrl_y ;///// DELETE CURRENT LINE ///////////////////////////////////
call get_line_offset
mov edi,esi
lodsd
and eax,0x0000FFFF
add esi,eax
push eax
dec [cur_editor.Lines.Count] ;! [lines]
mov ecx,[temp_buf] ;! AREA_TEMP2
;mov ecx,[temp_buf] ;! AREA_TEMP2
mov ecx,[cur_editor.Lines]
add ecx,[ecx-4]
sub ecx,esi
shr ecx,2 ;// fixed (was 4)
cld
rep movsd
pop eax
add eax,4
neg eax
call editor_realloc_lines
m2m [cur_editor.SelStart.X],[cur_editor.Caret.X]
m2m [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
call check_inv_all
mov [cur_editor.Modified],1 ;! [modified],1
@ -1129,6 +1160,16 @@ func key.del ;///// DELETE NEXT CHAR OR SELECTION ////////////////////////////
@@: m2m [cur_editor.SelStart.X],[cur_editor.Caret.X] ;! [sel.x],[pos.x]
m2m [cur_editor.SelStart.Y],[cur_editor.Caret.Y] ;! [sel.y],[pos.y]
mov ecx,[cur_editor.Lines.Count]
call get_line_offset
movzx eax,word[esi]
lea esi,[esi+eax+4]
mov eax,[cur_editor.Lines]
add eax,[eax-4]
sub esi,eax
lea eax,[esi+4096]
call editor_realloc_lines
mov [cur_editor.Modified],1 ;! [modified],1
.exit.2:
call check_inv_all
@ -1223,6 +1264,9 @@ func key.tab ;///// TABULATE /////////////////////////////////////////////////
push eax ' '
sub eax,ecx
.direct:
push eax
call editor_realloc_lines
pop eax
mov ecx,[cur_editor.Caret.Y] ;! ecx,[pos.y]
call get_line_offset
and dword[esi],not 0x00020000
@ -1238,6 +1282,11 @@ func key.tab ;///// TABULATE /////////////////////////////////////////////////
sub edx,eax
cmp ecx,edx
jl @f
push eax
mov eax,10
call editor_realloc_lines
add esi,eax
pop eax
pushad; esi ecx eax
mov ecx,[cur_editor.Lines] ;! AREA_TEMP2-10+1
add ecx,[ecx-4]
@ -1247,7 +1296,7 @@ func key.tab ;///// TABULATE /////////////////////////////////////////////////
; lea eax,[esi+4]
; add eax,[esi]
movzx eax,word[esi]
lea eax,word[esi+eax+4]
lea eax,[esi+eax+4]
sub ecx,eax
lea esi,[edi-10] ;! AREA_TEMP2-10
std
@ -1298,6 +1347,9 @@ func key.return ;///// CARRIAGE RETURN ///////////////////////////////////////
;-----------------------------------------------------------------------------
call delete_selection
mov eax,14
call editor_realloc_lines
mov ecx,[cur_editor.Caret.Y] ;! ecx,[pos.y]
call get_line_offset
@ -1489,3 +1541,21 @@ func key.ctrl_f4 ;///// CLOSE CURRENT TAB ////////////////////////////////////
call create_tab
@@: ret
endf
;-----------------------------------------------------------------------------
func key.shift_f9 ;///// SET DEFAULT TAB /////////////////////////////////////
;-----------------------------------------------------------------------------
mov eax,[tab_bar.Current.Ptr]
cmp eax,[tab_bar.Default.Ptr]
jne @f
xor eax,eax
@@: mov [tab_bar.Default.Ptr],eax
mov ebp,[tab_bar.Current.Ptr]
call make_tab_visible
cmp [tab_bar.Style],2
jbe @f
call align_editor_in_tab
call draw_editor
@@: call draw_tabctl
ret
endf

View File

@ -3,11 +3,13 @@ func check_mouse_in_edit_area
mov ebx,eax
and ebx,0x0000FFFF
shr eax,16
mov ecx,[top_ofs]
mov ecx,[cur_editor.Bounds.Top] ; ecx,[top_ofs]
inc ecx
pushd [left_ofs] ATOPH [p_info.client_box.width] ATOPH
pushd [cur_editor.Bounds.Left] ecx [cur_editor.Bounds.Right] ecx ; [left_ofs] ATOPH [p_info.client_box.width] ATOPH
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0]
sub [__rc+0x8],SCRLW+6
mov ecx,[cur_editor.Gutter.Width]
add [__rc+0x0],ecx
imul ecx,[lines.scr],LINEH
dec ecx
add [__rc+0xC],ecx
@ -148,9 +150,11 @@ mouse:
call clear_selection
.check_body.2:
sub eax,[left_ofs]
sub ebx,[top_ofs]
dec ebx
sub eax,[cur_editor.Bounds.Left] ; eax,[left_ofs]
sub ebx,[cur_editor.Bounds.Top] ; ebx,[top_ofs]
sub eax,[cur_editor.Gutter.Width]
sub eax,LCHGW
sub ebx,2
; sub ebx,[__rc+0x4]
push eax
mov eax,ebx
@ -196,19 +200,20 @@ mouse:
jmp still
.check_vscroll:
mov ecx,[p_info.client_box.width]
sub ecx,SCRLW-2
pushd ecx [top_ofs] ecx [bot_ofs]
;mov ecx,[p_info.client_box.width]
mov ecx,[cur_editor.Bounds.Right]
sub ecx,SCRLW-1;2
pushd ecx [cur_editor.Bounds.Top] ecx [cur_editor.Bounds.Bottom] ;ecx [top_ofs] ecx [bot_ofs]
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0]
add [__rc+0x8],SCRLW-1;!!!!!!!!!!!!!!-2
add [__rc+0x4],SCRLW;!!!!!!!!!!!!!!+1
sub [__rc+0xC],SCRLW*2+3
add [__rc+0x8],SCRLW-2;!!!!!!!!!!!!!!-2
add [__rc+0x4],SCRLW-1;!!!!!!!!!!!!!!+1
sub [__rc+0xC],SCRLW*2+1;3
mov ecx,__rc
call pt_in_rect
jnc .check_hscroll
.check_vscroll.2:
sub ebx,[top_ofs]
sub ebx,[cur_editor.Bounds.Top] ; ebx,[top_ofs]
sub ebx,SCRLW;!!!!!!!!!!!!!!+1
; sub ebx,[__rc+0x4]
cmp [vscrl_capt],0
@ -234,10 +239,10 @@ mouse:
jns @f
xor ebx,ebx
@@: mov [mouse_captured],1
mov eax,[bot_ofs]
sub eax,[top_ofs]
mov eax,[cur_editor.Bounds.Bottom] ; eax,[bot_ofs]
sub eax,[cur_editor.Bounds.Top] ; eax,[top_ofs]
sub eax,[cur_editor.VScroll.Size] ;! eax,[vscrl_size]
sub eax,SCRLW*3-2
sub eax,SCRLW*3;-2
cmp eax,ebx
jge @f
mov ebx,eax
@ -246,9 +251,9 @@ mouse:
mov eax,[cur_editor.Lines.Count] ;! eax,[lines]
sub eax,[lines.scr]
imul ebx
mov ebx,[bot_ofs]
sub ebx,[top_ofs]
sub ebx,SCRLW*3-2 ;**
mov ebx,[cur_editor.Bounds.Bottom] ; ebx,[bot_ofs]
sub ebx,[cur_editor.Bounds.Top] ; ebx,[top_ofs]
sub ebx,SCRLW*3;-2 ;**
sub ebx,[cur_editor.VScroll.Size] ;! ebx,[vscrl_size]
idiv ebx
cmp eax,[cur_editor.TopLeft.Y] ;! eax,[top_line]
@ -259,18 +264,21 @@ mouse:
jmp still.skip_write
.check_hscroll:
pushd (5+SCRLW+1) [bot_ofs] [p_info.box.width] [bot_ofs]
pushd [cur_editor.Bounds.Left] [cur_editor.Bounds.Bottom] [cur_editor.Bounds.Right] [cur_editor.Bounds.Bottom] ; (5+SCRLW+1) [bot_ofs] [p_info.box.width] [bot_ofs]
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0]
add [__rc+0x8],-SCRLW*2-10-1
add [__rc+0x4],-SCRLW
add [__rc+0xC],-2
add [__rc+0x8],-SCRLW*2-1
add [__rc+0x4],-SCRLW+1
add [__rc+0xC],-1
add [__rc+0x0],SCRLW+1
mov ecx,__rc
call pt_in_rect
jnc .check_main_menu
.check_hscroll.2:
mov ebx,eax
sub ebx,(5+SCRLW+1)
;sub ebx,(5+SCRLW+1)
sub ebx,SCRLW+1
sub ebx,[cur_editor.Bounds.Left]
; sub ebx,[__rc+0x0]
cmp [hscrl_capt],0
jge .hcaptured
@ -295,9 +303,9 @@ mouse:
jns @f
xor ebx,ebx
@@: mov [mouse_captured],1
mov eax,[p_info.box.width]
mov eax,[cur_editor.Bounds.Right] ; eax,[p_info.box.width]
sub eax,[cur_editor.HScroll.Size] ;! eax,[hscrl_size]
sub eax,SCRLW*3+10+1
sub eax,SCRLW*3+1 ; eax,SCRLW*3+10+1
cmp eax,ebx
jge @f
mov ebx,eax
@ -306,8 +314,8 @@ mouse:
mov eax,[cur_editor.Columns.Count] ;! eax,[columns]
sub eax,[columns.scr]
imul ebx
mov ebx,[p_info.box.width]
sub ebx,SCRLW*3+10+1 ;**
mov ebx,[cur_editor.Bounds.Right] ; ebx,[p_info.box.width]
sub ebx,SCRLW*3+1 ; ebx,SCRLW*3+10+1 ;**
sub ebx,[cur_editor.HScroll.Size] ;! ebx,[hscrl_size]
idiv ebx
cmp eax,[cur_editor.TopLeft.X] ;! eax,[left_col]

View File

@ -178,22 +178,11 @@ func draw_popup_wnd
test byte[ebp+edi-1],0x02
jz .lp8
movzx ecx,bx
shl ecx,16
mov cx,bx
shr ebx,16
push bx
shl ebx,16
pop bx
add ecx,0x00040003
sub ebx,0x000A000B
mcall 38,,,[sc.work_text]
add ecx,0x00010001
mcall
add ebx,4
sub ecx,2
mcall
sub ecx,0x00010001
mcall
add ebx,-11
add ecx,2
mov edx,[sc.work_text]
call draw_check
.lp8: popad
mov ecx,[sc.work_text];0x00000000

View File

@ -38,16 +38,15 @@ endf
;-----------------------------------------------------------------------------
func make_tab_visible ;///// MAKE SPECIFIED TAB VISIBLE IF IT'S OFFSCREEN ////
;-----------------------------------------------------------------------------
push ebp
imul eax,[tab_bar.Items.Left],sizeof.TABITEM
add eax,[tab_bar.Items]
cmp eax,ebp
jb .go_right
ja .go_left
add esp,4
ret
.go_right:
push ebp
call get_hidden_tabitems_number
cmp ebp,[esp]
ja .lp1
@ -67,13 +66,13 @@ func make_tab_visible ;///// MAKE SPECIFIED TAB VISIBLE IF IT'S OFFSCREEN ////
mov ebx,sizeof.TABITEM
div ebx
@@: mov [tab_bar.Items.Left],eax
add esp,4
ret
endf
;-----------------------------------------------------------------------------
func create_tab ;///// ADD TAB TO THE END ////////////////////////////////////
;-----------------------------------------------------------------------------
; DEBUGF 1,"items count before addition: %d\n",[tab_bar.Items.Count]
push eax ecx esi edi
inc [tab_bar.Items.Count]
@ -84,11 +83,15 @@ func create_tab ;///// ADD TAB TO THE END ////////////////////////////////////
mov [tab_bar.Items],eax
sub ecx,eax
sub [tab_bar.Current.Ptr],ecx
lea ebp,[eax+ebx-sizeof.TABITEM]
cmp [tab_bar.Default.Ptr],0
je @f
sub [tab_bar.Default.Ptr],ecx
@@: lea ebp,[eax+ebx-sizeof.TABITEM]
call set_cur_tab
call make_tab_visible
mov eax,1024
mov [cur_editor.Lines.Size],eax
call mem.Alloc
mov [cur_editor.Lines],eax
mov [cur_editor.Lines.Count],1
@ -115,14 +118,19 @@ func create_tab ;///// ADD TAB TO THE END ////////////////////////////////////
rep movsb
mov [cur_editor.FileName],0
mov [f_info.length],0
mov [cur_editor.Modified],0
mov [cur_editor.AsmMode],0
call flush_cur_tab
call update_caption
call drawwindow
;call drawwindow
cmp [do_not_draw],0
jne @f
call align_editor_in_tab
call draw_editor
call draw_tabctl
call draw_statusbar
@@:
mov ebp,cur_tab
pop edi esi ecx eax
ret
@ -131,7 +139,18 @@ endf
;-----------------------------------------------------------------------------
func delete_tab ;///// DELETE SPECIFIED TAB //////////////////////////////////
;-----------------------------------------------------------------------------
mov eax,[ebp+TABITEM.Editor.Lines]
; DEBUGF 1,"items count before deletion: %d\n",[tab_bar.Items.Count]
cmp [tab_bar.Default.Ptr],0
je @f
cmp ebp,[tab_bar.Default.Ptr]
je .lp1
ja @f
sub [tab_bar.Default.Ptr],sizeof.TABITEM
jmp @f
.lp1:
mov [tab_bar.Default.Ptr],0
@@: mov eax,[ebp+TABITEM.Editor.Lines]
call mem.Free
imul ecx,[tab_bar.Items.Count],sizeof.TABITEM
add ecx,[tab_bar.Items]
@ -153,7 +172,10 @@ func delete_tab ;///// DELETE SPECIFIED TAB //////////////////////////////////
mov [tab_bar.Items],eax
sub ecx,eax
sub ebp,ecx
cmp [tab_bar.Default.Ptr],0
je @f
sub [tab_bar.Default.Ptr],ecx
@@:
pop ecx
add ecx,[tab_bar.Items]
sub ecx,ebp
@ -163,14 +185,20 @@ func delete_tab ;///// DELETE SPECIFIED TAB //////////////////////////////////
@@: mov [tab_bar.Current.Ptr],0
call set_cur_tab
call make_tab_visible
call drawwindow
;call drawwindow
call align_editor_in_tab
call draw_editor
call draw_tabctl
call draw_statusbar
ret
.no_tabs:
mov eax,[tab_bar.Items]
call mem.Free
mov [tab_bar.Items],0
mov [tab_bar.Current.Ptr],0
xor eax,eax
mov [tab_bar.Items],eax
mov [tab_bar.Current.Ptr],eax
mov [tab_bar.Default.Ptr],eax
ret
endf
@ -354,6 +382,26 @@ func draw_tabctl ;///// DRAW TAB CONTROL /////////////////////////////////////
mov edx,[color_tbl+4*0]
.draw_tabs.inactive:
cmp ebp,[tab_bar.Default.Ptr]
jne .draw_tabs.notdefault
push ebx ecx edx
add ebx,3*65536
add ecx,(TBARH/2-6)*65536
mov bx,11
mov cx,bx
call draw_framerect
add ebx,1*65536-2
add ecx,1*65536-2
mcall 13,,,[sc.work]
shr ebx,16
shr ecx,16
add ebx,2
add ecx,3
mov edx,[esp]
call draw_check
pop edx ecx ebx
.draw_tabs.notdefault:
push ebx ecx esi edx
lea eax,[ebp+TABITEM.Editor.FilePath]
add eax,[ebp+TABITEM.Editor.FileName]
@ -362,9 +410,12 @@ func draw_tabctl ;///// DRAW TAB CONTROL /////////////////////////////////////
mov esi,eax
shr ecx,16
mov bx,cx
add ebx,0x00050005
add ebx,5*65536+TBARH/2-4
pop ecx
mcall 4
cmp ebp,[tab_bar.Default.Ptr]
jne .lp2
add ebx,13*65536
.lp2: mcall 4
pop esi ecx ebx
inc [tab_bar.Buttons.Last]
@ -533,6 +584,9 @@ func get_tab_size ;///// GET TAB WIDTH ///////////////////////////////////////
call strlen
imul ebx,eax,6
add ebx,9
cmp ebp,[tab_bar.Default.Ptr]
jne .lp2
add ebx,13
jmp .lp2
.lp1: call get_max_tab_width
mov ebx,eax
@ -566,6 +620,9 @@ func get_max_tab_width ;///// GET WIDTH OF LONGEST TAB ///////////////////////
cmp eax,SCRLW*2+2
jae @f
mov eax,SCRLW*2+2
@@: cmp [tab_bar.Default.Ptr],0
je @f
add eax,13
@@: pop ebp ecx ebx
ret
endf
@ -598,9 +655,8 @@ func get_hidden_tabitems_number ;/////////////////////////////////////////////
mov edi,[tab_bar.Bounds.Top]
inc edi
mov ecx,[tab_bar.Items.Count]
mov ebp,[tab_bar.Items]
imul eax,[tab_bar.Items.Left],sizeof.TABITEM
add ebp,eax
imul ebp,[tab_bar.Items.Left],sizeof.TABITEM
add ebp,[tab_bar.Items]
mov eax,ecx
sub eax,[tab_bar.Items.Left]
push eax