;	OPT O+
;	OPT O1+		;Tells when a branch could be optimised to short
;	OPT i+		;Tells when '#' is probably missing

	incdir	"INCLUDE:"
	include "exec/memory.i"
	include "exec/exec_lib.i"
	include "graphics/rastport.i"
	include "graphics/graphics_lib.i"
	include "intuition/intuition.i"
	include "intuition/intuition_lib.i"
	include "libraries/dos.i"
	include "libraries/dosextens.i"
	include "libraries/dos_lib.i"
	incdir	"DF0:PFiler/"
	include "PFiler.i"

* A few macro's
LoadBase	MACRO
		IFNC		'\1','ExecBase'
		movea.l		FD_\1(A5),A6
		ENDC
		IFC		'\1','ExecBase'
		movea.l		4.W,A6
		ENDC
		ENDM
CallLib		MACRO
		jsr		_LVO\1(A6)
		ENDM
Call		MACRO
		bsr		\1
		ENDM
PushS		MACRO
		move.l		\1,-(SP)
		ENDM
PopS		MACRO
		move.l		(SP)+,\1
		ENDM
Push		MACRO
		movem.l		\1,-(SP)
		ENDM
Pop		MACRO
		movem.l		(SP)+,\1
		ENDM
GADGET		MACRO
		dc.l		\1
		dc.w		\2,\3,\4,\5,\6,\7,\8
		ENDM
GADGET2		MACRO
		dc.l		\1,\2,\3,\4,\5
		dc.w		\6
		dc.l		\7
		ENDM
BORDER		MACRO
		dc.w		\1,\2
		dc.b		\3,\4,\5,\6
		dc.l		\7,\8
		ENDM
IMAGE		MACRO
		dc.w		\1,\2,\3,\4,\5
		dc.l		\6
		dc.b		\7,\8
		dc.l		\9
		ENDM
INTUITEXT	MACRO
		dc.b		\1,\2,\3,0
		dc.w		\4,\5
		dc.l		TxtAttr,\6,\7
		ENDM

* These are MY definitions.

BUTCOLOR	=3
STRCOLOR	=3
PROPCOLOR	=3
FILECOLOR	=1
DIRCOLOR	=3
DEVCOLOR	=2

				;The possible Node-Types
DIRTYPE		=-1		;Node contains the name of a directory		('c','libs','med-res' etc.)
DEVTYPE		=-2		;Node contains the name of a device		('DF1:','DH0:' etc.)
VOLTYPE		=-3		;Node contains the name of a volume		('CLIDisk:','AmigaLibDisk294:' etc.)
ASNTYPE		=-4		;Node contains the name of a logical device	('LIBS:','S:','FONTS:' etc.)
				;A Node containing the name of file is
				;characterized by having a type >=0 (the size actually)

				;Flags indicating what has to be done
NEWDIR		=0		;Start scanning a new directory and the Device-List
REFSTR		=1		;Refresh string-gadgets
ACTFSG		=2		;Activate the file-string-gadget
GETDEVS		=3		;Get names from Device-List instead of from disk
NOTDEVS		=4		;Don't show devices until the user clicks RMB
LETSWAIT	=5		;Be nice and wait for next message
DONTPOS		=6		;Just a trick to help saving a few bytes
KEEPTOP		=7		;Keep the display steady for a while no matter what arrives in the list

Select1ID	=0		;Gadget ID's
Select2ID	=1
Select3ID	=2
Select4ID	=3
Select5ID	=4
Select6ID	=5
Select7ID	=6
ParentID	=7
UpID		=8
DownID		=9
SlideID		=10
PathID		=11
PosID		=12
NegID		=13

				;STRUCTURE EntryNode	(Variable size)
EntryNext	=0		;APTR EntryNext		This is a single-linked list
EntryType	=4		;WORD EntryType
EntrySize	=8		;LONG EntrySize
EntryName	=10		;APTR EntryName
EntrySIZEOF	=10		;Size of EntryNode	(Except for the string)

				;STRUCTURE FileSelectData
FD_DosBase	=0		;APTR FD_DosBase
FD_GfxBase	=4		;APTR FD_GfxBase
FD_IntBase	=8		;APTR FD_IntBase
FD_Window	=12		;APTR FD_Window
FD_Rp		=16		;APTR FD_Rp		;Rastport
FD_Up		=20		;APTR FD_Up		;UserPort (for messages)
FD_FIB		=24		;APTR FD_FIB		;FileInfoBlock
FD_Lock		=28		;APTR FD_Lock		;Lock)
FD_SlideHeight	=32		;WORD FD_SlideHeight	;Height of slide-knob
FD_SlideVPos	=34		;WORD FD_SlideVPos	;Vertical position of slide-knob
FD_Class	=36		;WORD FD_Class		;\
FD_Code		=40		;WORD FD_Code		; \
FD_IAddress	=42		;WORD FD_IAddress	;  > Copied from last IntuiMessage 
FD_Seconds	=46		;LONG FD_Seconds	; /
FD_Micros	=50		;LONG FD_Micros		;/
FD_OSeconds	=54		;LONG FD_OSeconds	;\
FD_OMicros	=58		;LONG FD_OMicros	; > Used to check for double-clicks
FD_LastSelect	=62		;LONG FD_LastSelect	;/
FD_TxtBuf	=66		;APTR FD_TxtBuf
FD_DisplayList	=70		;APTR FD_DisplayList
FD_SIZEOF	=76	;(74)	;Size of FileSelectBlock ((FD_SIZEOF mod 4) MUST be 0) 

DisplayCols	=32		;Length of TxtBuffer
DisplayRows	=7		;Lines on display

InternalMem	=FD_SIZEOF+fib_SIZEOF+4*DisplayRows+DisplayCols+10

	SECTION SELECT,CODE

FReq		EQUR		A4
FData		EQUR		A5
*----------------------------------------------------
* Frees the memory for every node in FR_List
* Doesn't destroy  registers
*----------------------------------------------------
	XDEF	_FreeFileSelect
_FreeFileSelect	Push		D0-D7/A0-A6
		movea.l		4*15+4(SP),FReq		;FSRequest always in A4
		LoadBase	ExecBase
		lea		FR_List(FReq),A1
		move.l		EntryNext(A1),D2	;Save first node in list for later
		clr.l		EntryNext(A1)
FreeLoop	tst.l		D2			;Any node ?
		beq.S		DoneFreeList
		movea.l		D2,A1
		move.l		EntryNext(A1),D2	;Save next node in list for later
		move.w		EntrySize(A1),D0
		ext.l		D0
		CallLib		FreeMem			;Free this node
		bra.S		FreeLoop
DoneFreeList	Pop		D0-D7/A0-A6
		rts

*----------------------------------------------------
*FILESELECT
*Register usage:
*	A4: Used for base-relative access to user-supplied FileSelectRequest-structure (Never changed)
*	A5: Used for base-relative access to internally used/allocated data (Never changed)
*	A6: Only used for base-relative library-calls (Changes all the time)
*	All internally called sub-routines (referenced by the macro CALL)
*	preserves all registers (except A6), apart from some
*	(MyStrLen, ExNextD), which returns something in D0
*	Sort does not preserve registers at all
*	FileSelect itself returns an error-code in D0
*----------------------------------------------------
	XDEF	_FileSelect
* Here we enter the FileSelect
_FileSelect	Push		D1-D7/A0-A6
		movea.l		4*14+4(SP),FReq		;FSRequest always in A4
		move.l		FR_PosTxt(FReq),D0	;User-defined PosTxt ?
		bne.S		SetPosTxt
		lea		TxtPositiv(PC),A0	;Set default PosTxt
		move.l		A0,D0
SetPosTxt	lea		ITxtPos(PC),A0
		move.l		D0,it_IText(A0)		;Put PosTxt into IntuiText
		move.l		FR_NegTxt(FReq),D0	;User-defined NegTxt ?
		bne.S		SetNegTxt
		lea		TxtNegativ(PC),A0	;Set default NegTxt
		move.l		A0,D0
SetNegTxt	lea		ITxtNeg(PC),A0
		move.l		D0,it_IText(A0)		;Put NegTxt into IntuiText
		LoadBase	ExecBase
		move.l		#InternalMem,D0
		move.l		#MEMF_PUBLIC!MEMF_CLEAR,D1
		CallLib		AllocMem		;Allocate local data block + FileInfoBlock
		movea.l		D0,FData		;Internal datablock always in A5
		moveq		#FSENoMem,D7 
		tst.l		D0
		beq		Exit
		lea		FD_SIZEOF(FData),A0	;fib MUST be longword-aligned
		move.l		A0,FD_FIB(FData)	;Use part of allocated memory as FileInfoBlock
		lea		fib_SIZEOF(A0),A0
		move.l		A0,FD_DisplayList(FData)
		lea		4*DisplayRows(A0),A0
		move.l		A0,FD_TxtBuf(FData)
		lea		PathInfo(PC),A0		;Put user-PathBuffer into StringInfo
		move.w		FR_PathChars(FReq),si_MaxChars(A0)
		move.l		FR_PathBuf(FReq),si_Buffer(A0)
		lea		FileInfo(PC),A0		;Put user-FileBuffer into StringInfo
		move.w		FR_FileChars(FReq),si_MaxChars(A0)
		move.l		FR_FileBuf(FReq),si_Buffer(A0)
		moveq		#FSENoLib,D7
		lea		DosName(PC),A1
		CallLib		OldOpenLibrary		;Open dos
		move.l		D0,FD_DosBase(FData)
		lea		GfxName(PC),A1
		CallLib		OldOpenLibrary		;Open graphics
		move.l		D0,FD_GfxBase(FData)
		lea		IntuiName(PC),A1
		CallLib		OldOpenLibrary		;Open Intuition
		move.l		D0,FD_IntBase(FData)
		lea		FileNW(PC),A0
		movem.w		FR_LeftEdge(FReq),D0-D1
		movem.w		D0-D1,nw_LeftEdge(A0)	;Put coordinates into NewWindow-structure
		moveq		#WBENCHSCREEN,D0
		move.l		FR_Screen(FReq),nw_Screen(A0)	;Put screen-ptr or 0 into NewWindow-structure	
		beq.S		SetScreenType
		moveq		#CUSTOMSCREEN,D0
SetScreenType	move.w		D0,nw_Type(A0)		;Put CUSTOMSCREEN or WBENCHSCREEN into NewWindow-structure
		LoadBase	IntBase
		CallLib		OpenWindow		;Open the Window
		moveq		#FSENoWin,D7
		move.l		D0,FD_Window(FData)
		beq.S		Exit
		movea.l		D0,A1
		move.l		wd_RPort(A1),FD_Rp(FData)	;Get RastPort
		move.l		wd_UserPort(A1),FD_Up(FData)	;Get UserPort
		lea		TxtAttr(PC),A0
		LoadBase	GfxBase
		CallLib		OpenFont		;Open Topaz-80
		movea.l		D0,A0
		movea.l		FD_Rp(FData),A1
		CallLib		SetFont			;Use Topaz-80
		bra.S		Main			;Lets begin
* Here we exits, D7 contains return-code
Exit		btst		#LETSWAIT,FR_ToDo(FReq)	;The completion of the list was interrupted ?
		bne.S		FreeLock
		move.l		FReq,-(SP)
		Call		_FreeFileSelect		;Free old list
		addq.l		#4,SP
FreeLock	Call		RemoveLock		;UnLock if not already done
FreeWindow	LoadBase	IntBase
		move.l		FD_Window(FData),D0
		beq.S		FreeInt
		movea.l		D0,A0
		movem.w		wd_LeftEdge(A0),D0-D1
		movem.w		D0-D1,FR_LeftEdge(FReq)	;Store window-position in FileSelectRequest structure
		CallLib		CloseWindow		;Close window if it was open
FreeInt		LoadBase	ExecBase
		move.l		FD_IntBase(FData),D0
		beq.S		FreeGfx
		movea.l		D0,A1
		CallLib		CloseLibrary		;Close intuition if it was open
FreeGfx		move.l		FD_GfxBase(FData),D0
		beq.S		FreeDos
		movea.l		D0,A1
		CallLib		CloseLibrary		;Close graphics if it was open
FreeDos		move.l		FD_DosBase(FData),D0
		beq.S		FreeFSMem
		movea.l		D0,A1
		CallLib		CloseLibrary		;Close dos if it was open
FreeFSMem	move.l		FData,D0
		beq.S		AllDone
		movea.l		D0,A1
		move.l		#InternalMem,D0
		CallLib		FreeMem			;Free allocated memory
AllDone		move.l		D7,D0			;Set return-code
		Pop		D1-D7/A0-A6
		rts					;Return to the caller

* Here we really begin	
Main		ori.b		#(1<<REFSTR)!(1<<ACTFSG)!(1<<LETSWAIT),FR_ToDo(FReq)
		tst.l		FR_List(FReq)		;Called with a list ?. If so, use it
		bne		RefreshDisplay		;If not, lets start all over
		move.b		#(1<<REFSTR)!(1<<ACTFSG)!(1<<NEWDIR),FR_ToDo(FReq)
* This is the start of the event-loop
* See what happened since last time
GetNextMsg	LoadBase	IntBase
CheckRefresh	bclr		#REFSTR,FR_ToDo(FReq)	;Clear RefreshBit
		beq.S		CheckActivate		;Refresh String-Gadgets if it was set
		lea		PathGad(PC),A0
		movea.l		FD_Window(FData),A1
		suba.l		A2,A2
		moveq		#2,D0
		CallLib		RefreshGList		;Refresh String-Gadgets
CheckActivate	bclr		#ACTFSG,FR_ToDo(FReq)	;Clear activatebit
		beq.S		CheckNewDir		;Activate FileString-Gadget if it was set
		lea		FileGad(PC),A0
		movea.l		FD_Window(FData),A1
		suba.l		A2,A2
		CallLib		ActivateGadget		;Activate FileString-Gadget
CheckNewDir	bclr		#NEWDIR,FR_ToDo(FReq)	;Clear NewDirBit
		bne.S		DoNewPath		;Get new directory if it was set
		LoadBase	ExecBase
		btst		#LETSWAIT,FR_ToDo(FReq)	;Are we busy ?
		beq.S		NotWaiting
		movea.l		FD_Up(FData),A0
		CallLib		WaitPort		;We aren't busy, so we wait
NotWaiting	movea.l		FD_Up(FData),A0
		CallLib		GetMsg			;Get a message
		tst.l		D0
		beq.S		DoneWithMessage		;Did we get a message
DoMessage	movea.l		D0,A1			;Yes, put message address to A1 and reply
		move.l		im_Class(A1),FD_Class(FData)
		move.w		im_Code(A1),FD_Code(FData)
		move.l		im_IAddress(A1),FD_IAddress(FData)
		move.l		im_Seconds(A1),FD_Seconds(FData)
		move.l		im_Micros(A1),FD_Micros(FData)
		CallLib		ReplyMsg		;Reply the message
		move.l		FD_Class(FData),D0
		moveq		#MOUSEBUTTONS,D1
		cmp.l		D1,D0
		beq		DoButtons
		moveq		#GADGETUP,D1
		cmp.l		D1,D0
		beq		DoGadgets
		cmpi.l		#INTUITICKS,D0		;It is time to see if we should scroll
		beq		CheckScroll
DoneWithMessage	btst		#LETSWAIT,FR_ToDo(FReq)
		beq.S		GetNextFile		;If we are busy then get next file/dir/Device, else goto sleep

* Start scanning a new directory and the Device-List
DoNewPath	bset		#NOTDEVS,FR_ToDo(FReq)	;Lets get Devices first
		bclr		#KEEPTOP,FR_ToDo(FReq)
		Call		ResetKnob
		Call		ClearDisplay
		move.l		FReq,-(SP)
		Call		_FreeFileSelect		;Free old list
		addq.l		#4,SP
		Call		RemoveLock		;Free old lock
		moveq		#FR_ToDo-FR_TopView-1,D1
ResetLoop	clr.b		FR_TopView(FReq,D1.W)	;Clear FR_TopView and counters
		dbf		D1,ResetLoop
		lea		SelectTxt(PC),A1
		tst.l		FR_TitleTxt(FReq)	;Has the user supplied us with a title ?
		beq.S		SetWTitle
		movea.l		FR_TitleTxt(FReq),A1
SetWTitle	movea.l		FD_Window(FData),A0
		suba.l		A2,A2
		LoadBase	IntBase
		CallLib		SetWindowTitles		;Set window-title (User-supplied or default)
GetDevs		bset		#GETDEVS,FR_ToDo(FReq)	;Lets get Devices first
		Call		LockD			;Lock DeviceList
		bra.S		SignalDontWait
GetFiles	LoadBase	DosBase			;When that is done, we can get Files/Dirs
		move.l		FR_PathBuf(FReq),D1
		moveq		#ACCESS_READ,D2
		CallLib		Lock			;Lock new directory
		move.l		D0,FD_Lock(FData)
		beq		DirError
		move.l		D0,D1
		move.l		FD_FIB(FData),D2
		CallLib		Examine			;Examine new directory
		tst.l		D0
		beq		DirError
SignalDontWait	bclr		#LETSWAIT,FR_ToDo(FReq)	;We are busy, Can't wait

* Read next entry from directory or Device-list
GetNextFile	btst		#GETDEVS,FR_ToDo(FReq)
		beq.S		GettingFiles
GettingDevs	Call		ExNextD			;Try to get next device
		bra.S		DidWeGetOne
GettingFiles	LoadBase	DosBase
		move.l		FD_Lock(FData),D1	;Try to get next file
		move.l		FD_FIB(FData),D2
		CallLib		ExNext
DidWeGetOne	tst.l		D0
		beq		NoMore			;Success, found something
		movea.l		FD_FIB(FData),A3
		lea		fib_FileName(A3),A0
		Call		MyStrLen
		tst.l		D0
		beq		GetNextMsg		;Could it happen ?
		btst		#GETDEVS,FR_ToDo(FReq)	;Is it a device ?
		beq.S		SpecFDs
SpecDevs	move.l		fib_DirEntryType(A3),D1
		bne.S		SpecDevs2
		btst		#FSB_NODRIVE,FR_Flags+1(FReq)
		bra.S		Trick			;This doesn't destroy cc
SpecDevs2	subq.l		#1,D1
		bne.S		SpecDevs3
		btst		#FSB_NOASSIGN,FR_Flags+1(FReq)
		bra.S		Trick
SpecDevs3	btst		#FSB_NOVOL,FR_Flags+1(FReq)
		bra.S		Trick
SpecFDs		tst.l		fib_DirEntryType(A3)	;Is it a directory ?
		bmi.S		SpecFiles
SpecDirs	btst		#FSB_NODIR,FR_Flags+1(FReq)
Trick		bne		GetNextMsg
		bra.S		DoneSpec
SpecFiles	btst		#FSB_NOFILE,FR_Flags+1(FReq)
		bne		GetNextMsg
		btst		#FSB_NOINFO,FR_Flags+1(FReq)
		beq.S		DoneSpec
		cmpi.w		#5,D0			;Too short
		blt.S		DoneSpec
		lea		fib_FileName(A3),A0
		lea		-5(A0,D0.W),A0
		lea		InfoTxt(PC),A1
		moveq		#4,D1
InfoLoop	cmpm.b		(A1)+,(A0)+
		bne.S		DoneSpec
		dbf		D1,InfoLoop
		bra		GetNextMsg
DoneSpec	addi.w		#EntrySIZEOF+1,D0	;Make room for null character
		move.l		D0,D6
		move.l		#MEMF_PUBLIC!MEMF_CLEAR,D1
		LoadBase	ExecBase
		CallLib		AllocMem		;AllocMem(EntryBaseSize+MyStrLen(Name)+1,MEM_CLEAR)
		movea.l		D0,A0
		tst.l		D0
		beq		MemError
		move.w		D6,EntrySize(A0)	;Store size of allocated blok in the block itself
		btst		#GETDEVS,FR_ToDo(FReq)	;Is it a device ?
		beq.S		IsItDirType
		addq.w		#1,FR_Devs(FReq)	;One more device
		moveq		#DEVTYPE,D0		;The next few lines is here just for sorting reasons
		move.l		fib_DirEntryType(A3),D1
		beq.S		OneMoreOfThese		;DLT_DEVICE
		moveq		#ASNTYPE,D0
		subq.l		#1,D1
		beq.S		OneMoreOfThese		;DLT_DIRECTORY
		moveq		#VOLTYPE,D0	
		bra.S		OneMoreOfThese		;DLT_VOLUME
IsItDirType	tst.l		fib_DirEntryType(A3)	;Is it a directory ?
		bmi.S		IsItFileType
		addq.w		#1,FR_Dirs(FReq)	;One more directory
		moveq		#DIRTYPE,D0
		bra.S		OneMoreOfThese
IsItFileType	addq.w		#1,FR_Files(FReq)	;One more file
		move.l		fib_Size(A3),D0		;Store size instead of type
OneMoreOfThese	move.l		D0,EntryType(A0)	;D0=Type/Size
		move.w		FR_Files(FReq),D0
		add.w		FR_Dirs(FReq),D0
		btst		#NOTDEVS,FR_ToDo(FReq)
		bne.S		DontCountDevs
		add.w		FR_Devs(FReq),D0
DontCountDevs	move.w		D0,FR_Count(FReq)
		lea		fib_FileName(A3),A1
		lea		EntryName(A0),A2
StoreNameLoop	move.b		(A1)+,(A2)+		;Copy name from FIB to EntryNode
		bne.S		StoreNameLoop
		move.w		SlideInfo+pi_VertPot(PC),FD_SlideVPos(FData)	;Necessary, otherwise the user couldn't drag the slider
		Call		SortFiles		;while a directory is being scanned
		move.w		FR_Count(FReq),D0
		beq		GetNextMsg		;Only devices so far ?
		sub.w		FR_TopCount(FReq),D0
		subq.w		#DisplayRows,D0
		bgt.S		AdjustKnob		;Full display ?
Here		move.w		FR_TopCount(FReq),D0
		bra		SeeThem
AdjustKnob	Call		SetKnobHeight		;Display is full
		Call		SetKnobPos
		Call		SetKnob			;slider while the directory/device-List is being scanned
		bra		GetNextMsg
MemError	lea		MemErrorTxt(PC),A1	;Could not get memory for a node
		bra.S		ShowError
DirError	lea		DirErrorTxt(PC),A1	;Could not Lock/Examine a directory
ShowError	LoadBase	IntBase
		movea.l		FD_Window(FData),A0
		suba.l		A2,A2
		CallLib		SetWindowTitles
NoMore		Call		RemoveLock		;Let's unlock
		bclr		#GETDEVS,FR_ToDo(FReq)
		bne		GetFiles		;Were we getting Devices ?
WasFileLock	bset		#LETSWAIT,FR_ToDo(FReq)	;We are done getting Files/Dirs. We can wait now
		move.w		FR_Count(FReq),D0
		beq.S		Here
		subq.w		#DisplayRows,D0
		bgt.S		Here
		clr.w		FR_TopCount(FReq)
		move.l		FR_List(FReq),FR_TopView(FReq)
		bra.S		Here

* Have just recieved a MOUSEBUTTONS-message
DoButtons	bset		#ACTFSG,FR_ToDo(FReq)	;Always activate FileString-gadget
		cmpi.w		#MENUDOWN,FD_Code(FData);Pressed the Menu-button
		bne		GetNextMsg
		Call		ClearDisplay
		moveq		#0,D0
		bclr		#NOTDEVS,FR_ToDo(FReq)	;yes
		beq.S		DontAddDevs
		move.w		FR_Devs(FReq),D1
		add.w		D1,FR_Count(FReq)	;Now devices can be shown
		bra.S		SeeDevs
DontAddDevs	movea.l		FR_TopView(FReq),A0
		moveq		#DIRTYPE,D1
		cmp.l		EntryType(A0),D1
		bgt.S		SeeFiles
		bne.S		SeeDirs
		bra.S		SeeDevs
SeeFiles	tst.w		FR_Files(FReq)
		bne.S		SeeThese
SeeDirs		tst.w		FR_Dirs(FReq)
		bne.S		SeeTrick
SeeDevs		tst.w		FR_Devs(FReq)
		beq.S		SeeFiles
		add.w		FR_Dirs(FReq),D0
SeeTrick	add.w		FR_Files(FReq),D0
SeeThese	bset		#KEEPTOP,FR_ToDo(FReq)
		bra		SeeThem			;Look at files

* Have just recieved a GADGETUP-message
DoGadgets	bset		#ACTFSG,FR_ToDo(FReq)	;Always activate FileString-gadget
		movea.l		FD_IAddress(FData),A1
		move.w		gg_GadgetID(A1),D0
		lsl.w		#1,D0
		move.w		GJ(PC,D0.W),D0
		jmp		GJ(PC,D0.W)
GJ		dc.w		DoSelect-GJ		;Gadget indirect jumptable
		dc.w		DoSelect-GJ
		dc.w		DoSelect-GJ
		dc.w		DoSelect-GJ
		dc.w		DoSelect-GJ
		dc.w		DoSelect-GJ
		dc.w		DoSelect-GJ
		dc.w		DoParent-GJ
		dc.w		GetNextMsg-GJ		;Up   arrow
		dc.w		GetNextMsg-GJ		;Down arrow
		dc.w		SlideScroll-GJ		;Clicked in Slide-gadget box beside the knob
		dc.w		DoPathStr-GJ
		dc.w		DoPosExit-GJ
		dc.w		DoNegExit-GJ

* You clicked on one of the 7 gadgets on the display
DoSelect	movea.l		FD_IAddress(FData),A1
		move.w		gg_GadgetID(A1),D0
		lsl.l		#2,D0
		movea.l		FD_DisplayList(FData),A2
		move.l		0(A2,D0.W),D0
		beq.S		DoneSelect
		movea.l		D0,A2			;A2=EntryNode
		tst.l		EntryType(A2)		;Test type
		bmi.S		NewDir
NewFile		cmpa.l		FD_LastSelect(FData),A2	;Same as last time ?
		bne.S		NoDouble
		LoadBase	IntBase			;Same as last time. Check time between clicks
		movem.l		FD_OSeconds(FData),D0-D1;Time of previous select
		movem.l		FD_Seconds(FData),D2-D3	;Time of this select
		CallLib		DoubleClick
		tst.l		D0
		bne		DoPosExit		;Double-clicked on a file. Let's exit
NoDouble	move.l		A2,FD_LastSelect(FData)	;New last select
		movem.l		FD_Seconds(FData),D0-D1
		movem.l		D0-D1,FD_OSeconds(FData);Store time this select
		movea.l		FR_FileBuf(FReq),A0
		move.w		FR_FileChars(FReq),D1
		ext.l		D1
		add.l		A0,D1			;This is the end of the FileBuffer
		bra.S		CopyFile
NewDir		bset		#NEWDIR,FR_ToDo(FReq)
		movea.l		FR_PathBuf(FReq),A0
		move.w		FR_PathChars(FReq),D1
		subq.w		#1,D1			;Need room for '/' in the end
		ext.l		D1
		add.l		A0,D1			;This is the end of the PathBuffer
		cmpi.l		#DEVTYPE,EntryType(A2)
		ble.S		CopyFile		;Clicked on something ending with a ':' ?
		Call		TackOn			;Clicked on a directory
CopyFile	lea		EntryName(A2),A1
		subq.l		#1,D1
FileCopyLoop	cmpa.l		D1,A0
		beq.S		BufOverflow
		move.b		(A1)+,(A0)+		;Copy name to String-Gadget
		bne.S		FileCopyLoop
BufOverflow	clr.b		(A0)			;Just in case we overflowed
		bset		#REFSTR,FR_ToDo(FReq)
DoneSelect	bra		GetNextMsg

* The slide-knob is currently selected and you moved the mouse, or
* you clicked in the prop-gadget box beside the knob
SlideScroll	move.w		SlideInfo+pi_VertPot(PC),FD_SlideVPos(FData)
		moveq		#0,D0
		move.w		FR_Count(FReq),D2
		subq.w		#DisplayRows,D2		;TopCount must not be greater than Count-DisplayRows
		ble.S		NoNewTop		;If less than DisplayRows files then TopIt
		move.l		#MAXPOT,D1
		divu		D2,D1			;65535/(Count-DisplayRows)
		move.w		FD_SlideVPos(FData),D0
		divu		D1,D0			;D0=Slide.vertpot/(65535/(Count-DisplayRows))
		cmp.w		FR_TopCount(FReq),D0	;Last line will cause a crash if Count-DisplayRows>65535
		beq.S		DoneScroll		;Don't scroll if knob hasn't moved enough
		cmp.w		D2,D0			;If TopCount>D2 then
		ble.S		NoNewTop
		move.w		D2,D0			;TopCount=D2
NoNewTop	bset		#DONTPOS,FR_ToDo(FReq)
		bclr		#KEEPTOP,FR_ToDo(FReq)
		bra.S		SeeThem

* Have just recieved a INTUITICK-message, and are now going to examine
* whether the arrow-gadget are currently selected
CheckScroll	btst		#7,SlideGad+gg_Flags+1(PC)	;SlideGad Selected ?
		bne.S		SlideScroll
		btst		#7,UpGad+gg_Flags+1(PC)		;UpGad Selected ?
		bne.S		ScrollOneUp
		btst		#7,DownGad+gg_Flags+1(PC)	;DownGad Selected ?
		beq.S		DoneScroll
* The down-arrow is currently selected
ScrollOneDown	move.w		FR_TopCount(FReq),D0
		move.w		FR_Count(FReq),D1
		subq.w		#DisplayRows,D1
		cmp.w		D0,D1			;If TopCount+DisplayRows>Count then dont scroll
		ble.S		DoneScroll
		addq.w		#1,D0
		bra.S		SeeThem
* The up-arrow is currently selected
ScrollOneUp	move.w		FR_TopCount(FReq),D0
		beq.S		DoneScroll		;If TopCount=0 then dont scroll
		subq.w		#1,D0

* D0=count of node to display on top of the display
* Finds node and fills the display
SeeThem		move.w		D0,FR_TopCount(FReq)	;Show the list from the 'D0'th node
FindEntry	lea		FR_List(FReq),A0
		movea.l		EntryNext(A0),A0
EntryLoop	subq.w		#1,D0
		bmi.S		DoneFindEntry
		movea.l		EntryNext(A0),A0
		bra.S		EntryLoop
DoneFindEntry	move.l		A0,FR_TopView(FReq)
RefreshDisplay	Call		WriteDisplay
		bclr		#DONTPOS,FR_ToDo(FReq)
		bne.S		DoneScroll		;If called from SlideScroll then
		Call		SetKnobHeight		;don't do any of these
		Call		SetKnobPos		;because intuition
		Call		SetKnob			;has already done it
DoneScroll	bra		GetNextMsg

* You clicked the 'Parent' button
DoParent	ori.b		#(1<<REFSTR)!(1<<NEWDIR),FR_ToDo(FReq)
		movea.l		FR_PathBuf(FReq),A0
		Call		MyStrLen		;Returns length excluding the null
		subq.w		#1,D0			;Skip the last character
		beq.S		DoneParent2		;One more than besides the null ?
		bmi.S		DoneParent3		;Only the null was present ?
CutOffLoop	subq.w		#1,D0
		bmi.S		DoneParent1
		move.b		0(A0,D0.W),D1
		cmpi.b		#'/',D1
		beq.S		DoneParent2		;If '/' then clear this byte
		cmpi.b		#':',D1
		bne.S		CutOffLoop		;If ':' then clear next byte
DoneParent1	addq.w		#1,D0
DoneParent2	clr.b		0(A0,D0.W)
DoneParent3	bra		GetNextMsg

* You pressed return while the path-string-gadget was active
DoPathStr	bset		#NEWDIR,FR_ToDo(FReq)
		bra		GetNextMsg

* You clicked the 'Ok' button, or
* you pressed return while the file-string-gadget was active, or
* you double-clicked on a filename
DoPosExit	movea.l		FR_PathBuf(FReq),A0
		Call		TackOn			;Append a '/'
		bra.S		DoExit
* You clicked the 'Cancel' button
DoNegExit	moveq		#FSENeg,D7
DoExit		bra		Exit

* ----------------------- Misc sub-routines ----------------------------
* A0=String, returns i D0.L the length of string excluding the null character
* Destroys D0
MyStrLen	PushS		A0
		moveq		#-1,D0
MyStrLenLoop	addq.l		#1,D0
		tst.b		(A0)+
		bne.S		MyStrLenLoop
		PopS		A0
		rts

* A0=Buffer to extend with a '/' if the buffer is non-empty, and
* if it doesn't already end with a '/' or a ':'
* Destroys A0 which on return points to NULL-byte after ':' or '/'
TackOn		PushS		D0
		Call		MyStrLen
		tst.w		D0
		adda.w		D0,A0			;End of the path-string
		beq.S		EndTackOn
		cmpi.b		#':',-1(A0)		;If path ends on anything else than
		beq.S		EndTackOn		;a ':'
		moveq		#'/',D0
		cmp.b		-1(A0),D0		;or a '/'
		beq.S		EndTackOn
		move.b		D0,(A0)+		;then add a '/'
EndTackOn	clr.b		(A0)			;and a NULL
		PopS		D0
		rts

* Sets the Slide-Knob vertical size according to FR_Count
* Doesn't destroys registers
SetKnobHeight	Push		D0-D2
		move.l		#MAXBODY,D0
		move.w		FR_Count(FReq),D1
		moveq		#DisplayRows,D2		;Count<=DisplayRows means full-sized knob
		cmp.w		D2,D1
		ble.S		DoneSH
		divu		D1,D0			;D0=65535/Count*DisplayRows
		mulu		D2,D0
DoneSH		move.w		D0,FD_SlideHeight(FData)
		Pop		D0-D2
		rts
* Sets the Slide-Knob vertical position according to FR_TopCount
* Doesn't destroys registers
SetKnobPos	Push		D0-D1
		moveq		#0,D0
		move.w		FR_Count(FReq),D1
		subq.w		#DisplayRows,D1
		ble.S		SetKnobToTop		;Count<=DisplayRows means top-placed knob
		move.w		FR_TopCount(FReq),D0
		swap		D0
		divu		D1,D0			;(D0*65535)/(Count-DisplayRows)
		bvc.S		SetKnobToTop
		moveq		#-1,D0			;move.l #MAXPOS,D0
SetKnobToTop	move.w		D0,FD_SlideVPos(FData)
		Pop		D0-D1
		rts
* Makes the Slide-Knob fill the entire Prop-Gadget
* Doesn't destroys registers
ResetKnob	clr.w		FD_SlideVPos(FData)	;Knob to the top
		move.w		#-1,FD_SlideHeight(FData);Full size
* Updates/refreshes the Prop-Gadget
* Doesn't destroys registers
SetKnob		Push		D0-D5/A0-A2
		lea		SlideGad(PC),A0
		movea.l		FD_Window(FData),A1
		suba.l		A2,A2
		moveq		#AUTOKNOB!FREEVERT!PROPBORDERLESS,D0
		moveq		#0,D1
		move.w		FD_SlideVPos(FData),D2
		moveq		#-1,D3			;move.w #$FFFF,D3 (HorizBody)
		move.w		FD_SlideHeight(FData),D4
		moveq		#1,D5
		LoadBase	IntBase
		CallLib		NewModifyProp
		Pop		D0-D5/A0-A2
		rts

* Fills the display with color 0
* Doesn't destroys registers
ClearDisplay	Push		D0-D3/A0-A1
		LoadBase	GfxBase			;Clear display
		moveq		#0,D0
		movea.l		FD_Rp(FData),A1
		CallLib		SetAPen
		moveq		#6,D0
		moveq		#12,D1
		move.w		#6+DisplayCols*8,D2
		moveq		#81,D3
		movea.l		FD_Rp(FData),A1
		CallLib		RectFill
		moveq		#1,D0
		movea.l		FD_Rp(FData),A1
		CallLib		SetAPen
		Pop		D0-D3/A0-A1		;Fall through
* Clears then DisplayList-array
* Doesn't destroys registers
ClearDisplayArr	Push		D0/A0
		movea.l		FD_DisplayList(FData),A0
		moveq		#DisplayRows-1,D0
ClearArrLoop	clr.l		(A0)+
		dbf		D0,ClearArrLoop
		Pop		D0/A0
		rts

* Fills the display with filenames plus size/type
* Stores the address of the nodes containing the displayed filenames in DisplayRows
* This routine could be made faster (but its fast enough for now)
* Doesn't destroys registers
WriteDisplay	Push		D0-D4/A0-A3
		Call		ClearDisplayArr
		LoadBase	GfxBase
		move.w		FR_TopCount(FReq),D4
		movea.l		FR_TopView(FReq),A3
		movea.l		FD_DisplayList(FData),A2
		moveq		#19,D3
WriteLoop	cmp.l		#0,A3			;This double-condition is necessary in order
		beq		DoneWriting		;to keep the devices from being shown
		cmp.w		FR_Count(FReq),D4	;because FR_TopCount doesn't correspond to
		bge		DoneWriting		;FR_TopView while the list is being build
		move.l		A3,(A2)+		;Save address of EntryNode
		movea.l		FD_TxtBuf(FData),A0
		move.l		EntryType(A3),D0	;D0=Type or Size
		bge.S		CopyName
InsertType	addq.w		#1,D0			;Find correct text to insert
		mulu		#-5,D0
		lea		TxtDirs(PC),A1
		adda.w		D0,A1			;One more directory,device,volume or 'assign'
		movea.l		FD_TxtBuf(FData),A0
		moveq		#4,D0
InsertTypeLoop	move.b		(A1)+,(A0)+		;Insert '(Dir)','<Dev>','<Vol>' or '<Asn>'
		dbf		D0,InsertTypeLoop
		move.b		#' ',(A0)+
CopyName	lea		EntryName(A3),A1
NameCopyLoop	move.b		(A1)+,(A0)+		;Copy name to Txtbuffer
		bne.S		NameCopyLoop
		subq.l		#1,A0
		move.l		A0,D0
		sub.l		FD_TxtBuf(FData),D0
		moveq		#DisplayCols-1,D1
		sub.w		D0,D1
		moveq		#' ',D0
BuffClearLoop	move.b		D0,(A0)+		;Clear rest of Txtbuffer
		dbf		D1,BuffClearLoop
		move.l		EntryType(A3),D0	;D0=Type or Size
		cmpi.l		#DIRTYPE,D0
		blt.S		TxtInDevColor
		beq.S		TxtInDirColor
		btst		#FSB_NOFILESIZE,FR_Flags+1(FReq)
		bne.S		TxtInFileColor		;This doesn't destroy cc
InsertSize	move.b		#'0',-1(A0)		;This has to be done If D0=0 
ConvertLoop	tst.l		D0			;A0=end of Txtbuffer
		ble.S		TxtInFileColor
		divu		#10,D0
		swap		D0
		addi.b		#'0',D0
		move.b		D0,-(A0)
		clr.w		D0
		swap		D0
		bra.S		ConvertLoop
TxtInFileColor	moveq		#FILECOLOR,D0
		bra.S		WriteLine
TxtInDirColor	moveq		#DIRCOLOR,D0
		bra.S		WriteLine
TxtInDevColor	moveq		#DEVCOLOR,D0
WriteLine	movea.l		FD_Rp(FData),A1
		cmp.b		rp_FgPen(A1),D0
		beq.S		DontSetColor
		CallLib		SetAPen			;Shouldn't do this everytime
DontSetColor	moveq		#6,D0
		move.w		D3,D1
		movea.l		FD_Rp(FData),A1
		CallLib		Move
		moveq		#DisplayCols,D0
		movea.l		FD_TxtBuf(FData),A0
		movea.l		FD_Rp(FData),A1
		move.b		#%00000011,rp_Mask(A1)	;Only write in bitplanes 0 and 1
		CallLib		Text
		addq.w		#1,D4
		movea.l		EntryNext(A3),A3
		addi.w		#10,D3			;Add 10 to vertical Write-position
		cmpi.w		#19+(DisplayRows-1)*10,D3
		ble		WriteLoop
DoneWriting	Pop		D0-D4/A0-A3
		rts

* A0=Node to insert in list
* Sorts according to EntryType and EntryName
* Destroys D0-D4,A0-A3
SortFiles	lea		EntryName(A0),A2
		movea.l		FD_TxtBuf(FData),A3
UpperCaseLoop	move.b		(A2)+,D0		;Convert name to uppercase
		beq.S		DoneUpperCase
		cmpi.b		#'a',D0
		blt.S		StoreUpperCase
		cmpi.b		#'z',D0
		bgt.S		StoreUpperCase
		subi.b		#32,D0
StoreUpperCase	move.b		D0,(A3)+
		bra.S		UpperCaseLoop
DoneUpperCase	move.l		EntryType(A0),D0
		bmi.S		TypeOk
		moveq		#1,D0			;Type 1 is File
TypeOk		lea		FR_List(FReq),A1
		move.l		FR_TopView(FReq),D4
SortLoop	cmp.l		A1,D4
		bne.S		LowerThan
		moveq		#0,D4
LowerThan	move.l		A1,D3			;D3 always entry to insert after
		tst.l		EntryNext(A1)
		beq.S		Insert			;End of list ?
		movea.l		EntryNext(A1),A1	;We go further down
		move.l		EntryType(A1),D2
		bmi.S		TypeOk2
		moveq		#1,D2			;Type 1 is File
TypeOk2		cmp.l		D2,D0
		blt.S		SortLoop
		bgt.S		Insert
CmpStr		movea.l		FD_TxtBuf(FData),A2	;Name to insert
		lea		EntryName(A1),A3	;Name to compare to
CmpLoop		move.b		(A3)+,D1
		beq.S		SortLoop
		cmpi.b		#'a',D1
		blt.S		Compare
		cmpi.b		#'z',D1
		bgt.S		Compare
		subi.b		#32,D1
Compare		cmp.b		(A2)+,D1		;Compare in uppercase
		beq.S		CmpLoop
		blt.S		SortLoop		;If name to insert>name in list then continue
Insert		movea.l		D3,A1
		move.l		EntryNext(A1),EntryNext(A0)	;A0 is entry to insert
		move.l		A0,EntryNext(A1)
		tst.w		D4
		beq.S		DoneSort
		btst		#KEEPTOP,FR_ToDo(FReq)
		beq.S		DoneSort
		addq.w		#1,FR_TopCount(FReq)	;Inserted the new entry before TopView		
DoneSort	rts

* UnLocks, whether FD_Lock is on a file or on the Device-list
* Doesn't destroy  registers
RemoveLock	Push		D0-D1/A0-A1
		move.l		FD_Lock(FData),D1
		beq.S		DoneRemoveLock
		btst		#GETDEVS,FR_ToDo(FReq)
		beq.S		RemoveFileLock
RemoveDevLock	Call		UnLockD			;Unlock Device-List
		bra.S		DoneRemoveLock
RemoveFileLock	LoadBase	DosBase
		CallLib		UnLock
DoneRemoveLock	clr.l		FD_Lock(FData)
		Pop		D0-D1/A0-A1
		rts

* The next three sub-routines fakes a Lock/UnLock/ExNext (Not Examine) on the Device-List
* LockD disables multitasking to make sure the Device-List is not changed while doing ExNextD's
* UnLockD enables multitasking again

* Stores the Device-List in FD_Lock 
* Doesn't destroys registers
LockD		Push		D0-D1/A0-A1
		LoadBase	ExecBase
		CallLib		Forbid
		movea.l		FD_DosBase(FData),A0
		movea.l		dl_Root(A0),A0		;dl_Root
		movea.l		rn_Info(A0),A0		;dl_Root->rn_Info
		adda.l		A0,A0
		adda.l		A0,A0
		movea.l		di_DevInfo(A0),A0	;Dosbase->dl_Root->rn_Info->di_DevInfo
		adda.l		A0,A0
		adda.l		A0,A0
		move.l		A0,FD_Lock(FData)
		Pop		D0-D1/A0-A1
		rts

* Clears FD_Lock
* Doesn't destroys registers
UnLockD		Push		D0-D1/A0-A1
		LoadBase	ExecBase
		CallLib		Permit
		clr.l		FD_Lock(FData)
		Pop		D0-D1/A0-A1
		rts

* Fills the FileInfoBlock FD_FIB with name and type
* Returns 0 in D0 if no more entries on the Device-List and 1 otherwise
* Destroys D0
ExNextD		Push		D1-D2/A0-A3
FindNextDev	movea.l		FD_FIB(FData),A2	;A2=FIB
		movea.l		FD_Lock(FData),A3	;A3=(struct DeviceList *)Lock
		moveq		#0,D0			;Return code
		tst.l		FD_Lock(FData)		;while not end of list
		beq.S		EndOfList
		move.l		dl_Next(A3),D0
		asl.l		#2,D0
		move.l		D0,FD_Lock(FData)
		move.l		dl_Type(A3),D1
		moveq		#DLT_VOLUME,D0
		cmp.l		D0,D1
		beq.S		GetTheDevice
		moveq		#DLT_DIRECTORY,D0
		cmp.l		D0,D1
		beq.S		GetTheDevice
		moveq		#DLT_DEVICE,D0
		cmp.l		D0,D1
		bne.S		FindNextDev
		tst.l		dl_Task(A3)		;if(dn->dn_Task == 0 then skip it
		beq.S		FindNextDev
GetTheDevice	movea.l		dl_Name(A3),A1		;A1=(BPTR)list->dl_Name
		adda.l		A1,A1
		adda.l		A1,A1
		move.b		(A1)+,D0		;D0=Length of string, A0=string
		ext.w		D0
		moveq		#32,D2
		cmp.w		D2,D0			;if(D0 > 32)
		ble.S		NameLengthIsOk
		move.w		D2,D0			;D0 = 32;
NameLengthIsOk	lea		fib_FileName(A2),A0	;A0=fib->fib_FileName
		subq.w		#1,D0
CopyLoop	move.b		(A1)+,(A0)+
		dbf		D0,CopyLoop
		move.b		#':',(A0)+		;Append a ':'
		clr.b		(A0)+			;and a NULL
		move.l		dl_Type(A3),fib_DirEntryType(A2)	;fib->fib_DirEntryType=list->dl_type
		moveq		#1,D0			;return 1;
EndOfList	Pop		D1-D2/A0-A3
		rts					;return 1 or return 0

DosName		dc.b		'dos.library',0
GfxName		dc.b		'graphics.library',0
IntuiName	dc.b		'intuition.library',0
		EVEN

FileNW		dc.w		111,58,299,126
		dc.b		0,1
		dc.l		MOUSEBUTTONS!GADGETUP!INTUITICKS,ACTIVATE!RMBTRAP!WINDOWDRAG,GadgetList,0,0,0,0
		dc.w		0,0,0,0,0

BWIDTH		=74
BHEIGHT		=11
ButBorder	BORDER		-2,-1,BUTCOLOR,0,RP_JAM2,17,ButVectors,0
ButVectors	dc.w		2,0,BWIDTH+1,0,BWIDTH+3,2,BWIDTH+3,BHEIGHT-1,BWIDTH+1,BHEIGHT+1,2,BHEIGHT+1,0,BHEIGHT-1,0,2,2,0
		dc.w		1,0,-1,2,-1,BHEIGHT-1,1,BHEIGHT+1,BWIDTH+2,BHEIGHT+1,BWIDTH+4,BHEIGHT-1,BWIDTH+4,2,BWIDTH+2,0
SWIDTH		=215
SHEIGHT		=10
StrBorder	BORDER		-4,-2,STRCOLOR,0,RP_JAM2,17,SVectors,0
SVectors	dc.w		2,0,SWIDTH+1,0,SWIDTH+3,2,SWIDTH+3,SHEIGHT-1,SWIDTH+1,SHEIGHT+1,2,SHEIGHT+1,0,SHEIGHT-1,0,2,2,0
		dc.w		1,0,-1,2,-1,SHEIGHT-1,1,SHEIGHT+1,SWIDTH+2,SHEIGHT+1,SWIDTH+4,SHEIGHT-1,SWIDTH+4,2,SWIDTH+2,0
PWIDTH		=18
PHEIGHT		=70
P2HEIGHT	=92
SlideBorder	BORDER		-2,-82,PROPCOLOR,0,RP_JAM2,17,PVectors,0
PVectors	dc.w		2,0,PWIDTH+1,0,PWIDTH+3,2,PWIDTH+3,P2HEIGHT-1,PWIDTH+1,P2HEIGHT+1,2,P2HEIGHT+1,0,P2HEIGHT-1,0,2,2,0
		dc.w		1,0,-1,2,-1,P2HEIGHT-1,1,P2HEIGHT+1,PWIDTH+2,P2HEIGHT+1,PWIDTH+4,P2HEIGHT-1,PWIDTH+4,2,PWIDTH+2,0

ITxtParent	INTUITEXT	1,0,RP_JAM2,13,2,TxtParent,0
ITxtPath	INTUITEXT	1,0,RP_JAM2,-41,0,TxtPath,0
ITxtFile	INTUITEXT	1,0,RP_JAM2,-41,0,TxtFile,0
ITxtPos		INTUITEXT	1,0,RP_JAM2,5,2,TxtPositiv,0
ITxtNeg		INTUITEXT	1,0,RP_JAM2,5,2,TxtNegativ,0

TxtAttr		dc.l		FontName
		dc.w		TOPAZ_EIGHTY
		dc.b		FS_NORMAL,FPB_ROMFONT

FontName	dc.b		'topaz.font',0
MemErrorTxt	dc.b		'Out of memory',0
DirErrorTxt	dc.b		'Directory error',0
SelectTxt	dc.b		'Select a file',0
InfoTxt		dc.b		'.info'
TxtDirs		dc.b		'(dir)'			;\
TxtDevs		dc.b		'<dev>'			; \The order and length of these strings is important to 'WriteDisplay'
TxtVols		dc.b		'<vol>'			; /
TxtAsns		dc.b		'<asn>'			;/
TxtParent	dc.b		'Parent',0
TxtPath		dc.b		'Path',0
TxtFile		dc.b		'File',0
TxtNegativ	dc.b		' Cancel',0
TxtPositiv	dc.b		'   Ok',0
		EVEN

SlideImage	IMAGE		0,0,0,0,0,0,0,0,0
ArrowsImage	IMAGE		1,0,16,22,1,ArrowsData,%00000001,%00000000,0

PathInfo	ds.b		36
FileInfo	ds.b		36
SlideInfo	dc.w		AUTOKNOB!FREEVERT!PROPBORDERLESS,0,0,0,8700,0,0,0,0,0,0

GadgetList
Select1Gad	GADGET		Select2Gad,4,12,DisplayCols*8+3,10,GADGHCOMP,RELVERIFY,BOOLGADGET
		GADGET2		0,0,0,0,0,Select1ID,0
Select2Gad	GADGET		Select3Gad,4,22,DisplayCols*8+3,10,GADGHCOMP,RELVERIFY,BOOLGADGET
		GADGET2		0,0,0,0,0,Select2ID,0
Select3Gad	GADGET		Select4Gad,4,32,DisplayCols*8+3,10,GADGHCOMP,RELVERIFY,BOOLGADGET
		GADGET2		0,0,0,0,0,Select3ID,0
Select4Gad	GADGET		Select5Gad,4,42,DisplayCols*8+3,10,GADGHCOMP,RELVERIFY,BOOLGADGET
		GADGET2		0,0,0,0,0,Select4ID,0
Select5Gad	GADGET		Select6Gad,4,52,DisplayCols*8+3,10,GADGHCOMP,RELVERIFY,BOOLGADGET
		GADGET2		0,0,0,0,0,Select5ID,0
Select6Gad	GADGET		Select7Gad,4,62,DisplayCols*8+3,10,GADGHCOMP,RELVERIFY,BOOLGADGET
		GADGET2		0,0,0,0,0,Select6ID,0
Select7Gad	GADGET		ParentGad,4,72,DisplayCols*8+3,10,GADGHCOMP,RELVERIFY,BOOLGADGET
		GADGET2		0,0,0,0,0,Select7ID,0
ParentGad	GADGET		UpGad,112,110,BWIDTH,BHEIGHT,GADGHCOMP,RELVERIFY,BOOLGADGET
		GADGET2		ButBorder,0,ITxtParent,0,0,ParentID,0
UpGad		GADGET		DownGad,271,83,18,12,GADGHCOMP!GADGIMAGE,RELVERIFY,BOOLGADGET
		GADGET2		ArrowsImage,0,0,0,0,UpID,0
DownGad		GADGET		SlideGad,271,94,18,12,GADGHCOMP,RELVERIFY,BOOLGADGET
		GADGET2		SlideBorder,0,0,0,0,DownID,0
SlideGad	GADGET		PathGad,271,13,PWIDTH,PHEIGHT,GADGHCOMP,RELVERIFY,PROPGADGET
		GADGET2		SlideImage,0,0,0,SlideInfo,SlideID,0
PathGad		GADGET		FileGad,48,85,SWIDTH,SHEIGHT,GADGHCOMP,RELVERIFY,STRGADGET
		GADGET2		StrBorder,0,ITxtPath,0,PathInfo,PathID,0
FileGad		GADGET		PosGad,48,96,SWIDTH,SHEIGHT,GADGHCOMP,RELVERIFY,STRGADGET
		GADGET2		StrBorder,0,ITxtFile,0,FileInfo,PosID,0
PosGad		GADGET		NegGad,10,110,BWIDTH,BHEIGHT,GADGHCOMP,RELVERIFY,BOOLGADGET
		GADGET2		ButBorder,0,ITxtPos,0,0,PosID,0
NegGad		GADGET		0,215,110,BWIDTH,BHEIGHT,GADGHCOMP,RELVERIFY,BOOLGADGET
		GADGET2		ButBorder,0,ITxtNeg,0,0,NegID,0
		EVEN

	SECTION IMAGEDATA,DATA_C		;Image-data has to be in CHIP-RAM
ArrowsData	dc.w		%0000000110000000
		dc.w		%0000001111000000
		dc.w		%0000011001100000
		dc.w		%0000110000110000
		dc.w		%0001100000011000
		dc.w		%0011000000001100
		dc.w		%0110000000000110
		dc.w		%1100000000000011
		dc.w		%1100000000000011
		dc.w		%0110000000000110
		dc.w		%0011000000001100
		dc.w		%0011111111111100
		dc.w		%0110000000000110
		dc.w		%1100000000000011
		dc.w		%1100000000000011
		dc.w		%0110000000000110
		dc.w		%0011000000001100
		dc.w		%0001100000011000
		dc.w		%0000110000110000
		dc.w		%0000011001100000
		dc.w		%0000001111000000
		dc.w		%0000000110000000
		END


