;/* 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /************************************************************************* * 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); }