;***************************************************************************** ; Macro for use Open Dialog - for KolibriOS ; Copyright (c) 2009-2013, Marat Zakiyanov aka Mario79, aka Mario ; All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions are met: ; * Redistributions of source code must retain the above copyright ; notice, this list of conditions and the following disclaimer. ; * Redistributions in binary form must reproduce the above copyright ; notice, this list of conditions and the following disclaimer in the ; documentation and/or other materials provided with the distribution. ; * Neither the name of the nor the ; names of its contributors may be used to endorse or promote products ; derived from this software without specific prior written permission. ; ; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;***************************************************************************** ;--------------------------------------------------------------------- ;Some documentation for memory ; ;area name db 'FFFFFFFF_open_dialog',0 ; FFFFFFFF = PID ; ; communication area data ; flag ; +0 ; dw 0 ; 0 - empty, 1 - file for open, 2 -folder for open, ; 3 - cancel, 4 - path=name of area 6822. ; ; type of dialog: 0-Open, 1-Save, 2-Dir ; dw 0 ; +2 ; ; window X size ; +4 ; dw 0 ; ; window X position ; +6 ; dw 0 ; ; window y size ; +8 ; dw 0 ; ; window Y position ; +10 ; dw 0 ; ; OpenDialog WINDOW SLOT ; +12 ; dd 0 ; ; file_path ; +16 ; rb 3824 ; path to file ; ; file name ; +3840 ; rb 256 ; ; filtration flag ; +4096 ; dd 0 ; flag 0 - no filtration, 1 - filtering ; ; area for storage of filtering values ; +4100 ; rb 4092 ;--------------------------------------------------------------------- ;***************************************************************************** macro OpenDialog_exit { popa ret 4 } ;***************************************************************************** macro use_OpenDialog { OpenDialog: od_type equ dword [ebp] ; 0-Open, 1-Save, 2-Dir od_procinfo equ dword [ebp+4] ; Process info area for function 9 od_com_area_name equ dword [ebp+8] ; Name for shared area od_com_area equ dword [ebp+12] ; Adress of shared area od_opendir_pach equ dword [ebp+16] ; Temp area the directory for show od_dir_default_pach equ dword [ebp+20] ; Default path of directory, od_start_path equ dword [ebp+24] ; Location path to OpenDialog od_draw_window equ dword [ebp+28] ; Adress of procedure - draw_window od_status equ dword [ebp+32] ; 0-Cancel, 1-Get path OK, 2-Use alternatives od_openfile_pach equ dword [ebp+36] ; Getting path to file od_filename_area equ dword [ebp+40] ; Adress of file name area od_filter_area equ dword [ebp+44] ; Adress of filter area od_x_size equ [ebp+48] ; Window X size od_x_start equ [ebp+50] ; Window X position od_y_size equ [ebp+52] ; Window y size od_y_start equ [ebp+54] ; Window Y position ;***************************************************************************** .init: pusha mov ebp,dword [esp+36] mcall SF_THREAD_INFO,od_procinfo,-1 mov ebx,[ebx+30] mov edi,od_com_area_name add edi,7 std mov ecx,4 @@: mov al,bl and al,1111b add al,0x30 stosb mov al,bl shr al,4 and al,1111b add al,0x30 stosb shr ebx,8 dec ecx jnz @r cld mcall SF_SYS_MISC,SSF_MEM_OPEN,od_com_area_name,8192,0x09 mov od_com_area,eax mov esi,od_openfile_pach mov edi,od_opendir_pach call .copy_dir_path OpenDialog_exit ;***************************************************************************** ;***************************************************************************** .start: pusha mov ebp,dword [esp+36] mov eax,od_com_area test eax,eax jz .1 mov ebx,od_type mov [eax+2],bx mov [eax],word 2 ; folder for open pusha mcall SF_THREAD_INFO,od_procinfo,-1 mov eax,[ebx+42] ;main window x size shr eax,1 add eax,[ebx+34] ; main window x start mov cx,od_x_size shr cx,1 sub ax,cx test ax,cx test eax,0x8000 jz @f xor eax,eax @@: mov od_x_start,ax mov eax,[ebx+46] ;main window y size shr eax,1 add eax,[ebx+38] ; main window y start mov cx,od_y_size shr cx,1 sub ax,cx test eax,0x8000 jz @f xor eax,eax @@: mov od_y_start,ax popa mov ebx,dword od_x_size mov [eax+4],ebx mov ebx,dword od_y_size mov [eax+8],ebx mov edi,eax add edi,16 ;12 mov esi,od_opendir_pach xor eax,eax mov al,[esi] test eax,eax jnz @f mov esi,od_dir_default_pach ;communication_area_default_pach @@: call .copy ;---------------------------------------------- ; copy file name to shared area cmp od_type,dword 2 je .4 mov edi,od_com_area add edi,3840 ;4096-256 mov esi,od_filename_area test esi,esi jnz @f xor eax,eax mov [edi],eax jmp .4 @@: call .copy .4: ;---------------------------------------------- cmp od_type,dword 2 je @f call .get_filter_data @@: ;---------------------------------------------- mov ebx,od_procinfo xor eax,eax mov edi,ebx mov ecx,6 cld rep stosd mov [ebx],dword 7 mov eax,od_com_area_name mov [ebx+8],eax mov eax,od_start_path mov [ebx+21],eax mcall SF_FILE shr eax,31 test eax,eax jnz .1 ;---------------------------------------------- .still: ; The main window of application sometimes ; is not present the really. For this reason ; not use func 10 and 23, because event 1 ; is not cleared without call of func 0. ; In this case is suitable only func 5 and 11, ; or 68.1 and 11 for better response. mcall SF_SYS_MISC,SSF_SWITCH_TASK mcall SF_SLEEP,10 ; because OS uses a new scheduler for kernel(SVN r.3534) mcall SF_CHECK_EVENT cmp eax,1 je .draw cmp eax,2 je .key cmp eax,3 je .button jmp .no_draw .key: mcall SF_GET_KEY jmp .no_draw .button: mcall SF_GET_BUTTON jmp .no_draw ;---------------------------------------------- .draw: pusha call od_draw_window popa ;---------------------------------------------- pusha call .prepare_PID jz @f mov ecx,eax ; WINDOW SLOT mcall SF_SYSTEM,SSF_GET_ACTIVE_WINDOW cmp eax,ecx ; compare ACTIVE and WINDOW SLOT jne @f mov eax,od_com_area mov ecx,[eax+12] test ecx,ecx jz @f mcall SF_SYSTEM,SSF_FOCUS_WINDOW @@: popa ;---------------------------------------------- .no_draw: mov eax,od_com_area movzx ebx,word [eax] test ebx,ebx jz .still cmp ebx,3 je .2 cmp ebx,1 jne .still mov esi,od_com_area add esi,16 ;12 mov edi,od_openfile_pach call .copy mov od_status,1 mov esi,od_openfile_pach mov edi,od_opendir_pach call .copy_dir_path ;---------------------------------------------- ; copy file name from shared area cmp od_type,dword 2 je @f mov esi,od_com_area add esi,3840 mov edi,od_filename_area test edi,edi jz @f call .copy @@: ;---------------------------------------------- jmp .3 .2: mov od_status,0 jmp .3 .1: mov od_status,2 .3: mov eax,od_com_area mov ebx,[eax+4] mov od_x_size,ebx mov ebx,[eax+8] mov od_y_size, ebx call .prepare_PID jz @f mov ecx,eax ; WINDOW SLOT mcall SF_SYSTEM,SSF_FOCUS_WINDOW @@: OpenDialog_exit ;---------------------------------------------- .prepare_PID: mcall SF_THREAD_INFO,od_procinfo,-1 mov ecx,[ebx+30] ; PID mcall SF_SYSTEM,SSF_GET_THREAD_SLOT test eax,eax ret ;---------------------------------------------- .get_filter_data: mov edi,od_com_area test edi,edi jnz @f ret @@: add edi,4100 mov esi,od_filter_area mov ecx,[esi] test ecx,ecx jnz @f mov edi,od_com_area mov [edi+4096],dword 0 ret @@: cmp ecx,4091 ;max filter len = 8192-4100-1 jle @f ;todo ... error message: corrypt filter mov edi,od_com_area mov [edi+4096],dword 0 ret @@: inc ecx cld rep movsb mov edi,od_com_area mov [edi+4096],dword 1 ret ;---------------------------------------------- .copy: xor eax,eax cld @@: lodsb stosb test eax,eax jnz @b ret ;---------------------------------------------- .copy_dir_path: xor eax,eax cmp [esi],al jne @f mov [edi],al mov [ebx],al xor ebx,ebx inc ebx ret @@: cld lodsb stosb test eax,eax jnz @b cmp od_type,dword 2 jne @f ret @@: mov esi,edi dec esi @@: std lodsb cmp al,'/' jnz @b mov [esi+1],byte 0 cld ret ;---------------------------------------------- align 4 .set_file_name: push ebp mov ebp,esp push eax ecx edi esi mov edi,[ebp+8] ;open dlg struct mov edi,[edi+40] ;+40 - filename_area mov esi,[ebp+12] ;file name mov ecx,256 ;copy file name in dialog @@: lodsb stosb test eax,eax loop @b pop esi edi ecx eax pop ebp ret 8 ;---------------------------------------------- align 4 .set_file_ext: push ebp mov ebp,esp push eax ecx edi esi mov esi,[ebp+8] ;open dlg struct xor eax,eax mov ecx,256 mov edi,[esi+40] ;+40 - filename_area repne scasb @@: ;found position of '.' dec edi cmp byte[edi],'.' je @f cmp edi,[esi+40] ja @b jmp .no_dot @@: inc edi mov esi,[ebp+12] ;file ext ;copy file ext in dialog @@: lodsb stosb test eax,eax jnz @b .no_dot: pop esi edi ecx eax pop ebp ret 8 } ;*****************************************************************************