שתשת                                        	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	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,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.b	.CheckClose		; Nope!
	move.w	gg_GadgetID(a2),d1	; Get GadgetID
	bchg	#1,$bfe001
	bra.b	.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
	move.l	priv_info(a5),a1
	CallLib	GU_RefreshBoxes
	
	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
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

;------------------------------- 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
	dc.l	WA_Flags,	WINGADS!WFLG_ACTIVATE!WFLG_SMART_REFRESH
	dc.l	WA_RMBTrap,	TRUE
	dc.l	WA_Zoom,	zoomsize
	dc.l	WA_Gadgets
glist:	dc.l	0
	dc.l	WA_Title,WinTitle
emptytag:
	dc.l	TAG_DONE

zoomsize:	dc.w	0,11,200,11
mytextattr:	dc.l	fontname
		dc.w	8
		dc.b	0
		dc.b	FPF_DISKFONT
	
WinTitle:	dc.b	"GadUtil library test",0
fontname:	dc.b	"iconfont.font",0
	even

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

BevelBox1:
	dc.l	GU_TextAttr,	mytextattr
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	beveltxt
	dc.l	GU_Left,	LEFT_OFFSET,	GU_Top,		TOP_OFFSET+5
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_RIDGE,	GUBB_Recessed,	FALSE
	dc.l	GUBB_TextPen,	SHINEPEN,	GUBB_TextColor,	3
	dc.l	TAG_DONE

BevelBox2:
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	beveltxt
	dc.l	GU_LeftRel,	1,		GU_AddLeft,	INTERWIDTH
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_RIDGE,	GUBB_Recessed,	TRUE
	dc.l	TAG_DONE

BevelBox3:
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	beveltxt
	dc.l	GU_AlignLeft,	1,		GU_TopRel,	2
	dc.l	GU_AddTop,	INTERHEIGHT+5
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_BUTTON,	GUBB_Recessed,	FALSE
	dc.l	TAG_DONE

BevelBox4:
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	beveltxt
	dc.l	GU_LeftRel,	3,		GU_AddLeft,	INTERWIDTH
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_BUTTON,	GUBB_Recessed,	TRUE
	dc.l	TAG_DONE

BevelBox5:
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	beveltxt
	dc.l	GU_AlignLeft,	1,		GU_TopRel,	4
	dc.l	GU_AddTop,	INTERHEIGHT+5
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_DROPBOX,	GUBB_Recessed,	FALSE
	dc.l	TAG_DONE

BevelBox6:
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	beveltxt
	dc.l	GU_LeftRel,	5,		GU_AddLeft,	INTERWIDTH
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_DROPBOX,	GUBB_Recessed,	TRUE
	dc.l	TAG_DONE

BevelBox7:
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	NULL
	dc.l	GU_LeftRel,	2,		GU_AlignTop,	1
	dc.l	GU_AddLeft,	INTERWIDTH
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_RIDGE,	GUBB_Recessed,	FALSE
	dc.l	TAG_DONE

BevelBox8:
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	NULL
	dc.l	GU_LeftRel,	7,		GU_AddLeft,	INTERWIDTH
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_RIDGE,	GUBB_Recessed,	TRUE
	dc.l	TAG_DONE

BevelBox9:
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	NULL
	dc.l	GU_AlignLeft,	7,		GU_TopRel,	2
	dc.l	GU_AddTop,	INTERHEIGHT+5
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_BUTTON,	GUBB_Recessed,	FALSE
	dc.l	TAG_DONE

BevelBox10:
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	NULL
	dc.l	GU_LeftRel,	7,		GU_AddLeft,	INTERWIDTH
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_BUTTON,	GUBB_Recessed,	TRUE
	dc.l	TAG_DONE

BevelBox11:
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	NULL
	dc.l	GU_AlignLeft,	7,		GU_TopRel,	4
	dc.l	GU_AddTop,	INTERHEIGHT+5
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_DROPBOX,	GUBB_Recessed,	FALSE
	dc.l	TAG_DONE

BevelBox12:
	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	NULL
	dc.l	GU_LeftRel,	7,		GU_AddLeft,	INTERWIDTH
	dc.l	GU_Width,	100,		GU_Height,	50
	dc.l	GUBB_FrameType,	BFT_DROPBOX,	GUBB_Recessed,	TRUE
	dc.l	TAG_DONE

beveltxt:	dc.b	"Bevel box",0
	even

gadgets:
		GADGET	1,	BevelBox1,	NULL
		GADGET	2,	BevelBox2,	NULL
		GADGET	3,	BevelBox3,	NULL
		GADGET	4,	BevelBox4,	NULL
		GADGET	5,	BevelBox5,	NULL
		GADGET	6,	BevelBox6,	NULL

		GADGET	7,	BevelBox7,	NULL
		GADGET	8,	BevelBox8,	NULL
		GADGET	9,	BevelBox9,	NULL
		GADGET	10,	BevelBox10,	NULL
		GADGET	11,	BevelBox11,	NULL
		GADGET	12,	BevelBox12,	NULL

		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
