home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 3
/
AACD03.BIN
/
CDTools
/
ClassAct
/
Examples
/
Layout
/
WeightedDemo.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-07-09
|
8KB
|
306 lines
;/*
sc link weighteddemo.c lib lib:classact.lib
quit
*/
/* Layout Gadget Example.
* In this example we will NOT use window.class - just to show it is possible.
* Note, we do *NOT* recommend this. Window.class offers automatic prefs refresh,
* and support for window backfills, iconification and keyboard control!
*/
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <intuition/icclass.h>
#include <graphics/gfxbase.h>
#include <graphics/text.h>
#include <graphics/gfxmacros.h>
#include <utility/tagitem.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/diskfont.h>
#include <proto/utility.h>
#include <classact.h>
/*************************************************************************
* Main Program
*/
int main(argc,argv)
int argc;
char *argv[];
{
struct Screen *Scr = NULL;
struct Window *Win = NULL;
struct Gadget *gParent = NULL;
if (!ButtonBase)
return(20);
if(argc > 1)
Scr = LockPubScreen(argv[1]);
else
Scr = LockPubScreen("Workbench");
if (Scr == NULL)
{
/* Shut down, no screen lock
*/
Printf("Failed locking public screen.\n");
return(5);
}
/* In this example we will create the layout group before opening
* the window, and size the window to the minimum layout size
* returned by the LayoutLimits() function, then SetGadgetAttr()
* will be used to cause the GREL layout group to resize with the window.
*/
gParent = VGroupObject,
ICA_TARGET, ICTARGET_IDCMP,
LAYOUT_SpaceOuter, TRUE,
LAYOUT_BevelStyle, BVS_GROUP,
LAYOUT_DeferLayout, TRUE, /* this tag instructs layout.gadget to
* defer GM_LAYOUT and GM_RENDER and ask
* the application to do them. This
* lessens the load on input.device
*/
LAYOUT_AddChild, HGroupObject,
LAYOUT_SpaceOuter, FALSE,
LAYOUT_AddChild, HGroupObject,
LAYOUT_SpaceOuter, TRUE,
/* the first group is three label-less buttons
* side by side
*/
LAYOUT_BevelStyle, BVS_GROUP,
LAYOUT_Label, "Horizontal",
LAYOUT_AddChild, ButtonObject,
End,
LAYOUT_AddChild, ButtonObject,
End,
LAYOUT_AddChild, ButtonObject,
End,
End,
LAYOUT_AddChild, VGroupObject,
LAYOUT_SpaceOuter, TRUE,
/* the second group is three label-less buttons
* in a vertical group
*/
LAYOUT_BevelStyle, BVS_GROUP,
LAYOUT_Label, "Vertical",
LAYOUT_AddChild, ButtonObject,
End,
LAYOUT_AddChild, ButtonObject,
End,
LAYOUT_AddChild, ButtonObject,
End,
End,
End,
LAYOUT_AddChild, HGroupObject,
/* four buttons of varying widths */
LAYOUT_BevelStyle, BVS_SBAR_VERT,
LAYOUT_Label, "Free, Fixed and Weighted sizes.",
LAYOUT_AddChild, ButtonObject,
GA_Text, "25Kg",
End,
CHILD_WeightedWidth, 25,
LAYOUT_AddChild, ButtonObject,
GA_Text, "50Kg",
End,
CHILD_WeightedWidth, 50,
LAYOUT_AddChild, ButtonObject,
GA_Text, "75Kg",
End,
CHILD_WeightedWidth, 75,
LAYOUT_AddChild, ButtonObject,
GA_Text, "100Kg",
End,
CHILD_WeightedWidth, 100,
End,
CHILD_WeightedHeight,0,
LAYOUT_AddChild, HGroupObject,
/* four buttons sized in another way */
LAYOUT_AddChild, ButtonObject,
GA_Text, "Free",
End,
LAYOUT_AddChild, ButtonObject,
GA_Text, "Fixed",
End,
CHILD_WeightedWidth, 0,
LAYOUT_AddChild, ButtonObject,
GA_Text, "Free",
End,
LAYOUT_AddChild, ButtonObject,
GA_Text, "Fixed",
End,
CHILD_WeightedWidth, 0,
End,
CHILD_WeightedHeight,0,
CHILD_MinWidth, 300,
End;
if (gParent)
{
struct LayoutLimits Limits;
struct TextFont *font = OpenFont( Scr->Font );
/* Query parent layout group for min/max layout limits. */
LayoutLimits( gParent, &Limits, font, Scr );
CloseFont( font );
if (Win = OpenWindowTags(NULL,
WA_Flags, WFLG_DEPTHGADGET | WFLG_DRAGBAR |
WFLG_CLOSEGADGET | WFLG_ACTIVATE | WFLG_SIZEGADGET,
WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_IDCMPUPDATE,
WA_Top, 20,
WA_Left, 20,
WA_InnerWidth, Limits.MinWidth, /* open the window at the minimum */
WA_InnerHeight, Limits.MinHeight, /* size in which the layout fits */
WA_NoCareRefresh, TRUE, /* only BOOPSI here, no need for separate refreshing */
WA_PubScreen, Scr,
WA_Title, "ClassAct layout.gadget Example",
WA_ScreenTitle, "ClassAct Copyright 1995 Phantom Development LLC.",
TAG_END))
{
ULONG wsig = 1L << Win->UserPort->mp_SigBit;
struct IntuiMessage *msg;
BOOL done = FALSE;
WORD BorderWidth = Win->BorderLeft + Win->BorderRight;
WORD BorderHeight = Win->BorderTop + Win->BorderBottom;
/* set the window minimum and maximum size to the limits of the layout */
WindowLimits(Win,
Limits.MinWidth + BorderWidth,
Limits.MinHeight + BorderHeight,
Limits.MaxWidth + BorderWidth,
Limits.MaxHeight + BorderHeight);
/* make the layout group resize itself relative to window size */
SetGadgetAttrs( gParent, NULL, NULL,
GA_Top, Win->BorderTop,
GA_Left, Win->BorderLeft,
GA_RelWidth, -BorderWidth,
GA_RelHeight, -BorderHeight,
TAG_END);
/* make the layout visible */
AddGadget(Win, gParent, -1);
RefreshGList(gParent, Win, NULL, 1);
while (done == FALSE)
{
ULONG sig = Wait(wsig | SIGBREAKF_CTRL_C);
if (sig & wsig)
{
while (msg = (struct IntuiMessage *) GetMsg(Win->UserPort))
{
/* If you chooser to reply to the message before processing
* it, remember that for IDCMP_IDCMPUPDATE the IAddress
* field points to a tag list that will get free'd on reply.
*
* Before replying, check if the message is IDCMPUPDATE
* and CloneTagItems(msg->IAddress). Don't forget to
* FreeTagItems() your cloned list after you have
* processed it.
*/
switch (msg->Class)
{
case IDCMP_CLOSEWINDOW:
done = TRUE;
break;
case IDCMP_IDCMPUPDATE:
{
/* These are the deferred layout specific event
* handlers. This is not as sophisticated as
* window.class's internal logic, but it will suffice.
*/
if (FindTagItem(LAYOUT_RequestRefresh,msg->IAddress))
{
/* Intuition attempted to refresh the window,
* layout.gadget sent this message to the application.
* We now do the refresh. This is done here because
* refreshing a very complex layout could take some
* time, and doing it in input.device context makes
* the pointer jumpy.
* RefreshWindowFrame() will refresh not only the
* window border but also all gadgets.
* RefreshGList(gParent, Win, NULL, 1);
*/
RefreshWindowFrame( Win );
break;
}
else if (FindTagItem(LAYOUT_RequestLayout,msg->IAddress))
{
/* GM_LAYOUT can be a slow operation, so we don't
* want it to be done my input.device...
*/
RethinkLayout(gParent, Win, NULL, FALSE );
break;
}
else if (FindTagItem(LAYOUT_RelVerify,msg->IAddress))
{
/* LAYOUT_RelVerify matches an IDCMP_GADGETUP,
* which is somewhat restricted because of
* Intuition limitations....
*/
switch ( GetTagData(GA_ID,0,msg->IAddress) )
{
default:
done = TRUE;
break;
}
break;
}
}
break;
default:
break;
}
ReplyMsg((struct Message *) msg);
}
}
else if (sig & SIGBREAKF_CTRL_C)
{
done = TRUE;
}
}
RemoveGadget(Win, gParent);
CloseWindow(Win);
}
/* Disposing a layout instance will automatically dispose
* all the child objects.
*/
DisposeObject(gParent);
}
UnlockPubScreen(0, Scr);
exit(0);
}