ùúùú  6‰  6‰  6‰  6‰  6‰  6‰  6‰  6‰  6‰  6‰	incdir	"include:"
	include	"exec/execbase.i"
	include	"libraries/gadtools.i"
	include	"libraries/gadutil.i"
	include	"libraries/gadutil_lib.i"
	include	"LVOs.i"

start:
	move.l	_AbsExecBase.w,a6
	lea.l	libdatas(pc),a2		; Open all needed libraries
	move.w	(a2)+,d2
.openlib:
	move.l	(a2),a1			; Get library name pointer
	moveq.l	#36,d0
	CallLib	OpenLibrary
	move.l	d0,(a2)+		; Save base address
	dbeq	d2,.openlib		; Continue until done or error
	beq.s	.closelibs

	bsr.b	TestProgram

.closelibs:
	lea.l	libdatas(pc),a2		; Close all opened libraries
	move.w	(a2)+,d2
.closelib:
	move.l	(a2)+,d0		; Get base address for library
	beq.s	.closedone
	move.l	d0,a1
	CallLib	CloseLibrary
	dbra	d2,.closelib
.closedone:
	moveq.l	#0,d0
	rts

;----------------------------- library data ----------------------------------
libdatas:	dc.w	5-1

dosbase:	dc.l	dosname
GUtilBase:	dc.l	gadutilname
GfxBase:	dc.l	gfxname
IntuiBase:	dc.l	intuiname
UtilBase:	dc.l	utilname

dosname:	dc.b	'dos.library',0
gadutilname:	dc.b	'gadutil.library',0
gfxname:	dc.b	'graphics.library',0
intuiname:	dc.b	'intuition.library',0
utilname:	dc.b	'utility.library',0
	even

;------------------------------ The test program -----------------------------

	include	exec/execbase.i
	include	libraries/amigaguide.i
TestProgram:
	movem.l	d0-a6,-(sp)
;	move.l	LibList(a6),LVGTTags+4 ; Set list pointer for ListView gadget
	move.l	GUtilBase(pc),a6

	move.l	a6,a0			; Check for latest version of GadUtil
	moveq.l	#GADUTIL_VER,d0
	moveq.l	#GADUTIL_REV,d1
	CallLib	GU_CheckVersion
	beq.w	.wrongver
.verok:	
	lea.l	mybss,a5		; Get pointer to BSS
	suba.l	a0,a0			; Lock the default public screen
	CallLib	LockPubScreen,IntuiBase(pc)
	move.l	d0,screen(a5)
	beq.w	.noscreen

	lea.l	glist(pc),a0		; Pointer to gadget list pointer
	lea.l	gadgets(pc),a1		; LayoutGadget structures
	move.l	d0,a2			; Screen pointer
	lea.l	LayoutTags(pc),a3	; Tags for LayoutGadgetsA

	move.l	sc_Font(a2),textattr	; Use the screen's font
	move.l	GUtilBase(pc),a6
	CallLib	GU_LayoutGadgetsA	; Lay out the gadgets
	move.l	a0,priv_info(a5)	; Save pointer to PrivateInfo
	beq.b	.unlocksc

	lea.l	window_tags(pc),a1	; Get window tags

	move.l	screen(a5),a0		; WA_Top = screen->Font->ta_YSize + 3
	move.l	sc_Font(a0),a0
	moveq.l	#0,d0
	move.w	ta_YSize(a0),d0
	addq.w	#3,d0
	move.l	d0,WinTop(a1)
	
	move.l	farright(pc),d0		; WA_InnerWidth = farright+LEFT_OFFSET
	addq.l	#LEFT_OFFSET,d0
	move.l	d0,InnerWidth(a1)

	move.l	farbottom(pc),d0	; WA_InnerHeight = farbotton+TOP_OFFSET
	addq.l	#TOP_OFFSET*2,d0
	move.l	d0,InnerHeight(a1)

	suba.l	a0,a0			; Open the window
	CallLib	OpenWindowTagList,IntuiBase(pc)
	move.l	d0,main_win(a5)
	beq.s	.freegads		; Error opening the window

	move.l	d0,a0			; Refresh everything in the window
	move.l	priv_info(a5),a1
	CallLib	GU_RefreshWindow,GUtilBase(pc)

	move.l	main_win(a5),a0
	bsr.b	process_window_events	; Wait for and process all events
	
;------------------------------- Exit routines -------------------------------
.closewin:
	move.l	main_win(a5),a0
	CallLib	CloseWindow,IntuiBase(pc)	
.freegads:
	move.l	priv_info(a5),a0	; Free all gadgets
	move.l	GUtilBase(pc),a6
	CallLib	GU_FreeLayoutGadgets
.unlocksc:
	suba.l	a0,a0			; No name pointer
	move.l	screen(a5),a1		; Pointer to the locked screen
	CallLib	UnlockPubScreen,IntuiBase(pc)
.noscreen:
.wrongver:
	movem.l	(sp)+,d0-a6
	rts

;------------------ Wait for and process window events -----------------------
; Inputs: A0 - Window pointer
;
process_window_events:
	movem.l	d0-a6,-(sp)
	lea.l	MyList(a5),a0		; Initialize list structure
	CallLib	GU_NewList,GUtilBase(pc)

	moveq.l	#FILENAME_GAD,d0	; Get address of filename string gad
	lea.l	gadgets(pc),a0
	CallLib	GU_GetGadgetPtr
	beq.w	.Exit			; Don't continue if no gadget
	move.l	d0,a0
	move.l	gg_SpecialInfo(a0),a0	; Get gadget->SpecialInfo->Buffer
	move.l	si_Buffer(a0),a0
	move.l	a0,StringBuff(a5)
.WaitEvent:
	move.l	_AbsExecBase.w,a6
	move.l	32(sp),a0		; Get pointer to window
	move.l	wd_UserPort(a0),a0	; Get UserPort
	CallLib	WaitPort		; Wait for a message
.GetEvent:
	move.l	32(sp),a0		; Get window pointer
	bsr.w	GetIMessage		; Get the message and process REFRESH
	bmi.s	.GetEvent		; Get next event if IDCMP_REFRESHWIN
	beq.s	.WaitEvent		; Continue waiting if no message

.checkgadup:
	cmp.l	#IDCMP_GADGETUP,d3	; Any gadget released ?
	bne.w	.CheckClose		; Nope!
	move.w	gg_GadgetID(a2),d1	; Get GadgetID
	bchg	#1,$bfe001

	cmp.w	#ADD_GAD,d1		; Button 1 pressed ?
	bne.s	.CheckNext		; Nope! Check more gadgets

	moveq.l	#LISTVIEW_GAD,d0	; Get pointer to the ListView gadget
	lea.l	gadgets(pc),a0
	CallLib	GU_GetGadgetPtr,GUtilBase(pc)
	move.l	d0,d2			; Store gadget pointer
	beq.b	.nogadget

	move.l	main_win(a5),a0		; Detach the list from the ListView
	CallLib	GU_DetachList

	move.l	d2,d0			; Get gadget pointer
	move.l	StringBuff(a5),a0	; Get string to add
	lea.l	MyList(a5),a1		; Get list pointer
	CallLib	GU_AddTail

	move.l	d2,d0			; Get gadget pointer
	move.l	main_win(a5),a0
	lea.l	MyList(a5),a1
	CallLib	GU_AttachList		; Put back the list in the listview
	
.nogadget:
	bra.b	.GetEvent
.CheckNext:
	cmp.w	#20,d1			; FILE_KIND gadget ?
	bne.b	.CheckHelp
	
	moveq.l	#LISTVIEW_GAD,d0
	lea.l	gadgets(pc),a0
	CallLib	GU_GetGadgetPtr,GUtilBase(pc)
	beq.b	.nogadget

	move.l	main_win(a5),a0
	lea.l	MyList(a5),a1
	CallLib	GU_ClearList
	bra.b	.nogadget

.CheckHelp:
	cmp.w	#HELP_GAD,d1		; Help gadget ?
	bne.w	.GetEvent

	move.l	main_win(a5),a0		; Block input of main window
	CallLib	GU_BlockInput,GUtilBase(pc)

	lea.l	aguidename(pc),a1
	moveq.l	#33,d0
	CallLib	OpenLibrary,_AbsExecBase.w
	move.l	d0,aguidebase
	beq.b	.noaguide

	lea.l	myag(pc),a0		; Get NewAmigaGuide structure
	move.l	screen(a5),nag_Screen(a0)
	suba.l	a1,a1
	CallLib	OpenAmigaGuideA,aguidebase(pc)	
	tst.l	d0
	beq.b	.closeaguide
	move.l	d0,a0
	CallLib	CloseAmigaGuide
.closeaguide:
	move.l	aguidebase(pc),a1
	CallLib	CloseLibrary,_AbsExecBase.w
.noaguide:
;	move.l	#50,d1
;	CallLib	Delay,dosbase(pc)
	
	move.l	main_win(a5),a0		; Block input of main window
	CallLib	GU_FreeInput,GUtilBase(pc)

	bra.w	.GetEvent
.CheckClose:
	cmp.l	#IDCMP_CLOSEWINDOW,d3	; Close gadget pressed ?
	beq.b	.Exit			; Yup! Exit

	cmp.l	#IDCMP_MOUSEMOVE,d3	; Slider gadget ?
	bne.w	.GetEvent		; Nope! Get next message
	cmp.w	#SLIDER_GAD,gg_GadgetID(a2)	; Progress gadget ?
	bne.w	.GetEvent		; Nope! Get next message
	
	move.l	progr_gad(pc),a2
	move.l	d2,pg_Current(a2)
	move.l	main_win(a5),a0
	move.l	priv_info(a5),a1
	CallLib	GU_UpdateProgress
	bra.w	.GetEvent
.Exit
	movem.l	(sp)+,d0-a6
	rts

;---------------------- Get a message from the window ------------------------
; Input:
;	A0 = pointer to window
; Output:
;	A2 = Message IAddress
;	D2 = Message Code
;	D3 = Message Class
; Flags:
;	 Z =  1 for no message (use BEQ)
;	 Z =  0 for a valid message other than IDCMP_REFRESHWINDOW
;	 N =  1 for a IDCMP_REFRESHWINDOW message (use BMI)
;
;------------------------------------------------------------------------------
GetIMessage:
	move.l	a0,-(sp)		; Save window pointer
	move.l	wd_UserPort(a0),a0	; Get UserPort

	CallLib	GU_GetIMsg,GUtilBase(pc)
	beq.s	.NoMessage		; No message - return
	move.l	d0,a1
	move.l	im_IAddress(a1),a2	; IAddress to A2
	moveq.l	#0,d2			; Clear code longword
	move.w	im_Code(a1),d2		; Code to D2
	move.l	im_Class(a1),d3		; Class to D3
	move.l	im_MouseX(a1),msgcoords(a5)
	CallLib	GU_ReplyIMsg		; Reply the message

	cmp.l	#IDCMP_REFRESHWINDOW,d3	; Do window need to be refreshed ?
	bne.b	.NoMessage		; Nope! Check next message!
	move.l	(sp),a0
	CallLib	GU_BeginRefresh		; Start refreshing window
	move.l	(sp),a0
	moveq.l	#TRUE,d0
	CallLib	GU_EndRefresh		; Refreshing done
	moveq.l	#-1,d0			; Set N flag
.NoMessage:
	move.l	(sp)+,a0
	rts

;------------------------ Datas for LayoutGadgetsA ---------------------------
LayoutTags:
	dc.l	GU_RightExtreme,	farright
	dc.l	GU_LowerExtreme,	farbottom
	dc.l	GU_MinimumIDCMP,	MinimumIDCMP
ta:	dc.l	GU_DefTextAttr,		0
cat:	dc.l	GU_Catalog,		0
	dc.l	TAG_DONE

textattr:	equ	ta+4	

farright:	dc.l	0
farbottom:	dc.l	0

ADD_GAD:	equ	0
FILENAME_GAD:	equ	1
LISTVIEW_GAD:	equ	2
FILE_GAD:	equ	3
SHOWSEL_GAD:	equ	4
BOXAROUND_GAD:	equ	5
DRIVE_GAD:	equ	6
PROGRESS_GAD:	equ	7
SLIDER_GAD:	equ	8
HELP_GAD:	equ	9

addtxt:		dc.b	'_Add filename',0
filenametxt:	dc.b	'_Filename:',0
listviewtxt:	dc.b	'_Select an item:',0
helptxt:	dc.b	'_Help',0
;------------------------------- AmigaGuide data -----------------------------
aguidename:	dc.b	'amigaguide.library',0
guidename:	dc.b	'ram:Guide.guide',0
applname:	dc.b	'TestProgram',0
nodename:	dc.b	'MAIN',0

	even
aguidebase:	dc.l	0

myag:		dc.l	0		; Lock
		dc.l	guidename	; Filename
		dc.l	0,0,0,0		; Screen,PubScreen,HostPort,ClientPort
		dc.l	applname	; BaseName
		dc.l	0,0		; Flags,Context
		dc.l	nodename	; Node
		dc.l	10,0,0		; Line, Extens, Client (private)



;------------------------------- Window datas --------------------------------

INTUIIDCMP:	equ	IDCMP_REFRESHWINDOW!IDCMP_CLOSEWINDOW
WINGADS:	equ	WFLG_DRAGBAR!WFLG_DEPTHGADGET!WFLG_CLOSEGADGET

window_tags:
	dc.l	WA_Left,	0,	WA_Top
WinTop:	equ	*-window_tags
	dc.l	0,		WA_InnerWidth
InnerWidth:EQU	*-window_tags
	dc.l	0,		WA_InnerHeight
InnerHeight:EQU	*-window_tags
	dc.l	0,		WA_IDCMP,INTUIIDCMP
MinimumIDCMP:	EQU *-4
	dc.l	WA_Flags,	WINGADS!WFLG_ACTIVATE!WFLG_SMART_REFRESH!WFLG_REPORTMOUSE
	dc.l	WA_RMBTrap,	TRUE
	dc.l	WA_Gadgets
glist:	dc.l	0
	dc.l	WA_Title,WinTitle
emptytag:
	dc.l	TAG_DONE

mytextattr:	dc.l	fontname
		dc.w	6
		dc.b	0
		dc.b	FPF_DISKFONT

WinTitle:	dc.b	"GadUtil library test",0
fontname:	dc.b	"mini6.font",0
bordertxt:	dc.b	"Test all gadgets",0
	even

;----------------------------- Gadget datas ----------------------------------
LEFT_OFFSET:	equ	6
TOP_OFFSET:	equ	3

StdGTTags:
	dc.l	GT_Underscore,	'_',		TAG_DONE
	
BoxAround:
	dc.l	GU_TextAttr,	mytextattr
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_Left,	LEFT_OFFSET
	dc.l	GU_Top,		TOP_OFFSET,	GU_AlignBottom,	PROGRESS_GAD
	dc.l	GU_AddHeiLines,	1,		GU_AlignRight,	LISTVIEW_GAD
	dc.l	GU_AddWidth,	LEFT_OFFSET*2,	GU_GadgetText,	bordertxt
	dc.l	GUBB_FrameType,	BFT_RIDGE,	GUBB_Recessed,	TRUE
	dc.l	GUBB_TextPen,	SHINEPEN,	GUBB_3DText,	TRUE
	dc.l	GUBB_Flags,	BB_TEXT_IN_CENTER!BB_SHADOW_DR
	dc.l	TAG_DONE

NextDriveGad:
	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	addtxt
	dc.l	GU_Left,	LEFT_OFFSET*3,	GU_Top,		TOP_OFFSET
	dc.l	GU_AdjustTop,	0
	dc.l	GU_AutoWidth,	10,		GU_DupeHeight,	FILENAME_GAD
StdButtonTags:
	dc.l	GU_Flags,	PLACETEXT_IN
StdGadTags:
	dc.l	GU_LabelHotkey,	TRUE
	dc.l	TAG_DONE

FileNameGad:
	dc.l	GU_GadgetKind,	STRING_KIND,	GU_LeftRel,	ADD_GAD
	dc.l	GU_GadgetText,	filenametxt,	GU_AutoHeight,	4
	dc.l	GU_Flags,	PLACETEXT_LEFT,	GU_AdjustLeft,	10
	dc.l	GU_Hotkey,	"F",		GU_HotkeyCase,	TRUE
	dc.l	GU_Columns,	40,		TAG_MORE,	StdGadTags

ListViewGad:
	dc.l	GU_GadgetKind,	LISTVIEW_KIND,	GU_TopRel,	ADD_GAD
	dc.l	GU_HeightFactor,14,		GU_GadgetText,	listviewtxt
	dc.l	GU_AlignLeft,	ADD_GAD,	GU_AlignRight,	FILE_GAD
	dc.l	GU_AdjustTop,	INTERHEIGHT*2
	dc.l	GU_Flags,	PLACETEXT_ABOVE!NG_HIGHLABEL
	dc.l	TAG_MORE,	StdGadTags

LVGTTags:
	dc.l	GTLV_Labels,	NULL,		GTLV_ShowSelected,	-1
	dc.l	TAG_MORE,	StdGTTags

ShowSelGad:
	dc.l	GU_GadgetKind,	STRING_KIND,	GU_DupeWidth,	LISTVIEW_GAD
	dc.l	GU_AlignLeft,	LISTVIEW_GAD,	GU_AutoHeight,	4
	dc.l	GU_GadgetText,	NULL,		TAG_DONE

FileGad:
	dc.l	GU_GadgetKind,	FILE_KIND,	GU_GadgetText,	NULL
	dc.l	GU_AlignTop,	FILENAME_GAD,	GU_LeftRel,	FILENAME_GAD
	dc.l	GU_DupeHeight,	FILENAME_GAD,	GU_Width,	20
	dc.l	GU_Hotkey,	'f',		GU_HotkeyCase,	TRUE
	dc.l	GU_Flags,	PLACETEXT_LEFT
	dc.l	TAG_DONE

DriveGad:
	dc.l	GU_GadgetKind,	CYCLE_KIND,	GU_GadgetText,	DriveText
	dc.l	GU_TopRel,	ADD_GAD,	GU_AutoWidth,	ADD_GAD
	dc.l	GU_DupeHeight,	ADD_GAD,	GU_AlignLeft,	ADD_GAD
	dc.l	GU_AdjustLeft,	10
	dc.l	GU_AddTop,	1,		GU_Flags,	PLACETEXT_LEFT
	dc.l	TAG_MORE,	StdGadTags

DriveGTTags:
	dc.l	GTCY_Labels,	CycleText,	TAG_MORE,	StdGTTags

HelpGad:
	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	helptxt
	dc.l	GU_AutoWidth,	10,		GU_DupeHeight,	ADD_GAD
	dc.l	GU_AlignRight,	FILE_GAD,	GU_AlignTop,	DRIVE_GAD
	dc.l	TAG_MORE,	StdButtonTags

ProgressGadget:
	dc.l	GU_GadgetKind,	PROGRESS_KIND,	GU_AlignLeft,	ADD_GAD
	dc.l	GU_GadgetText,	slidtxt,	GU_AdjustLeft,	0
	dc.l	GU_AlignRight,	FILE_GAD,	GU_AutoHeight,	4
	dc.l	GU_TopRel,	SLIDER_GAD,	GU_AddTop,	1
;	dc.l	GU_Flags,	PLACETEXT_LEFT
	dc.l	GUPR_Total,	60,		GUPR_Current,	30
;	dc.l	GUPR_FillColor,	3,		GUPR_BackColor,	5
	dc.l	TAG_DONE

SliderGadget:
	dc.l	GU_GadgetKind,	SLIDER_KIND,	GU_AlignLeft,	ADD_GAD
	dc.l	GU_GadgetText,	slidtxt,	GU_Flags,	PLACETEXT_LEFT
	dc.l	GU_AdjustLeft,	0
	dc.l	GU_AlignRight,	FILE_GAD,	GU_AutoHeight,	4
	dc.l	GU_AddWidChar,	-3
	dc.l	GU_TopRel,	LISTVIEW_GAD,	TAG_MORE,	StdGadTags
SliderGTTags:
	dc.l	GTSL_Max,	 60,		GTSL_Level,	30
	dc.l	GTSL_MaxLevelLen, 3,		GTSL_LevelFormat, levform
	dc.l	GTSL_LevelPlace, PLACETEXT_RIGHT, PGA_Freedom, LORIENT_HORIZ
	dc.l	TAG_MORE,	StdGTTags
slidtxt:
	dc.b	"_Tax:",0
levform:
	dc.b	"%ld%",0
	even

gadgets:
		GADGET	BOXAROUND_GAD,	BoxAround,	NULL
		GADGET	ADD_GAD,	NextDriveGad,	StdGTTags
		GADGET	FILENAME_GAD,	FileNameGad,	StdGTTags
;		GADGET	SHOWSEL_GAD,	ShowSelGad,	StdGTTags
		GADGET	LISTVIEW_GAD,	ListViewGad,	LVGTTags
		GADGET	FILE_GAD,	FileGad,	NULL
		GADGET	DRIVE_GAD,	DriveGad,	DriveGTTags
		GADGET	PROGRESS_GAD,	ProgressGadget,	StdGTTags
progr_gad:	equ	*-4
		GADGET	SLIDER_GAD,	SliderGadget,	SliderGTTags
		GADGET	HELP_GAD,	HelpGad,	StdGTTags
		LASTGAD

CycleText:	dc.l	CyText1,CyText2,CyText3,CyText4,0
CyText1:	dc.b	"Label 1",0
CyText2:	dc.b	"Lejjjbel 2",0
CyText3:	dc.b	"Lejbel 3",0
CyText4:	dc.b	"Lajjbel 4",0
DriveText:	dc.b	"Drive:",0
progresstxt:	dc.b	"Progress:",0

;------------------------------- BSS ----------------------------

	STRUCTURE	MyBSS,0
		LONG	StringBuff
		LONG	screen
		LONG	main_win
		LONG	priv_info
		LONG	menustrip
		LONG	msgcoords
		STRUCT	MyList,MLH_SIZE
	LABEL	MyBSS_SIZEOF

	SECTION	TestProg,BSS
mybss:	ds.b	MyBSS_SIZEOF

TestPgmEnd:
;---------------- Test program for debugging ends here -----------------
