diff --git a/programs/develop/tinypad/trunk/macros.inc b/programs/develop/tinypad/trunk/macros.inc index 1c7b10d7fa..eac7d1530a 100644 --- a/programs/develop/tinypad/trunk/macros.inc +++ b/programs/develop/tinypad/trunk/macros.inc @@ -210,7 +210,7 @@ macro section name { align 16 label name } macro func name { if ~used name - display 'FUNC NOT USED: ',`name,13,10 + ;display 'FUNC NOT USED: ',`name,13,10 else align 4 name: @@ -372,6 +372,25 @@ struct system_colors work_graph dd ? ends +struct FILEDATE + Second db ? + Minute db ? + Hour db ? + db ? + Day db ? + Month db ? + Year dw ? +ends + +struct FILEINFO + Attributes dd ? + IsUnicode db ? + db 3 dup(?) + DateCreate FILEDATE + DateAccess FILEDATE + DateModify FILEDATE + Size dq ? +ends ; constants diff --git a/programs/develop/tinypad/trunk/tinypad.asm b/programs/develop/tinypad/trunk/tinypad.asm index 851b510132..df241279bf 100644 --- a/programs/develop/tinypad/trunk/tinypad.asm +++ b/programs/develop/tinypad/trunk/tinypad.asm @@ -1,31 +1,42 @@ ;----------------------------------------------------------------------------- ; project name: TINYPAD -; compiler: flat assembler 1.67.1 +; 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: 2006-12-30 (Dec 30, 2006) +; last update: 2007-01-03 (Jan 3, 2007) ; minimal kernel: revision #138 (svn://kolibrios.org/kernel) ;----------------------------------------------------------------------------- ; originally by: Ville Michael Turjanmaa >> villemt@aton.co.jyu.fi ; maintained by: Mike Semenyako >> mike.dld@gmail.com ; Ivan Poddubny >> ivan-yar@bk.ru ;----------------------------------------------------------------------------- -; TODO: +; TODO (FOR 4.1.0): ; - optimize drawing (reduce flickering) -; - optimize memory usage (allocate only needed amount, not static 3 Mbytes) -; - add block selection ability, undo action, goto position -; - working with multiple files (add tabs) +; - add vertical selection, undo, goto position, overwrite mode ; - improve window drawing with small dimensions -; - other bugfixes and speed/size optimizations +; - other bug-fixes and speed/size optimizations +; +; TODO (FOR 4.0.4, PLANNED FOR 2007-01-21): +; - finish tabbed interface [critical] +; - add memory reallocation to keys handler [critical] +; - rework save_file (memory manager) [critical] +; - reduce flickering (changes checker) [average] +; - incorrect saved/modified lines flags on copy/paste [normal] +; - case-insensitive file extensions comparison (.asm/.inc) [normal] +; - prompt to save file before closing/opening [low] ; ; HISTORY: ; 4.0.4 pre (mike.dld) ; bug-fixes: -; - clear statusbar text if dialog operation cancelled +; - statusbar contained hint after dialog operation cancelled +; - small drawing fix for gutter and line saved/modified markers ; changes: ; - 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 ; new features: ; - recode tables between CP866, CP1251 and KOI8-R (suggested by Victor) +; - tabbed interface, ability to open several files in one app instance ; 4.0.3 (mike.dld) ; bug-fixes: ; - 1-char selection if pressing out of real line length @@ -132,22 +143,14 @@ ; auto-indent ; Ctrl+L - insert comment string ;----------------------------------------------------------------------------- -; Memory 0x300000: -; stack for popup 0x00dff0 - -; stack for help 0x00eff0 - -; stack 0x00fff0 - -; load position 0x010000 + -; edit area 0x080000 + -; copy/paste area 0x2f0000 + -;----------------------------------------------------------------------------- include 'lang.inc' include 'macros.inc' ; useful stuff ;include 'proc32.inc' include 'tinypad.inc' -;purge mov,add,sub ;  SPEED +purge mov,add,sub ;  SPEED -header '01',1,@CODE,TINYPAD_END,AREA_ENDMEM,MAIN_STACK,@PARAMS,self_path +header '01',1,@CODE,TINYPAD_END,STATIC_MEM_END,MAIN_STACK,@PARAMS,self_path APP_VERSION equ '4.0.4 pre' @@ -155,15 +158,15 @@ APP_VERSION equ '4.0.4 pre' ASEPC = '-' ; separator character (char) ATOPH = POP_IHEIGHT+2 ; menu bar height (pixels) -;OLEFT = 50+1 ; left offset (pixels) !!! don't change !!! SCRLW = 16 ; scrollbar widht/height (pixels) ATABW = 8 ; tab width (chars) LINEH = 10 ; line height (pixels) -PATHL = 255 ; maximum path length (chars) !!! don't change !!! +PATHL = 256 ; maximum path length (chars) !!! don't change !!! AMINS = 8 ; minimal scroll thumb size (pixels) -LCHGW = 2 ; changed/saved marker width +LCHGW = 3 ; changed/saved marker width -STATH = 14 ; status bar height +STATH = 16 ; status bar height +TBARH = 18 ; tab bar height MEV_LDOWN = 1 MEV_LUP = 2 @@ -184,8 +187,8 @@ label color_tbl dword RGB(255,255,255) ; RGB(224,224,224) ; RGB(255,255,255) ; background RGB(255,255,255) ; RGB(255,255,255) ; RGB(255,255,255) ; selection text RGB( 10, 36,106) ; RGB( 0, 0,128) ; RGB( 0, 64,128) ; selection background - RGB(255,255, 0) ; modified line marker - RGB( 0,255, 0) ; saved line marker + RGB(255,238, 98) ; modified line marker + RGB(108,226,108) ; saved line marker ins_mode db 1 @@ -220,12 +223,26 @@ section @CODE ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: mov al,0 rep stosb + mov [tab_bar.Style],2 + + mcall 68,11 + or eax,eax + jz key.alt_x.close + + mov eax,65536 + call mem.Alloc + mov [temp_buf],eax + + mov eax,65536 + call mem.Alloc + mov [cur_tab.Editor.Data],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 [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 @@ -262,17 +279,35 @@ section @CODE ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;// diamond ] add edx,20 - mcall 60,1,AREA_TEMP-16 ; 0x10000-16 - mov dword[AREA_TEMP-16+4],8 ; [0x10000-16+4],8 + + mov eax,edx + call mem.Alloc + mov ebp,eax + +;! 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+4],8 mcall 40,1000000b mcall 23,200 cmp eax,7 - jne key.alt_x.close ; ¤Єю эр mcall -1 ьхЄър - mov esi,AREA_TEMP-16 ; 0x10000-16 - mov byte[esi],1 - mov eax,[esi+12] - inc eax - call load_file.file_found + jne key.alt_x.close +;! mov esi,AREA_TEMP-16 ; 0x10000-16 +;! mov byte[esi],1 +;! mov eax,[esi+12] + mov byte[ebp],1 +;! mov eax,[ebp+12] +;! inc eax +;! call load_file.file_found + + mov ecx,[ebp+12] + mov esi,ebp + call create_tab + call load_from_memory + + mov eax,ebp + call mem.Free + jmp @f .noipc: @@ -292,9 +327,9 @@ section @CODE ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: mov [tb_opensave.length],al no_params: - call btn.load_file;do_load_file - jnc @f - call new_file + ;call btn.load_file;do_load_file + ;jnc @f + call create_tab @@: dec [do_not_draw] @@ -307,7 +342,7 @@ red: ;----------------------------------------------------------------------------- still: - call writepos ; write current position & number of strings + call draw_statusbar ; write current position & number of strings .skip_write: mcall 10;23,50; wait here until event @@ -329,7 +364,7 @@ func start_fasm ;///////////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- ; BL = run after compile ;----------------------------------------------------------------------------- - cmp [asm_mode],0 + cmp [cur_tab.Editor.AsmMode],0 ;! [asm_mode],0 jne @f ret @@: mov esi,f_info.path ; s_fname @@ -458,48 +493,37 @@ endf ; @@: ret ;endf -func set_opt - test [options],al - je @f - not al - and [options],al - ret - @@: or [options],al - ret -endf +set_opt: -func set_line_numbers + .line_numbers: mov al,OPTS_LINENUMS - call set_opt - ret -endf - -func set_optimal_fill + jmp .main + .optimal_fill: mov al,OPTS_OPTIMSAVE - call set_opt - ret -endf - -func set_auto_indents + jmp .main + .auto_indents: mov al,OPTS_AUTOINDENT - call set_opt - ret -endf - -func set_auto_braces + jmp .main + .auto_braces: mov al,OPTS_AUTOBRACES - call set_opt - ret -endf - -func set_secure_sel + jmp .main + .secure_sel: mov al,OPTS_SECURESEL - call set_opt + + .main: + xor [options],al +; test [options],al +; je @f +; not al +; and [options],al +; ret +; @@: or [options],al ret -endf ;----------------------------------------------------------------------------- +include 'tp-defines.inc' + include 'tp-draw.asm' include 'tp-key.asm' include 'tp-button.asm' @@ -509,6 +533,8 @@ include 'tp-common.asm' include 'tp-dialog.asm' include 'tp-popup.asm' include 'tp-tbox.asm' +include 'tp-tabctl.asm' +include 'tp-editor.asm' include 'tp-recode.asm' ;include 'lib-ini.asm' @@ -559,6 +585,7 @@ accel_table dd \ 0x00010150,key.shift_down ,\ ; Shift+Down 0x00010151,key.shift_pgdn ,\ ; Shift+PageDown 0x00010153,key.del ,\ ; Shift+Delete + 0x0002000F,key.ctrl_tab ,\ ; Ctrl+Tab 0x00020015,key.ctrl_y ,\ ; Ctrl+Y 0x00020018,key.ctrl_o ,\ ; Ctrl+O 0x0002001E,key.ctrl_a ,\ ; Ctrl+A @@ -582,6 +609,7 @@ accel_table dd \ \;0x00020150,key.ctrl_down ,\ ; Ctrl+Down 0x00020151,key.ctrl_pgdn ,\ ; Ctrl+PageDown 0x00020153,key.del ,\ ; Ctrl+Del + 0x0003000F,key.shift_ctrl_tab ,\ ; Shift+Ctrl+Tab 0x0003001F,key.shift_ctrl_s ,\ ; Shift+Ctrl+S 0x00030147,key.shift_ctrl_home ,\ ; Shift+Ctrl+Home \;0x00030148,key.shift_ctrl_up ,\ ; Shift+Ctrl+Up @@ -613,15 +641,10 @@ accel_table_textbox dd \ accel_table2 dd \ 1,btn.close_main_window ,\ -\;10000,btn.compile ,\ -\;10001,btn.compile_run ,\ -\;10002,btn.debug_board ,\ -\;10003,btn.sysfuncs_txt ,\ 'UP',btn.scroll_up ,\ 'DN',btn.scroll_down ,\ 'LT',btn.scroll_left ,\ 'RT',btn.scroll_right ,\ -\;5,key.ctrl_o ,\ 0 accel_table2_botdlg dd \ @@ -632,7 +655,6 @@ accel_table2_botdlg dd \ 0 add_table: -; times $61 db -$00 times $1A db -$20 times $25 db -$00 times $10 db -$20 @@ -641,15 +663,8 @@ add_table: times $04 db -$00,-$01 times $08 db -$00 -;error_beep db 0xA0,0x30,0 - s_status dd 0 -sz s_example,'EXAMPLE.ASM' -sz s_still ,'still' - -;sz param_setup,'LANG',0 ; parameter for SETUP - fasm_start: dd 7 dd 0 @@ -679,246 +694,18 @@ docpak_start: dd 0 db '/RD/1/DOCPAK',0 -;sz setup ,'SETUP ' ; to change keyboard layout - sz sysfuncs_param,'g',0 -lsz sysfuncs_filename,\ - ru,<'SYSFUNCR.TXT',0>,\ - en,<'SYSFUNCS.TXT',0> - -sz htext,'TINYPAD ',APP_VERSION - -lszc help_text,b,\ - ru,'КОМАНДЫ:',\ - ru,' ',\ - ru,' CTRL+F1 : Это окно',\ - ru,' CTRL+S : Первая строка для копирования',\ - ru,' CTRL+E : Последняя строка для копирования',\ - ru,' CTRL+P : Вставить выбранное на текущую позицию',\ - ru,' CTRL+D : Удалить строку',\ - ru,' CTRL+L : Вставить строку-разделитель',\ - ru,' CTRL+[ : Перейти в начало файла',\ - ru,' CTRL+] : Перейти в конец файла',\ - ru,' CTRL+F2 : Загрузить файл',\ - ru,' CTRL+F3 : Поиск',\ - ru,' CTRL+F4 : Сохранить файл',\ - ru,' CTRL+F5 : Ввести имя файла',\ - ru,' CTRL+F6 : Ввести строку для поиска',\ - ru,' CTRL+F8 : Сменить раскладку клавиатуры',\ -\ - en,'COMMANDS:',\ - en,' ',\ - en,' CTRL+F1 : SHOW THIS WINDOW',\ - en,' CTRL+S : SELECT FIRST STRING TO COPY',\ - en,' CTRL+E : SELECT LAST STRING TO COPY',\ - en,' CTRL+P : PASTE SELECTED TO CURRENT POSITION',\ - en,' CTRL+D : DELETE CURRENT LINE',\ - en,' CTRL+L : INSERT SEPARATOR LINE',\ - en,' CTRL+[ : GO TO THE BEGINNING OF FILE',\ - en,' CTRL+] : GO TO THE END OF FILE',\ - en,' CTRL+F2 : LOAD FILE',\ - en,' CTRL+F3 : SEARCH',\ - en,' CTRL+F4 : SAVE FILE',\ - en,' CTRL+F5 : ENTER FILENAME',\ - en,' CTRL+F6 : ENTER SEARCH STRING',\ - en,' CTRL+F8 : CHANGE KEYBOARD LAYOUT' -db 0 - -menubar_res main_menu,\ - ru,'Файл' ,popup_file ,onshow.file ,\ - ru,'Правка' ,popup_edit ,onshow.edit ,\ - ru,'Поиск' ,popup_search ,onshow.search ,\ - ru,'Запуск' ,popup_run ,onshow.run ,\ - ru,'Кодировка',popup_recode ,onshow.recode ,\ - ru,'Опции' ,popup_options,onshow.options,\ -\ - en,'File' ,popup_file ,onshow.file ,\ - en,'Edit' ,popup_edit ,onshow.edit ,\ - en,'Search' ,popup_search ,onshow.search ,\ - en,'Run' ,popup_run ,onshow.run ,\ - en,'Encoding',popup_recode ,onshow.recode ,\ - en,'Options' ,popup_options,onshow.options - -popup_res popup_file,\ - ru,'Новый' ,'Ctrl+N' ,key.ctrl_n ,\ - ru,'Открыть...' ,'Ctrl+O' ,key.ctrl_o ,\ - ru,'Сохранить' ,'Ctrl+S' ,key.ctrl_s ,\ - ru,'Сохранить как...','Ctrl+Shift+S',key.shift_ctrl_s,\ - ru,'-' ,'' ,0 ,\ - ru,'Выход' ,'Alt+X' ,key.alt_x ,\ -\ - en,'New' ,'Ctrl+N' ,key.ctrl_n ,\ - en,'Open...' ,'Ctrl+O' ,key.ctrl_o ,\ - en,'Save' ,'Ctrl+S' ,key.ctrl_s ,\ - en,'Save as...','Ctrl+Shift+S',key.shift_ctrl_s,\ - en,'-' ,'' ,0 ,\ - en,'Exit' ,'Alt+X' ,key.alt_x - -popup_res popup_edit,\ - ru,'Вырезать' ,'Ctrl+X',key.ctrl_x,\ - ru,'Копировать' ,'Ctrl+C',key.ctrl_c,\ - ru,'Вставить' ,'Ctrl+V',key.ctrl_v,\ - ru,'Удалить' ,'' ,key.del ,\ - ru,'-' ,'' ,0 ,\ - ru,'Выделить всё','Ctrl+A',key.ctrl_a,\ -\; ru,'-' ,'' ,0 ,\ -\; ru,'Вертикальное выделение','Alt+Ins',0 ,\ -\ - en,'Cut' ,'Ctrl+X',key.ctrl_x,\ - en,'Copy' ,'Ctrl+C',key.ctrl_c,\ - en,'Paste' ,'Ctrl+V',key.ctrl_v,\ - en,'Delete' ,'' ,key.del ,\ - en,'-' ,'' ,0 ,\ - en,'Select all','Ctrl+A',key.ctrl_a;,\ -; en,'-' ,'' ,0 ,\ -; en,'Vertical selection','Alt+Ins',0 - -popup_res popup_search,\ - ru,'Перейти...' ,'Ctrl+G',key.ctrl_g,\ - ru,'-' ,'' ,0 ,\ - ru,'Найти...' ,'Ctrl+F',key.ctrl_f,\ - ru,'Найти далее','F3' ,key.f3 ,\ - ru,'Заменить...','Ctrl+H',key.ctrl_h,\ -\ - en,'Position...','Ctrl+G',key.ctrl_g,\ - en,'-' ,'' ,0 ,\ - en,'Find...' ,'Ctrl+F',key.ctrl_f,\ - en,'Find next' ,'F3' ,key.f3 ,\ - en,'Replace...' ,'Ctrl+H',key.ctrl_h - -popup_res popup_run,\ - ru,'Запустить' ,'F9' ,key.f9 ,\ - ru,'Компилировать' ,'Ctrl+F9',key.ctrl_f9 ,\ - ru,'-' ,'' ,0 ,\ - ru,'Доска отладки' ,'' ,open_debug_board ,\ - ru,'Системные функции','' ,open_sysfuncs_txt,\ -\ - en,'Run' ,'F9' ,key.f9 ,\ - en,'Compile' ,'Ctrl+F9',key.ctrl_f9 ,\ - en,'-' ,'' ,0 ,\ - en,'Debug board' ,'' ,open_debug_board ,\ - en,'System functions' ,'' ,open_sysfuncs_txt - -popup_res popup_recode,\ - ru,'CP866 -> CP1251' ,'',recode.866.1251,\ - ru,'CP1251 -> CP866' ,'',recode.1251.866,\ - ru,'-' ,'',0,\ - ru,'CP866 -> KOI8-R' ,'',recode.866.koi,\ - ru,'KOI8-R -> CP866' ,'',recode.koi.866,\ - ru,'-' ,'',0,\ - ru,'CP1251 -> KOI8-R' ,'',recode.1251.koi,\ - ru,'KOI8-R -> CP1251' ,'',recode.koi.1251,\ -\ - en,'CP866 -> CP1251' ,'',recode.866.1251,\ - en,'CP1251 -> CP866' ,'',recode.1251.866,\ - en,'-' ,'',0,\ - en,'CP866 -> KOI8-R' ,'',recode.866.koi,\ - en,'KOI8-R -> CP866' ,'',recode.koi.866,\ - en,'-' ,'',0,\ - en,'CP1251 -> KOI8-R' ,'',recode.1251.koi,\ - en,'KOI8-R -> CP1251' ,'',recode.koi.1251 - -popup_res popup_options,\ - ru,'Внешний вид...' ,'',0,\ - ru,'-' ,'',0,\ - ru,'Безопасное выделение' ,'',set_secure_sel,\ - ru,'Автоматические скобки' ,'',set_auto_braces,\ - ru,'Автоматический отступ' ,'',set_auto_indents,\ - ru,'Умная табуляция' ,'',0,\ - ru,'Оптимальное сохранение','',set_optimal_fill,\ - ru,'-' ,'',0,\ - ru,'Номера строк' ,'',set_line_numbers,\ -\ - en,'Appearance...' ,'',0,\ - en,'-' ,'',0,\ - en,'Secure selection' ,'',set_secure_sel,\ - en,'Automatic brackets' ,'',set_auto_braces,\ - en,'Automatic indents' ,'',set_auto_indents,\ - en,'Smart tabulation' ,'',0,\ - en,'Optimal fill on saving','',set_optimal_fill,\ - en,'-' ,'',0,\ - en,'Line numbers' ,'',set_line_numbers - -lsz s_modified,\ - ru,'Изменено',\ - en,'Modified' - -lsz s_2filename,\ - ru,'Имя файла:',\ - en,'Filename:' -lsz s_2open,\ - ru,'Открыть',\ - en,'Open' -lsz s_2save,\ - ru,'Сохранить',\ - en,'Save' -lsz s_2find,\ - ru,'Найти',\ - en,'Find' -db ':' -lsz s_2replace,\ - ru,'Заменить',\ - en,'Replace' -db ':' -lsz s_2cancel,\ - ru,'Отмена',\ - en,'Cancel' - -lsz s_enter_filename,\ - ru,<'Введите имя файла',0>,\ - en,<'Enter filename',0> - -lsz s_enter_text_to_find,\ - ru,<'Введите текст для поиска',0>,\ - en,<'Enter text to find',0> - -lsz s_enter_text_to_replace,\ - ru,<'Введите текст для замены',0>,\ - en,<'Enter text to replace',0> - -lsz s_text_not_found,\ - ru,<'Достигнут конец файла, текст не найден',0>,\ - en,<'Reached end of file, text not found',0> - -lszc s_fs_error,b,\ - ru,<'Операция завершена успешно (0)',0>,\ - ru,<'',0>,\ - ru,<'Функция не поддерживается для данной файловой системы (2)',0>,\ - ru,<'Неизвестная файловая система (3)',0>,\ - ru,<'',0>,\ - ru,<'Невозможно открыть файл (5)',0>,\ - ru,<'Операция завершена успешно (6)',0>,\ - ru,<'Адрес находится за границами памяти программы (7)',0>,\ - ru,<'На диске нет свободного места (8)',0>,\ - ru,<'Таблица FAT уничтожена (9)',0>,\ - ru,<'Доступ запрещён (10)',0>,\ - ru,<'Ошибка устройства (11)',0>,\ -\ - en,<'Operation executed successfully (0)',0>,\ - en,<'',0>,\ - en,<'Function is not supported for the given filesystem (2)',0>,\ - en,<'Unknown filesystem (3)',0>,\ - en,<'',0>,\ - en,<'Unable to open file (5)',0>,\ - en,<'Operation executed successfully (6)',0>,\ - en,<'Pointer lies outside of application memory (7)',0>,\ - en,<'Disk is full (8)',0>,\ - en,<'FAT table is destroyed (9)',0>,\ - en,<'Access denied (10)',0>,\ - en,<'Device error (11)',0> +include 'tp-locale.inc' sz symbols_ex,';?.%"',"'" sz symbols ,'#&*\:/<>|{}()[]=+-, ' -ini_sec_window db 'Window',0 -ini_window_top db 'Top',0 -ini_window_left db 'Left',0 -ini_window_right db 'Right',0 -ini_window_bottom db 'Bottom',0 - -finfo_ini dd ?,?,?,AREA_TEMP,AREA_EDIT-AREA_TEMP - db '/rd/1/tinypad.ini',0 +sz ini_sec_window ,'Window',0 +sz ini_window_top ,'Top',0 +sz ini_window_left ,'Left',0 +sz ini_window_right ,'Right',0 +sz ini_window_bottom,'Bottom',0 TINYPAD_END: ; end of file @@ -928,38 +715,26 @@ self_path rb PATHL section @UDATA ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;----------------------------------------------------------------------------- -f_info70 rd 7 - f_info.length dd ? -f_info dd ?,?,?,?,?;?,0,?,AREA_TEMP,AREA_EDIT-AREA_TEMP - f_info.path: times PATHL+1 db ? +f_info70 rd 7 + +file_info FILEINFO + +tab_bar TABCTL +virtual at tab_bar.Current + cur_tab TABITEM + ;cur_tab_addr dd ? +end virtual -pos.x dd ? ; global X position (cursor) -pos.y dd ? ; global Y position (cursor) -sel.x dd ? ; global X position (selection start) -sel.y dd ? ; global Y position (selection start) -lines dd ? ; number of lines in file lines.scr dd ? ; number of lines on the screen -columns dd ? ; number of columns in file columns.scr dd ? ; number of columns on the screen top_ofs dd ? ; height occupied by top buttons bot_ofs dd ? ; height occupied by bottom buttons dw ? left_ofs dd ? ; -top_line dd ? ; topmost visible line on screen -left_col dd ? ; leftmost visible char on line -vscrl_top dd ? -vscrl_size dd ? -hscrl_top dd ? -hscrl_size dd ? -;skinh dd ? ; skin height __rc dd ?,?,?,? -;filelen dd ? ; file size (on save) ??? -filesize dd ? ; file size (on load) ??? -ya dd ? ; for read_string -;copy_start dd ? ; first line for copying (Ctrl+S) copy_count dd ? ; number of lines for copying (Ctrl+E) copy_size dd ? ; size of data to copy s_title.size dd ? ; caption length @@ -978,7 +753,6 @@ sel.selected db ? in_sel db ? -asm_mode db ? ; ASM highlight? do_not_draw db ? ; draw top and bottom buttons? main_closed db ? ; main window closed? tb_casesen db ? ; focused textbox is case-sensitive? @@ -1021,13 +795,14 @@ just_from_popup db ? bot_mode db ? -modified db ? - align 4 bot_dlg_height dd ? bot_dlg_mode2 db ? +temp_buf dd ? +copy_buf dd ? + ;----------------------------------------------------------------------------- section @PARAMS ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;----------------------------------------------------------------------------- @@ -1038,22 +813,6 @@ p_info process_information p_info2 process_information sc system_colors -diff16 'Main memory size',0,$ - -MAIN_STACK = 0x0000FFF0 -POPUP_STACK = 0x0000EFF0 - -AREA_TEMP = 0x00010000 ; 0x00010000 -AREA_EDIT = 0x000C0000 ; 0x00080000 -AREA_TEMP2 = 0x00190000 ; 0x002E0000 -AREA_CBUF = 0x001A0000 ; 0x002F0000 -AREA_ENDMEM = 0x001B0000 ; 0x00300000 - -diff10 'Header+options size',0,@CODE -diff10 'Load area size',AREA_TEMP,AREA_EDIT -diff10 'Edit area size',AREA_EDIT,AREA_TEMP2 -diff10 'Total memory usage',0,AREA_ENDMEM - ;store dword '/hd/' at tb_opensave.text+4*0 ;store dword '1/tp' at tb_opensave.text+4*1 ;store dword 'ad4/' at tb_opensave.text+4*2 @@ -1061,3 +820,13 @@ diff10 'Total memory usage',0,AREA_ENDMEM ;store dword 'pad.' at tb_opensave.text+4*4 ;store dword 'asm' at tb_opensave.text+4*5 ;store byte 23 at tb_opensave.length + +;rb 1024*36 +rb 1024*4 +MAIN_STACK: +rb 1024*4 +POPUP_STACK: + +STATIC_MEM_END: + +diff10 'Main memory size',0,$ diff --git a/programs/develop/tinypad/trunk/tinypad.inc b/programs/develop/tinypad/trunk/tinypad.inc index 4dafcba31f..a3467f3e3c 100644 --- a/programs/develop/tinypad/trunk/tinypad.inc +++ b/programs/develop/tinypad/trunk/tinypad.inc @@ -1,3 +1,56 @@ + +struct POINT + X dd ? + Y dd ? +ends + +struct RECT + Left dd ? + Top dd ? + Right dd ? + Bottom dd ? +ends + +struct SCROLLBAR + Top dd ? + Size dd ? +ends + +struct EDITOR + FilePath db PATHL dup(?) + FileName dd ? + Data dd ? + Bounds RECT + Caret POINT + SelStart POINT + Lines dd ? + Columns dd ? + TopLeft POINT + VScroll SCROLLBAR + HScroll SCROLLBAR + Gutter.Width dd ? + Gutter.Visible db ? + AsmMode db ? + Modified db ? + db ? +ends + +struct TABITEM + Editor EDITOR +ends + +struct TABCTL + Bounds RECT + Items dd ? + Items.Count dd ? + Current TABITEM + Current.Ptr dd ? + Style db ? + db 3 dup(?) +ends + + + virtual at -20 POPUP: .actions dd ? @@ -29,13 +82,13 @@ macro popup_res _name,[_lang,_title,_accel,_action] dw ? ; x _name: forward - if (lang eq _lang) + if (lang eq _lang) | (_lang eq @!) db 1 end if common .data: forward - if lang eq _lang + if (lang eq _lang) | (_lang eq @!) if _title eq '-' db 1,'-' c2 = c2+1 @@ -63,8 +116,12 @@ macro popup_res _name,[_lang,_title,_accel,_action] align 4 .actions: forward - if lang eq _lang - dd _action + if (lang eq _lang) | (_lang eq @!) + if (_action eq ) + dd 0 + else + dd _name#.#_action + end if end if common .size = $-_name+20 diff --git a/programs/develop/tinypad/trunk/tp-button.asm b/programs/develop/tinypad/trunk/tp-button.asm index 7b7c306a5b..24890f2620 100644 --- a/programs/develop/tinypad/trunk/tp-button.asm +++ b/programs/develop/tinypad/trunk/tp-button.asm @@ -22,64 +22,44 @@ button: jmp still.skip_write -; cmp eax,BUTTON_SCRLUP -; jne not_up btn.scroll_up: - dec [top_line] + dec [cur_tab.Editor.TopLeft.Y] ;! [top_line] jns @f - inc [top_line] - ret;jmp still.skip_write + inc [cur_tab.Editor.TopLeft.Y] ;! [top_line] + ret @@: call check_inv_all.skip_check ret -; not_up: -; cmp eax,BUTTON_SCRLDN -; jne not_down btn.scroll_down: - inc [top_line] - mov eax,[lines] + inc [cur_tab.Editor.TopLeft.Y] ;! [top_line] + mov eax,[cur_tab.Editor.Lines] ;! eax,[lines] sub eax,[lines.scr] - cmp eax,[top_line] + cmp eax,[cur_tab.Editor.TopLeft.Y] ;! eax,[top_line] jge @f - dec [top_line] - ;dec eax - ;mov [top_line],eax - ret;jmp still.skip_write + dec [cur_tab.Editor.TopLeft.Y] ;! [top_line] + ret @@: call check_inv_all.skip_check ret -; not_down: -; cmp eax,BUTTON_SCRLLT -; jne not_left btn.scroll_left: - dec [left_col] + dec [cur_tab.Editor.TopLeft.X] ;! [left_col] jns @f - inc [left_col] + inc [cur_tab.Editor.TopLeft.X] ;! [left_col] ret;jmp still.skip_write @@: call check_inv_all.skip_check ret -; not_left: -; cmp eax,BUTTON_SCRLRT -; jne not_right btn.scroll_right: - inc [left_col] - mov eax,[columns] + inc [cur_tab.Editor.TopLeft.X] ;! [left_col] + mov eax,[cur_tab.Editor.Columns] ;! eax,[columns] sub eax,[columns.scr] - cmp eax,[left_col] + cmp eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] jge @f - dec [left_col] - ;dec eax - ;mov [left_col],eax - ret;jmp still.skip_write + dec [cur_tab.Editor.TopLeft.X] ;! [left_col] + ret @@: call check_inv_all.skip_check ret -; not_right: -; SEARCH { -; search: -; cmp al,BUTTON_SEARCH -; jne no_search btn.search: key.f3: call search @@ -90,7 +70,7 @@ button: func search cld - mov ecx,[pos.y] + mov ecx,[cur_tab.Editor.Caret.Y] ;! ecx,[pos.y] mov edx,ecx call get_line_offset cmp word[esi],0 @@ -100,11 +80,9 @@ func search or eax,eax jz .end_line.2 mov ecx,eax - sub ecx,[pos.x] + sub ecx,[cur_tab.Editor.Caret.X] ;! ecx,[pos.x] push esi - add esi,[pos.x] - ;dec ecx - ;inc esi + add esi,[cur_tab.Editor.Caret.X] ;! esi,[pos.x] jmp @f .next_line: @@ -140,15 +118,15 @@ func search .found: add esp,4 - mov [pos.y],edx - mov [sel.y],edx + mov [cur_tab.Editor.Caret.Y],edx ;! [pos.y],edx + mov [cur_tab.Editor.SelStart.Y],edx ;! [sel.y],edx mov ecx,edx lea eax,[esi-4] call get_line_offset sub eax,esi - mov [sel.x],eax + mov [cur_tab.Editor.SelStart.X],eax ;! [sel.x],eax add eax,[s_search.size] - mov [pos.x],eax + mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax mov [s_status],0 clc ret @@ -170,136 +148,87 @@ func search ret endf -; SEARCH } - -; no_search: - -; TOOLBAR { -; cmp eax,10000 -; jb no_toolbar - -; add eax,-10000 -; jnz @f btn.compile: key.ctrl_f9: - mov bl,0;[run_outfile],0 + mov bl,0 call start_fasm - ret;jmp still -; @@: dec eax -; jnz @f + ret btn.compile_run: key.f9: - mov bl,1;[run_outfile],1 + mov bl,1 call start_fasm - ret;jmp still -; @@: dec eax -; jnz @f + ret btn.debug_board: call open_debug_board - ret;jmp still -; @@: dec eax -; jnz still + ret btn.sysfuncs_txt: call open_sysfuncs_txt - ret;jmp still -; TOOLBAR } + ret -; no_toolbar: - -; cmp al,4 -; jne noid4 - -; LOAD_FILE { -; do_load_file: btn.load_file: key.ctrl_l: -; cmp [s_fname],'/' -; jne @f -; call load_hd_file -; jmp .restorecursor -; @@: call load_file call load_file jnc @f ret -; .restorecursor: @@: - xor eax,eax - mov [top_line],eax - mov [left_col],eax - mov [pos.x],eax - mov [pos.y],eax - mov [sel.x],eax - mov [sel.y],eax - mov [modified],al + xor eax,eax + mov [cur_tab.Editor.TopLeft.Y],eax ;! [top_line],eax + mov [cur_tab.Editor.TopLeft.X],eax ;! [left_col],eax + mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax + mov [cur_tab.Editor.Caret.Y],eax ;! [pos.y],eax + mov [cur_tab.Editor.SelStart.X],eax ;! [sel.x],eax + mov [cur_tab.Editor.SelStart.Y],eax ;! [sel.y],eax + + mov [cur_tab.Editor.Modified],al ;! [modified],al ; enable color syntax for ASM and INC files: - mov [asm_mode],al + mov [cur_tab.Editor.AsmMode],al ;! [asm_mode],al - mov eax,[f_info.length] ; [s_fname.size] - add eax,f_info.path ; s_fname + mov eax,[f_info.length] + add eax,f_info.path mov byte[eax],0 - mov ecx, dword [eax-3] - or ecx, 0x202020 - cmp ecx, 'asm' + mov ecx, dword [eax-3] + or ecx, 0x202020 + cmp ecx, 'asm' jne @f - inc [asm_mode] + inc [cur_tab.Editor.AsmMode] ;! [asm_mode] jmp .nocol @@: cmp ecx, 'inc' jne .nocol - inc [asm_mode] + inc [cur_tab.Editor.AsmMode] ;! [asm_mode] .nocol: update_caption: -macro unused { - movzx ecx,[f_info.length] ; [s_fname.size] - add ecx,10 ; strlen(" - TINYPAD"); - cmp ecx,[s_title.size] - jne @f - add ecx,-10 - mov esi,f_info.path ; s_fname ; strcmp(s_fname,header); - mov edi,s_title - repe cmpsb - jne @f -; call draw_file - clc - ret;jmp still - @@: -} -; set window title: - mov esi,f_info.path ; s_fname + lea esi,[cur_tab.Editor.FilePath] ;! mov esi,f_info.path mov edi,s_title - cld - mov ecx,[f_info.length] ; [s_fname.size] - jecxz @f - ;lea eax,[ecx+10] - ;mov [s_title.size],eax + @@: lodsb + cmp al,0 + je @f + stosb + jmp @b + @@: ;cld - rep movsb + ;mov ecx,[f_info.length] + ;jecxz @f + ;rep movsb mov dword[edi],' - ' add edi,3 @@: mov esi,htext mov ecx,htext.size + cld rep movsb mov al,0 stosb -; call drawwindow + mcall 71,1,s_title + clc - ret;jmp still -; LOAD_FILE } + ret -; noid4: - -; cmp al, 2 -; jz yessave - -; dec al ; close if butid == 1 -; jnz nosave -; EXIT: btn.close_main_window: key.alt_x: mov esi,self_path @@ -310,11 +239,6 @@ macro unused { stosb or al,al jnz @b -; mov ebx,f_info -; mov dword[ebx+0],1 -; mov dword[ebx+8],self_path -; mov dword[ebx+12],0 -; mcall 58 mov [f_info70+0],2 mov [f_info70+4],0 @@ -325,31 +249,6 @@ macro unused { mov [f_info70+21],f_info.path mcall 70,f_info70 -; test eax,eax -; je .close -; cmp eax,6 -; je .close -; ret - .close: mov [main_closed],1 mcall -1 - -; SAVE_FILE { -; yessave: -; btn.save_file: -; key.ctrl_s: -; mov [bot_mode],1 -; mov [bot_save_mode],1 -; mov [bot_dlg_height],16*2+4*2-1 -; mov [bot_dlg_handler],osdlg_handler -; call drawwindow -; call save_file -; ret;jmp still -; SAVE_FILE } - -; nosave: -; btn.save_enter_name: -; inc al -; call read_string -; ret;jmp still \ No newline at end of file diff --git a/programs/develop/tinypad/trunk/tp-common.asm b/programs/develop/tinypad/trunk/tp-common.asm index f5e89ec1f9..538a4759dc 100644 --- a/programs/develop/tinypad/trunk/tp-common.asm +++ b/programs/develop/tinypad/trunk/tp-common.asm @@ -4,60 +4,62 @@ func check_cur_vis_inv ;////////////////////////////////////////////////////// push eax ebx xor bl,bl .chk_y: - mov eax,[pos.y] + mov eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] or eax,eax jge @f - mov [pos.y],0 + mov [cur_tab.Editor.Caret.Y],0 ;! [pos.y],0 jmp .chk_dy - @@: cmp eax,[lines] + @@: cmp eax,[cur_tab.Editor.Lines] ;! eax,[lines] jl .chk_dy - mov eax,[lines] + mov eax,[cur_tab.Editor.Lines] ;! eax,[lines] dec eax - mov [pos.y],eax + mov [cur_tab.Editor.Caret.Y],eax ;! [pos.y],eax .chk_dy: - mov eax,[top_line] - cmp eax,[pos.y] + mov eax,[cur_tab.Editor.TopLeft.Y] ;! eax,[top_line] + cmp eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] jle @f - push [pos.y] - pop [top_line] + m2m [cur_tab.Editor.TopLeft.Y],[cur_tab.Editor.Caret.Y] +;! push [pos.y] +;! pop [top_line] inc bl @@: add eax,[lines.scr] - cmp eax,[pos.y] + cmp eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] jg .chk_x - mov eax,[pos.y] + mov eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] sub eax,[lines.scr] inc eax - mov [top_line],eax + mov [cur_tab.Editor.TopLeft.Y],eax ;! [top_line],eax inc bl .chk_x: - mov eax,[pos.x] + mov eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] or eax,eax jge @f - mov [pos.x],0 + mov [cur_tab.Editor.Caret.X],0 ;! [pos.x],0 jmp .chk_dx - @@: cmp eax,[columns] + @@: cmp eax,[cur_tab.Editor.Columns] ;! eax,[columns] jl .chk_dx - mov eax,[columns] - mov [pos.x],eax + mov eax,[cur_tab.Editor.Columns] ;! eax,[columns] + mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax .chk_dx: - mov eax,[left_col] - cmp eax,[pos.x] + mov eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] + cmp eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] jle @f - push [pos.x] - pop [left_col] + m2m [cur_tab.Editor.TopLeft.X],[cur_tab.Editor.Caret.X] +;! push [pos.x] +;! pop [left_col] inc bl @@: add eax,[columns.scr] - cmp eax,[pos.x] + cmp eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] jg @f - mov eax,[pos.x] + mov eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] sub eax,[columns.scr] inc eax - mov [left_col],eax + mov [cur_tab.Editor.TopLeft.X],eax ;! [left_col],eax inc bl @@: cmp [mev],MEV_LDOWN jne .exit - push [pos.x] [pos.y] - pop [sel.y] [sel.x] + push [cur_tab.Editor.Caret.X] [cur_tab.Editor.Caret.Y] ;! [pos.x] [pos.y] + pop [cur_tab.Editor.SelStart.Y] [cur_tab.Editor.SelStart.X] ;! [sel.y] [sel.x] .exit: or bl,bl clc @@ -72,13 +74,13 @@ endf func clear_selection ;//////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- push eax ebx - mov eax,[sel.y] - mov ebx,[pos.y] + mov eax,[cur_tab.Editor.SelStart.Y] ;! eax,[sel.y] + mov ebx,[cur_tab.Editor.Caret.Y] ;! ebx,[pos.y] cmp eax,ebx jle @f xchg eax,ebx - @@: push [pos.x] [pos.y] - pop [sel.y] [sel.x] + @@: push [cur_tab.Editor.Caret.X] [cur_tab.Editor.Caret.Y] ;! [pos.x] [pos.y] + pop [cur_tab.Editor.SelStart.Y] [cur_tab.Editor.SelStart.X] ;! [sel.y] [sel.x] call draw_file.ex pop ebx eax ret @@ -105,24 +107,24 @@ endf func check_bottom_right ;///////////////////////////////////////////////////// ;----------------------------------------------------------------------------- push eax - mov eax,[top_line] + mov eax,[cur_tab.Editor.TopLeft.Y] ;! eax,[top_line] add eax,[lines.scr] - cmp eax,[lines] + cmp eax,[cur_tab.Editor.Lines] ;! eax,[lines] jbe .lp1 - mov eax,[lines] + mov eax,[cur_tab.Editor.Lines] ;! eax,[lines] sub eax,[lines.scr] jns @f xor eax,eax - @@: mov [top_line],eax - .lp1: mov eax,[left_col] + @@: mov [cur_tab.Editor.TopLeft.Y],eax ;! [top_line],eax + .lp1: mov eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] add eax,[columns.scr] - cmp eax,[columns] + cmp eax,[cur_tab.Editor.Columns] ;! eax,[columns] jbe .exit - mov eax,[columns] + mov eax,[cur_tab.Editor.Columns] ;! eax,[columns] sub eax,[columns.scr] jns @f xor eax,eax - @@: mov [left_col],eax + @@: mov [cur_tab.Editor.TopLeft.X],eax ;! [left_col],eax .exit: pop eax ret @@ -148,12 +150,12 @@ endf ;----------------------------------------------------------------------------- func check_inv_all ;////////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- - mov eax,[pos.y] - mov ecx,[top_line] + mov eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] + mov ecx,[cur_tab.Editor.TopLeft.Y] ;! ecx,[top_line] .skip_init: call check_cur_vis - mov [pos.y],eax - mov [top_line],ecx + mov [cur_tab.Editor.Caret.Y],eax ;! [pos.y],eax + mov [cur_tab.Editor.TopLeft.Y],ecx ;! [top_line],ecx .skip_check: ; call clear_screen call draw_file @@ -167,9 +169,9 @@ func check_cur_vis ;////////////////////////////////////////////////////////// jb .low mov edx,ecx add edx,[lines.scr] - cmp edx,[lines] + cmp edx,[cur_tab.Editor.Lines] ;! edx,[lines] jbe @f - mov edx,[lines] + mov edx,[cur_tab.Editor.Lines] ;! edx,[lines] @@: cmp eax,edx jb @f lea ecx,[eax+1] @@ -180,17 +182,17 @@ func check_cur_vis ;////////////////////////////////////////////////////////// .low: mov ecx,eax @@: mov edx,ecx add edx,[lines.scr] - cmp edx,[lines] + cmp edx,[cur_tab.Editor.Lines] ;! edx,[lines] jbe @f - mov ecx,[lines] + mov ecx,[cur_tab.Editor.Lines] ;! ecx,[lines] sub ecx,[lines.scr] jns @f xor ecx,ecx @@:;mov [top_line],ecx pushad - mov eax,[pos.x] - mov ebx,[left_col] + mov eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] + mov ebx,[cur_tab.Editor.TopLeft.X] ;! ebx,[left_col] mov ecx,ebx add ecx,[columns.scr] cmp eax,ebx @@ -201,10 +203,10 @@ func check_cur_vis ;////////////////////////////////////////////////////////// sub ebx,[columns.scr] jmp @f .lp1: mov ebx,eax - @@: mov [left_col],ebx + @@: mov [cur_tab.Editor.TopLeft.X],ebx ;! [left_col],ebx .exit: - mov [pos.x],eax + mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax popad ret @@ -230,12 +232,12 @@ func get_line_offset ;//////////////////////////////////////////////////////// ; ESI = line data offset ;----------------------------------------------------------------------------- push eax ecx - mov esi,AREA_EDIT - jecxz .exit - @@: movzx eax,word[esi] - dec ecx + mov esi,[cur_tab.Editor.Data] ;! AREA_EDIT + @@: dec ecx + js .exit + movzx eax,word[esi] lea esi,[esi+eax+4] - jnz @b + jmp @b .exit: pop ecx eax ret @@ -246,10 +248,10 @@ func init_sel_vars ;////////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- pushad mov [sel.selected],1 - mov eax,[sel.x] - mov ebx,[sel.y] - mov ecx,[pos.x] - mov edx,[pos.y] + mov eax,[cur_tab.Editor.SelStart.X] ;! eax,[sel.x] + mov ebx,[cur_tab.Editor.SelStart.Y] ;! ebx,[sel.y] + mov ecx,[cur_tab.Editor.Caret.X] ;! ecx,[pos.x] + mov edx,[cur_tab.Editor.Caret.Y] ;! edx,[pos.y] cmp ebx,edx jl .lp2 jne @f @@ -352,6 +354,20 @@ func uint2str ;/////////////////////////////////////////////////////////////// ret endf +;----------------------------------------------------------------------------- +func strlen ;///////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx + mov ebx,eax + xor eax,eax + @@: cmp byte[ebx+eax],0 + je @f + inc eax + jmp @b + @@: pop ebx + ret +endf + ;----------------------------------------------------------------------------- func rgb_to_gray ;//////////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- @@ -492,7 +508,9 @@ func line_add_spaces ;//////////////////////////////////////////////////////// jbe .exit sub ecx,edx push ecx - mov edi,AREA_TEMP2 + mov edi,[cur_tab.Editor.Data] ;! AREA_TEMP2 + add edi,[edi-4] + dec edi mov eax,esi mov esi,edi sub esi,ecx @@ -502,6 +520,7 @@ func line_add_spaces ;//////////////////////////////////////////////////////// neg ecx lea ecx,[esi+ecx+1] std +diff16 '32DC',0,$ rep movsb pop edi ecx add [eax],cx @@ -516,6 +535,8 @@ endf ;----------------------------------------------------------------------------- func delete_selection ;/////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- +; call init_sel_vars + cmp [sel.selected],0 je .exit.2 @@ -542,13 +563,14 @@ func delete_selection ;/////////////////////////////////////////////////////// mov [edi-4],bx add edi,[sel.begin.x] lea esi,[esi+eax+4] - mov ecx,AREA_TEMP2 + mov ecx,[cur_tab.Editor.Data] ;! AREA_TEMP2 + add ecx,[ecx-4] sub ecx,esi cld rep movsb mov eax,[sel.end.y] sub eax,[sel.begin.y] - sub [lines],eax + sub [cur_tab.Editor.Lines],eax ;! [lines],eax jmp .exit .single_line: @@ -567,20 +589,21 @@ func delete_selection ;/////////////////////////////////////////////////////// lea edi,[esi+4] add edi,[sel.begin.x] lea esi,[edi+ecx] - mov ecx,AREA_TEMP2 + mov ecx,[cur_tab.Editor.Data] ;! AREA_TEMP2 + add ecx,[ecx-4] sub ecx,esi cld rep movsb .exit: mov eax,[sel.begin.x] - mov [pos.x],eax - mov [sel.x],eax + mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax + mov [cur_tab.Editor.SelStart.X],eax ;! [sel.x],eax mov eax,[sel.begin.y] - mov [pos.y],eax - mov [sel.y],eax + mov [cur_tab.Editor.Caret.Y],eax ;! [pos.y],eax + mov [cur_tab.Editor.SelStart.Y],eax ;! [sel.y],eax popad - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 clc ret @@ -588,3 +611,103 @@ func delete_selection ;/////////////////////////////////////////////////////// stc ret endf + +;----------------------------------------------------------------------------- +func get_selection_size ;///////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ecx esi + mov ecx,[sel.end.y] + inc ecx + call get_line_offset + mov eax,esi + mov ecx,[sel.begin.y] + call get_line_offset + sub eax,esi + pop esi ecx + ret +endf + +;----------------------------------------------------------------------------- +func get_lines_in_file ;////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- +; ESI = data pointer +; ECX = data length +;----------------------------------------------------------------------------- + push ebx ecx esi + or ebx,-1 + .lp0: inc ebx + .lp1: dec ecx + jle .lp2 + lodsb + cmp al,10 + je .LF + cmp al,13 + je .CR + jmp .lp1 + .lp2: mov eax,ebx + pop esi ecx ebx + ret + + .CR: cmp byte[esi],10 + jne .lp0 + lodsb + .LF: jmp .lp0 +endf + +;----------------------------------------------------------------------------- +func mem.Alloc ;////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx + lea ecx,[eax+4+4095] + and ecx,not 4095 + mcall 68,12 + add ecx,-4 + mov [eax],ecx + add eax,4 + pop ecx ebx + ret +endf + +;----------------------------------------------------------------------------- +func mem.ReAlloc ;//////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx esi edi eax + or eax,eax + jz @f + lea ecx,[ebx+4+4095] + and ecx,not 4095 + add ecx,-4 + cmp ecx,[eax-4] + je .exit + @@: mov eax,ebx + call mem.Alloc + xchg eax,[esp] + or eax,eax + jz .exit + mov esi,eax + xchg eax,[esp] + mov edi,eax + mov ecx,[esi-4] + cmp ecx,[edi-4] + jbe @f + mov ecx,[edi-4] + @@: add ecx,3 + shr ecx,2 + cld + rep movsd + xchg eax,[esp] + call mem.Free + .exit: + pop eax edi esi ecx ebx + ret +endf + +;----------------------------------------------------------------------------- +func mem.Free ;/////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx + lea ecx,[eax-4] + mcall 68,13 + pop ecx ebx + ret +endf diff --git a/programs/develop/tinypad/trunk/tp-defines.inc b/programs/develop/tinypad/trunk/tp-defines.inc new file mode 100644 index 0000000000..7d01315732 --- /dev/null +++ b/programs/develop/tinypad/trunk/tp-defines.inc @@ -0,0 +1,37 @@ + +define mm.File.New key.ctrl_n +define mm.File.Open key.ctrl_o +define mm.File.Save key.ctrl_s +define mm.File.SaveAs key.shift_ctrl_s +define mm.File.Exit key.alt_x + +define mm.Edit.Cut key.ctrl_x +define mm.Edit.Copy key.ctrl_c +define mm.Edit.Insert key.ctrl_d +define mm.Edit.Delete key.del +define mm.Edit.SelAll key.ctrl_a + +define mm.Search.Position key.ctrl_g +define mm.Search.Find key.ctrl_f +define mm.Search.FindNext key.f3 +define mm.Search.Replace key.ctrl_h + +define mm.Run.Run key.f9 +define mm.Run.Compile key.ctrl_f9 +define mm.Run.DbgBoard open_debug_board +define mm.Run.SysFuncs open_sysfuncs_txt + +define mm.Encoding.CP866.CP1251 recode.866.1251 +define mm.Encoding.CP1251.CP866 recode.1251.866 +define mm.Encoding.CP866.KOI8R recode.866.koi +define mm.Encoding.KOI8R.CP866 recode.koi.866 +define mm.Encoding.CP1251.KOI8R recode.1251.koi +define mm.Encoding.KOI8R.CP1251 recode.koi.1251 + +define mm.Options.Appearance 0 +define mm.Options.SecureSel set_opt.secure_sel +define mm.Options.AutoBrackets set_opt.auto_braces +define mm.Options.AutoIndents set_opt.auto_indents +define mm.Options.SmartTabs 0 +define mm.Options.OptimalFill set_opt.optimal_fill +define mm.Options.LineNumbers set_opt.line_numbers diff --git a/programs/develop/tinypad/trunk/tp-dialog.asm b/programs/develop/tinypad/trunk/tp-dialog.asm index 8149f0be72..cd207e5364 100644 --- a/programs/develop/tinypad/trunk/tp-dialog.asm +++ b/programs/develop/tinypad/trunk/tp-dialog.asm @@ -266,7 +266,7 @@ botdlg.button: jnc @f .lp2: ret - @@: call update_caption + @@: ;call update_caption xor eax,eax mov [bot_mode],al mov [bot_dlg_height],eax @@ -290,16 +290,21 @@ botdlg.button: .found: ;--------------------------------------- - push [copy_size] [copy_count] + push [copy_size] [copy_count] [copy_buf] - mov esi,AREA_CBUF - mov edi,AREA_CBUF-304 - mov ecx,300/4 - rep movsd +; mov esi,0 ;! AREA_CBUF +; mov edi,0 ;! AREA_CBUF-304 +; mov ecx,300/4 +; rep movsd + + movzx eax,[tb_replace.length] + add eax,10 + call mem.Alloc + mov [copy_buf],eax movzx eax,[tb_replace.length] mov esi,tb_replace.text - mov edi,AREA_CBUF + mov edi,[copy_buf] ;! AREA_CBUF stosd mov ecx,eax jecxz .lp1 @@ -308,17 +313,20 @@ botdlg.button: mov [copy_size],eax mov [copy_count],1 - push [sel.x] + push [cur_tab.Editor.SelStart.X] ;! [sel.x] call init_sel_vars call key.ctrl_v - pop [sel.x] + pop [cur_tab.Editor.SelStart.X] ;! [sel.x] - mov esi,AREA_CBUF-304 - mov edi,AREA_CBUF - mov ecx,300/4 - rep movsd + mov eax,[copy_buf] + call mem.Free - pop [copy_count] [copy_size] +; mov esi,0 ;! AREA_CBUF-304 +; mov edi,0 ;! AREA_CBUF +; mov ecx,300/4 +; rep movsd + + pop [copy_buf] [copy_count] [copy_size] ;--------------------------------------- call check_inv_all diff --git a/programs/develop/tinypad/trunk/tp-draw.asm b/programs/develop/tinypad/trunk/tp-draw.asm index 09f9160e2a..d7ebeb6633 100644 --- a/programs/develop/tinypad/trunk/tp-draw.asm +++ b/programs/develop/tinypad/trunk/tp-draw.asm @@ -10,22 +10,6 @@ func drawwindow ;///// DRAW WINDOW /////////////////////////////////////////// mcall 48,3,sc,sizeof.system_colors call calc_3d_colors - test [options],OPTS_LINENUMS - jnz @f - mov eax,2+LCHGW - jmp .lp1 - @@: mov edi,p_info+100 - mov eax,[lines] - mov ecx,10 - call uint2str - lea eax,[edi-p_info-100] - cmp eax,3 - jae @f - mov eax,3 - @@: imul eax,6 - add eax,2+4+LCHGW - .lp1: mov [left_ofs],eax - mcall 12,1 push [color_tbl+4*5] @@ -46,53 +30,75 @@ func drawwindow ;///// DRAW WINDOW /////////////////////////////////////////// cld rep movsd -; mcall 9,p_info,-1 +; mcall 9,p_info,-1 cmp [p_info.client_box.height],LINEH jl .exit.2 +;++ calculate editor bounds ++ + mov [tab_bar.Bounds.Left],0 + mov [tab_bar.Bounds.Top],ATOPH + mov eax,[p_info.client_box.width] + mov [tab_bar.Bounds.Right],eax + mov eax,[p_info.client_box.height] + sub eax,[bot_dlg_height] + add eax,-STATH-1 + mov [tab_bar.Bounds.Bottom],eax + + call align_editor_in_tab + mov [top_ofs],ATOPH;+1 - mov eax,[p_info.client_box.width] - sub eax,SCRLW+1 - sub eax,[left_ofs] + mov eax,[cur_tab.Editor.Bounds.Right] + sub eax,[cur_tab.Editor.Bounds.Left] + sub eax,[cur_tab.Editor.Gutter.Width] + sub eax,SCRLW+LCHGW+4 cdq mov ebx,6 div ebx mov [columns.scr],eax - mov eax,[p_info.client_box.height] ; calculate buttons position - add eax,-STATH;*3-2-2 - sub eax,[bot_dlg_height] - mov [bot_ofs],eax - - call draw_bottom_dialog - - mov [do_not_draw],1 ; do_not_draw = true - - mov ebx,eax - sub ebx,[top_ofs] - sub ebx,SCRLW*3+AMINS+5 - js .no_draw - - dec [do_not_draw] ; do_not_draw = false + mov eax,[cur_tab.Editor.Bounds.Bottom] + sub eax,[cur_tab.Editor.Bounds.Top] sub eax,SCRLW+3 - sub eax,[top_ofs] cdq mov ebx,LINEH div ebx mov [lines.scr],eax - mov ebx,[p_info.client_box.width] - mov ecx,[top_ofs-2] - mov cx,word[top_ofs] - sub ecx,1*65536+1 - mcall 38,,,[cl_3d_inset];[sc.work_text] - mov ecx,[p_info.client_box.height] - sub ecx,STATH+1 - push cx - shl ecx,16 - pop cx - mcall + mov eax,[p_info.client_box.height] + add eax,-STATH+1;*3-2-2 + sub eax,[bot_dlg_height] + mov [bot_ofs],eax + + call draw_bottom_dialog + +; mov [do_not_draw],1 ; do_not_draw = true + +; mov ebx,eax +; sub ebx,[top_ofs] +; sub ebx,SCRLW*3+AMINS+5 +; js .no_draw + +; dec [do_not_draw] ; do_not_draw = false +; sub eax,SCRLW+3 +; sub eax,[top_ofs] +; cdq +; mov ebx,LINEH +; div ebx +; mov [lines.scr],eax + +;-- horizontal lines for menubar and statusbar -- + ;mov ebx,[p_info.client_box.width] + ;mov ecx,[top_ofs-2] + ;mov cx,word[top_ofs] + ;sub ecx,1*65536+1 + ;mcall 38,,,[cl_3d_inset];[sc.work_text] + ;mov ecx,[p_info.client_box.height] + ;sub ecx,STATH+1 + ;push cx + ;shl ecx,16 + ;pop cx + ;mcall inc [top_ofs] @@ -134,7 +140,11 @@ func drawwindow ;///// DRAW WINDOW /////////////////////////////////////////// @@: .exit: - call draw_file +;-- draw file -- + ;call draw_file +;++ draw editor control ++ + call draw_editor + call draw_tabctl .exit.2: mcall 12,2 ret @@ -177,6 +187,8 @@ func draw_main_menu ;///////////////////////////////////////////////////////// inc ebx mcall 13,,ATOPH-1,[cl_3d_normal] + mcall 38,[p_info.client_box.width],,[sc.frame];[cl_3d_pushed] + mov edx,main_menu mov ebx,9*65536+ATOPH/2-4 mov ecx,[sc.work_text] @@ -220,6 +232,9 @@ func draw_file.ex ;/////////////////////////////////////////////////////////// ; EAX = start line ; EBX = end line ;----------------------------------------------------------------------------- + call draw_editor;_text + ret +macro unused { cmp [p_info.client_box.height],LINEH jge @f ret @@ -235,10 +250,10 @@ func draw_file.ex ;/////////////////////////////////////////////////////////// cmp eax,ebx jle @f xchg eax,ebx - @@: cmp eax,[top_line] + @@: cmp eax,[cur_tab.Editor.TopLeft.Y] ;! eax,[top_line] jge @f - mov eax,[top_line] - @@: mov ecx,[top_line] + mov eax,[cur_tab.Editor.TopLeft.Y] ;! eax,[top_line] + @@: mov ecx,[cur_tab.Editor.TopLeft.Y] ;! ecx,[top_line] add ecx,[lines.scr] cmp ebx,ecx jl @f @@ -258,19 +273,23 @@ func draw_file.ex ;/////////////////////////////////////////////////////////// mov ebx,[top_ofs] add ebx,[left_ofs-2] - sub eax,[top_line] + sub eax,[cur_tab.Editor.TopLeft.Y] ;! eax,[top_line] imul eax,LINEH add ebx,eax - imul ebp,[left_col],6*65536 + imul ebp,[cur_tab.Editor.TopLeft.X],6*65536 ;! ebp,[left_col],6*65536 or [draw_blines],-1 jmp draw_file.next_line +} endf ;----------------------------------------------------------------------------- func draw_file ;////////////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- + call draw_editor;_text + ret +macro unused { cmp [p_info.client_box.height],LINEH jge @f ret @@ -283,7 +302,7 @@ func draw_file ;////////////////////////////////////////////////////////////// mov ebx,[top_ofs] add ebx,[left_ofs-2] - mov ecx,[top_line] + mov ecx,[cur_tab.Editor.TopLeft.Y] ;! ecx,[top_line] push ecx call get_line_offset @@ -294,9 +313,9 @@ func draw_file ;////////////////////////////////////////////////////////////// jle .exit add esp,-4 - imul ebp,[left_col],6*65536 + imul ebp,[cur_tab.Editor.TopLeft.X],6*65536 ;! ebp,[left_col],6*65536 mov eax,[lines.scr] - sub eax,[lines] + sub eax,[cur_tab.Editor.Lines] ;! eax,[lines] mov [draw_blines],eax .next_line: @@ -327,7 +346,7 @@ func draw_file ;////////////////////////////////////////////////////////////// cmp eax,[sel.end.y] je .lp5 .lp2: mov eax,[sel.begin.x] - sub eax,[left_col] + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] jle .lp6.2 cmp eax,[columns.scr] jge .lp6 @@ -350,7 +369,7 @@ func draw_file ;////////////////////////////////////////////////////////////// cmp eax,[sel.end.y] je .lp5 .lp4: mov eax,[sel.end.x] - sub eax,[left_col] + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] jle .lp6 cmp eax,[columns.scr] jg .lp6.2 @@ -369,7 +388,7 @@ func draw_file ;////////////////////////////////////////////////////////////// mov bx,ax mov [in_sel],3 jmp .lp6 - .lp5: mov eax,[left_col] + .lp5: mov eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] cmp eax,[sel.begin.x] jge .lp4 add eax,[columns.scr] @@ -378,7 +397,7 @@ func draw_file ;////////////////////////////////////////////////////////////// mov eax,[sel.begin.x] cmp eax,[sel.end.x] je .lp6 - sub eax,[left_col] + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] imul eax,6 pushad mov ebx,[sel.end.x] @@ -452,13 +471,13 @@ func draw_file ;////////////////////////////////////////////////////////////// push esi ebx mov eax,ebx - sub ebx,[left_col] + sub ebx,[cur_tab.Editor.TopLeft.X] ;! ebx,[left_col] cmp ebx,[columns.scr] jge .skip_t add ebx,esi jle .skip_t mov ebx,[esp+8+4*2] ;// 4*2=esi+ebx - sub eax,[left_col] + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] jge .qqq sub edx,eax add esi,eax @@ -475,7 +494,7 @@ func draw_file ;////////////////////////////////////////////////////////////// mov eax,[esp] ; ebx add eax,[esp+4] ; esi - sub eax,[left_col] + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] sub eax,[columns.scr] jle .qweqwe sub esi,eax @@ -499,7 +518,7 @@ func draw_file ;////////////////////////////////////////////////////////////// mov esi,[sel.begin.x] sub esi,[esp] pushad - mov ecx,[left_col] + mov ecx,[cur_tab.Editor.TopLeft.X] ;! ecx,[left_col] sub ecx,[esp+4*8] jle @f sub esi,ecx @@ -529,7 +548,7 @@ func draw_file ;////////////////////////////////////////////////////////////// sub eax,[esp] push ebx mov ebx,[esp+4] - sub ebx,[left_col] + sub ebx,[cur_tab.Editor.TopLeft.X] ;! ebx,[left_col] jge .ya2.1 add eax,ebx .ya2.1: @@ -561,7 +580,7 @@ func draw_file ;////////////////////////////////////////////////////////////// sub esi,[esp] push eax mov eax,[esp+4] - sub eax,[left_col] + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] jge .nt3.1 add esi,eax .nt3.1: @@ -642,7 +661,7 @@ func draw_file ;////////////////////////////////////////////////////////////// shl ebx,16 add ebx,[top_ofs] mov edi,[sc.work_text] - mov ecx,[top_line] + mov ecx,[cur_tab.Editor.TopLeft.Y] ;! ecx,[top_line] inc ecx mov edx,p_info+100 @@: pushad @@ -660,10 +679,10 @@ func draw_file ;////////////////////////////////////////////////////////////// popad add ebx,LINEH inc ecx - cmp ecx,[lines] + cmp ecx,[cur_tab.Editor.Lines] ;! ecx,[lines] jg @f mov esi,ecx - sub esi,[top_line] + sub esi,[cur_tab.Editor.TopLeft.Y] ;! esi,[top_line] cmp esi,[lines.scr] jbe @b @@: add esp,4*8*2 @@ -688,8 +707,8 @@ func draw_file ;////////////////////////////////////////////////////////////// add esp,4 cmp [bot_mode],0 jne @f - mov ebx,[pos.x] - sub ebx,[left_col] + mov ebx,[cur_tab.Editor.Caret.X] ;! ebx,[pos.x] + sub ebx,[cur_tab.Editor.TopLeft.X] ;! ebx,[left_col] js @f cmp ebx,[columns.scr] ja @f @@ -699,8 +718,8 @@ func draw_file ;////////////////////////////////////////////////////////////// push bx shl ebx,16 pop bx - mov eax,[pos.y] - sub eax,[top_line] + mov eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] + sub eax,[cur_tab.Editor.TopLeft.Y] ;! eax,[top_line] js @f cmp eax,[lines.scr] jge @f @@ -786,15 +805,15 @@ func draw_file ;////////////////////////////////////////////////////////////// ; sub ebx,1*65536-2 push ebx - mov eax,[lines] + mov eax,[cur_tab.Editor.Lines] ;! eax,[lines] mov ebx,[lines.scr] - mov ecx,[top_line] + mov ecx,[cur_tab.Editor.TopLeft.Y] ;! ecx,[top_line] mov edx,[bot_ofs] sub edx,[top_ofs] add edx,-SCRLW*3+1 call get_scroll_vars - mov [vscrl_top],eax - mov [vscrl_size],ebx + mov [cur_tab.Editor.VScroll.Top],eax ;! [vscrl_top],eax + mov [cur_tab.Editor.VScroll.Size],ebx ;! [vscrl_size],ebx pop ebx mov ecx,eax @@ -810,7 +829,7 @@ func draw_file ;////////////////////////////////////////////////////////////// ; rol ecx,16 ; movsx eax,cx ; sar ecx,16 - push ebx ecx SCRLW [vscrl_size] + push ebx ecx SCRLW [cur_tab.Editor.VScroll.Size] ;! ebx ecx SCRLW [vscrl_size] dec dword[esp] call draw_3d_panel popad @@ -819,7 +838,7 @@ func draw_file ;////////////////////////////////////////////////////////////// inc ebx mov ecx,[top_ofs-2] - mov cx,word[vscrl_top] + mov cx,word[cur_tab.Editor.VScroll.Top] ;! cx,word[vscrl_top] add ecx,(SCRLW-1)*65536 mov edx,[sc.work];[color_tbl+4*5] or cx,cx @@ -827,8 +846,8 @@ func draw_file ;////////////////////////////////////////////////////////////// mcall 13 @@: mov ecx,[top_ofs] - add ecx,[vscrl_top] - add ecx,[vscrl_size] + add ecx,[cur_tab.Editor.VScroll.Top] ;! ecx,[vscrl_top] + add ecx,[cur_tab.Editor.VScroll.Size] ;! ecx,[vscrl_size] add ecx,SCRLW-1 mov di,cx shl ecx,16 @@ -915,20 +934,20 @@ func draw_file ;////////////////////////////////////////////////////////////// ; inc ecx push ecx - mov eax,[columns] + mov eax,[cur_tab.Editor.Columns] ;! eax,[columns] mov ebx,[columns.scr] - mov ecx,[left_col] + mov ecx,[cur_tab.Editor.TopLeft.X] ;! ecx,[left_col] mov edx,[p_info.client_box.width] add edx,-(SCRLW*3) call get_scroll_vars - mov [hscrl_top],eax - mov [hscrl_size],ebx + mov [cur_tab.Editor.HScroll.Top],eax ;! [hscrl_top],eax + mov [cur_tab.Editor.HScroll.Size],ebx ;! [hscrl_size],ebx pop ecx mov ebx,eax add ebx,1+SCRLW shl ebx,16 - mov bx,word[hscrl_size] + mov bx,word[cur_tab.Editor.HScroll.Size] ;! bx,word[hscrl_size] ; mcall 13,,,[sc.work_button] ;!!!!!!!!!!!!!!!!!! @@ -944,11 +963,11 @@ func draw_file ;////////////////////////////////////////////////////////////// ;!!!!!!!!!!!!!!!!!! mov ebx,(1+SCRLW)*65536 - mov bx,word[hscrl_top] + mov bx,word[cur_tab.Editor.HScroll.Top] ;! bx,word[hscrl_top] mcall 13,,,[sc.work];[color_tbl+4*5] mov ebx,1+SCRLW - add ebx,[hscrl_top] - add ebx,[hscrl_size] + add ebx,[cur_tab.Editor.HScroll.Top] ;! ebx,[hscrl_top] + add ebx,[cur_tab.Editor.HScroll.Size] ;! ebx,[hscrl_size] mov di,bx shl ebx,16 mov bx,word[p_info.client_box.width] @@ -978,6 +997,7 @@ func draw_file ;////////////////////////////////////////////////////////////// .exit: popad ret +} endf ;----------------------------------------------------------------------------- @@ -991,7 +1011,7 @@ func get_next_part ;////////////////////////////////////////////////////////// ; EDX = string ; ESI = length ;----------------------------------------------------------------------------- - cmp [asm_mode],0 + cmp [cur_tab.Editor.AsmMode],0 ;! [asm_mode],0 je .plain.text xor ebx,ebx mov edx,ecx @@ -1099,12 +1119,17 @@ func get_next_part ;////////////////////////////////////////////////////////// endf ;----------------------------------------------------------------------------- -func writepos ;///// WRITE POSITION ////////////////////////////////////////// +func draw_statusbar ;///// WRITE POSITION //////////////////////////////////// ;----------------------------------------------------------------------------- cmp [do_not_draw],1 ; return if drawing is not permitted jae .exit pusha + 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 9,p_info,-1 mov ecx,[p_info.client_box.height-2] @@ -1116,9 +1141,10 @@ func writepos ;///// WRITE POSITION ////////////////////////////////////////// mcall 38,<6*13,6*13>,,[cl_3d_inset] pushad + add ecx,1*65536 ; sub ebx,(6*13+1)*65536-1 ; sub ebx,[left_ofs] - mov cx,STATH+1 + mov cx,STATH mcall 13,<0,6*13>,,[cl_3d_normal] mcall ,<6*13+1,6*(s_modified.size+2)-1> mov ebx,(6*(s_modified.size+15)+1)*65536 @@ -1133,7 +1159,7 @@ func writepos ;///// WRITE POSITION ////////////////////////////////////////// and ecx,0x0000FFFF push ecx - mov eax,[pos.y] + mov eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] inc eax mov ecx,10 mov edi,p_info+0x100;htext2.pos1 @@ -1141,7 +1167,7 @@ func writepos ;///// WRITE POSITION ////////////////////////////////////////// call uint2str mov al,',' stosb - mov eax,[pos.x] + mov eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] inc eax call uint2str @@ -1156,7 +1182,7 @@ func writepos ;///// WRITE POSITION ////////////////////////////////////////// sub ebx,edi mcall 4,,[sc.work_text],p_info+0x100 - cmp [modified],0 + cmp [cur_tab.Editor.Modified],0 ;! [modified],0 je @f and ebx,0x0000FFFF ; add ebx,[left_ofs-2] @@ -1176,58 +1202,17 @@ func writepos ;///// WRITE POSITION ////////////////////////////////////////// ret endf -;----------------------------------------------------------------------------- -func print_text ;///////////////////////////////////////////////////////////// -;----------------------------------------------------------------------------- - pusha -; mov ebx,(LBTNW+5+2)*65536 - mov bx,word[p_info.box.width] -; sub bx,LBTNW+RBTNW+10+3 - mov ecx,[ya-2] -; mov cx,ABTNH+1 - mcall 13,,,[sc.work] -; mov ebx,(LBTNW+5+2+4)*65536+ABTNH/2-3 - add ebx,[ya] - mov eax,[p_info.box.width] -; sub eax,LBTNW+RBTNW+10+8 - push eax - cdq - mov ecx,6 - div ecx - cmp eax,PATHL - jbe @f - mov eax,PATHL - @@: mov esi,eax - mcall 4,,[color_tbl+0],[addr] - - mov eax,[ya] - mov ebx,eax -; add eax,ABTNH/2-6 - shl eax,16 - add eax,ebx -; add eax,ABTNH/2-6+11 - mov ecx,eax - imul eax,[temp],6 - pop ebx - cmp eax,ebx - jae @f -; add eax,LBTNW+5+2+4 - mov ebx,eax - shl eax,16 - add ebx,eax - mcall 38,,,[color_tbl+0] - - @@: popa - ret -endf - -func draw_framerect ; ebx,ecx +func draw_framerect ; ebx,ecx,edx push ebx ecx + ; x1 = esp+6 + ; x2 = esp+4 (width) + ; y1 = esp+2 + ; y2 = esp+0 (height) add bx,[esp+6] mov cx,[esp+2] dec ebx - mcall 38,,,[cl_3d_inset] + mcall 38 add cx,[esp] rol ecx,16 add cx,[esp] @@ -1246,6 +1231,6 @@ func draw_framerect ; ebx,ecx sub ebx,0x00010001 mcall - add esp,8 + pop ecx ebx ret endf \ No newline at end of file diff --git a/programs/develop/tinypad/trunk/tp-editor.asm b/programs/develop/tinypad/trunk/tp-editor.asm new file mode 100644 index 0000000000..32c0f57187 --- /dev/null +++ b/programs/develop/tinypad/trunk/tp-editor.asm @@ -0,0 +1,757 @@ + +;----------------------------------------------------------------------------- +func draw_editor ;//////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + + mov ebx,[cur_tab.Editor.Bounds.Left-2] + mov bx,word[cur_tab.Editor.Bounds.Right] + sub bx,word[cur_tab.Editor.Bounds.Left] + inc ebx + mov ecx,[cur_tab.Editor.Bounds.Top-2] + mov cx,word[cur_tab.Editor.Bounds.Bottom] + sub cx,word[cur_tab.Editor.Bounds.Top] + inc ecx + mov edx,[cl_3d_inset] + call draw_framerect +@^ + mov ebx,[cur_tab.Editor.Bounds.Left-2] + mov bx,word[cur_tab.Editor.Bounds.Right] + mov ecx,[cur_tab.Editor.Bounds.Top-2] + mov cx,word[cur_tab.Editor.Bounds.Top] + mcall 38,,,[cl_3d_inset] + mov ecx,[cur_tab.Editor.Bounds.Bottom-2] + mov cx,word[cur_tab.Editor.Bounds.Bottom] + mcall + mov bx,word[cur_tab.Editor.Bounds.Left] + mov cx,word[cur_tab.Editor.Bounds.Top] + mcall + mov ebx,[cur_tab.Editor.Bounds.Right-2] + mov bx,word[cur_tab.Editor.Bounds.Right] + mov cx,word[cur_tab.Editor.Bounds.Top] + mcall +^@ + mov [cur_tab.Editor.Gutter.Visible],0 + test [options],OPTS_LINENUMS + jnz @f + xor eax,eax ;! mov eax,2+LCHGW + jmp .lp1 + @@: inc [cur_tab.Editor.Gutter.Visible] + mov edi,p_info+100 + mov eax,[cur_tab.Editor.Lines] ;! eax,[lines] + mov ecx,10 + call uint2str + lea eax,[edi-p_info-100] + cmp eax,3 + jae @f + mov eax,3 + @@: imul eax,6 + add eax,8 + .lp1: mov [cur_tab.Editor.Gutter.Width],eax ;! [left_ofs],eax + mov [left_ofs],eax + + call draw_editor_gutter + call draw_editor_vscroll + call draw_editor_hscroll + call draw_editor_text + call draw_editor_caret + + ret +endf + +;----------------------------------------------------------------------------- +func draw_editor_gutter ;///////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + cmp [cur_tab.Editor.Gutter.Visible],0 + je .exit + + add esp,-4*8*2 + + mov ebx,[cur_tab.Editor.Bounds.Left-2] + mov bx,word[cur_tab.Editor.Gutter.Width] + add ebx,0x00010000 + mov ecx,[cur_tab.Editor.Bounds.Top-2] + mov cx,word[cur_tab.Editor.Bounds.Bottom] + sub cx,word[cur_tab.Editor.Bounds.Top] + add cx,-SCRLW + add ecx,0x00010000 + dec cx + mcall 13,,,[cl_3d_normal] + + add bx,word[cur_tab.Editor.Bounds.Left] + push bx + shl ebx,16 + pop bx + add ecx,[cur_tab.Editor.Bounds.Top] + mcall 38,,,[cl_3d_inset] + + add ebx,-2*65536 + mov bx,word[cur_tab.Editor.Bounds.Top] + add bx,3 + mov edi,[sc.work_text] + mov ecx,[cur_tab.Editor.TopLeft.Y] + inc ecx + mov edx,p_info+100 + @@: pushad + push eax edx edi + mov eax,ecx + mov ecx,10 + mov edi,edx + call uint2str + mov esi,edi + pop edi edx eax + sub esi,edx + imul eax,esi,6*65536 + sub ebx,eax + mcall 4,,edi + popad + add ebx,LINEH + inc ecx + cmp ecx,[cur_tab.Editor.Lines] + jg @f + mov esi,ecx + sub esi,[cur_tab.Editor.TopLeft.Y] + cmp esi,[lines.scr] + jbe @b + @@: add esp,4*8*2 + + .exit: + ret +endf + +;----------------------------------------------------------------------------- +func draw_editor_vscroll ;//////////////////////////////////////////////////// +;----------------------------------------------------------------------------- +;!!!!!!!!!!!!!!!!!! + mov ebx,[cur_tab.Editor.Bounds.Right] + shl ebx,16 + add ebx,(-SCRLW)*65536+SCRLW + mov ecx,[cur_tab.Editor.Bounds.Top-2] + mov cx,SCRLW + mcall 8,,,'UP' or 0x40000000 + pushad + sar ebx,16 + sar ecx,16 + push ebx ecx SCRLW SCRLW + call draw_3d_panel + popad + mov eax,8 +;!!!!!!!!!!!!!!!!!! + + pushad + push 0x18 + shr ecx,16 + mov bx,cx + add ebx,(SCRLW/2-2)*65536+SCRLW/2-3 + mcall 4,,[sc.work_text],esp,1 + add esp,4 + popad + +;!!!!!!!!!!!!!!!!!! + mov ecx,[cur_tab.Editor.Bounds.Bottom] + shl ecx,16 + add ecx,(-SCRLW*2)*65536+SCRLW + mcall ,,,'DN' or 0x40000000 + pushad + sar ebx,16 + sar ecx,16 + push ebx ecx SCRLW SCRLW + call draw_3d_panel + popad + mov eax,8 +;!!!!!!!!!!!!!!!!!! + + pushad + push 0x19 + shr ecx,16 + mov bx,cx + add ebx,(SCRLW/2-2)*65536+SCRLW/2-3 + mcall 4,,[sc.work_text],esp,1 + add esp,4 + popad + + push ebx + mov eax,[cur_tab.Editor.Lines] + mov ebx,[lines.scr] + mov ecx,[cur_tab.Editor.TopLeft.Y] + mov edx,[cur_tab.Editor.Bounds.Bottom] + sub edx,[cur_tab.Editor.Bounds.Top] + add edx,-SCRLW*3+1 + call get_scroll_vars + mov [cur_tab.Editor.VScroll.Top],eax + mov [cur_tab.Editor.VScroll.Size],ebx + pop ebx + + mov ecx,eax + add ecx,[cur_tab.Editor.Bounds.Top] + add ecx,SCRLW+1 + +;!!!!!!!!!!!!!!!!!! + pushad + sar ebx,16 + push ebx ecx SCRLW [cur_tab.Editor.VScroll.Size] + dec dword[esp] + call draw_3d_panel + popad + mov eax,13 +;!!!!!!!!!!!!!!!!!! + add ebx,1*65536-1 + + mov ecx,[cur_tab.Editor.Bounds.Top-2] + mov cx,word[cur_tab.Editor.VScroll.Top] + add ecx,(SCRLW+1)*65536 + mov edx,[sc.work] + or cx,cx + jle @f + mcall 13 + @@: + mov ecx,[cur_tab.Editor.Bounds.Top] + add ecx,[cur_tab.Editor.VScroll.Top] + add ecx,[cur_tab.Editor.VScroll.Size] + add ecx,SCRLW+1 + mov di,cx + shl ecx,16 + mov cx,word[cur_tab.Editor.Bounds.Bottom] + sub cx,di + sub cx,SCRLW*2;+1 + jle @f + mcall + @@: + rol ebx,16 + dec bx + push bx + rol ebx,16 + pop bx + mov ecx,[cur_tab.Editor.Bounds.Top-2] + mov cx,word[cur_tab.Editor.Bounds.Bottom] + add ecx,(SCRLW)*65536-SCRLW*2-1 + mcall 38,,,[cl_3d_inset] + + ret +endf + +;----------------------------------------------------------------------------- +func draw_editor_hscroll ;//////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + mov ebx,[cur_tab.Editor.Bounds.Left-2] + mov bx,SCRLW + mov ecx,[cur_tab.Editor.Bounds.Bottom] + shl ecx,16 + add ecx,(-SCRLW)*65536+SCRLW + mcall 8,,,'LT' or 0x40000000 + pushad + sar ebx,16 + sar ecx,16 + push ebx ecx SCRLW SCRLW + call draw_3d_panel + popad +;!!!!!!!!!!!!!!!!!! + + pushad + push 0x1B + shr ecx,16 + mov bx,cx + add ebx,(SCRLW/2-2)*65536+SCRLW/2-3 + mcall 4,,[sc.work_text],esp,1 + add esp,4 + popad + +;!!!!!!!!!!!!!!!!!! + mov ebx,[cur_tab.Editor.Bounds.Right] + shl ebx,16 + add ebx,(-SCRLW*2)*65536+SCRLW + mcall 8,,,'RT' or 0x40000000 + pushad + sar ebx,16 + sar ecx,16 + push ebx ecx SCRLW SCRLW + call draw_3d_panel + popad +;!!!!!!!!!!!!!!!!!! + + pushad + push 0x1A + shr ecx,16 + mov bx,cx + add ebx,(SCRLW/2-2)*65536+SCRLW/2-3 + mcall 4,,[sc.work_text],esp,1 + add esp,4 + popad + + push ecx + mov eax,[cur_tab.Editor.Columns] + mov ebx,[columns.scr] + mov ecx,[cur_tab.Editor.TopLeft.X] + mov edx,[cur_tab.Editor.Bounds.Right] + add edx,-(SCRLW*3) + call get_scroll_vars + mov [cur_tab.Editor.HScroll.Top],eax + mov [cur_tab.Editor.HScroll.Size],ebx + pop ecx + + mov ebx,eax + add ebx,[cur_tab.Editor.Bounds.Left] + add ebx,SCRLW+1 + shl ebx,16 + mov bx,word[cur_tab.Editor.HScroll.Size] + +;!!!!!!!!!!!!!!!!!! + pushad + sar ecx,16 + rol ebx,16 + movsx eax,bx + sar ebx,16 + dec ebx + push eax ecx ebx SCRLW + call draw_3d_panel + popad +;!!!!!!!!!!!!!!!!!! + add ecx,1*65536-1 + + mov ebx,[cur_tab.Editor.Bounds.Left-2] + mov bx,word[cur_tab.Editor.Bounds.Left] + mov bx,word[cur_tab.Editor.HScroll.Top] + add ebx,(1+SCRLW)*65536 + mcall 13,,,[sc.work] + mov ebx,[cur_tab.Editor.Bounds.Left] + add ebx,1+SCRLW + add ebx,[cur_tab.Editor.HScroll.Top] + add ebx,[cur_tab.Editor.HScroll.Size] + mov di,bx + shl ebx,16 + mov bx,word[cur_tab.Editor.Bounds.Right] + sub bx,di + sub bx,SCRLW*2 + jle @f + mcall + @@: + mov ebx,[cur_tab.Editor.Bounds.Left-2] + mov bx,word[cur_tab.Editor.Bounds.Right] + add ebx,(SCRLW)*65536-SCRLW*2-1 + rol ecx,16 + dec cx + push cx + rol ecx,16 + pop cx + mcall 38,,,[cl_3d_inset] + + ret +endf + +;----------------------------------------------------------------------------- +func draw_editor_text ;/////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + mov eax,[cur_tab.Editor.Bounds.Bottom] + sub eax,[cur_tab.Editor.Bounds.Top] + cmp eax,LINEH + jge @f + ret + @@: + call init_sel_vars + call check_bottom_right + + pushad + + mov eax,[cur_tab.Editor.Bounds.Left] + add eax,[cur_tab.Editor.Gutter.Width] + add eax,LCHGW+3 + mov [left_ofs],eax + mov eax,[cur_tab.Editor.Bounds.Top] + add eax,3 + mov [top_ofs],eax + + mov ebx,[top_ofs] + add ebx,[left_ofs-2] + + mov ecx,[cur_tab.Editor.TopLeft.Y] ;! ecx,[top_line] + push ecx + call get_line_offset + + .start: + add esp,4 + mov ecx,[lines.scr] + or ecx,ecx + jle .exit + add esp,-4 + + imul ebp,[cur_tab.Editor.TopLeft.X],6*65536 ;! ebp,[left_col],6*65536 + mov eax,[lines.scr] + sub eax,[cur_tab.Editor.Lines] ;! eax,[lines] + mov [draw_blines],eax + + .next_line: + + push ecx ebx + + mov ecx,ebx + shl ecx,16 + mov cl,LINEH + mov ebx,[cur_tab.Editor.Bounds.Right] + ;sub ebx,[cur_tab.Editor.Bounds.Left] + add ebx,-SCRLW + add ebx,[left_ofs-2] + sub ebx,[left_ofs] + add ebx,-2*65536+2 + + ; selection (text background) + mov [in_sel],0 + mov edx,[color_tbl+4*5] + mov eax,[esp+4*2] + cmp eax,[sel.begin.y] + jl .lp6 + je .lp1 + cmp eax,[sel.end.y] + jg .lp6 + je .lp3 + jmp .lp6.2 + .lp1: mov eax,[sel.begin.y] + cmp eax,[sel.end.y] + je .lp5 + .lp2: mov eax,[sel.begin.x] + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] + jle .lp6.2 + cmp eax,[columns.scr] + jge .lp6 + imul eax,6 + pushad + sub bx,ax + rol ebx,16 + mov bx,ax + add ebx,[left_ofs] + add ebx,-2 + rol ebx,16 + mov edx,[color_tbl+4*7] + mcall 13 + popad + mov bx,ax + mov [in_sel],2 + jmp .lp6 + .lp3: mov eax,[sel.begin.y] + cmp eax,[sel.end.y] + je .lp5 + .lp4: mov eax,[sel.end.x] + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] + jle .lp6 + cmp eax,[columns.scr] + jg .lp6.2 + imul eax,6 + pushad + sub bx,ax + rol ebx,16 + add eax,[left_ofs];OLEFT-1 + add eax,-2 + mov bx,ax + rol ebx,16 + mcall 13 + popad + inc eax + mov edx,[color_tbl+4*7] + mov bx,ax + mov [in_sel],3 + jmp .lp6 + .lp5: mov eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] + cmp eax,[sel.begin.x] + jge .lp4 + add eax,[columns.scr] + cmp eax,[sel.end.x] + jl .lp2 + mov eax,[sel.begin.x] + cmp eax,[sel.end.x] + je .lp6 + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] + imul eax,6 + pushad + mov ebx,[sel.end.x] + sub ebx,[sel.begin.x] + imul ebx,6 + sal ebx,16 + dec eax + add eax,[left_ofs] + mov bx,ax + rol ebx,16 + mov edx,[color_tbl+4*7] + mcall 13 + movzx eax,bx + sar ebx,16 + add eax,ebx + mov ebx,eax + sal ebx,16 + sub ax,[esp+4*4] + neg ax + add ax,word[left_ofs] + add ax,-2 + mov bx,ax + mov edx,[color_tbl+4*5] + mcall 13 + popad + mov bx,ax + mov [in_sel],4 + jmp .lp6 + + .lp6.2: + mov edx,[color_tbl+4*7] + inc [in_sel] + .lp6: + mcall 13 + + lodsd + + pushad + mov edx,[color_tbl+4*5] + test eax,0x00010000 + jz @f + mov edx,[color_tbl+4*8] + test eax,0x00020000 + jz @f + mov edx,[color_tbl+4*9] + @@: mov ebx,[left_ofs] + add ebx,-LCHGW-2;-4 + shl ebx,16 + mov bx,LCHGW + mcall 13 + popad + + xor ecx,ecx + and eax,0x0000FFFF + mov [cur_line_len],eax + + or eax,eax + ja .next_block + add esp,4*2 + jmp .exit ; .draw_cursor + + .next_block: + + push esi ecx + call get_next_part + pop ebx + + push ecx + mov ecx,eax + + push esi ebx + mov eax,ebx + sub ebx,[cur_tab.Editor.TopLeft.X] ;! ebx,[left_col] + cmp ebx,[columns.scr] + jge .skip_t + add ebx,esi + jle .skip_t + mov ebx,[esp+8+4*2] ;// 4*2=esi+ebx + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] + jge .qqq + sub edx,eax + add esi,eax +; mov eax,OLEFT*65536 + xor eax,eax + jmp .qqq2 + .qqq: +; inc eax + imul eax,6*65536 + .qqq2: + and ebx,0x0000FFFF + add eax,[left_ofs-2];OLEFT*65536 + add ebx,eax + + mov eax,[esp] ; ebx + add eax,[esp+4] ; esi + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] + sub eax,[columns.scr] + jle .qweqwe + sub esi,eax + .qweqwe: + + mov al,[in_sel] + cmp al,0 + je .draw_t + dec al + jz .ya4 + .nt1: dec al + jnz .nt2 + mov eax,[esp] + cmp eax,[sel.begin.x] + jge .ya4 + add eax,[esp+4] + cmp eax,[sel.begin.x] + jl .draw_t +;---[ selection crosses block from the right ]-(- + .ya1: mov eax,esi + mov esi,[sel.begin.x] + sub esi,[esp] + pushad + mov ecx,[cur_tab.Editor.TopLeft.X] ;! ecx,[left_col] + sub ecx,[esp+4*8] + jle @f + sub esi,ecx + sub [esp+4],ecx + @@: sub eax,esi + add edx,esi + imul esi,6 + rol ebx,16 + add bx,si + rol ebx,16 + mov esi,eax + mov ecx,[color_tbl+4*6] + mcall 4 + popad + jmp .draw_t +;----------------------------------------------)- + .nt2: dec al + jnz .nt3 + mov eax,[esp] + cmp eax,[sel.end.x] + jge .draw_t + add eax,[esp+4] + cmp eax,[sel.end.x] + jl .ya4 +;---[ selection crosses block from the left ]--(- + .ya2: mov eax,[sel.end.x] + sub eax,[esp] + push ebx + mov ebx,[esp+4] + sub ebx,[cur_tab.Editor.TopLeft.X] ;! ebx,[left_col] + jge .ya2.1 + add eax,ebx + .ya2.1: + pop ebx + pushad + mov esi,eax + mov ecx,[color_tbl+4*6] + mcall 4 + popad + sub esi,eax + add edx,eax + imul eax,6*65536 + add ebx,eax + jmp .draw_t +;----------------------------------------------)- + .nt3: mov eax,[esp] + cmp eax,[sel.end.x] + jge .draw_t + cmp eax,[sel.begin.x] + jge @f + add eax,[esp+4] + cmp eax,[sel.begin.x] + jl .draw_t + cmp eax,[sel.end.x] + jl .ya1 +;---[ selection inside block ]-----------------(- + mov eax,esi + mov esi,[sel.begin.x] + sub esi,[esp] + push eax + mov eax,[esp+4] + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] + jge .nt3.1 + add esi,eax + .nt3.1: + pop eax + sub eax,esi + pushad + add edx,esi + imul esi,6*65536 + add ebx,esi + mov esi,[sel.end.x] + sub esi,[sel.begin.x] + mov ecx,[color_tbl+4*6] + sub eax,esi + push eax + mcall 4 + add edx,esi + imul esi,6*65536 + add ebx,esi + pop esi + mov ecx,[esp+4*6] + mcall 4 + popad + jmp .draw_t +;----------------------------------------------)- + @@: add eax,esi + dec eax + cmp eax,[sel.end.x] + jge .ya2 +;---[ block inside selection ]-----------------(- + .ya4: mov ecx,[color_tbl+4*6] +;----------------------------------------------)- + + .draw_t: + mcall 4;[esp+8] + .skip_t: + pop eax eax ; ebx esi + imul eax,6 + add [esp+4*2+2],ax + pop ecx esi + cmp ecx,[cur_line_len];LINE_WIDTH + jl .next_block + + pop ebx ecx + and ebx,0x0000FFFF + add ebx,[left_ofs-2] + add ebx,LINEH + add esi,[cur_line_len];LINE_WIDTH + inc dword[esp] + dec ecx + jg .next_line + + .exit: + + cmp [draw_blines],0 + jl @f + mov ecx,[esp-8] + shl ecx,16 + mov cx,word[cur_tab.Editor.Bounds.Bottom] + sub cx,[esp-8] + add cx,-SCRLW + mov eax,[cur_tab.Editor.Bounds.Left] + add eax,[cur_tab.Editor.Gutter.Width] + inc eax + mov ebx,eax + shl ebx,16 + mov bx,word[cur_tab.Editor.Bounds.Right] + sub bx,ax + add ebx,-SCRLW + mcall 13,,,[color_tbl+4*5] + @@: + + popad + add esp,4 + ret +endf + +;----------------------------------------------------------------------------- +func draw_editor_caret ;////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + cmp [bot_mode],0 + jne @f + mov ebx,[cur_tab.Editor.Caret.X] + sub ebx,[cur_tab.Editor.TopLeft.X] + js @f + cmp ebx,[columns.scr] + ja @f + imul ebx,6 + add ebx,[left_ofs] + dec ebx + push bx + shl ebx,16 + pop bx + mov eax,[cur_tab.Editor.Caret.Y] + sub eax,[cur_tab.Editor.TopLeft.Y] + js @f + cmp eax,[lines.scr] + jge @f + imul eax,LINEH + add eax,[top_ofs] + mov esi,eax + shl esi,16 + add eax,LINEH-2 + mov si,ax + mov ecx,2 + cmp [ins_mode],0 + jne .lp8 + add cl,4 + .lp8: push ecx + mcall 38,,esi,0x01000000 + add ebx,0x00010001 + pop ecx + loop .lp8 + @@: + ret +endf \ No newline at end of file diff --git a/programs/develop/tinypad/trunk/tp-files.asm b/programs/develop/tinypad/trunk/tp-files.asm index 29e8d1de53..1e965a5bc2 100644 --- a/programs/develop/tinypad/trunk/tp-files.asm +++ b/programs/develop/tinypad/trunk/tp-files.asm @@ -10,18 +10,18 @@ func save_file ;////////////////////////////////////////////////////////////// rep movsb mov byte[edi],0 - mov esi,AREA_EDIT ; 0x70000 = 448 Kbytes (maximum) - mov edi,AREA_TEMP + mov esi,[cur_tab.Editor.Data] ;! AREA_EDIT ; 0x70000 = 448 Kbytes (maximum) + mov edi,0 ;!!! AREA_TEMP .new_string: call save_string cmp dword[esi],0 jne .new_string - sub edi,AREA_TEMP+2 ; minus last CRLF + sub edi,0 ;!!! AREA_TEMP+2 ; minus last CRLF ;! mov [filelen],edi cmp byte[f_info.path],'/' je .systree_save - mcall 33,f_info.path,AREA_TEMP,edi,0;[filelen],0 + mcall 33,f_info.path,0,edi,0 ;!!! AREA_TEMP,edi,0;[filelen],0 or eax,eax jz .exit ; call file_not_found @@ -40,7 +40,7 @@ func save_file ;////////////////////////////////////////////////////////////// mov [f_info70+0],2 mov [f_info70+12],edi - mov [f_info70+16],AREA_TEMP + mov [f_info70+16],0 ;!!! AREA_TEMP mov byte[f_info70+20],0 mov [f_info70+21],f_info.path mcall 70,f_info70 @@ -51,7 +51,7 @@ func save_file ;////////////////////////////////////////////////////////////// jnz .exit.2 .exit: - mov [modified],0 + mov [cur_tab.Editor.Modified],0 ;! [modified],0 clc ret @@ -145,48 +145,13 @@ func set_status_fs_error @@: inc esi mov [s_status],esi pop eax - call writepos - ret -endf - -;----------------------------------------------------------------------------- -func load_hd_file ;/////////////////////////////////////////////////////////// -;----------------------------------------------------------------------------- - mov [f_info+0],0 - mov [f_info+8],300000/512 -; mov esi,s_fname -; mov edi,f_info.path;pathfile_read -; mov ecx,PATHL -; cld -; rep movsb - ;mcall 58,f_info ; fileinfo_read - - mov [f_info70+0],0 - mov [f_info70+4],0 - mov [f_info70+8],0 - mov [f_info70+12],300000;/512 - mov [f_info70+16],AREA_TEMP - mov byte[f_info70+20],0 - mov [f_info70+21],f_info.path - mcall 70,f_info70 - - call set_status_fs_error - - xchg eax,ebx - inc eax - test ebx,ebx - je load_file.file_found - cmp ebx,6 ;// ATV driver fix (6 instead of 5) - je load_file.file_found -; jmp file_not_found - stc + call draw_statusbar ret endf ;----------------------------------------------------------------------------- func load_file ;////////////////////////////////////////////////////////////// ;----------------------------------------------------------------------------- - mov esi,tb_opensave.text mov edi,f_info.path movzx ecx,[tb_opensave.length] @@ -195,24 +160,81 @@ func load_file ;////////////////////////////////////////////////////////////// rep movsb mov byte[edi],0 - cmp byte[f_info.path],'/' - je load_hd_file + xor eax,eax + mov [f_info70+0],5 + mov [f_info70+4],eax + mov [f_info70+8],eax + mov [f_info70+12],eax + mov [f_info70+16],file_info + mov byte[f_info70+20],al + mov [f_info70+21],f_info.path + mcall 70,f_info70 + mov [f_info70+0],0 + mov eax,dword[file_info.Size] + mov [f_info70+12],eax + call mem.Alloc + mov [f_info70+16],eax + mcall 70,f_info70 - mcall 6,f_info.path,0,16800,AREA_TEMP ; 6 = open file - inc eax ; eax = -1 -> file not found - jnz .file_found -; jmp file_not_found + call set_status_fs_error + + mov esi,[f_info70+16] + + xchg eax,ebx + test ebx,ebx + je .file_found + cmp ebx,6 ;// ATV driver fix (6 instead of 5) + je .file_found + + mov eax,[f_info70+16] + call mem.Free stc ret .file_found: - dec eax - mov [filesize],eax - mov [lines],1 - mov [columns],0 - mov esi,AREA_TEMP - mov edi,AREA_EDIT - mov edx,eax + mov ecx,eax + call create_tab + push ecx esi edi + mov esi,tb_opensave.text + lea edi,[ebp+TABITEM.Editor.FilePath] + ;mov ecx,[f_info.length] + movzx ecx,[tb_opensave.length] + rep movsb + mov byte[edi],0 + lea edi,[ebp+TABITEM.Editor.FilePath] + movzx ecx,[tb_opensave.length] + @@: cmp byte[edi+ecx-1],'/' + je @f + dec ecx + jmp @b + @@: mov [ebp+TABITEM.Editor.FileName],ecx + call flush_cur_tab + pop edi esi ecx + call load_from_memory + mov eax,[f_info70+16] + call mem.Free + clc + ret +endf + +;----------------------------------------------------------------------------- +func load_from_memory ;/////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- +; ECX = data length +; ESI = data pointer +; EBP = EDITOR* +;----------------------------------------------------------------------------- + call get_lines_in_file + mov [ebp+EDITOR.Lines],eax + imul ebx,eax,14 + add ebx,ecx + mov eax,[ebp+EDITOR.Data] + call mem.ReAlloc + mov [ebp+EDITOR.Data],eax + + mov [ebp+EDITOR.Columns],0 + mov edi,eax + mov edx,ecx .next_line: mov ebx,edi @@ -244,11 +266,10 @@ func load_file ;////////////////////////////////////////////////////////////// sub eax,10 jnz @f inc eax - @@: cmp eax,[columns] + @@: cmp eax,[ebp+EDITOR.Columns] ;! eax,[columns] jbe @f - mov [columns],eax - @@: mov [modified],0 - clc + mov [ebp+EDITOR.Columns],eax ;! [columns],eax + @@: mov [ebp+EDITOR.Modified],0 ;! [modified],0 ret .CR: cmp byte[esi],10 @@ -261,11 +282,11 @@ func load_file ;////////////////////////////////////////////////////////////// lea eax,[edi-4] sub eax,ebx mov [ebx],eax - inc [lines] + ;inc [cur_tab.Editor.Lines] ;! [lines] add eax,-10 - cmp eax,[columns] + cmp eax,[ebp+EDITOR.Columns] ;! eax,[columns] jbe .next_line - mov [columns],eax + mov [ebp+EDITOR.Columns],eax ;! [columns],eax jmp .next_line .TB: lea eax,[edi-4] @@ -278,30 +299,3 @@ func load_file ;////////////////////////////////////////////////////////////// rep stosb jmp .next_char endf - -;----------------------------------------------------------------------------- -func new_file ;/////////////////////////////////////////////////////////////// -;----------------------------------------------------------------------------- -; mcall 55,eax,error_beep ; beep - mov [lines],1 ; open empty document - mov [columns],1 - xor eax,eax - mov [top_line],eax - mov [pos.x],eax - mov [pos.y],eax - mov edi,AREA_EDIT+4 - mov ecx,10 - mov [edi-4],ecx - mov [edi+10],eax - mov al,' ' - cld - rep stosb - - mov [f_info.length],0 - mov [modified],0 - mov [asm_mode],0 - call update_caption - call drawwindow - - ret -endf \ No newline at end of file diff --git a/programs/develop/tinypad/trunk/tp-key.asm b/programs/develop/tinypad/trunk/tp-key.asm index b9b8e3ba10..1fe35bfea4 100644 --- a/programs/develop/tinypad/trunk/tp-key.asm +++ b/programs/develop/tinypad/trunk/tp-key.asm @@ -51,8 +51,8 @@ key: jne @f test [options],OPTS_SECURESEL jz .lp1 - m2m [sel.x],[pos.x] - m2m [sel.y],[pos.y] + m2m [cur_tab.Editor.SelStart.X],[cur_tab.Editor.Caret.X] ;! [sel.x],[pos.x] + m2m [cur_tab.Editor.SelStart.Y],[cur_tab.Editor.Caret.Y] ;! [sel.y],[pos.y] .lp1: mov [s_status],0 call dword[esi+4] jmp still @@ -74,8 +74,8 @@ key: test [options],OPTS_SECURESEL jz .lp2 - m2m [sel.x],[pos.x] - m2m [sel.y],[pos.y] + m2m [cur_tab.Editor.SelStart.X],[cur_tab.Editor.Caret.X] ;! [sel.x],[pos.x] + m2m [cur_tab.Editor.SelStart.Y],[cur_tab.Editor.Caret.Y] ;! [sel.y],[pos.y] jmp .put .lp2: call delete_selection @@ -85,24 +85,24 @@ key: jne @f mov al,']' call .lp3 - dec [pos.x] + dec [cur_tab.Editor.Caret.X] ;! [pos.x] jmp .put @@: cmp al,'(' jne @f mov al,')' call .lp3 - dec [pos.x] + dec [cur_tab.Editor.Caret.X] ;! [pos.x] jmp .put @@: cmp al,'{' jne .put mov al,'}' call .lp3 - dec [pos.x] + dec [cur_tab.Editor.Caret.X] ;! [pos.x] .put: pop eax push still - inc [sel.x] - .lp3: push [pos.x] eax + inc [cur_tab.Editor.SelStart.X] ;! [sel.x] + .lp3: push [cur_tab.Editor.Caret.X] eax ;! [pos.x] eax inc dword[esp+4] mov eax,1 jmp key.tab.direct @@ -111,14 +111,14 @@ key: func key.ctrl_a ;///// SELECT ALL DOCUMENT /////////////////////////////////// ;----------------------------------------------------------------------------- xor eax,eax - mov [sel.x],eax - mov [sel.y],eax - mov ecx,[lines] + mov [cur_tab.Editor.SelStart.X],eax ;! [sel.x],eax + mov [cur_tab.Editor.SelStart.Y],eax ;! [sel.y],eax + mov ecx,[cur_tab.Editor.Lines] ;! ecx,[lines] dec ecx - mov [pos.y],ecx + mov [cur_tab.Editor.Caret.Y],ecx ;! [pos.y],ecx call get_line_offset call get_real_length - mov [pos.x],eax + mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax call draw_file ret endf @@ -155,7 +155,7 @@ endf ;----------------------------------------------------------------------------- func key.ctrl_s ;///// ENTER SAVE FILENAME /////////////////////////////////// ;----------------------------------------------------------------------------- - cmp [modified],0 + cmp [cur_tab.Editor.Modified],0 ;! [modified],0 je .exit cmp [f_info.length],0 je key.shift_ctrl_s @@ -172,7 +172,7 @@ endf ;----------------------------------------------------------------------------- func key.ctrl_n ;///// ENTER SAVE FILENAME /////////////////////////////////// ;----------------------------------------------------------------------------- - call new_file + call create_tab ret endf @@ -248,8 +248,8 @@ func key.ctrl_left ;///// GO TO PREVIOUS WORD //////////////////////////////// ;----------------------------------------------------------------------------- key.shift_ctrl_left: ;///// GO TO PREVIOUS WORD, WITH SELECTION ///////// ;----------------------------------------------------------------------------- - mov ebx,[pos.y] - mov edx,[pos.x] + mov ebx,[cur_tab.Editor.Caret.Y] ;! ebx,[pos.y] + mov edx,[cur_tab.Editor.Caret.X] ;! edx,[pos.x] cld mov ecx,ebx call get_line_offset @@ -307,26 +307,26 @@ func key.ctrl_left ;///// GO TO PREVIOUS WORD //////////////////////////////// jmp .lp2 @@: inc edx - mov [pos.y],ebx - mov [pos.x],edx + mov [cur_tab.Editor.Caret.Y],ebx ;! [pos.y],ebx + mov [cur_tab.Editor.Caret.X],edx ;! [pos.x],edx test byte[shi+2],0x01 jnz @f - mov [sel.y],ebx - mov [sel.x],edx - @@: sub ebx,[top_line] + mov [cur_tab.Editor.SelStart.Y],ebx ;! [sel.y],ebx + mov [cur_tab.Editor.SelStart.X],edx ;! [sel.x],edx + @@: sub ebx,[cur_tab.Editor.TopLeft.Y] ;! ebx,[top_line] jge @f - add [top_line],ebx + add [cur_tab.Editor.TopLeft.Y],ebx ;! [top_line],ebx @@: mov eax,edx - sub eax,[left_col] + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] cmp eax,[columns.scr] jl @f sub eax,[columns.scr] inc eax - add [left_col],eax + add [cur_tab.Editor.TopLeft.X],eax ;! [left_col],eax jmp .exit - @@: cmp edx,[left_col] + @@: cmp edx,[cur_tab.Editor.TopLeft.X] ;! edx,[left_col] jge .exit - mov [left_col],edx + mov [cur_tab.Editor.TopLeft.X],edx ;! [left_col],edx .exit: call draw_file .exit.2: @@ -341,8 +341,8 @@ func key.ctrl_right ;///// GO TO NEXT WORD /////////////////////////////////// ;----------------------------------------------------------------------------- key.shift_ctrl_right: ;///// GO TO NEXT WORD, WITH SELECTION //////////// ;----------------------------------------------------------------------------- - mov ebx,[pos.y] - mov edx,[pos.x] + mov ebx,[cur_tab.Editor.Caret.Y] ;! ebx,[pos.y] + mov edx,[cur_tab.Editor.Caret.X] ;! edx,[pos.x] cld .lp1: mov ecx,ebx call get_line_offset @@ -363,7 +363,7 @@ func key.ctrl_right ;///// GO TO NEXT WORD /////////////////////////////////// dec ecx jnz @b .nx1: inc ebx - cmp ebx,[lines] + cmp ebx,[cur_tab.Editor.Lines] ;! ebx,[lines] jge .exit.2 xor edx,edx jmp .lp1 @@ -388,34 +388,34 @@ func key.ctrl_right ;///// GO TO NEXT WORD /////////////////////////////////// dec ecx jnz @b .nx2: inc ebx - cmp ebx,[lines] + cmp ebx,[cur_tab.Editor.Lines] ;! ebx,[lines] jge .exit.2 xor edx,edx jmp .lp2 @@: - mov [pos.y],ebx - mov [pos.x],edx + mov [cur_tab.Editor.Caret.Y],ebx ;! [pos.y],ebx + mov [cur_tab.Editor.Caret.X],edx ;! [pos.x],edx test byte[shi+2],0x01 jnz @f - mov [sel.y],ebx - mov [sel.x],edx - @@: sub ebx,[top_line] + mov [cur_tab.Editor.SelStart.Y],ebx ;! [sel.y],ebx + mov [cur_tab.Editor.SelStart.X],edx ;! [sel.x],edx + @@: sub ebx,[cur_tab.Editor.TopLeft.Y] ;! ebx,[top_line] cmp ebx,[lines.scr] jl @f sub ebx,[lines.scr] inc ebx - add [top_line],ebx + add [cur_tab.Editor.TopLeft.Y],ebx ;! [top_line],ebx @@: mov eax,edx - sub eax,[left_col] + sub eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] cmp eax,[columns.scr] jl @f sub eax,[columns.scr] inc eax - add [left_col],eax + add [cur_tab.Editor.TopLeft.X],eax ;! [left_col],eax jmp .exit - @@: cmp edx,[left_col] + @@: cmp edx,[cur_tab.Editor.TopLeft.X] ;! edx,[left_col] jge .exit - mov [left_col],edx + mov [cur_tab.Editor.TopLeft.X],edx ;! [left_col],edx .exit: call draw_file .exit.2: @@ -428,7 +428,7 @@ func key.ctrl_x je @f call key.ctrl_c call key.del - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 @@: ret endf @@ -437,6 +437,13 @@ func key.ctrl_c mov [copy_size],0 cmp [sel.selected],0 je .exit + + call get_selection_size + mov ebx,eax + mov eax,[copy_buf] + call mem.ReAlloc + mov [copy_buf],eax + cld mov eax,[sel.begin.y] cmp eax,[sel.end.y] @@ -445,7 +452,7 @@ func key.ctrl_c call get_line_offset inc ecx push ecx - mov edi,AREA_CBUF + mov edi,[copy_buf] ;! AREA_CBUF call get_real_length sub eax,[sel.begin.x] jge @f @@ -487,7 +494,7 @@ func key.ctrl_c add [ebx],eax mov al,' ' rep stosb - @@: sub edi,AREA_CBUF + @@: sub edi,[copy_buf] ;! AREA_CBUF mov [copy_size],edi mov eax,[sel.end.y] sub eax,[sel.begin.y] @@ -499,7 +506,7 @@ func key.ctrl_c .single_line: mov eax,[sel.end.x] sub eax,[sel.begin.x] - mov edi,AREA_CBUF + mov edi,[copy_buf] ;! AREA_CBUF stosd mov ecx,[sel.begin.y] call get_line_offset @@ -530,19 +537,21 @@ func key.ctrl_v call delete_selection - mov ecx,[pos.y] + mov ecx,[cur_tab.Editor.Caret.Y] ;! ecx,[pos.y] call get_line_offset pushd [esi] esi - mov ecx,[pos.x] + mov ecx,[cur_tab.Editor.Caret.X] ;! ecx,[pos.x] call line_add_spaces mov ecx,[copy_size] sub ecx,4 - mov edi,AREA_TEMP2 + mov edi,[cur_tab.Editor.Data] ;! AREA_TEMP2 + add edi,[edi-4] + dec edi mov eax,esi mov esi,edi sub esi,ecx lea ecx,[eax+4] - add ecx,[pos.x] + add ecx,[cur_tab.Editor.Caret.X] ;! ecx,[pos.x] neg ecx lea ecx,[esi+ecx+1] std @@ -555,10 +564,10 @@ func key.ctrl_v cld pop edi add edi,4 - mov esi,AREA_CBUF + mov esi,[copy_buf] ;! AREA_CBUF lodsd - mov ebx,[pos.x] + mov ebx,[cur_tab.Editor.Caret.X] ;! ebx,[pos.x] add eax,ebx mov [edi-4],ax sub eax,ebx @@ -581,38 +590,38 @@ func key.ctrl_v mov ecx,eax rep movsb - mov [pos.x],eax - mov [sel.x],eax + mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax + mov [cur_tab.Editor.SelStart.X],eax ;! [sel.x],eax mov eax,[copy_count] dec eax - add [pos.y],eax - add [sel.y],eax - add [lines],eax + add [cur_tab.Editor.Caret.Y],eax ;! [pos.y],eax + add [cur_tab.Editor.SelStart.Y],eax ;! [sel.y],eax + add [cur_tab.Editor.Lines],eax ;! [lines],eax call check_inv_all - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 jmp .exit .single_line: cld pop edi add edi,4 - mov esi,AREA_CBUF + mov esi,[copy_buf] ;! AREA_CBUF lodsd add [edi-4],ax and dword[edi-4],not 0x00020000 or dword[edi-4],0x00010000 call .check_columns - add edi,[pos.x] + add edi,[cur_tab.Editor.Caret.X] ;! edi,[pos.x] add esp,4 mov ecx,eax rep movsb - add [pos.x],eax - add [sel.x],eax + add [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax + add [cur_tab.Editor.SelStart.X],eax ;! [sel.x],eax call check_inv_all - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 .exit: ret @@ -620,9 +629,9 @@ func key.ctrl_v .check_columns: push eax movzx eax,word[edi-4] - cmp eax,[columns] + cmp eax,[cur_tab.Editor.Columns] ;! eax,[columns] jbe @f - mov [columns],eax + mov [cur_tab.Editor.Columns],eax ;! [columns],eax @@: pop eax ret ; push eax ebx esi @@ -647,11 +656,11 @@ endf ;----------------------------------------------------------------------------- func key.ctrl_d ;///// INSERT SEPARATOR ////////////////////////////////////// ;----------------------------------------------------------------------------- - mov ecx,[pos.y] + mov ecx,[cur_tab.Editor.Caret.Y] ;! ecx,[pos.y] call get_line_offset mov ebx,esi - mov ecx,[lines] + mov ecx,[cur_tab.Editor.Lines] ;! ecx,[lines] call get_line_offset lea edi,[esi+90+4] lea ecx,[esi+4] @@ -670,12 +679,12 @@ func key.ctrl_d ;///// INSERT SEPARATOR ////////////////////////////////////// rep stosb mov byte[ebx+4],';' - inc [lines] - inc [pos.y] - m2m [sel.y],[pos.y] + inc [cur_tab.Editor.Lines] ;! [lines] + inc [cur_tab.Editor.Caret.Y] ;! [pos.y] + m2m [cur_tab.Editor.SelStart.Y],[cur_tab.Editor.Caret.Y] ;! [sel.y],[pos.y] call check_inv_all - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 .exit: ret @@ -684,25 +693,25 @@ endf ;----------------------------------------------------------------------------- func key.ctrl_y ;///// DELETE CURRENT LINE /////////////////////////////////// ;----------------------------------------------------------------------------- - mov eax,[pos.y] + mov eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] inc eax - cmp eax,[lines] + cmp eax,[cur_tab.Editor.Lines] ;! eax,[lines] jge .exit - mov ecx,[pos.y] + mov ecx,[cur_tab.Editor.Caret.Y] ;! ecx,[pos.y] call get_line_offset mov edi,esi lodsd add esi,eax - dec [lines] - mov ecx,AREA_TEMP2 + dec [cur_tab.Editor.Lines] ;! [lines] + mov ecx,[temp_buf] ;! AREA_TEMP2 sub ecx,esi shr ecx,2 ;// fixed (was 4) cld rep movsd call check_inv_all - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 .exit: ret @@ -716,11 +725,11 @@ func key.up ;///// GO TO PREVIOUS LINE /////////////////////////////////////// ;----------------------------------------------------------------------------- key.shift_up: ;///// GO TO PREVIOUS LINE, WITH SELECTION //////////////// ;----------------------------------------------------------------------------- - mov eax,[pos.y] + mov eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] dec eax jns @f xor eax,eax - @@: mov ecx,[top_line] + @@: mov ecx,[cur_tab.Editor.TopLeft.Y] ;! ecx,[top_line] cmp eax,ecx jae @f dec ecx @@ -728,7 +737,7 @@ func key.up ;///// GO TO PREVIOUS LINE /////////////////////////////////////// xor ecx,ecx @@: test byte[shi+2],0x01 jnz @f - mov [sel.y],eax + mov [cur_tab.Editor.SelStart.Y],eax ;! [sel.y],eax @@: call check_inv_all.skip_init .exit: @@ -744,12 +753,12 @@ func key.down ;///// GO TO NEXT LINE ///////////////////////////////////////// key.shift_down: ;///// GO TO NEXT LINE, WITH SELECTION ////////////////// ;----------------------------------------------------------------------------- - mov eax,[pos.y] + mov eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] inc eax - cmp eax,[lines] + cmp eax,[cur_tab.Editor.Lines] ;! eax,[lines] jb @f dec eax - @@: mov ecx,[top_line] + @@: mov ecx,[cur_tab.Editor.TopLeft.Y] ;! ecx,[top_line] mov edx,eax sub edx,ecx cmp edx,[lines.scr] @@ -757,7 +766,7 @@ func key.down ;///// GO TO NEXT LINE ///////////////////////////////////////// inc ecx @@: test byte[shi+2],0x01 jnz @f - mov [sel.y],eax + mov [cur_tab.Editor.SelStart.Y],eax ;! [sel.y],eax @@: call check_inv_all.skip_init .exit: @@ -772,14 +781,14 @@ func key.left ;///// GO TO PREVIOUS CHAR ///////////////////////////////////// ;----------------------------------------------------------------------------- key.shift_left: ;///// GO TO PREVIOUS CHAR, WITH SELECTION ////////////// ;----------------------------------------------------------------------------- - mov eax,[pos.x] + mov eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] dec eax jns @f inc eax @@: test byte[shi+2],0x01 jnz @f - mov [sel.x],eax - @@: mov [pos.x],eax + mov [cur_tab.Editor.SelStart.X],eax ;! [sel.x],eax + @@: mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax call check_inv_all .exit: @@ -794,15 +803,15 @@ func key.right ;///// GO TO NEXT CHAR //////////////////////////////////////// ;----------------------------------------------------------------------------- key.shift_right: ;///// GO TO NEXT CHAR, WITH SELECTION ///////////////// ;----------------------------------------------------------------------------- - mov eax,[pos.x] + mov eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] inc eax - cmp eax,[columns] + cmp eax,[cur_tab.Editor.Columns] ;! eax,[columns] jbe @f dec eax @@: test byte[shi+2],0x01 jnz @f - mov [sel.x],eax - @@: mov [pos.x],eax + mov [cur_tab.Editor.SelStart.X],eax ;! [sel.x],eax + @@: mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax call check_inv_all .exit: @@ -819,8 +828,8 @@ func key.pgup ;///// GO TO PREVIOUS PAGE ///////////////////////////////////// ;----------------------------------------------------------------------------- mov edx,[lines.scr] dec edx - mov eax,[pos.y] - mov ecx,[top_line] + mov eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] + mov ecx,[cur_tab.Editor.TopLeft.Y] ;! ecx,[top_line] sub eax,edx jns @f xor eax,eax @@ -829,7 +838,7 @@ func key.pgup ;///// GO TO PREVIOUS PAGE ///////////////////////////////////// xor ecx,ecx @@: test byte[shi+2],0x01 jnz @f - mov [sel.y],eax + mov [cur_tab.Editor.SelStart.Y],eax ;! [sel.y],eax @@: call check_inv_all.skip_init .exit: @@ -846,17 +855,17 @@ func key.pgdn ;///// GO TO NEXT PAGE ///////////////////////////////////////// ;----------------------------------------------------------------------------- mov edx,[lines.scr] dec edx - mov eax,[pos.y] - mov ecx,[top_line] + mov eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] + mov ecx,[cur_tab.Editor.TopLeft.Y] ;! ecx,[top_line] add eax,edx add ecx,edx - cmp eax,[lines] + cmp eax,[cur_tab.Editor.Lines] ;! eax,[lines] jb @f - mov eax,[lines] + mov eax,[cur_tab.Editor.Lines] ;! eax,[lines] dec eax @@: test byte[shi+2],0x01 jnz @f - mov [sel.y],eax + mov [cur_tab.Editor.SelStart.Y],eax ;! [sel.y],eax @@: call check_inv_all.skip_init .exit: @@ -871,10 +880,10 @@ func key.home ;///// GO TO LINE START //////////////////////////////////////// ;----------------------------------------------------------------------------- key.shift_home: ;///// GO TO LINE START, WITH SELECTION ///////////////// ;----------------------------------------------------------------------------- - mov [pos.x],0 + mov [cur_tab.Editor.Caret.X],0 ;! [pos.x],0 test byte[shi+2],0x01 jnz @f - mov [sel.x],0 + mov [cur_tab.Editor.SelStart.X],0 ;! [sel.x],0 @@: call check_inv_all .exit: @@ -889,13 +898,13 @@ func key.end ;///// GO TO LINE END /////////////////////////////////////////// ;----------------------------------------------------------------------------- key.shift_end: ;///// GO TO LINE END, WITH SELECTION //////////////////// ;----------------------------------------------------------------------------- - mov ecx,[pos.y] + mov ecx,[cur_tab.Editor.Caret.Y] ;! ecx,[pos.y] call get_line_offset call get_real_length - mov [pos.x],eax + mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax test byte[shi+2],0x01 jnz @f - mov [sel.x],eax + mov [cur_tab.Editor.SelStart.X],eax ;! [sel.x],eax @@: call check_inv_all .exit: @@ -910,11 +919,11 @@ func key.ctrl_home ;///// GO TO PAGE START /////////////////////////////////// ;----------------------------------------------------------------------------- key.shift_ctrl_home: ;///// GO TO PAGE START, WITH SELECTION //////////// ;----------------------------------------------------------------------------- - mov eax,[top_line] + mov eax,[cur_tab.Editor.TopLeft.Y] ;! eax,[top_line] mov ecx,eax test byte[shi+2],0x01 jnz @f - mov [sel.y],eax + mov [cur_tab.Editor.SelStart.Y],eax ;! [sel.y],eax @@: call check_inv_all.skip_init .exit: @@ -929,16 +938,16 @@ func key.ctrl_end ;///// GO TO PAGE END ////////////////////////////////////// ;----------------------------------------------------------------------------- key.shift_ctrl_end: ;///// GO TO PAGE END, WITH SELECTION /////////////// ;----------------------------------------------------------------------------- - mov ecx,[top_line] + mov ecx,[cur_tab.Editor.TopLeft.Y] ;! ecx,[top_line] mov eax,[lines.scr] - cmp eax,[lines] + cmp eax,[cur_tab.Editor.Lines] ;! eax,[lines] jle @f - mov eax,[lines] + mov eax,[cur_tab.Editor.Lines] ;! eax,[lines] @@: add eax,ecx dec eax test byte[shi+2],0x01 jnz @f - mov [sel.y],eax + mov [cur_tab.Editor.SelStart.Y],eax ;! [sel.y],eax @@: call check_inv_all.skip_init .exit: @@ -954,11 +963,11 @@ func key.ctrl_pgup ;///// GO TO DOCUMENT START /////////////////////////////// key.shift_ctrl_pgup: ;///// GO TO DOCUMENT START, WITH SELECTION //////// ;----------------------------------------------------------------------------- xor eax,eax - mov [top_line],eax - mov [pos.y],eax + mov [cur_tab.Editor.TopLeft.Y],eax ;! [top_line],eax + mov [cur_tab.Editor.Caret.Y],eax ;! [pos.y],eax test byte[shi+2],0x01 jnz @f - mov [sel.y],eax + mov [cur_tab.Editor.SelStart.Y],eax ;! [sel.y],eax @@: call check_inv_all.skip_check .exit: @@ -973,17 +982,18 @@ func key.ctrl_pgdn ;///// GO TO DOCUMENT END ///////////////////////////////// ;----------------------------------------------------------------------------- key.shift_ctrl_pgdn: ;///// GO TO DOCUMENT END, WITH SELECTION ////////// ;----------------------------------------------------------------------------- - mov eax,[lines] ; eax = lines in the file - mov [pos.y],eax + mov eax,[cur_tab.Editor.Lines] ;! eax,[lines] ; eax = lines in the file + mov [cur_tab.Editor.Caret.Y],eax ;! [pos.y],eax sub eax,[lines.scr] ; eax -= lines on the screen jns @f xor eax,eax - @@: mov [top_line],eax - dec [pos.y] + @@: mov [cur_tab.Editor.TopLeft.Y],eax ;! [top_line],eax + dec [cur_tab.Editor.Caret.Y] ;! [pos.y] test byte[shi+2],0x01 jnz @f - push [pos.y] - pop [sel.y] + m2m [cur_tab.Editor.SelStart.Y],[cur_tab.Editor.Caret.Y] +;! push [pos.y] +;! pop [sel.y] @@: call check_inv_all.skip_check .exit: @@ -996,7 +1006,7 @@ func key.del ;///// DELETE NEXT CHAR OR SELECTION //////////////////////////// call delete_selection jnc .exit.2 - mov ecx,[pos.y] + mov ecx,[cur_tab.Editor.Caret.Y] ;! ecx,[pos.y] call get_line_offset and dword[esi],not 0x00020000 or dword[esi],0x00010000 @@ -1007,7 +1017,7 @@ func key.del ;///// DELETE NEXT CHAR OR SELECTION //////////////////////////// or eax,eax je .line_up - mov ecx,[pos.x] + mov ecx,[cur_tab.Editor.Caret.X] ;! ecx,[pos.x] cmp ecx,eax jae .line_up lea edi,[ebx+ecx] @@ -1018,7 +1028,7 @@ func key.del ;///// DELETE NEXT CHAR OR SELECTION //////////////////////////// je .line_up mov edi,ebx - mov ecx,[pos.x] + mov ecx,[cur_tab.Editor.Caret.X] ;! ecx,[pos.x] add edi,ecx lea esi,[edi+1] neg ecx @@ -1028,23 +1038,25 @@ func key.del ;///// DELETE NEXT CHAR OR SELECTION //////////////////////////// rep movsb mov byte[edi],' ' - m2m [sel.x],[pos.x] - m2m [sel.y],[pos.y] + m2m [cur_tab.Editor.SelStart.X],[cur_tab.Editor.Caret.X] ;! [sel.x],[pos.x] + m2m [cur_tab.Editor.SelStart.Y],[cur_tab.Editor.Caret.Y] ;! [sel.y],[pos.y] call check_inv_all - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 ret .line_up: - mov eax,[lines] + mov eax,[cur_tab.Editor.Lines] ;! eax,[lines] dec eax - cmp eax,[pos.y] + cmp eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] je .exit - mov edi,AREA_TEMP+4 + mov edi,[temp_buf] ;! AREA_TEMP+4 + add edi,4 mov esi,ebx - mov ecx,[pos.x] + mov ecx,[cur_tab.Editor.Caret.X] ;! ecx,[pos.x] rep movsb - mov ecx,[pos.x] - mov [AREA_TEMP],ecx + mov ecx,[cur_tab.Editor.Caret.X] ;! ecx,[pos.x] + mov eax,[temp_buf] + mov [eax],ecx ;! [AREA_TEMP],ecx cmp cx,[ebp] jbe @f movzx eax,word[ebp] @@ -1056,20 +1068,24 @@ func key.del ;///// DELETE NEXT CHAR OR SELECTION //////////////////////////// movzx eax,word[ebp] add esi,eax;[ebp] movzx ecx,word[esi-4] - add [AREA_TEMP],ecx - or dword[AREA_TEMP],0x00010000 + mov eax,[temp_buf] + add [eax],ecx ;! [AREA_TEMP],ecx + or dword[eax],0x00010000 ;! dword[AREA_TEMP],0x00010000 rep movsb - lea ecx,[edi-AREA_TEMP] + mov ecx,edi ;! [edi-AREA_TEMP] + sub ecx,[temp_buf] - mov esi,AREA_TEMP + mov esi,[temp_buf] ;! AREA_TEMP call get_real_length - cmp eax,[columns] + cmp eax,[cur_tab.Editor.Columns] ;! eax,[columns] jbe @f - mov [columns],eax + mov [cur_tab.Editor.Columns],eax ;! [columns],eax @@: push ecx - mov edi,AREA_TEMP2 + mov edi,[cur_tab.Editor.Data] ;! AREA_TEMP2 + add edi,[edi-4] + dec edi lea esi,[edi+8] sub esi,ecx movzx eax,word[ebp] @@ -1092,27 +1108,28 @@ func key.del ;///// DELETE NEXT CHAR OR SELECTION //////////////////////////// add esi,eax;[esi-8] movzx eax,word[esi-4] add esi,eax;[esi-4] - mov ecx,AREA_TEMP2 + mov ecx,[cur_tab.Editor.Data] ;! AREA_TEMP2 + add ecx,[ecx-4] sub ecx,esi cld @@: rep movsb .lp1: pop ecx - mov esi,AREA_TEMP + mov esi,[temp_buf] ;! AREA_TEMP mov edi,ebp cld rep movsb .ok.dec.lines: - dec [lines] - mov eax,[lines] - cmp [pos.y],eax + dec [cur_tab.Editor.Lines] ;! [lines] + mov eax,[cur_tab.Editor.Lines] ;! eax,[lines] + cmp [cur_tab.Editor.Caret.Y],eax ;! [pos.y],eax jb @f dec eax - mov [pos.y],eax - @@: m2m [sel.x],[pos.x] - m2m [sel.y],[pos.y] + mov [cur_tab.Editor.Caret.Y],eax ;! [pos.y],eax + @@: m2m [cur_tab.Editor.SelStart.X],[cur_tab.Editor.Caret.X] ;! [sel.x],[pos.x] + m2m [cur_tab.Editor.SelStart.Y],[cur_tab.Editor.Caret.Y] ;! [sel.y],[pos.y] - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 .exit.2: call check_inv_all @@ -1135,23 +1152,23 @@ func key.bkspace ;///// DELETE PREVIOUS CHAR OR SELECTION //////////////////// call delete_selection jnc key.del.exit.2 - mov eax,[pos.x] + mov eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] dec eax js .line_up - dec [pos.x] - mov ecx,[pos.y] + dec [cur_tab.Editor.Caret.X] ;! [pos.x] + mov ecx,[cur_tab.Editor.Caret.Y] ;! ecx,[pos.y] call get_line_offset and dword[esi],not 0x00020000 or dword[esi],0x00010000 mov ebx,eax call get_real_length - cmp eax,[pos.x] + cmp eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] jae @f - m2m [sel.x],[pos.x] + m2m [cur_tab.Editor.SelStart.X],[cur_tab.Editor.Caret.X] ;! [sel.x],[pos.x] call check_inv_all - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 ret @@: lea edi,[esi+4+ebx] @@ -1165,17 +1182,17 @@ func key.bkspace ;///// DELETE PREVIOUS CHAR OR SELECTION //////////////////// rep movsb mov byte[edi],' ' - m2m [sel.x],[pos.x] - m2m [sel.y],[pos.y] + m2m [cur_tab.Editor.SelStart.X],[cur_tab.Editor.Caret.X] ;! [sel.x],[pos.x] + m2m [cur_tab.Editor.SelStart.Y],[cur_tab.Editor.Caret.Y] ;! [sel.y],[pos.y] call check_inv_str - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 ret .line_up: - cmp [pos.y],0 + cmp [cur_tab.Editor.Caret.Y],0 ;! [pos.y],0 jne @f ret - @@: mov ecx,[pos.y] + @@: mov ecx,[cur_tab.Editor.Caret.Y] ;! ecx,[pos.y] dec ecx call get_line_offset and dword[esi],not 0x00020000 @@ -1188,8 +1205,8 @@ func key.bkspace ;///// DELETE PREVIOUS CHAR OR SELECTION //////////////////// jne @f dec ecx jg @b - @@: mov [pos.x],ecx - dec [pos.y] + @@: mov [cur_tab.Editor.Caret.X],ecx ;! [pos.x],ecx + dec [cur_tab.Editor.Caret.Y] ;! [pos.y] cld jmp key.del.line_up endf @@ -1198,7 +1215,7 @@ endf func key.tab ;///// TABULATE ///////////////////////////////////////////////// ;----------------------------------------------------------------------------- call delete_selection - mov eax,[pos.x] + mov eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] mov ecx,eax add eax,ATABW @@ -1206,7 +1223,7 @@ func key.tab ;///// TABULATE ///////////////////////////////////////////////// push eax ' ' sub eax,ecx .direct: - mov ecx,[pos.y] + mov ecx,[cur_tab.Editor.Caret.Y] ;! ecx,[pos.y] call get_line_offset and dword[esi],not 0x00020000 or dword[esi],0x00010000 @@ -1214,22 +1231,25 @@ func key.tab ;///// TABULATE ///////////////////////////////////////////////// xchg eax,ecx call get_real_length - cmp eax,[pos.x] + cmp eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] jae @f - mov eax,[pos.x] + mov eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] @@: movzx edx,word[esi] sub edx,eax cmp ecx,edx jl @f pushad; esi ecx eax - mov ecx,AREA_TEMP2-10+1 + mov ecx,[cur_tab.Editor.Data] ;! AREA_TEMP2-10+1 + add ecx,[ecx-4] + dec ecx + mov edi,ecx ;! AREA_TEMP2 + add ecx,-10+1 ; lea eax,[esi+4] ; add eax,[esi] movzx eax,word[esi] lea eax,word[esi+eax+4] sub ecx,eax - mov edi,AREA_TEMP2 - mov esi,AREA_TEMP2-10 + lea esi,[edi-10] ;! AREA_TEMP2-10 std rep movsb mov ecx,10 @@ -1248,26 +1268,26 @@ func key.tab ;///// TABULATE ///////////////////////////////////////////////// sub esi,ecx lea ecx,[esi+1] sub ecx,ebx - sub ecx,[pos.x] + sub ecx,[cur_tab.Editor.Caret.X] ;! ecx,[pos.x] std rep movsb .ok: pop ecx ;******* pop eax rep stosb cld - pop [pos.x] + pop [cur_tab.Editor.Caret.X] ;! [pos.x] lea esi,[ebx-4] call get_real_length - cmp eax,[pos.x] + cmp eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] jae @f - mov eax,[pos.x] - @@: cmp eax,[columns] + mov eax,[cur_tab.Editor.Caret.X] ;! eax,[pos.x] + @@: cmp eax,[cur_tab.Editor.Columns] ;! eax,[columns] jbe @f - mov [columns],eax - @@: m2m [sel.x],[pos.x] - m2m [sel.y],[pos.y] + mov [cur_tab.Editor.Columns],eax ;! [columns],eax + @@: m2m [cur_tab.Editor.SelStart.X],[cur_tab.Editor.Caret.X] ;! [sel.x],[pos.x] + m2m [cur_tab.Editor.SelStart.Y],[cur_tab.Editor.Caret.Y] ;! [sel.y],[pos.y] call check_inv_all - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 .exit: ret @@ -1278,10 +1298,10 @@ func key.return ;///// CARRIAGE RETURN /////////////////////////////////////// ;----------------------------------------------------------------------------- call delete_selection - mov ecx,[pos.y] + mov ecx,[cur_tab.Editor.Caret.Y] ;! ecx,[pos.y] call get_line_offset - mov ebx,[pos.x] + mov ebx,[cur_tab.Editor.Caret.X] ;! ebx,[pos.x] cmp bx,[esi] jb @f movzx ebx,word[esi] @@ -1291,10 +1311,9 @@ func key.return ;///// CARRIAGE RETURN /////////////////////////////////////// @@: cld - mov edi,AREA_TEMP + mov edi,[temp_buf] ;! AREA_TEMP mov ebp,esi - mov ecx,ebx - inc ecx + lea ecx,[ebx+1] @@: dec ecx jz @f cmp byte[esi+ecx+4-1],' ' @@ -1343,7 +1362,7 @@ func key.return ;///// CARRIAGE RETURN /////////////////////////////////////// .lp2: xor eax,eax @@: mov edx,edi add edi,4 - mov [pos.x],eax + mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax jecxz @f push ecx mov ecx,eax @@ -1361,10 +1380,13 @@ func key.return ;///// CARRIAGE RETURN /////////////////////////////////////// or eax,0x00010000 mov [edx],eax - lea ecx,[edi-AREA_TEMP] + mov ecx,edi ;! [edi-AREA_TEMP] + sub ecx,[temp_buf] push ecx - mov edi,AREA_TEMP2 + mov edi,[cur_tab.Editor.Data] ;! AREA_TEMP2 + add edi,[edi-4] + dec edi lea esi,[edi+4] sub esi,ecx movzx ecx,word[ebp] @@ -1380,25 +1402,77 @@ func key.return ;///// CARRIAGE RETURN /////////////////////////////////////// lea edi,[esi+eax-4] movzx ecx,word[ebp] add esi,ecx;[ebp] - mov ecx,AREA_TEMP2 + mov ecx,[cur_tab.Editor.Data] ;! AREA_TEMP2 + add ecx,[ecx-4] sub ecx,esi cld @@: rep movsb .lp3: pop ecx - mov esi,AREA_TEMP + mov esi,[temp_buf] ;! AREA_TEMP mov edi,ebp cld rep movsb - inc [pos.y] - inc [sel.y] - inc [lines] + inc [cur_tab.Editor.Caret.Y] ;! [pos.y] + inc [cur_tab.Editor.SelStart.Y] ;! [sel.y] + inc [cur_tab.Editor.Lines] ;! [lines] - m2m [sel.x],[pos.x] + m2m [cur_tab.Editor.SelStart.X],[cur_tab.Editor.Caret.X] ;! [sel.x],[pos.x] call check_inv_all - mov [modified],1 + mov [cur_tab.Editor.Modified],1 ;! [modified],1 .exit: ret -endf \ No newline at end of file +endf + +;----------------------------------------------------------------------------- +func key.ctrl_tab ;///// SWITCH TO NEXT TAB ////////////////////////////////// +;----------------------------------------------------------------------------- + cmp [tab_bar.Items.Count],1 + je .exit + xor eax,eax + mov ebp,[tab_bar.Items] + @@: cmp ebp,[tab_bar.Current.Ptr] + je @f + inc eax + add ebp,sizeof.TABITEM + jmp @b + @@: add ebp,sizeof.TABITEM + inc eax + cmp eax,[tab_bar.Items.Count] + jb @f + mov ebp,[tab_bar.Items] + @@: call set_cur_tab + call align_editor_in_tab + call draw_editor + call draw_tabctl + .exit: + ret +endf + +;----------------------------------------------------------------------------- +func key.shift_ctrl_tab ;///// SWITCH TO PREVIOUS TAB //////////////////////// +;----------------------------------------------------------------------------- + cmp [tab_bar.Items.Count],1 + je .exit + xor eax,eax + mov ebp,[tab_bar.Items] + @@: cmp ebp,[tab_bar.Current.Ptr] + je @f + inc eax + add ebp,sizeof.TABITEM + jmp @b + @@: add ebp,-sizeof.TABITEM + dec eax + jge @f + imul eax,[tab_bar.Items.Count],sizeof.TABITEM + add eax,[tab_bar.Items] + lea ebp,[eax-sizeof.TABITEM] + @@: call set_cur_tab + call align_editor_in_tab + call draw_editor + call draw_tabctl + .exit: + ret +endf diff --git a/programs/develop/tinypad/trunk/tp-locale.inc b/programs/develop/tinypad/trunk/tp-locale.inc new file mode 100644 index 0000000000..7f87b8f9c9 --- /dev/null +++ b/programs/develop/tinypad/trunk/tp-locale.inc @@ -0,0 +1,179 @@ + +sz htext,'TINYPAD ',APP_VERSION + +menubar_res main_menu,\ + ru,'Файл' ,mm.File ,onshow.file ,\ + ru,'Правка' ,mm.Edit ,onshow.edit ,\ + ru,'Поиск' ,mm.Search ,onshow.search ,\ + ru,'Запуск' ,mm.Run ,onshow.run ,\ + ru,'Кодировка',mm.Encoding,onshow.recode ,\ + ru,'Опции' ,mm.Options ,onshow.options,\ +\ + en,'File' ,mm.File ,onshow.file ,\ + en,'Edit' ,mm.Edit ,onshow.edit ,\ + en,'Search' ,mm.Search ,onshow.search ,\ + en,'Run' ,mm.Run ,onshow.run ,\ + en,'Encoding',mm.Encoding,onshow.recode ,\ + en,'Options' ,mm.Options ,onshow.options + +popup_res mm.File,\ + ru,'Новый' ,'Ctrl+N' ,New ,\ + ru,'Открыть...' ,'Ctrl+O' ,Open ,\ + ru,'Сохранить' ,'Ctrl+S' ,Save ,\ + ru,'Сохранить как...','Ctrl+Shift+S',SaveAs,\ + ru,'-' ,'' , ,\ + ru,'Выход' ,'Alt+X' ,Exit ,\ +\ + en,'New' ,'Ctrl+N' ,New ,\ + en,'Open...' ,'Ctrl+O' ,Open ,\ + en,'Save' ,'Ctrl+S' ,Save ,\ + en,'Save as...','Ctrl+Shift+S',SaveAs,\ + en,'-' ,'' , ,\ + en,'Exit' ,'Alt+X' ,Exit + +popup_res mm.Edit,\ + ru,'Вырезать' ,'Ctrl+X',Cut ,\ + ru,'Копировать' ,'Ctrl+C',Copy ,\ + ru,'Вставить' ,'Ctrl+V',Insert,\ + ru,'Удалить' ,'' ,Delete,\ + ru,'-' ,'' , ,\ + ru,'Выделить всё','Ctrl+A',SelAll,\ +\ + en,'Cut' ,'Ctrl+X',Cut ,\ + en,'Copy' ,'Ctrl+C',Copy ,\ + en,'Paste' ,'Ctrl+V',Insert,\ + en,'Delete' ,'' ,Delete,\ + en,'-' ,'' , ,\ + en,'Select all','Ctrl+A',SelAll + +popup_res mm.Search,\ + ru,'Перейти...' ,'Ctrl+G',Position,\ + ru,'-' ,'' , ,\ + ru,'Найти...' ,'Ctrl+F',Find ,\ + ru,'Найти далее','F3' ,FindNext,\ + ru,'Заменить...','Ctrl+H',Replace ,\ +\ + en,'Position...','Ctrl+G',Position,\ + en,'-' ,'' , ,\ + en,'Find...' ,'Ctrl+F',Find ,\ + en,'Find next' ,'F3' ,FindNext,\ + en,'Replace...' ,'Ctrl+H',Replace + +popup_res mm.Run,\ + ru,'Запустить' ,'F9' ,Run ,\ + ru,'Компилировать' ,'Ctrl+F9',Compile ,\ + ru,'-' ,'' , ,\ + ru,'Доска отладки' ,'' ,DbgBoard,\ + ru,'Системные функции','' ,SysFuncs,\ +\ + en,'Run' ,'F9' ,Run ,\ + en,'Compile' ,'Ctrl+F9',Compile ,\ + en,'-' ,'' , ,\ + en,'Debug board' ,'' ,DbgBoard,\ + en,'System functions' ,'' ,SysFuncs + +popup_res mm.Encoding,\ + @!,'CP866 -> CP1251','',CP866.CP1251,\ + @!,'CP1251 -> CP866' ,'',CP1251.CP866,\ + @!,'-' ,'', ,\ + @!,'CP866 -> KOI8-R','',CP866.KOI8R ,\ + @!,'KOI8-R -> CP866' ,'',KOI8R.CP866 ,\ + @!,'-' ,'', ,\ + @!,'CP1251 -> KOI8-R','',CP1251.KOI8R,\ + @!,'KOI8-R -> CP1251','',KOI8R.CP1251 + +popup_res mm.Options,\ + ru,'Внешний вид...' ,'',Appearance ,\ + ru,'-' ,'', ,\ + ru,'Безопасное выделение' ,'',SecureSel ,\ + ru,'Автоматические скобки' ,'',AutoBrackets,\ + ru,'Автоматический отступ' ,'',AutoIndents ,\ + ru,'Умная табуляция' ,'',SmartTabs ,\ + ru,'Оптимальное сохранение','',OptimalFill ,\ + ru,'-' ,'', ,\ + ru,'Номера строк' ,'',LineNumbers ,\ +\ + en,'Appearance...' ,'',Appearance ,\ + en,'-' ,'', ,\ + en,'Secure selection' ,'',SecureSel ,\ + en,'Automatic brackets' ,'',AutoBrackets,\ + en,'Automatic indents' ,'',AutoIndents ,\ + en,'Smart tabulation' ,'',SmartTabs ,\ + en,'Optimal fill on saving','',OptimalFill ,\ + en,'-' ,'', ,\ + en,'Line numbers' ,'',LineNumbers + +lsz s_modified,\ + ru,'Изменено',\ + en,'Modified' + +lsz s_2filename,\ + ru,'Имя файла:',\ + en,'Filename:' +lsz s_2open,\ + ru,'Открыть',\ + en,'Open' +lsz s_2save,\ + ru,'Сохранить',\ + en,'Save' +lsz s_2find,\ + ru,'Найти',\ + en,'Find' +db ':' +lsz s_2replace,\ + ru,'Заменить',\ + en,'Replace' +db ':' +lsz s_2cancel,\ + ru,'Отмена',\ + en,'Cancel' + +lsz s_enter_filename,\ + ru,<'Введите имя файла',0>,\ + en,<'Enter filename',0> + +lsz s_enter_text_to_find,\ + ru,<'Введите текст для поиска',0>,\ + en,<'Enter text to find',0> + +lsz s_enter_text_to_replace,\ + ru,<'Введите текст для замены',0>,\ + en,<'Enter text to replace',0> + +lsz s_text_not_found,\ + ru,<'Достигнут конец файла, текст не найден',0>,\ + en,<'Reached end of file, text not found',0> + +lszc s_fs_error,b,\ + ru,<'Операция завершена успешно (0)',0>,\ + ru,<'',0>,\ + ru,<'Функция не поддерживается для данной файловой системы (2)',0>,\ + ru,<'Неизвестная файловая система (3)',0>,\ + ru,<'',0>,\ + ru,<'Невозможно открыть файл (5)',0>,\ + ru,<'Операция завершена успешно (6)',0>,\ + ru,<'Адрес находится за границами памяти программы (7)',0>,\ + ru,<'На диске нет свободного места (8)',0>,\ + ru,<'Таблица FAT уничтожена (9)',0>,\ + ru,<'Доступ запрещён (10)',0>,\ + ru,<'Ошибка устройства (11)',0>,\ +\ + en,<'Operation executed successfully (0)',0>,\ + en,<'',0>,\ + en,<'Function is not supported for the given filesystem (2)',0>,\ + en,<'Unknown filesystem (3)',0>,\ + en,<'',0>,\ + en,<'Unable to open file (5)',0>,\ + en,<'Operation executed successfully (6)',0>,\ + en,<'Pointer lies outside of application memory (7)',0>,\ + en,<'Disk is full (8)',0>,\ + en,<'FAT table is destroyed (9)',0>,\ + en,<'Access denied (10)',0>,\ + en,<'Device error (11)',0> + +lsz sysfuncs_filename,\ + ru,<'SYSFUNCR.TXT',0>,\ + en,<'SYSFUNCS.TXT',0> + +sz s_example,'EXAMPLE.ASM' +sz s_still ,'still' diff --git a/programs/develop/tinypad/trunk/tp-mouse.asm b/programs/develop/tinypad/trunk/tp-mouse.asm index 730db68c84..1372b9600a 100644 --- a/programs/develop/tinypad/trunk/tp-mouse.asm +++ b/programs/develop/tinypad/trunk/tp-mouse.asm @@ -123,7 +123,7 @@ mouse: call check_mouse_in_edit_area jnc still.skip_write mcall 37,0 - mov [popup_edit+POPUP.pos],eax + mov [mm.Edit+POPUP.pos],eax @@: mcall 37,2 cmp eax,ebx jnz @f @@ -131,7 +131,7 @@ mouse: jmp @b @@: and [mst],0xFD call onshow.edit - mov dword[POPUP_STACK],popup_edit + mov dword[POPUP_STACK],mm.Edit mcall 51,1,popup_thread_start,POPUP_STACK mov [h_popup],eax jmp still.skip_write @@ -157,31 +157,31 @@ mouse: cdq;xor edx,edx mov ecx,LINEH idiv ecx - @@: add eax,[top_line] + @@: add eax,[cur_tab.Editor.TopLeft.Y] ;! eax,[top_line] mov ebx,eax pop eax cdq;xor edx,edx mov ecx,6 idiv ecx - @@: add eax,[left_col] + @@: add eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] - cmp eax,[columns] + cmp eax,[cur_tab.Editor.Columns] ;! eax,[columns] jl @f - mov eax,[columns] - @@: cmp ebx,[lines] + mov eax,[cur_tab.Editor.Columns] ;! eax,[columns] + @@: cmp ebx,[cur_tab.Editor.Lines] ;! ebx,[lines] jl @f - mov ebx,[lines] + mov ebx,[cur_tab.Editor.Lines] ;! ebx,[lines] dec ebx @@: - cmp [pos.x],eax + cmp [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax jne .change_cur_pos - cmp [pos.y],ebx + cmp [cur_tab.Editor.Caret.Y],ebx ;! [pos.y],ebx je still.skip_write .change_cur_pos: - mov [pos.x],eax - mov eax,[pos.y] - mov [pos.y],ebx + mov [cur_tab.Editor.Caret.X],eax ;! [pos.x],eax + mov eax,[cur_tab.Editor.Caret.Y] ;! eax,[pos.y] + mov [cur_tab.Editor.Caret.Y],ebx ;! [pos.y],ebx call check_cur_vis_inv jc .check_ldown ; cmp eax,ebx @@ -213,20 +213,20 @@ mouse: ; sub ebx,[__rc+0x4] cmp [vscrl_capt],0 jge .vcaptured - mov eax,[vscrl_top] + mov eax,[cur_tab.Editor.VScroll.Top] ;! eax,[vscrl_top] cmp ebx,eax jb .center_vcapture - add eax,[vscrl_size] + add eax,[cur_tab.Editor.VScroll.Size] ;! eax,[vscrl_size] cmp ebx,eax jae .center_vcapture mov eax,ebx - sub eax,[vscrl_top] + sub eax,[cur_tab.Editor.VScroll.Top] ;! eax,[vscrl_top] dec eax mov [vscrl_capt],eax dec ebx jmp .vcaptured .center_vcapture: - mov eax,[vscrl_size] + mov eax,[cur_tab.Editor.VScroll.Size] ;! eax,[vscrl_size] shr eax,1 mov [vscrl_capt],eax .vcaptured: @@ -236,24 +236,24 @@ mouse: @@: mov [mouse_captured],1 mov eax,[bot_ofs] sub eax,[top_ofs] - sub eax,[vscrl_size] + sub eax,[cur_tab.Editor.VScroll.Size] ;! eax,[vscrl_size] sub eax,SCRLW*3-2 cmp eax,ebx jge @f mov ebx,eax @@: - mov [vscrl_top],ebx - mov eax,[lines] + mov [cur_tab.Editor.VScroll.Top],ebx ;! [vscrl_top],ebx + mov eax,[cur_tab.Editor.Lines] ;! eax,[lines] sub eax,[lines.scr] imul ebx mov ebx,[bot_ofs] sub ebx,[top_ofs] sub ebx,SCRLW*3-2 ;** - sub ebx,[vscrl_size] + sub ebx,[cur_tab.Editor.VScroll.Size] ;! ebx,[vscrl_size] idiv ebx - cmp eax,[top_line] + cmp eax,[cur_tab.Editor.TopLeft.Y] ;! eax,[top_line] je still.skip_write - mov [top_line],eax + mov [cur_tab.Editor.TopLeft.Y],eax ;! [top_line],eax call check_bottom_right call draw_file jmp still.skip_write @@ -274,20 +274,20 @@ mouse: ; sub ebx,[__rc+0x0] cmp [hscrl_capt],0 jge .hcaptured - mov eax,[hscrl_top] + mov eax,[cur_tab.Editor.HScroll.Top] ;! eax,[hscrl_top] cmp ebx,eax jl .center_hcapture - add eax,[hscrl_size] + add eax,[cur_tab.Editor.HScroll.Size] ;! eax,[hscrl_size] cmp ebx,eax jge .center_hcapture mov eax,ebx - sub eax,[hscrl_top] + sub eax,[cur_tab.Editor.HScroll.Top] ;! eax,[hscrl_top] dec eax mov [hscrl_capt],eax dec ebx jmp .hcaptured .center_hcapture: - mov eax,[hscrl_size] + mov eax,[cur_tab.Editor.HScroll.Size] ;! eax,[hscrl_size] shr eax,1 mov [hscrl_capt],eax .hcaptured: @@ -296,23 +296,23 @@ mouse: xor ebx,ebx @@: mov [mouse_captured],1 mov eax,[p_info.box.width] - sub eax,[hscrl_size] + sub eax,[cur_tab.Editor.HScroll.Size] ;! eax,[hscrl_size] sub eax,SCRLW*3+10+1 cmp eax,ebx jge @f mov ebx,eax @@: - mov [hscrl_top],ebx - mov eax,[columns] + mov [cur_tab.Editor.HScroll.Top],ebx ;! [hscrl_top],ebx + mov eax,[cur_tab.Editor.Columns] ;! eax,[columns] sub eax,[columns.scr] imul ebx mov ebx,[p_info.box.width] sub ebx,SCRLW*3+10+1 ;** - sub ebx,[hscrl_size] + sub ebx,[cur_tab.Editor.HScroll.Size] ;! ebx,[hscrl_size] idiv ebx - cmp eax,[left_col] + cmp eax,[cur_tab.Editor.TopLeft.X] ;! eax,[left_col] je still.skip_write - mov [left_col],eax + mov [cur_tab.Editor.TopLeft.X],eax ;! [left_col],eax call check_bottom_right call draw_file jmp still.skip_write @@ -373,52 +373,52 @@ endf onshow: .file: - or byte[popup_file+3],0x01 + or byte[mm.File+3],0x01 cmp [f_info.length],0 jne @f - and byte[popup_file+3],0xFE + and byte[mm.File+3],0xFE @@: ret .edit: - or byte[popup_edit+2],0x01 + or byte[mm.Edit+2],0x01 cmp [copy_size],0 jne @f - and byte[popup_edit+2],0xFE - @@: or dword[popup_edit+0],0x01000101 + and byte[mm.Edit+2],0xFE + @@: or dword[mm.Edit+0],0x01000101 cmp [sel.selected],0 jne @f - and dword[popup_edit+0],0xFEFFFEFE + and dword[mm.Edit+0],0xFEFFFEFE @@: ret .search: - mov byte[popup_search+0],0 - ;mov byte[popup_search+4],0 + mov byte[mm.Search+0],0 + ;mov byte[mm.Search+4],0 ret .run: ret .recode: ret .options: - mov word[popup_options+0],0 - mov byte[popup_options+5],0 - or byte[popup_options+2],0x02 + mov word[mm.Options+0],0 + mov byte[mm.Options+5],0 + or byte[mm.Options+2],0x02 test [options],OPTS_SECURESEL jnz @f - and byte[popup_options+2],0xFD - @@: or byte[popup_options+3],0x02 + and byte[mm.Options+2],0xFD + @@: or byte[mm.Options+3],0x02 test [options],OPTS_AUTOBRACES jnz @f - and byte[popup_options+3],0xFD - @@: or byte[popup_options+4],0x02 + and byte[mm.Options+3],0xFD + @@: or byte[mm.Options+4],0x02 test [options],OPTS_AUTOINDENT jnz @f - and byte[popup_options+4],0xFD - @@: or byte[popup_options+6],0x02 + and byte[mm.Options+4],0xFD + @@: or byte[mm.Options+6],0x02 test [options],OPTS_OPTIMSAVE jnz @f - and byte[popup_options+6],0xFD - @@: or byte[popup_options+8],0x02 + and byte[mm.Options+6],0xFD + @@: or byte[mm.Options+8],0x02 test [options],OPTS_LINENUMS jnz @f - and byte[popup_options+8],0xFD + and byte[mm.Options+8],0xFD @@: ret \ No newline at end of file diff --git a/programs/develop/tinypad/trunk/tp-recode.asm b/programs/develop/tinypad/trunk/tp-recode.asm index 48fe533405..1dde7fc81b 100644 --- a/programs/develop/tinypad/trunk/tp-recode.asm +++ b/programs/develop/tinypad/trunk/tp-recode.asm @@ -19,8 +19,8 @@ recode: mov edi,table.koi.1251 .main: - mov ecx,[lines] - mov esi,AREA_EDIT + mov ecx,[cur_tab.Editor.Lines] ;! ecx,[lines] + mov esi,[cur_tab.Editor.Data] ;! AREA_EDIT jecxz .exit xor eax,eax .lp0: dec ecx @@ -30,7 +30,7 @@ recode: @@: dec edx js .lp0 lodsb - add al,-$80 + add al,-$80 js @b mov al,[edi+eax] mov [esi-1],al diff --git a/programs/develop/tinypad/trunk/tp-tabctl.asm b/programs/develop/tinypad/trunk/tp-tabctl.asm new file mode 100644 index 0000000000..e808d2b69f --- /dev/null +++ b/programs/develop/tinypad/trunk/tp-tabctl.asm @@ -0,0 +1,294 @@ + +sz s_defname,'Untitled',0 + +;----------------------------------------------------------------------------- +func flush_cur_tab ;////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- +; EBP = TABITEM* +;----------------------------------------------------------------------------- + push ecx esi edi + mov esi,cur_tab + mov edi,[tab_bar.Current.Ptr] + mov ecx,sizeof.TABITEM/4 + cld + rep movsd + pop edi esi ecx + ret +endf + +;----------------------------------------------------------------------------- +func set_cur_tab ;//////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- +; EBP = TABITEM* +;----------------------------------------------------------------------------- + push ecx esi edi + cmp [tab_bar.Current.Ptr],0 + je @f + call flush_cur_tab + @@: mov esi,ebp + mov edi,cur_tab + mov ecx,sizeof.TABITEM/4 + rep movsd + mov [tab_bar.Current.Ptr],ebp + call update_caption + pop edi esi ecx + ret +endf + +;----------------------------------------------------------------------------- +func create_tab ;///////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push eax ecx esi edi + + inc [tab_bar.Items.Count] + imul ebx,[tab_bar.Items.Count],sizeof.TABITEM + mov eax,[tab_bar.Items] + mov ecx,eax + call mem.ReAlloc + mov [tab_bar.Items],eax + sub ecx,eax + sub [tab_bar.Current.Ptr],ecx + lea ebp,[eax+ebx-sizeof.TABITEM] + call set_cur_tab + + mov eax,1024 + call mem.Alloc + mov [cur_tab.Editor.Data],eax + mov [cur_tab.Editor.Lines],1 + mov [cur_tab.Editor.Columns],1 + xor eax,eax + mov [cur_tab.Editor.TopLeft.X],eax + mov [cur_tab.Editor.TopLeft.Y],eax + mov [cur_tab.Editor.Caret.X],eax + mov [cur_tab.Editor.Caret.Y],eax + mov [cur_tab.Editor.SelStart.X],eax + mov [cur_tab.Editor.SelStart.Y],eax + mov edi,[cur_tab.Editor.Data] + add edi,4 + mov ecx,10 + mov [edi-4],ecx + mov [edi+10],eax + mov al,' ' + cld + rep stosb + + mov esi,s_defname + mov edi,cur_tab.Editor.FilePath + mov ecx,s_defname.size + rep movsb + mov [cur_tab.Editor.FileName],0 + + mov [f_info.length],0 + mov [cur_tab.Editor.Modified],0 + mov [cur_tab.Editor.AsmMode],0 + + call flush_cur_tab + call update_caption + call drawwindow + + mov ebp,cur_tab + pop edi esi ecx eax + ret +endf + +;----------------------------------------------------------------------------- +func delete_tab ;///////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + ret +endf + +;----------------------------------------------------------------------------- +func get_tab_size ;/////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- +; EBP = TABITEM* +;----------------------------------------------------------------------------- + push eax + cmp [tab_bar.Style],3 + jae .lp1 + lea eax,[ebp+TABITEM.Editor.FilePath] + add eax,[ebp+TABITEM.Editor.FileName] + call strlen + imul ebx,eax,6 + add ebx,9 + jmp .lp2 + .lp1: call get_max_tab_width + mov ebx,eax + .lp2: mov ecx,TBARH-1 + pop eax + ret +endf + +;----------------------------------------------------------------------------- +func draw_tabctl ;//////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + + mov ebx,[tab_bar.Bounds.Left-2] + mov bx,word[tab_bar.Bounds.Right] + sub bx,word[tab_bar.Bounds.Left] + inc ebx + mov ecx,[tab_bar.Bounds.Top-2] + mov cx,word[tab_bar.Bounds.Bottom] + sub cx,word[tab_bar.Bounds.Top] + inc ecx + mov edx,[cl_3d_normal] + call draw_framerect + + mov al,[tab_bar.Style] + dec al + jz .tabs_on_top + dec al + jz .tabs_on_bottom + dec al + jz .tabs_on_left + dec al + jz .tabs_on_right + ret + + .tabs_on_top: + add ebx,1*65536-2 + mov ecx,[tab_bar.Bounds.Top-2] + xor cx,cx + add ecx,1*65536+TBARH + mcall 13 + add ecx,(TBARH-2)*65536-(TBARH-3) + mov edx,[cl_3d_inset] + call draw_framerect + ret + + .tabs_on_bottom: + add ebx,1*65536-2 + mov ecx,[tab_bar.Bounds.Bottom-2] + xor cx,cx + add ecx,-TBARH*65536+TBARH + mcall 13 + mov cx,1 + mcall ,,,[sc.work] + add ecx,-1*65536+2;-(TBARH-3) + mov edx,[cl_3d_inset] + call draw_framerect + + mov ecx,[tab_bar.Items.Count] + mov ebp,[tab_bar.Items] + mov esi,[tab_bar.Bounds.Left] + inc esi + mov edi,[tab_bar.Bounds.Bottom] + add edi,-TBARH+1 + @@: push ecx + + call get_tab_size + rol ebx,16 + mov bx,si + rol ebx,16 + rol ecx,16 + mov cx,di + rol ecx,16 + mov edx,[cl_3d_inset] + call draw_framerect + + cmp ebp,[tab_bar.Current.Ptr] + jne .lp1 + push ebx ecx + add ebx,1*65536-2 + dec ecx + mcall 13,,,[sc.work] + pop ecx ebx + .lp1: + pushad + lea eax,[ebp+TABITEM.Editor.FilePath] + add eax,[ebp+TABITEM.Editor.FileName] + mov edx,eax + call strlen + mov esi,eax + shr ecx,16 + mov bx,cx + add ebx,0x00050005 + mcall 4,,0x00000000 + popad + + movzx ebx,bx + lea esi,[esi+ebx+1] + add ebp,sizeof.TABITEM + + pop ecx + dec ecx + jnz @b + + ret + + .tabs_on_left: + call get_max_tab_width + mov ebx,[tab_bar.Bounds.Left-2] + mov bx,ax + add ebx,1*65536 + add ecx,1*65536-2 + push eax + mcall 13 + pop eax + add eax,-2 + shl eax,16 + add ebx,eax + mov bx,3 + mov edx,[cl_3d_inset] + call draw_framerect + ret + + .tabs_on_right: + call get_max_tab_width + mov ebx,[tab_bar.Bounds.Right-2] + mov bx,ax + shl eax,16 + sub ebx,eax + add ecx,1*65536-2 + mcall 13 + add ebx,-1*65536 + mov bx,3 + mov edx,[cl_3d_inset] + call draw_framerect + ret +endf + +func get_max_tab_width + mov eax,100 + ret +endf + +func align_editor_in_tab + m2m [cur_tab.Editor.Bounds.Left],[tab_bar.Bounds.Left] + m2m [cur_tab.Editor.Bounds.Top],[tab_bar.Bounds.Top] + m2m [cur_tab.Editor.Bounds.Right],[tab_bar.Bounds.Right] + m2m [cur_tab.Editor.Bounds.Bottom],[tab_bar.Bounds.Bottom] + + inc [cur_tab.Editor.Bounds.Left] + inc [cur_tab.Editor.Bounds.Top] + dec [cur_tab.Editor.Bounds.Right] + dec [cur_tab.Editor.Bounds.Bottom] + + mov al,[tab_bar.Style] + dec al + jz .tabs_on_top + dec al + jz .tabs_on_bottom + dec al + jz .tabs_on_left + dec al + jz .tabs_on_right + ret + + .tabs_on_top: + add [cur_tab.Editor.Bounds.Top],TBARH + ret + + .tabs_on_bottom: + sub [cur_tab.Editor.Bounds.Bottom],TBARH + ret + + .tabs_on_left: + call get_max_tab_width + add [cur_tab.Editor.Bounds.Left],eax + ret + + .tabs_on_right: + call get_max_tab_width + sub [cur_tab.Editor.Bounds.Right],eax + ret +endf \ No newline at end of file diff --git a/programs/develop/tinypad/trunk/tp-tbox.asm b/programs/develop/tinypad/trunk/tp-tbox.asm index 26db39c653..a639ebfe0b 100644 --- a/programs/develop/tinypad/trunk/tp-tbox.asm +++ b/programs/develop/tinypad/trunk/tp-tbox.asm @@ -85,6 +85,7 @@ func textbox.draw ; TBOX* ebp mov [tb.sel.x],ah mcall 13,dword[tbox.x],dword[tbox.y],[color_tbl+4*5];[sc.work] + mov edx,[cl_3d_inset] call draw_framerect call textbox.get_width