kolibrios-gitea/programs/network/ftpc/gui.inc
Kirill Lipatov (Leency) 273fe867a7 ftpc: restrict cursor move to existing nodes
git-svn-id: svn://kolibrios.org@7509 a494cfbc-eb01-0410-851d-a64ba20cac60
2018-10-30 15:09:41 +00:00

1209 lines
36 KiB
PHP
Executable File

include '../../load_img.inc'
include '../../develop/libraries/libs-dev/libimg/libimg.inc'
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
include '../../develop/libraries/box_lib/load_lib.mac'
@use_library_mem mem.Alloc, mem.Free, mem.ReAlloc, dll.Load
icon_tl_sys dd 0
icon_tl_nod dd 0
TLIST_SZ = 325+16 ;=341. 16 is x-size of scroll bar
TLIST1_X = 50
TLIST2_X = 409
BT_SZ_X = 40
SYS_COL = 0xe6e6e6
BT_COL = 0xcccccc
STR_COL = 0x595959 ;0x000000
; TODO: automatic resizing of GUI elements on window resizing
align 4
;;================================================================================================;;
gui: ;////////////////////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? GUI-specific functions ;;
;;------------------------------------------------------------------------------------------------;;
;> none ;;
;;------------------------------------------------------------------------------------------------;;
;< none ;;
;;================================================================================================;;
dd .init
dd .server_addr
dd .get_username
dd .get_cmd
dd .print
dd .set_flags
dd .list
dd .progress
dd .error
.init:
; load libraries
stdcall dll.Load, @IMPORT_GUI_LIBS
test eax, eax
jnz .exit
mcall 48, 3, sc, sizeof.system_colors
mcall 40, 0xC0000027 ; set event mask
ret
.server_addr:
mov [auto_list], 1
jmp login_gui.server_addr
.get_username:
jmp login_gui.get_username
;;================================================================================================;;
.main: ;//////////////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Initialize tree list, editbox and textedit elements ;;
;;------------------------------------------------------------------------------------------------;;
;> none ;;
;;------------------------------------------------------------------------------------------------;;
;< none ;;
;;================================================================================================;;
stdcall [ted_init], tedit0
stdcall dword[edit_box_set_text], edit_volume, root_dir
; initialize tree list elements
stdcall dword[tl_data_init], tree1
stdcall dword[tl_data_init], tree2
or dword[tree1.style], 8 ;tl_cursor_pos_limited - restrict cursor move to existing nodes
or dword[tree2.style], 8 ;tl_cursor_pos_limited
; read icons
load_image_file 'tl_sys_16.png', icon_tl_sys
mov [filestruct.ptr], eax
mov [filestruct.subfn], 0
mov [filestruct.offset], 54
mov [filestruct.size], ecx
mcall 70, filestruct
cmp ebx, 0
jl @f
m2m dword[tree1.data_img_sys], dword[icon_tl_sys]
m2m dword[tree2.data_img_sys], dword[icon_tl_sys]
@@:
; read nodes icon file
load_image_file 'tl_nod_16.png', icon_tl_nod
mov [filestruct.ptr], eax
;mov [filestruct.subfn], 0
;mov [filestruct.offset], 54
mov [filestruct.size], ecx
mcall 70, filestruct
cmp ebx, 0
jl @f
m2m dword[tree1.data_img], dword[icon_tl_nod]
m2m dword[tree2.data_img], dword[icon_tl_nod]
@@:
mcall 67, 35, 20, 830, 555 ; resize to main gui window's coordinates
call .draw
; create initial tree list for root_dir
call populate_local_tree_list
jmp arg_handler.connect
.get_cmd:
dec [auto_list]
jnz .redraw
call .clear_remote_tree
jmp cmd_list
.redraw:
call .draw
align 4
.still:
mcall 10
dec eax
jz .redraw
dec eax
jz .key
dec eax
jz .button
sub eax, 3
jz .mouse
jmp .still
.error:
jmp login_gui.error
.exit:
; stdcall mem.Free,[bmp_icon]
stdcall dword[tl_data_clear], tree1
stdcall dword[tl_data_clear], tree2
stdcall [ted_delete], tedit0
jmp exit
align 4
.draw:
mcall 12, 1
; main window
mcall 0, <35,830>, <20,555>, 0x34000000+SYS_COL, 0x805080DD, str_title
;-------------------------
; textedit components
;-------------------------
mcall 9, procinfo, -1
mov edi, tedit0
call EvSize
movzx ebx,word[procinfo.client_box.width]
inc bx
mcall 13, , ted_wnd_t
stdcall [ted_draw], tedit0
; draw "disconnect" button
mcall 8, <50,95>, <25,25>, 3, BT_COL
; string "disconnect"
mcall 4, <50+5,25+5>, 0xb0000000+STR_COL, str_disconnect
; draw "Copy" button
mcall 8, <50,40>, <326,25>, 4, BT_COL
; string "copy"
mcall 4, <50+5,326+5>, 0xb0000000+STR_COL, str_copy
; draw "Search" button
mcall 8, <TLIST2_X+TLIST_SZ-55,55>, <20,25>, 5, BT_COL
; string "Search"
mcall 4, <TLIST2_X+TLIST_SZ-55+5,20+5>, 0xb0000000+STR_COL, str_search
; draw "LIST" button
mcall 8, <TLIST2_X+TLIST_SZ-4*BT_SZ_X-15,BT_SZ_X>, <50,25>, 12, BT_COL
; string "LIST"
mcall 4, <TLIST2_X+TLIST_SZ-4*BT_SZ_X-15+5,50+5>, 0xb0000000+STR_COL, str_list
; draw "DELE" button
mcall 8, <TLIST2_X+TLIST_SZ-3*BT_SZ_X-10,BT_SZ_X>, <50,25>, 7, BT_COL
; string "DELE"
mcall 4, <TLIST2_X+TLIST_SZ-3*BT_SZ_X-10+5,50+5>, 0xb0000000+STR_COL, str_dele
; draw "RDIR" button
mcall 8, <TLIST2_X+TLIST_SZ-2*BT_SZ_X-5,BT_SZ_X>, <50,25>, 8, BT_COL
; string "RDIR"
mcall 4, <TLIST2_X+TLIST_SZ-2*BT_SZ_X-5+5,50+5>, 0xb0000000+STR_COL, str_rdir
; draw "RMD" button
mcall 8, <TLIST2_X+TLIST_SZ-BT_SZ_X,BT_SZ_X>, <50,25>, 9, BT_COL
; string "RMD"
mcall 4, <TLIST2_X+TLIST_SZ-BT_SZ_X+5,50+5>, 0xb0000000+STR_COL, str_rmd
; draw "mkd" button
mcall 8, <TLIST2_X+TLIST_SZ-BT_SZ_X,BT_SZ_X>, <80,20>, 6, BT_COL
; string "mkd"
mcall 4, <TLIST2_X+TLIST_SZ-BT_SZ_X+5,80+5>, 0xb0000000+STR_COL, str_mkd
; draw "cancel" button
mcall 8, <555,55>, <308,25>, 10, BT_COL
; string "Cancel"
mcall 4, <555+5,308+5>, 0xb0000000+STR_COL, str_abort
; draw "change volume" button
mcall 8, <TLIST1_X+TLIST_SZ-55,55>, <100-20,22>, 11, BT_COL
; string "Change"
mcall 4, <TLIST1_X+TLIST_SZ-55+5,100-20+5>, 0xb0000000+STR_COL, str_change
;--------------------------
; tree list components
;--------------------------
stdcall dword[tl_draw], tree1
stdcall dword[tl_draw], tree2
mov dword[wScr.all_redraw], 1
stdcall [scrollbar_ver_draw], wScr
mov dword[wScr2.all_redraw],1
stdcall [scrollbar_ver_draw], wScr2
stdcall [edit_box_draw], edit_mkd
stdcall [edit_box_draw], edit_volume
stdcall [edit_box_draw], edit_search
; progress bar
stdcall [progressbar_draw], pb
mcall 12,2
ret
align 16
.mouse:
mcall 37, 1
cmp word[tedit0.wnd.top], ax
jg .no_edit
shr eax, 16
cmp word[tedit0.wnd.left], ax
jg .no_edit
mcall 37, 3
bt eax, 24
jnc @f
stdcall [ted_but_select_word], tedit0
jmp .still
@@:
stdcall [ted_mouse], tedit0
jmp .still
.no_edit:
stdcall [tl_mouse], tree1
stdcall [tl_mouse], tree2
stdcall [edit_box_mouse], edit_mkd
stdcall [edit_box_mouse], edit_volume
stdcall [edit_box_mouse], edit_search
jmp .still
align 16
.key:
mcall 2
stdcall [tl_key], tree1
stdcall [tl_key], tree2
stdcall [edit_box_key], edit_mkd
stdcall [edit_box_key], edit_volume
stdcall [edit_box_key], edit_search
jmp .still
align 16
.button:
mcall 17
cmp ah, 3
jne @f
ijmp eax, interface_addr, interface.server_addr
jmp .still
@@:
cmp ah, 4
jne @f
stdcall [ted_but_copy], tedit0
jmp .still
@@:
cmp ah, 5
jne @f
je filter_remote_list
@@:
cmp ah, 6
je create_remote_dir
cmp ah, 7
je delete_file
cmp ah, 8
je cmd_rdir
cmp ah, 9
je remove_dir
cmp ah, 11
jne @f
call populate_local_tree_list
@@:
cmp ah, 12
jne @f
call .clear_remote_tree
je cmd_list
@@:
cmp ah, 1
je .exit
jmp .still
.print:
pushad
mov ebx, ted_opt_ed_change_time + ted_opt_ed_move_cursor
mov ecx, 2 ; 0a0d
mov esi, [esp+36]
mov word[tedit_buffer], 0x0a0d
lea edi, [tedit_buffer+2]
@@:
movsb
inc ecx
cmp byte[esi], 0
jne @b
stdcall [ted_text_add], tedit0, tedit_buffer, ecx, ebx
stdcall [ted_draw], tedit0
; write to log file
mov eax, [esp+36]
sub ecx, 2 ; 0a0d is not included
call write_to_file
@@:
popad
ret 4
.set_flags:
ret 4
;;================================================================================================;;
.list: ;//////////////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? update tree2 with remote directory listing ;;
;;------------------------------------------------------------------------------------------------;;
;> buf_buffer2 = received data buffer ;;
;> eax = size of data ;;
;> remote_list_buf = buffer containing last incomplete entry (if any) ;;
;;------------------------------------------------------------------------------------------------;;
;< none ;;
;;================================================================================================;;
push edx
push eax
; check if any incomplete entry to be parsed
cmp byte[remote_list_buf], 0
je .no_backlog
; find end of remote_list_buf
mov edi, remote_list_buf
mov al, 0
repne scasb
; copy rest of the incomplete entry to remote_list_buf
mov esi, buf_buffer2
dec edi
@@:
movsb
cmp word[esi-2], 0x0a0d
jne @b
mov byte[edi], 0
mov ecx, edi
sub ecx, remote_list_buf ; ecx = length of remote_list_buf
mov ebx, esi ; ebx = address at which next parse should start
mov edi, remote_list_buf
jmp .start_parsing
.no_backlog:
mov ecx, eax ; ecx = number of bytes remaining to parse in buf_buffer2
mov edi, buf_buffer2
.start_parsing:
; find pointer to name
cmp byte[edi], 'd' ; file is a directory
je @f
cmp byte[edi], 'l' ; link
je @f
mov word[node_entry2], 'fi'
jmp .parse
@@:
mov word[node_entry2], 'fo'
.parse:
mov edx, 8
@@:
mov al, ' '
mov ecx, [esp]
add ecx, buf_buffer2
sub ecx, edi
repne scasb
; check if the (last) entry is incomplete
test ecx, ecx
jz .store_last_entry
rep scasb
test ecx, ecx
jz .store_last_entry
dec edx
jnz @b
lea esi, [edi-1]
lea edi, [node_entry2+4]
@@:
movsb
cmp word[esi], 0x0a0d ; end of entry
jne @b
mov byte[edi], 0
; add node to tree list
cmp word[node_entry2], 'fi'
jne @f
stdcall dword[tl_node_add], tree2, 0, node_entry2
jmp .added_remote_node
@@:
stdcall dword[tl_node_add], tree2, 0x10000, node_entry2
.added_remote_node:
; check whether we are parsing remote_list_buf
cmp byte[remote_list_buf], 0
je @f
mov byte[remote_list_buf], 0 ; done parsing remote_list_buf
mov edi, ebx
mov eax, [esp]
mov ecx, buf_buffer2
add ecx, eax
sub ecx, ebx
jmp .start_parsing
@@:
; any more entries to parse?
lea edi, [esi+2] ; skip 0a0d
cmp byte[edi], 0
jne .start_parsing
jmp .done_parsing
.store_last_entry:
; find index of the last incomplete entry
mov ecx, -1
mov eax, [esp]
lea edi, [buf_buffer2+eax-2]
mov al, 0x0a
std
repne scasb
cld
; copy last (incomplete) entry of buf_buffer2 to remote_list_buf
lea esi, [edi+2]
mov edi, remote_list_buf
@@:
movsb
cmp byte[esi-1], 0
jne @b
.done_parsing:
call .draw ; to update tree list immediately in case of "auto_list"
pop eax
pop edx
jmp data_loop
; clear tree list and add ".." node before executing "LIST"
.clear_remote_tree:
stdcall dword[tl_info_clear], tree2
mov dword[node_entry2+4], 0x2E2E
stdcall dword[tl_node_add], tree2, 0x10000, node_entry2
ret
;;================================================================================================;;
.progress: ;//////////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Update progress bar every time new data is received from data_loop block ;;
;;------------------------------------------------------------------------------------------------;;
;> edx = no. of bytes downloaded ;;
;;------------------------------------------------------------------------------------------------;;
;< none ;;
;;================================================================================================;;
; detect abort
mcall 17
cmp ah, 10
je cmd_abor
push eax ebx ecx edx
mov ebx, [file_size]
mov ecx, 100
mov eax, edx
mul ecx
div ebx
cmp eax, 100
jle @f
mov eax, 100
@@:
mov dword[pb], eax
push pb
call [progressbar_draw]
pop edx ecx ebx eax
ret
remove_dir:
stdcall dword[tl_node_get_data], tree2
cmp word[eax], 'fo'
jne gui.still
lea esi, [eax+4]
lea edi, [buf_cmd+4]
@@:
movsb
cmp byte[esi], 0
jne @b
mov word[edi], 0x000a
jmp cmd_rmd
delete_file:
stdcall dword[tl_node_get_data], tree2
cmp word[eax], 'fi'
jne gui.still
lea esi, [eax+4]
lea edi, [buf_cmd+5]
@@:
movsb
cmp byte[esi], 0
jne @b
mov word[edi], 0x000a
jmp cmd_dele
create_remote_dir:
lea edi, [buf_cmd+4]
mov esi, new_dir_buf
@@:
movsb
cmp byte[esi], 0
jne @b
mov word[edi], 0x000a
jmp cmd_mkd
; Function to call when you press [Enter]
align 4
fun_on_enter:
stdcall dword[tl_node_get_data], tree1
cmp word[eax], 'fi'
je @f
lea ecx, [eax+4] ; discard first 4 bytes
call populate_local_tree_list.read_new_dir
;stdcall dword[tl_draw], tree1
ret
@@:
lea esi, [eax+4]
lea edi, [buf_cmd+5]
@@:
movsb
cmp byte[esi], 0
jne @b
mov word[edi], 0x000a
jmp cmd_stor
; Function to call when you press [Enter]
; for treelist with remote directory listing
align 4
fun_on_enter2:
stdcall dword[tl_node_get_data], tree2
lea esi, [eax+4]
cmp dword[esi], 0x2E2E
jne @f
mov [auto_list], 1
jmp cmd_cdup
@@:
cmp word[eax], 'fo'
je @f
lea edi, [buf_cmd+5]
jmp .copy
@@:
lea edi, [buf_cmd+4]
.copy:
movsb
cmp byte[esi], 0
jne .copy
mov word[edi], 0x000a ; extra character before 0 to compensate for
; newline in console code
cmp word[eax], 'fo'
je @f
jmp cmd_retr
@@:
stdcall dword[tl_info_clear], tree2
mov [auto_list], 1
jmp cmd_cwd
;;================================================================================================;;
populate_local_tree_list: ;///////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Update tree1 with file names from current working directory ;;
;;------------------------------------------------------------------------------------------------;;
;> none ;;
;;------------------------------------------------------------------------------------------------;;
;< none ;;
;;================================================================================================;;
mov [filestruct.subfn], 1
mov [filestruct.size], 32
mov [filestruct.ptr], folder_data
mov ecx, root_dir
.read_new_dir: ; ecx = pointer to folder name
; parse ".."
cmp word[ecx], '..'
jne @f
cmp byte[ecx+2], 0
jne @f
; removes last file name from filestruct.name
mcall 30, 2, filestruct.name,1024 ; get absolute path for cwd
lea edi, [filestruct.name+eax] ; edi = pointer to the tail of file name
mov al, '/'
mov ecx, -1
std
repne scasb
cld
mov byte[edi+1], 0
mov ecx, filestruct.name
@@:
mcall 30, 1, ; set cwd
mcall 30, 2, filestruct.name, 1024 ; get absolute path for cwd
; clear all nodes in tree list
stdcall dword[tl_info_clear], tree1
mov [filestruct.offset], 0
; read 32 blocks
.outer:
mcall 70, filestruct
;int3
test eax, eax
jz @f
cmp eax, 6 ; EOF
je @f
call error_fs
jmp .done
@@:
test ebx, ebx
je .done ; when no. of blocks is multiple of 32
add [filestruct.offset], ebx
mov ecx, ebx
mov edx, folder_data+32+40 ; pointer to first file's name in BDFE
.inner: ; ebx = total number of BDFEs
; ecx = number of BDFEs remaining
; edx = pointer to file's name in BDFE
; ignore "." entry
cmp word[edx], 0x002E
je .added
; copy file/folder name to node_entry
mov esi, edx
mov edi, node_entry+4
@@:
movsb
cmp byte [esi-1], 0
jne @b
; check whether this is a file or a folder
mov al, byte[edx-40]
and al, 0x10
jz @f
; add a folder to tree
mov word[node_entry], 'fo'
stdcall dword[tl_node_add], tree1, 0x10000, node_entry
jmp .added
@@:
; add a file to tree
mov word[node_entry], 'fi'
stdcall dword[tl_node_add], tree1, 0, node_entry
.added:
add edx, 304 ; 304 = length of BDFE. jump to next file's name
loop .inner
stdcall dword[tl_draw], tree1
cmp ebx, 32
je .outer ; more BDFEs to come
.done:
ret
MIN_M_WND_H equ 500 ;
;input:
; edi = pointer to tedit struct
align 4
EvSize:
pushad
mov ebx, ted_scr_h
mov esi, ted_scr_w
m2m ted_wnd_w, [procinfo.client_box.width]
mov eax, ted_wnd_l
sub ted_wnd_w, eax
sub ted_wnd_w, 70
movzx eax, word[esi+sb_offs_size_x]
sub ted_wnd_w, eax
;m2m ted_wnd_h,[procinfo.client_box.height] ;
;cmp ted_wnd_h,MIN_M_WND_H
;jg @f
mov ted_wnd_h, MIN_M_WND_H
;@@:
movzx eax, word[ebx+sb_offs_size_y]
sub ted_wnd_h, eax
mov eax, ted_wnd_t
sub ted_wnd_h, eax
stdcall [ted_init_scroll_bars], tedit0,2
popad
ret
;;================================================================================================;;
filter_remote_list: ;/////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Filter tree list according to pattern specified in 'filter' ;;
;;------------------------------------------------------------------------------------------------;;
;> none ;;
;;------------------------------------------------------------------------------------------------;;
;< none ;;
;;================================================================================================;;
stdcall dword[tl_cur_beg], tree2
.next_node:
stdcall dword[tl_node_get_data], tree2
; check whether any nodes left
test eax, eax
jnz @f
stdcall dword[tl_draw], tree2
stdcall dword[edit_box_set_text], edit_search, str_null
je gui.still
@@:
cmp byte[filter], 0
je gui.still
; calculate size of node entry
lea esi, [eax+4]
mov edi, esi
mov ecx, -1
@@:
lodsb
inc ecx
test al, al
jnz @b
; calculate size of pattern
mov esi, filter
mov edx, -1
@@:
lodsb
inc edx
test al, al
jnz @b
mov esi, filter
call search
pop esi
test al, al
jnz .get_next
stdcall dword[tl_node_delete], tree2
jmp @f
.get_next:
stdcall dword[tl_cur_next], tree2
@@:
jmp .next_node
;;================================================================================================;;
search: ;/////////////////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Search for a substring within a string ;;
;;------------------------------------------------------------------------------------------------;;
;> edi = pointer to haystack ;;
;> ecx = size of haystack ;;
;> esi = pointer to needle ;;
;> edx = size of needle ;;
;;------------------------------------------------------------------------------------------------;;
;< al = 0 (not found) / 1 (found) ;;
;;================================================================================================;;
push ebx ecx edx esi edi
; if length of haystack < length of needle
cmp ecx, edx
jge @f
mov bh, 0
jmp .done
@@:
mov bh, 1 ; flag (0 = not found, 1 = found)
sub ecx, edx
dec edi
.outer:
cmp ecx, 0
jl .done
dec ecx
inc edi
mov bh, 1 ; flag (0 = not found, 1 = found)
mov edx, [esp+8]
mov esi, [esp+4]
.inner:
test edx, edx
jz .done
dec edx
mov eax, esi
sub eax, [esp+4]
mov al, byte[edi+eax]
mov bl, byte[esi]
inc esi
cmp al, bl
je .inner
mov bh, 0
jmp .outer
.done:
mov al, bh
pop edi esi edx ecx ebx
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;hed db 'FTP Client for KolibriOS',0
str_change db 'Change',0
str_disconnect db 'Disconnect',0
str_copy db 'Copy',0
str_mkd db 'MKD',0
str_dele db 'DELE',0
str_rdir db 'RDIR',0
str_rmd db 'RMD',0
str_abort db 'Cancel',0
str_search db 'Search',0
str_list db 'LIST',0
str_null db 0
;----------------------
; tree list elements
;----------------------
tree1 tree_list 64, 500, tl_list_box_mode, 16, 16, \
0xffffff, BT_COL, 0x000000, TLIST1_X, 105, TLIST_SZ-16, 185, 14, 4,\
0, el_focus, wScr, fun_on_enter
tree2 tree_list 64, 500, tl_list_box_mode, 16, 16, \
0xffffff, BT_COL, 0x000000, TLIST2_X, 105, TLIST_SZ-16, 185, 14, 4, \
0, el_focus, wScr2, fun_on_enter2
; editbox for mkd
edit_mkd edit_box TLIST_SZ-45, TLIST2_X, 82, 0xffffff, 0x6a9480, 0, \
0xAABBCC, 0, 99, new_dir_buf, mouse_dd, 0
; editbox for default volume
edit_volume edit_box TLIST_SZ-60, TLIST1_X, 105-20, 0xffffff, 0x6a9480, 0, \
0xAABBCC, 0, 99, root_dir, mouse_dd, 0
; editbox for search
edit_search edit_box TLIST_SZ-60, TLIST2_X, 25, 0xffffff, 0x6a9480, 0, \
0xAABBCC, 0, 99, filter,mouse_dd, 0
; A subsidiary structure for scrolling
align 4
wScr:
.x:
.size_x dw 16 ;+0
.start_x dw 250+50-16 ;+2
.y:
.size_y dw 185 ;+4
.start_y dw 105 ;+6
.btn_high dd 15 ;+8
.type dd 1 ;+12
.max_area dd 100 ;+16
.cur_area dd 30 ;+20
.position dd 0 ;+24
.bckg_col dd 0xeeeeee ;+28
.frnt_col dd 0xbbddff ;+32
.line_col dd 0 ;+36
.redraw dd 0 ;+40
.delta dw 0 ;+44
.delta2 dw 0 ;+46
.run_x:
.r_size_x dw 0 ;+48
.r_start_x dw 0 ;+50
.run_y:
.r_size_y dw 0 ;+52
.r_start_y dw 0 ;+54
.m_pos dd 0 ;+56
.m_pos_2 dd 0 ;+60
.m_keys dd 0 ;+64
.run_size dd 0 ;+68
.position2 dd 0 ;+72
.work_size dd 0 ;+76
.all_redraw dd 0 ;+80
.ar_offset dd 1 ;+84
align 4
wScr2:
.x:
.size_x dw 16 ;+0
.start_x dw 675+50-16 ;+2
.y:
.size_y dw 185 ;+4
.start_y dw 105 ;+6
.btn_high dd 15 ;+8
.type dd 1 ;+12
.max_area dd 100 ;+16
.cur_area dd 30 ;+20
.position dd 0 ;+24
.bckg_col dd 0xeeeeee ;+28
.frnt_col dd 0xbbddff ;+32
.line_col dd 0 ;+36
.redraw dd 0 ;+40
.delta dw 0 ;+44
.delta2 dw 0 ;+46
.run_x:
.r_size_x dw 0 ;+48
.r_start_x dw 0 ;+50
.run_y:
.r_size_y dw 0 ;+52
.r_start_y dw 0 ;+54
.m_pos dd 0 ;+56
.m_pos_2 dd 0 ;+60
.m_keys dd 0 ;+64
.run_size dd 0 ;+68
.position2 dd 0 ;+72
.work_size dd 0 ;+76
.all_redraw dd 0 ;+80
.ar_offset dd 1 ;+84
;----------------------
; end tree list element
;----------------------
;----------------------
; textedit elements
;----------------------
align 4
tedit0:
.wnd BOX 50,355,325,240 ;+ 0 195,5+40,325,240
.rec BOX 30,13,6,10 ;+16
.drag_m db 0 ;+32
.drag_k db 0 ;+33
.sel rb 16 ;+34
.seln rb 16 ;+50
.tex dd 0 ;+66 text memory pointer
.tex_1 dd 0 ;+70 text first symbol pointer
.tex_end dd 0 ;+74 text end memory pointer
.cur_x dd 0 ;+78
.cur_y dd 0 ;+82
.max_chars dd 4096 ;+86
.count_colors_text dd 1 ;+90
.count_key_words dd 0 ;+94
.color_cursor dd SYS_COL ;+98
.color_wnd_capt dd BT_COL ;+102
.color_wnd_work dd 0xffffff ;+106
.color_wnd_bord dd 0x737373 ;+110
.color_select dd 0xA4C4E4 ;+114
.color_cur_text dd 0xffff00 ;+118
.color_wnd_text dd 0x000000 ;+122
.syntax_file dd 0 ;+126
.syntax_file_size dd 500 ;+130
.text_colors dd 0 ;+134
.help_text_f1 dd 0 ;+138
.help_id dd -1 ;+142
.key_words_data dd 0 ;+146
.tim_ch dd ? ;+150
.tim_undo dd ? ;+154
.tim_ls dd ? ;+158
.tim_co dd ? ;+162
.el_focus dd el_focus ;+166
.err_save db 0 ;+170
.panel_id db 0 ;+171
.key_new db 0 ;+172
.symbol_new_line db 20 ;+173
.scr_w dd scrol_w1 ;+174
.scr_h dd scrol_h1 ;+178
.arr_key_pos dd 0 ;+182
.buffer dd ed_buffer ;+186
.buffer_find dd 0 ;+190
.cur_ins db 1 ;+194
.mode_color db 1 ;+195
.mode_invis db 0 ;+196
.gp_opt db 0 ;+197
dd 0;.fun_on_key_ctrl_o dd but_ctrl_o ;+198
.fun_on_key_ctrl_f dd 0 ;+202 ... Ctrl+F
dd 0;.fun_on_key_ctrl_n dd but_ctrl_n ;+206 ... Ctrl+N
.fun_on_key_ctrl_s dd 0 ;+210 ... Ctrl+S
.buffer_size dd 4096 ;+214
.fun_find_err dd 0 ;+218
.fun_init_synt_err dd 0 ;+222
.fun_draw_panel_buttons dd 0 ;+226
.fun_draw_panel_find dd 0 ;+230
.fun_draw_panel_syntax dd 0 ;+234
.fun_save_err dd 0 ;+238
.increase_size dd 1000 ;+242
.ptr_free_symb dd ? ;+246
.font_size dd 16 shl 16 ; +250
align 4
scrol_w1:
.x:
.size_x dw 16 ;+0
.start_x dw 85 ;+2
.y:
.size_y dw 100 ; +4
.start_y dw 15 ; +6
.btn_high dd 15 ; +8
.type dd 1 ;+12
.max_area dd 100 ;+16
rb 4+4
.bckg_col dd 0xeeeeee ;+28
.frnt_col dd 0xbbddff ;+32
.line_col dd 0x808080 ;+36
.redraw dd 0 ;+40
.delta dw 0 ;+44
.delta2 dw 0 ;+46
.run_x:
rb 2*4+4*6
.all_redraw dd 0 ;+80
.ar_offset dd 1 ;+84
;---------------------------------------------------------------------
align 4
scrol_h1:
.x:
.size_x dw 85 ;+0
.start_x dw 30 ;+2
.y:
.size_y dw 16 ;+4
.start_y dw 100 ;+6
.btn_high dd 15 ;+8
.type dd 1 ;+12
.max_area dd 100 ;+16
rb 4+4
.bckg_col dd 0xeeeeee ;+28
.frnt_col dd 0xbbddff ;+32
.line_col dd 0x808080 ;+36
.redraw dd 0 ;+40
.delta dw 0 ;+44
.delta2 dw 0 ;+46
.run_x:
rb 2*4+4*6
.all_redraw dd 0 ;+80
.ar_offset dd 1 ;+84
;------------
;Progress bar
;------------
struc pb
{
dd 0 ; PB_VALUE equ +0
dd (TLIST2_X+TLIST1_X+TLIST_SZ)/2-150 ; PB_LEFT equ +4. 150 = PB_WIDTH/2
dd 315; PB_TOP equ +8
dd 300; PB_WIDTH equ +12
dd 15 ; PB_HEIGHT equ +16
dd ? ; PB_STYLE equ +20
dd 0 ; PB_MIN equ +24
dd 100; PB_MAX equ +28
dd 0xffffff; PB_BACK_COLOR equ +32
dd 0x00ff40; PB_PROGRESS_COLOR equ +36
dd 0x808080; PB_FRAME_COLOR equ +40
}
pb pb
align 4
@IMPORT_GUI_LIBS:
library box_lib, 'box_lib.obj', libimg, 'libimg.obj'
import box_lib, \
edit_box_draw, 'edit_box', \
edit_box_key, 'edit_box_key', \
edit_box_mouse, 'edit_box_mouse', \
edit_box_set_text, 'edit_box_set_text', \
version_ed, 'version_ed', \
scrollbar_ver_draw ,'scrollbar_v_draw', \
scrollbar_ver_mouse,'scrollbar_v_mouse', \
scrollbar_hor_draw, 'scrollbar_h_draw', \
scrollbar_hor_mouse,'scrollbar_h_mouse', \
version_scrollbar, 'version_scrollbar', \
tl_data_init, 'tl_data_init', \
tl_data_clear, 'tl_data_clear', \
tl_info_clear, 'tl_info_clear', \
tl_key, 'tl_key', \
tl_mouse, 'tl_mouse', \
tl_draw, 'tl_draw', \
tl_node_add, 'tl_node_add', \
tl_node_set_data, 'tl_node_set_data', \
tl_node_get_data, 'tl_node_get_data', \
tl_node_delete, 'tl_node_delete', \
tl_cur_beg, 'tl_cur_beg', \
tl_cur_next, 'tl_cur_next', \
tl_cur_perv, 'tl_cur_perv', \
tl_node_close_open, 'tl_node_close_open', \
ted_but_sumb_upper, 'ted_but_sumb_upper', \
ted_but_sumb_lover, 'ted_but_sumb_lover', \
ted_can_save, 'ted_can_save', \
ted_clear, 'ted_clear', \
ted_delete, 'ted_delete', \
ted_draw, 'ted_draw', \
ted_init, 'ted_init', \
ted_init_scroll_bars, 'ted_init_scroll_bars', \
ted_init_syntax_file, 'ted_init_syntax_file', \
ted_is_select, 'ted_is_select', \
ted_key, 'ted_key', \
ted_mouse, 'ted_mouse', \
ted_open_file, 'ted_open_file', \
ted_save_file, 'ted_save_file', \
ted_text_add, 'ted_text_add', \
ted_but_select_word,'ted_but_select_word', \
ted_but_cut, 'ted_but_cut', \
ted_but_copy, 'ted_but_copy', \
ted_but_paste, 'ted_but_paste', \
ted_but_undo, 'ted_but_undo', \
ted_but_redo, 'ted_but_redo', \
ted_but_reverse, 'ted_but_reverse', \
ted_but_find_next, 'ted_but_find_next', \
ted_text_colored, 'ted_text_colored', \
progressbar_draw, 'progressbar_draw'
import libimg, \
lib_init1 , 'lib_init', \
img_is_img , 'img_is_img', \;определяет по данным, может ли библиотека сделать из них изображени \
img_info , 'img_info', \
img_from_file , 'img_from_file', \
img_to_file , 'img_to_file', \
img_from_rgb , 'img_from_rgb', \
img_to_rgb , 'img_to_rgb', \;преобразование изображения в данные RG \
img_to_rgb2 , 'img_to_rgb2', \
img_decode , 'img_decode', \ ;автоматически определяет формат графических данны \
img_encode , 'img_encode', \
img_create , 'img_create', \
img_destroy , 'img_destroy', \
img_destroy_layer , 'img_destroy_layer', \
img_count , 'img_count', \
img_lock_bits , 'img_lock_bits', \
img_unlock_bits , 'img_unlock_bits', \
img_flip , 'img_flip', \
img_flip_layer , 'img_flip_layer', \
img_rotate , 'img_rotate', \
img_rotate_layer , 'img_rotate_layer', \
img_draw , 'img_draw'
run_file_70 FileInfoBlock ; required for libimg
auto_list db 1 ; to run LIST immediately after CWD
filter rb 512
root_dir db '/rd/1'
rb 507
new_dir_buf rb 512
folder_data rb 32+32*304
node_entry db '1111'
rb 512
node_entry2 db '1111'
rb 512
remote_list_buf rb 1024
file_name rb 4096 ; required for libimg
conv_tabl rb 128
ed_buffer rb 100
tedit_buffer rb 1024
el_focus dd 0
;-----------------------
procinfo process_information