שתשת                                        	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.w	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 -----------------------------
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.w	.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.w	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)
.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
.nogadget:
	bra.w	.GetEvent

.CheckClose:
	cmp.l	#IDCMP_CLOSEWINDOW,d3	; Close gadget pressed ?
	bne.w	.GetEvent		; Nope! Get next message
.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
	dc.l	TAG_DONE

textattr:	equ	ta+4	

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

;------------------------------- 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
	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
but1txt:	dc.b	"_A button",0
but2txt:	dc.b	"Another _button",0
but3txt:	dc.b	"_One more",0
bordertxt:	dc.b	"Border",0
	even

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

StdGTTags:
	dc.l	GT_Underscore,	'_',		TAG_DONE
	
Gad1:	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_Left,	LEFT_OFFSET
	dc.l	GU_Top,		TOP_OFFSET,	GU_GadgetText,	bordertxt
	dc.l	GU_AdjustTop,	-4
	dc.l	GU_AlignRight,	2,		GU_AddWidth,	8
	dc.l	GU_AlignBottom,	4,		GU_AddHeight,	INTERHEIGHT

	dc.l	GUBB_Flags,	BB_TEXT_IN,	GUBB_TextPen,	SHINEPEN
	dc.l	GUBB_FrameType,	BFT_RIDGE,	GUBB_Recessed,	TRUE
	dc.l	TAG_DONE

Gad2:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but1txt
	dc.l	GU_AddLeft,	INTERWIDTH,	GU_AdjustTop,	0
	dc.l	GU_AutoWidth,	50,		GU_AutoHeight,	4
StdButtonTags:
	dc.l	GU_Flags,	PLACETEXT_IN
StdGadTags:
	dc.l	GU_LabelHotkey,	TRUE		GU_TextAttr,	mytextattr
	dc.l	TAG_DONE

Gad3:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but2txt
	dc.l	GU_AlignLeft,	2,		GU_TopRel,	2
	dc.l	GU_DupeHeight,	2,		GU_DupeWidth,	2
	dc.l	GU_AddTop,	INTERHEIGHT,	TAG_MORE,	StdButtonTags

Gad4:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but3txt
	dc.l	GU_AlignLeft,	2,		GU_TopRel,	3
	dc.l	GU_DupeHeight,	2,		GU_DupeWidth,	2
	dc.l	GU_AddTop,	INTERHEIGHT,	TAG_MORE,	StdButtonTags

gadgets:
	GADGET	1,	Gad1,	StdGTTags
	GADGET	2,	Gad2,	StdGTTags
	GADGET	3,	Gad3,	StdGTTags
	GADGET	4,	Gad4,	StdGTTags
	GADGET	-1,	NULL,	NULL

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

	STRUCTURE	MyBSS,0
		LONG	screen
		LONG	main_win
		LONG	priv_info
		LONG	menustrip
		LONG	msgcoords
	LABEL	MyBSS_SIZEOF

	SECTION	TestProg,BSS
mybss:	ds.b	MyBSS_SIZEOF

