;***************************************************************************** ; Macro for use Open Dialog - for Kolibri OS ; Copyright (c) 2009 2010, 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. ;***************************************************************************** ;***************************************************************************** macro OpenDialog_exit { popa ret } ;***************************************************************************** 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 ;***************************************************************************** .init: pusha mcall 9, 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 68,22,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 eax,od_com_area test eax,eax jz .1 mov ebx,od_type mov [eax+2],bx mov [eax],word 2 ; folder for open mov edi,eax add edi,4 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 mov eax,od_com_area_name mov [start_open_dialog.parameter],eax mov eax,od_start_path mov [start_open_dialog.name],eax mcall 70, start_open_dialog shr eax,31 test eax,eax jnz .1 jmp .still .red: pusha call od_draw_window popa .still: mcall 23, 50 cmp eax,1 je .red mov eax,od_com_area movzx ebx,word [eax] test ebx,ebx jz .still cmp ebx,3 je .2 ;still cmp ebx,1 jne .still mov esi,od_com_area add esi,4 mov edi,od_openfile_pach ;string call .copy mov od_status,1 mov esi,od_openfile_pach mov edi,od_opendir_pach call .copy_dir_path jmp .3 ;kopen_1 .2: mov od_status,0 jmp .3 ; still .1: mov od_status,2 ; thread1 .3: OpenDialog_exit ;---------------------------------------------- .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 mov esi,edi dec esi @@: std lodsb cmp al,'/' jnz @b ; push esi ; add esi,2 ;; mov edi,ebx ;file_name ;; xor ebx,ebx ;@@: ; cld ; lodsb ;; stosb ; inc ebx ; test eax,eax ; jnz @b ; pop esi mov [esi+1], byte 0 cld ret ;---------------------------------------------- align 4 start_open_dialog: .subfunction dd 7 .flags dd 0 .parameter dd 0 ;od_com_area_name .reserved1 dd 0 .reserved2 dd 0 db 0 .name: dd 0 ;od_start_path } ;***************************************************************************** macro init_OpenDialog od_ptr { mov ebp,od_ptr call OpenDialog.init } ;***************************************************************************** macro start_OpenDialog od_ptr { mov ebp,od_ptr call OpenDialog.start } ;*****************************************************************************