;*****************************************************************************
; Macro for use Open Dialog - for Kolibri OS
; 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 <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.
;*****************************************************************************
;---------------------------------------------------------------------
;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	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

	pusha
	mcall	9,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	70

	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	68,1
	mcall	5,10 ; because OS uses a new scheduler for kernel(SVN r.3534)
	mcall	11
	cmp	eax,1
	je	.draw
	cmp	eax,2
	je	.key
	cmp	eax,3
	je	.button
	jmp	.no_draw
.key:
	mcall	2
	jmp	.no_draw
.button:
	mcall	17
	jmp	.no_draw
;----------------------------------------------
.draw:
	pusha
	call	od_draw_window
	popa
;----------------------------------------------
	pusha
	call	.prepare_PID
	jz	@f

	mov	ecx,eax	; WINDOW SLOT
	mcall	18,7
	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	18,3
@@:
	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	18,3
@@:
OpenDialog_exit
;----------------------------------------------
.prepare_PID:
	mcall	9,od_procinfo,-1
	mov	ecx,[ebx+30]	; PID
	mcall	18,21
	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
@@:
	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
;----------------------------------------------
}
;*****************************************************************************