0,0 → 1,259 |
;***************************************************************************** |
; 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 <organization> 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 <copyright holder> 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 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 |
;***************************************************************************** |
.init: |
pusha |
mov ebp,dword [esp+36] |
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 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 |
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 |
;---------------------------------------------- |
; copy file name to shared area |
cmp od_type,dword 2 |
je .4 |
mov edi,od_com_area |
add edi,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 eax,od_com_area_name |
mov [start_open_dialog.parameter],eax |
|
mov eax,od_start_path |
mov [start_open_dialog.name],eax |
|
mcall 70,dword start_open_dialog |
shr eax,31 |
test eax,eax |
jnz .1 |
.still: |
mcall 23,50 |
cmp eax,1 |
jne @f |
pusha |
call od_draw_window |
popa |
@@: |
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,4 |
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,4096-256 |
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: |
OpenDialog_exit |
;---------------------------------------------- |
.get_filter_data: |
mov edi,od_com_area |
test edi,edi |
jnz @f |
; add esp,4 |
; jmp still |
ret |
@@: |
add edi,4096+4 |
mov esi,od_filter_area |
mov ecx,[esi] |
test ecx,ecx |
jnz @f |
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 |
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 |
} |
;***************************************************************************** |