home *** CD-ROM | disk | FTP | other *** search
- /*
- * Dynamic Intuition menu functions
- * from the author of PDTerm
- */
-
- #include "exec/types.h"
- #include "exec/memory.h"
- #include "graphics/text.h"
- #include "intuition/intuition.h"
- #define MEMFLAGS (LONG) (MEMF_PUBLIC | MEMF_CHIP | MEMF_CLEAR)
-
- extern char *AllocMem();
- extern LONG FreeMem();
-
- /*
- * Create an instance of an Intuitext structure
- * containing text, positioned at (left,top)
- */
-
- struct IntuiText *NewIText(text, left, top)
- char *text;
- int left, top;
- {
- struct IntuiText *newtext = NULL;
-
- newtext = (struct IntuiText *)
- AllocMem((LONG) sizeof(*newtext), MEMFLAGS);
- newtext->IText = (UBYTE *)text;
- newtext->FrontPen = 0;
- newtext->BackPen = 1;
- newtext->DrawMode = JAM2;
- newtext->LeftEdge = left;
- newtext->TopEdge = top;
- newtext->ITextFont = NULL;
- newtext->NextText = NULL;
-
- return(newtext);
- }
-
- /*
- * Add an Intuitext structure to the end of
- * list of them, returning a pointer to the
- * new Intuitext.
- */
-
- struct IntuiText *AddIText(IText, text)
- struct IntuiText *IText;
- char *text;
- {
- struct IntuiText *newtext = NULL;
-
- newtext = (struct IntuiText *)
- AllocMem((LONG) sizeof(*newtext), MEMFLAGS);
-
- newtext->IText = (UBYTE *)text;
- newtext->FrontPen = IText->FrontPen;
- newtext->BackPen = IText->BackPen;
- newtext->DrawMode = IText->DrawMode;
- newtext->LeftEdge = IText->LeftEdge;
- newtext->TopEdge = IText->TopEdge + 11;
- newtext->ITextFont = IText->ITextFont;
- newtext->NextText = NULL;
- IText->NextText = newtext;
-
- return(newtext);
- }
-
- /*
- * Dispose of a lise of IntuiText structures
- */
-
- DisposeIText(IText)
- struct IntuiText *IText;
- {
- struct IntuiText *cur, *next;
-
- cur = IText;
- for(next = cur->NextText; cur != NULL; next = next->NextText) {
- FreeMem(cur,(LONG) sizeof(*cur));
- cur = next;
- }
- }
-
-
- /*
- * Dynamic menu constructor functions
- */
-
- #define InterMenuWidth 15
-
- /*
- * Create a new menu structure.
- */
-
- struct Menu *NewMenu(menuname, width, height)
- char *menuname;
- int width, height;
- {
- struct Menu *menu = NULL;
-
- menu = (struct Menu *)
- AllocMem((LONG) sizeof(*menu), MEMFLAGS);
-
- menu->NextMenu = NULL;
- menu->LeftEdge = 0;
- menu->TopEdge = 0;
- menu->Width = width;
- menu->Height = height;
- menu->Flags = MENUENABLED;
- menu->MenuName = menuname;
- menu->FirstItem = NULL;
-
- return(menu);
- }
-
- /*
- * Create a new menu and add it to
- * the end of the list of menus.
- */
- struct Menu *AddMenu(menus, MenuName, width, height)
- struct Menu *menus;
- char *MenuName;
- int width, height;
- {
- struct Menu *newmenu;
-
- newmenu = NewMenu(MenuName, width, height);
- newmenu->LeftEdge = menus->LeftEdge + menus->Width + InterMenuWidth;
- menus->NextMenu = newmenu;
- return(newmenu);
- }
-
- /*
- * Create a new menu item
- */
-
- struct MenuItem *NewMenuItem(name, width, height)
- char *name;
- int width, height;
- {
- struct MenuItem *newitem = NULL;
- struct IntuiText *NewIText(), *newtext = NULL;
-
- newitem = (struct MenuItem *)
- AllocMem((LONG) sizeof(*newitem), MEMFLAGS);
-
- newtext = NewIText(name,0,1);
-
- newitem->NextItem = NULL;
- newitem->ItemFill = (APTR) newtext;
- newitem->LeftEdge = 0;
- newitem->TopEdge = 0;
- newitem->Width = width;
- newitem->Height = height;
- newitem->Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP;
- newitem->MutualExclude = 0;
- newitem->SelectFill = NULL;
- newitem->Command = 0;
- newitem->SubItem = NULL;
- newitem->NextSelect = 0;
-
- return(newitem);
- }
-
- /*
- * Start the menu item list for a menu.
- */
-
- struct MenuItem *AddNewMenuItem(menu, name, width, height)
- struct Menu *menu;
- char *name;
- int width, height;
- {
- struct MenuItem *newitem, *NewMenuItem();
-
- newitem = NewMenuItem(name, width, height);
- menu->FirstItem = newitem;
- return(newitem);
- }
-
- /*
- * Add to a menu item list
- */
-
- struct MenuItem *AddItem(items, name)
- struct MenuItem *items;
- char *name;
- {
- struct MenuItem *newitem, *NewMenuItem();
-
- newitem = NewMenuItem(name, items->Width, items->Height);
- newitem->TopEdge = items->TopEdge + items->Height;
- newitem->LeftEdge = items->LeftEdge;
- items->NextItem = newitem;
- return(newitem);
- }
-
- /*
- * Start a list of subitems for a menu item.
- */
-
- struct MenuItem *AddNewSubItem(item, name, width, height)
- struct MenuItem *item;
- char *name;
- int width, height;
- {
- struct MenuItem *newitem, *NewMenuItem();
-
- newitem = NewMenuItem(name, width, height);
- item->SubItem = newitem;
- newitem->LeftEdge = item->Width;
- return(newitem);
- }
-
- /*
- * Dispose of a menu item.
- */
-
- DisposeItem(item)
- struct MenuItem *item;
- {
- DisposeIText((struct ItuiText *)item->ItemFill);
- FreeMem(item,(LONG) sizeof(*item));
- }
-
- /*
- * Dispose of a list of menu items.
- */
-
- DisposeItems(items)
- struct MenuItem *items;
- {
- struct MenuItem *cur, *next;
-
- cur = items;
- for(next = cur->NextItem; cur != NULL; next = next->NextItem){
- DisposeItem(cur);
- cur = next;
- }
- }
-
- /*
- * Dispose of a single menu
- */
- DisposeMenu(menu)
- struct Menu *menu;
- {
- DisposeItems(menu->FirstItem);
- FreeMem(menu,(LONG) sizeof(*menu));
- }
-
- /*
- * Get rid of a menu list.
- */
- DisposeMenus(menus)
- struct Menu *menus;
- {
- struct Menu *cur, *next;
-
- cur = menus;
- for(next = cur->NextMenu; cur != NULL; next = next->NextMenu){
- DisposeMenu(cur);
- cur = next;
- }
- }
-
-