;*****************************************************************************
; 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
}
;*****************************************************************************
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
	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
;----------------------------------------------
; 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
	mov	esi,.null
@@:
	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,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
;	xor	eax,eax
;	mov	al,[edi]
;	test	eax,eax
	test	edi,edi
	jz	@f
	call	.copy
@@:
;----------------------------------------------
	jmp	.3
.2:
	mov	od_status,0
	jmp	.3
.1:
	mov	od_status,2
.3:
OpenDialog_exit
;----------------------------------------------
.null:
	dd 0
;----------------------------------------------
.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
}
;*****************************************************************************
macro	init_OpenDialog od_ptr
{
	mov	ebp,od_ptr
	call	OpenDialog.init
}
;*****************************************************************************
macro	start_OpenDialog od_ptr
{
	mov	ebp,od_ptr
	call	OpenDialog.start
}
;*****************************************************************************