home *** CD-ROM | disk | FTP | other *** search
- ;/* newgadgets.c -- execute me to compile me
- sc data=near nominc strmer streq nostkchk saveds ign=73 newgadgets
- slink FROM LIB:c.o newgadgets.o TO newgadgets LIB LIB:sc.lib LIB:amiga.lib
- quit
-
- This code is only designed to demonstrate some of the new 3.0 GadTools
- features. It does not handle all of the IDCMP events and other conditions like
- allocating pens for the palette gadget that a good user interface should.
-
- Note also, that it takes advantage of the SAS 6.0 C compiler.
-
- */
-
-
- /* (c) Copyright 1993 Commodore-Amiga, Inc. All rights reserved. */
- /* The information contained herein is subject to change without */
- /* notice, and is provided "as is" without warranty of any kind, */
- /* either expressed or implied. The entire risk as to the use of */
- /* this information is assumed by the user. */
-
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <exec/nodes.h>
- #include <intuition/intuition.h>
- #include <intuition/intuitionbase.h>
- #include <intuition/gadgetclass.h>
- #include <libraries/diskfont.h>
- #include <libraries/gadtools.h>
-
- #include <clib/intuition_protos.h>
- #include <clib/exec_protos.h>
- #include <clib/dos_protos.h>
- #include <clib/alib_protos.h>
- #include <clib/diskfont_protos.h>
- #include <clib/graphics_protos.h>
- #include <clib/gadtools_protos.h>
-
- #include <stdio.h>
-
- #ifdef LATTICE
- int
- CXBRK (void)
- {
- return (0);
- } /* Disable Lattice CTRL/C handling */
-
- int
- chkabort (void)
- {
- return (0);
- } /* really */
-
- #endif
-
- /* declare the library base pointers */
- extern struct IntuitionBase *IntuitionBase;
- extern struct Library *DiskfontBase, *GfxBase, *GadToolsBase;
-
- /* lots of gadgets used here */
- struct Gadget *glist = NULL, *stringgad, *textgad, *checkgad, *mxgad, *palgad, *listgad,
- *intgad, *numgad, *slid1gad, *slid2gad, *slid3gad;
-
- /* assign the gadget ids even though we're not using them */
- #define MYGAD_STRING 69
- #define MYGAD_TEXT 70
- #define MYGAD_CHECK 71
- #define MYGAD_MX 72
- #define MYGAD_PAL 73
- #define MYGAD_LIST 74
- #define MYGAD_INT 75
- #define MYGAD_NUM 76
- #define MYGAD_SLIDERLEFT 77
- #define MYGAD_SLIDERCENTER 78
- #define MYGAD_SLIDERRIGHT 79
-
- struct List *DaList; /* the listview list */
-
- UBYTE colors[7] =
- {1, 2, 15, 6, 0, 3, 8}; /* the palette colortable */
-
-
- /*
- * Create the listview list
- */
-
- BOOL
- CreateDaList (UBYTE * names[])
- {
- struct Node *DaListNode;
- USHORT i;
- BOOL okay = TRUE;
-
- if (DaList = AllocMem (sizeof (struct List), MEMF_FAST))
- {
- NewList (DaList);
-
- for (i = 0; names[i] != NULL && okay == TRUE; i++)
- {
- if (DaListNode = AllocMem (sizeof (struct Node), MEMF_FAST))
- {
- DaListNode->ln_Name = names[i];
- DaListNode->ln_Type = 100L;
- DaListNode->ln_Pri = 0;
- AddTail (DaList, DaListNode);
- }
- else
- {
- printf ("Could not allocate memory for node\n");
- okay = FALSE;
- }
- }
- }
- else
- {
- printf ("Could not allocate memory for list\n");
- okay = FALSE;
- }
-
- return (okay);
- }
-
-
- /*
- * Create the gadgets.
- * The gadgets are more or less positioned relative to the window size
- * and each other. This is not extremely sophisticated, so don't expect
- * them to look good on a lores screen.
- */
-
- struct Gadget *
- CreateGads (struct Screen *scr, struct VisualInfo *vi,
- struct TextAttr *gadfont)
- {
- struct Gadget *gad;
- struct NewGadget ng;
- UBYTE *BassLines[] =
- {"Always", "Fine", "Do", "Boys", "Good", NULL}; /* mx choices */
- UBYTE *BassSpaces[] =
- {"Grass", "Eat", "Cows", "All", NULL}; /* listview choices */
-
- if (gad = CreateContext (&glist))
- {
- /* create an MX gadget */
- ng.ng_TextAttr = gadfont;
- ng.ng_VisualInfo = vi;
- ng.ng_LeftEdge = 80 + scr->WBorLeft;
- ng.ng_TopEdge = 30 + scr->WBorTop + (scr->Font->ta_YSize + 1);
- ng.ng_Width = 50;
- ng.ng_Height = 30;
- ng.ng_GadgetText = "Bass Lines";
- ng.ng_GadgetID = MYGAD_MX;
- ng.ng_Flags = 0;
- mxgad = gad = CreateGadget (MX_KIND, gad, &ng,
- GTMX_TitlePlace, PLACETEXT_ABOVE,
- GTMX_Labels, BassLines, GTMX_Scaled, TRUE,
- GTMX_Spacing, gadfont->ta_YSize + 1, TAG_END);
- /* create a slider gadget */
- ng.ng_TopEdge = scr->Height - 170;
- ng.ng_Height = 10;
- ng.ng_Width = 100;
- ng.ng_GadgetText = "Left Justified";
- ng.ng_GadgetID = MYGAD_SLIDERLEFT;
- ng.ng_Flags = PLACETEXT_ABOVE;
- slid1gad = gad = CreateGadget (SLIDER_KIND, gad, &ng,
- GTSL_MaxLevelLen, 6,
- GTSL_MaxPixelLen, 64,
- GTSL_Max, 512,
- GTSL_Justification, GTJ_LEFT,
- GTSL_LevelFormat, "%lx",
- GTSL_LevelPlace, PLACETEXT_BELOW,
- TAG_END);
-
- /* create a slider gadget */
- ng.ng_TopEdge = ng.ng_TopEdge + 55;
- ng.ng_GadgetText = "Centered";
- ng.ng_GadgetID = MYGAD_SLIDERCENTER;
- slid2gad = gad = CreateGadget (SLIDER_KIND, gad, &ng,
- GTSL_MaxLevelLen, 6,
- GTSL_MaxPixelLen, 64,
- GTSL_Max, 512,
- GTSL_LevelFormat, "%lx",
- GTSL_Justification, GTJ_CENTER,
- GTSL_LevelPlace, PLACETEXT_BELOW,
- TAG_END);
-
- /* create a slider gadget */
- ng.ng_TopEdge = ng.ng_TopEdge + 55;
- ng.ng_GadgetText = "Right Justified";
- ng.ng_GadgetID = MYGAD_SLIDERRIGHT;
- slid3gad = gad = CreateGadget (SLIDER_KIND, gad, &ng,
- GTSL_MaxLevelLen, 6,
- GTSL_MaxPixelLen, 64,
- GTSL_Max, 512,
- GTSL_LevelFormat, "%lx",
- GTSL_Justification, GTJ_RIGHT,
- GTSL_LevelPlace, PLACETEXT_BELOW,
- TAG_END);
-
- /* Set these in case the listview cannot be created */
- ng.ng_LeftEdge = 240 + scr->WBorLeft;
- ng.ng_TopEdge = 30 + scr->WBorTop + (scr->Font->ta_YSize + 1);
-
- if (CreateDaList (BassSpaces))
- {
- /* create a listview gadget */
- ng.ng_LeftEdge = 240 + scr->WBorLeft;
- ng.ng_TopEdge = 30 + scr->WBorTop + (scr->Font->ta_YSize + 1);
- ng.ng_Width = 100;
- ng.ng_Height = 30 + gadfont->ta_YSize + 14;
- ng.ng_GadgetText = "Bass Spaces";
- ng.ng_GadgetID = MYGAD_LIST;
- listgad = gad = CreateGadget (LISTVIEW_KIND, gad, &ng,
- GTLV_ShowSelected, NULL,
- GTLV_Selected, 2,
- GTLV_MakeVisible, 2,
- GTLV_Labels, DaList,
- TAG_END);
- }
-
- /* create a checkbox gadget */
- ng.ng_LeftEdge = ng.ng_LeftEdge + 30;
- ng.ng_TopEdge = ng.ng_TopEdge + 130;
- ng.ng_Width = 50;
- ng.ng_Height = 30;
- ng.ng_GadgetText = "BigCheck";
- ng.ng_GadgetID = MYGAD_TEXT;
- ng.ng_Flags = PLACETEXT_ABOVE;
- checkgad = gad = CreateGadget (CHECKBOX_KIND, gad, &ng,
- GTCB_Scaled, TRUE, TAG_END);
-
-
- /* create a string gadget */
- ng.ng_LeftEdge = scr->Width - scr->WBorRight - 190;
- ng.ng_TopEdge = ng.ng_TopEdge - 130;
- ng.ng_Width = 150;
- ng.ng_Height = gadfont->ta_YSize + 14;
- ng.ng_GadgetText = "String Immediate";
- ng.ng_GadgetID = MYGAD_STRING;
- stringgad = gad = CreateGadget (STRING_KIND, gad, &ng,
- GA_Immediate, TRUE, TAG_END);
-
- /* create a text gadget */
- ng.ng_TopEdge = ng.ng_TopEdge + 55;
- ng.ng_Height = gadfont->ta_YSize + 2;
- ng.ng_GadgetText = "Echo After Click";
- ng.ng_GadgetID = MYGAD_TEXT;
- textgad = gad = CreateGadget (TEXT_KIND, gad, &ng,
- GTTX_Border, TRUE,
- GTTX_FrontPen, 3,
- GTTX_BackPen, 2,
- GTTX_Clipped, TRUE,
- TAG_END);
-
- /* create a palette gadget */
- ng.ng_TopEdge = ng.ng_TopEdge + 80;
- ng.ng_Width = 100;
- ng.ng_Height = 30;
- ng.ng_GadgetText = "Odd Colors";
- ng.ng_GadgetID = MYGAD_PAL;
- palgad = gad = CreateGadget (PALETTE_KIND, gad, &ng,
- GTPA_ColorTable, colors,
- GTPA_NumColors, 7,
- GTPA_Color, 2,
- GTPA_IndicatorWidth, 21,
- TAG_END);
-
- /* create an integer gadget */
- ng.ng_Width = 150;
- ng.ng_LeftEdge = scr->Width + scr->WBorRight - 190;
- ng.ng_TopEdge = scr->Height - 170;
- ng.ng_Height = gadfont->ta_YSize + 14;
- ng.ng_GadgetText = "Number, please";
- ng.ng_GadgetID = MYGAD_INT;
- intgad = gad = CreateGadget (INTEGER_KIND, gad, &ng,
- GTIN_MaxChars, 14,
- TAG_END);
-
- /* create a number gadget */
- ng.ng_TopEdge = ng.ng_TopEdge + 60;
- ng.ng_Width = 100;
- ng.ng_Height = gadfont->ta_YSize + 2;
- ng.ng_GadgetText = "Echo Number";
- ng.ng_GadgetID = MYGAD_NUM;
- numgad = gad = CreateGadget (NUMBER_KIND, gad, &ng,
- GTNM_FrontPen, 3,
- GTNM_Format, "%04ld",
- GTNM_Clipped, TRUE,
- GTNM_Number, 0xffff1,
- TAG_END);
- }
- else
- printf ("Could not create context\n");
-
- return (gad);
- }
-
- /*
- * Create Menu.
- */
-
- struct Menu *
- CreateDaMenu (struct NewMenu *themenu, struct VisualInfo *vi)
- {
- struct Menu *menusready;
-
- if (menusready = CreateMenus (themenu, TAG_END))
- LayoutMenus (menusready, vi, GTMN_NewLookMenus, TRUE, TAG_END);
- else
- printf ("Could not create menus\n");
-
- return (menusready);
- }
-
-
- /*
- * Process menu events.
- */
-
- BOOL
- ProcessDaMenu (USHORT menunumber, struct Window * win, struct Menu * menustrip,
- struct VisualInfo * vi)
- {
- USHORT menunum, itemnum, subnum;
- BOOL closeit = FALSE;
- menunum = MENUNUM (menunumber);
- itemnum = ITEMNUM (menunumber);
- subnum = SUBNUM (menunumber);
-
- switch (menunum)
- {
- case 0: /* project menu */
- closeit = TRUE;
- break;
- case 1: /* justify text menu */
- switch (itemnum)
- {
- case 0: /* left justify string */
- GT_SetGadgetAttrs (textgad, win, NULL,
- GTTX_Justification, GTJ_LEFT,
- GTTX_Text, "Left", TAG_END);
- break;
- case 2: /* center justify string */
- GT_SetGadgetAttrs (textgad, win, NULL,
- GTTX_Justification, GTJ_CENTER,
- GTTX_Text, "Center", TAG_END);
- break;
- case 4: /* right justify string */
- GT_SetGadgetAttrs (textgad, win, NULL,
- GTTX_Justification, GTJ_RIGHT,
- GTTX_Text, "Right", TAG_END);
- }
- }
-
- return (closeit);
- }
-
-
- /*
- * Process IDCMP events
- * Again, this is very incomplete. You would do a lot more if this were a
- * real application.
- */
-
- void
- ProcessEvents (struct Window *win, struct Menu *menustrip, struct VisualInfo *vi)
- {
- struct IntuiMessage *msg;
- ULONG msgclass;
- LONG num;
- BOOL Closeflag = FALSE;
- STRPTR holdstring;
- USHORT menunumber;
-
- while (!Closeflag)
- {
- Wait (1 << win->UserPort->mp_SigBit);
-
- while ((!Closeflag) && (msg = GT_GetIMsg (win->UserPort)))
- {
- msgclass = msg->Class;
-
- switch (msgclass)
- {
- case IDCMP_CLOSEWINDOW:
- Closeflag = TRUE;
- break;
-
- case IDCMP_GADGETDOWN:
- if (msg->IAddress == stringgad)
- {
- holdstring = ((struct StringInfo *) (stringgad->SpecialInfo))->Buffer;
- GT_SetGadgetAttrs (textgad, win, NULL,
- GTTX_Text, holdstring, TAG_END);
- }
- break;
-
- case IDCMP_GADGETUP:
- if (msg->IAddress == intgad)
- {
- num = ((struct StringInfo *) (intgad->SpecialInfo))->LongInt;
- GT_SetGadgetAttrs (numgad, win, NULL, GTNM_Number, num,
- GTNM_Justification, GTJ_RIGHT, TAG_END);
- }
- break;
-
- case IDCMP_MENUPICK:
- menunumber = msg->Code;
- while (menunumber != MENUNULL && !Closeflag)
- {
- Closeflag = ProcessDaMenu (menunumber, win, menustrip, vi);
- menunumber = (ItemAddress (menustrip, menunumber))->NextSelect;
- }
- }
- GT_ReplyIMsg (msg);
- }
- }
- }
-
- /*
- * Free the memory used for the listview.
- */
-
- void
- FreeDaMemory (void)
- {
- struct Node *freenode, *nextnode;
-
- freenode = (struct Node *) DaList->lh_Head;
- while (nextnode = (struct Node *) freenode->ln_Succ)
- {
- FreeMem (freenode, sizeof (struct Node));
- freenode = nextnode;
- }
- FreeMem (DaList, sizeof (struct List));
- }
-
-
- /*
- * main().
- * With SAS 6.0, you don't have to open libraries, so we can get straight
- * to work.
- */
-
- void
- main (void)
- {
- struct Screen *Gadscreen;
- struct Window *Gadwindow;
- struct VisualInfo *vi;
- struct TextFont *Appfont;
- struct Menu *menuptr;
-
- /* use a font you like */
- struct TextAttr nicefont =
- {
- "diamond.font", /* STRPTR ta_Name name of the font */
- 15, /* UWORD ta_YSize height of the font */
- FS_NORMAL, /* UBYTE ta_Style intrinsic font style */
- FPF_DISKFONT /* UBYTE ta_Flags font preferences and flags */
- };
-
- struct NewMenu Gadmenu[] =
- {
- {NM_TITLE, "Project", 0, 0, 0, 0,},
- {NM_ITEM, "Quit", "Q", 0, 0, 0,},
-
- {NM_TITLE, "Justify Text", 0, 0, 0, 0,},
- {NM_ITEM, "Left", "L", 0, 0, 0,},
- {NM_ITEM, NM_BARLABEL, 0, 0, 0, 0,},
- {NM_ITEM, "Center", "M", 0, 0, 0,},
- {NM_ITEM, NM_BARLABEL, 0, 0, 0, 0,},
- {NM_ITEM, "Right", "R", 0, 0, 0,},
- {NM_END, NULL, 0, 0, 0, 0,},
- };
-
- if (Appfont = OpenDiskFont (&nicefont))
- {
- if (Gadscreen = OpenScreenTags (NULL,
- SA_Left, 0,
- SA_Top, 0,
- SA_LikeWorkbench, TRUE,
- SA_Font, &nicefont,
- SA_Title, "Some New GadTools Features",
- TAG_DONE))
- {
- if ((vi = GetVisualInfo (Gadscreen, TAG_END)) != NULL)
- {
- if (CreateGads (Gadscreen, vi, &nicefont) != NULL)
- {
- if (menuptr = CreateDaMenu (Gadmenu, vi))
- {
- if (Gadwindow = OpenWindowTags (NULL,
- WA_Left, Gadscreen->LeftEdge,
- WA_Top, Gadscreen->TopEdge + Gadscreen->BarHeight,
- WA_Height, Gadscreen->Height - Gadscreen->BarHeight,
- WA_Width, Gadscreen->Width,
- WA_MinWidth, Gadscreen->Height - Gadscreen->BarHeight,
- WA_MinHeight, Gadscreen->Width,
- WA_Gadgets, glist,
- WA_Title, "Lots of Gadgets",
- WA_CustomScreen, Gadscreen,
- WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_ACTIVEWINDOW |
- IDCMP_GADGETDOWN | IDCMP_MENUPICK |
- IDCMP_GADGETHELP | IDCMP_GADGETUP | SLIDERIDCMP,
- WA_Flags, WFLG_DEPTHGADGET | WFLG_CLOSEGADGET |
- WFLG_ACTIVATE,
- WA_NewLookMenus, TRUE,
- WA_DragBar, TRUE,
- WA_CloseGadget, TRUE,
- TAG_DONE))
- {
- if (SetMenuStrip (Gadwindow, menuptr))
- {
- GT_RefreshWindow (Gadwindow, NULL);
-
- ProcessEvents (Gadwindow, menuptr, vi);
-
- ClearMenuStrip (Gadwindow);
-
- FreeMenus (menuptr);
-
- CloseWindow (Gadwindow);
- }
- }
- }
- }
- else
- printf ("Could not create gadgets\n");
-
- if (DaList)
- FreeDaMemory ();
-
- FreeGadgets (glist);
-
- FreeVisualInfo (vi);
- }
-
- else
- printf ("Could not get visual info\n");
-
- CloseScreen (Gadscreen);
- }
- else
- printf ("Could not open screen\n");
-
- CloseFont (Appfont);
- }
- else
- printf ("Could not open %s\n", nicefont.ta_Name);
- }
-