; 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<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<','' or '' 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 '' ; \The order and length of these strings is important to 'WriteDisplay' TxtVols dc.b '' ; / TxtAsns dc.b '' ;/ 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