/***************************************************************************
 * popmenu_pak.h -general-purpose dynamic Pop-up Menu routines to help make*
 *                programming alot easier.                                 *
 *                (c) 1990 VIDEOWORKS Computer Applications                *
 *                All rights reserved.                                     *
 *                129 Orchard Avenue, Rocky Mount, VA 24151                *
 *                (703) 483-8219 / 489-3863                                *
 *                                                                         *
 *                Designed and Developed by Paul T. Miller                 *
 *                                                                         *
 * Program Name:  N/A                                                      *
 * Version:       1                                                        *
 * Revision:      0                                                        *
 *-------------------------------------------------------------------------*
 * File: (popmenu_pak.h) popmenu_pak.c header file                         *
 *-------------------------------------------------------------------------*
 * Modification History                                                    *
 * Date     Author   Comment                                               *
 * -------- ------   -------                                               *
 * 03-29-90    PTM   Created. PMenu/PMenuItem structures and constants
 *
 ***************************************************************************/

#ifndef POPMENU_PAK_H
#define POPMENU_PAK_H

#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif

#ifndef EXEC_MEMORY_H
#include <exec/memory.h>
#endif

#ifndef GRAPHICS_GFX_H
#include <graphics/gfx.h>
#endif

#ifndef INTUITION_INTUITION_H
#include <proto/intuition.h>
#endif

/* PMenu structure - based closely on Intuition Menu structure */
struct PMenu
{
   struct PMenu  *NextPMenu;     /* next one in list */
   struct Window *PMenuWindow;   /* window this menu resides in */
   SHORT          LeftEdge;      /* top-left corner of activate box */
   SHORT          TopEdge;
   SHORT          Width;         /* width is user-set or based on items */
   SHORT          Height;        /* height is user-set or based on font */
   USHORT         Flags;         /* some status stuff */
   SHORT          pad;           /* addresses should be long-word aligned */
   UBYTE         *MenuName;      /* goes in activate box (for COMMPMENU) */
   struct PMenuItem *FirstPItem; /* first item in list */
   struct PMenuItem *ActiveItem; /* active item (the one displayed) */
   struct Gadget *PMenuGadget;   /* pointer to activate box gadget */
   SHORT JazzX, JazzY, BeatX, BeatY; /* we can have mysterious stuff too...*/
};

/* FLAGS SET BY THE APPLIPROG */
#define LISTPMENU    0x1000      /* menu items are list only (w/ checks) */
#define COMMPMENU    0x2000      /* menu items are commands (only one) */
#define SHADOWED     0x0002      /* shadow the menu Mac-style */
#define TITLED       0x0008      /* user-controlled menu title */

/* SET BY POPUPMENU */
#define MENU_INIT    0x0004      /* has it been installed into a window? */
#define PREDEFINED   0x4000      /* PMenuItems were pre-defined */

/* The following flags are the same as in intuition.h, so we comment only.
#define MENUENABLED 0x0001        * whether or not this menu is enabled

   FLAGS SET BY POPUPMENU
#define MIDRAWN 0x0100            * this menu's items are currently drawn
*/

/* PMenuItem structure - based loosely on Intuition MenuItem structure */
struct PMenuItem
{
   struct PMenuItem *NextPItem;     /* Next PMenuItem in list */
   USHORT            Flags;         /* see below for details */
   LONG              MutualExclude; /* for LISTPMENU only */
   APTR              ItemFill;      /* Only IntuiText supported right now */
   APTR              SelectFill;    /* Currently not supported */
};

/* FLAGS SET BY THE APPLIPROG */
#define CENTERED        0x0004  /* center the menu text in the fields */

/* The following flags are the same as in intuition.h, so we comment only.

#define ITEMTEXT        0x0002  * set if textual, clear if graphical item *
#define ITEMENABLED     0x0010  * set if this item is enabled *

   these are the SPECIAL HIGHLIGHT FLAG state meanings
#define HIGHFLAGS       0x00C0  * see definitions below for these bits *
#define HIGHIMAGE       0x0000  * use the user's "select image" *
#define HIGHCOMP        0x0040  * highlight by complementing the selectbox *
#define HIGHBOX         0x0080  * highlight by "boxing" the selectbox *
#define HIGHNONE        0x00C0  * don't highlight *

 * FLAGS SET BY BOTH APPLIPROG AND POPMENU *
#define CHECKED         0x0100  * then set when selected/active *

*/


/* popmenu_pak.c function prototypes */

/* application callable routines */
struct PMenu *BuildPMenu(struct PMenuItem *, USHORT, SHORT, UBYTE *, USHORT);
void SetPMenuColor(struct PMenu *, USHORT, USHORT);
int InitPMenu(struct Window *, struct PMenu *, SHORT, SHORT);
void RemovePMenu(struct PMenu *);
void FreePMenu(struct PMenu *);
void SetActiveItem(struct PMenu *, SHORT);
struct PMenuItem *GetPItem(struct PMenu *, SHORT);
SHORT GetPItemNum(struct PMenu *, struct PMenuItem *);
int CountPMenuItems(struct PMenu *);
void SetPMenuText(struct PMenu *, UBYTE *);
void RefreshPMenu(struct PMenu *);
USHORT HandlePMenu(struct PMenu *);

/* support routines */
int find_maxpitemwidth(struct PMenu *);
void calc_border(struct PMenu *);
void calc_menusize(struct PMenu *);
struct BitMap *savebackground(struct PMenu *);
void restorebackground(struct PMenu *, struct BitMap *);
void drawpmenu(struct PMenu *);
struct PMenuItem *getmenuitem(struct PMenu *, SHORT, SHORT);
void handle_items(struct PMenu *, SHORT, SHORT, SHORT *);
void complement_item(struct PMenu *, SHORT);
struct BitMap *allocbitmap(USHORT, USHORT, UBYTE);
void freebitmap(struct BitMap *);

#endif   /* POPMENU_PAK_H */

