/*
 *  WICONIFY    A utility that allows you to iconify any Intuition window
 *              on any screen, and to open WB windows on any screen.
 *
 *  wMenu.c     Definitions and static arrays of menu items.
 *
 *  Copyright 1990 by Davide P. Cervone, all rights reserved.
 *  You may use this code, provided this copyright notice is kept intact.
 */

#define INTUITION_PREFERENCES_H             /* don't need 'em */
#include <intuition/intuition.h>
#include "wMenu.h"


/*
 *  These macros do all the hard work of setting up the static menu
 *  items. 
 */

#define CHECK(n,t,c,f,mx)\
{\
   {NEXTMENU(n),MENU_LEFT,MENU_TOP+MENUH*(n+OFFSET),MENU_W,MENUH,\
    (ITEMTEXT|HIGHCOMP|CHECKIT|ITEMENABLED|COMMSEQ)+(f),mx,\
    (APTR)&MENU_NAME[n].IText,NULL,c,NULL,NULL},CHKTEXT(t)\
}

#define LABEL(n,t)\
{\
   {NEXTMENU(n),MENU_LEFT,MENU_TOP+MENUH*n,MENU_W,MENUH,\
    (ITEMTEXT|HIGHNONE|ITEMENABLED),0,(APTR)&MENU_NAME[n].IText,\
    NULL,0,NULL,NULL},SUBTEXT(t)\
}

#define LABL2(n,t)\
{\
   {NEXTMENU(n),MENU_LEFT,MENU_TOP+MENUH*(n-NS_DEPTH5+NS_DEPTH1),MENU_W,MENUH,\
    (ITEMTEXT|HIGHNONE|ITEMENABLED),0,(APTR)&MENU_NAME[n].IText,\
    NULL,0,NULL,NULL},SUBTEXT(t)\
}

#define DEPTH(n,t)\
{\
   {NEXTMENU(n),MENU_LEFT+(n-NS_DEPTH1)*CHARW*3+6,MENU_TOP+MENUH*NS_DEPTH1,\
    CHARW*3,MENUH,(ITEMTEXT|HIGHCOMP|ITEMENABLED),0,\
    (APTR)&MENU_NAME[n].IText,NULL,0,NULL,NULL},DEPTEXT(t)\
}

#define SLINE(n,l)\
{\
   {NEXTMENU(n),MENU_LEFT,MENU_TOP+MENUH*n,MENU_W,MENUH,\
    ITEMTEXT|HIGHNONE,~(1<<n),(APTR)&MENU_NAME[n].IText,NULL,0,NULL,NULL},\
    MENUTEXT(l)\
}


#define MITEM(n,t,c,f,s)\
{\
   {NEXTMENU(n),MENU_L,MENUH*n,MENU_W,MENUH,\
    (ITEMTEXT|HIGHCOMP|COMMSEQ|ITEMENABLED)+(f),~(1<<n),\
    (APTR)&MENU_NAME[n].IText,NULL,c,(struct MenuItem *)s,NULL},\
   MENUTEXT(t)\
}

#define MLINE(n,l)\
{\
   {NEXTMENU(n),MENU_L,MENUH*n,MENU_W,MENUH,ITEMTEXT|HIGHNONE,~(1<<n),\
    (APTR)&MENU_NAME[n].IText,NULL,0,NULL,NULL},MENUTEXT(l)\
}

static char Line[] = "--------------------";
static struct TextAttr wFont = {"topaz.font",8,FS_NORMAL,0};


/*
 *  The menus are declared as arrays of menu items, prelinked and 
 *  initialized.  The macros set up all the links, the names, the
 *  command key equivalents, and the mutual excludes.  The data needed
 *  by the macros (MENU_NAME, etc) must be declared at the top of
 *  each menu (and removed at the bottom to avoid macro redefinition warnings)
 */

struct wMenuItem OpenWindowMenu[] =
{
     #define MENU_NAME      OpenWindowMenu
     #define MENU_NUM       SCREEN_MENU
     #define MENU_W         MENUW(MAX_OPEN_LEN)
     #define MENU_TOP       (-2*MENUH)
     #define MENU_LEFT      ((NEWSCREEN_LEN+4)*CHARW)
     #define OFFSET         0
     #define NEXTMENU(n)    NEXT(n)
   LABEL(OW_ON,         "On:"),
   CHECK(OW_ACTIVESCRN, "Active Screen", 'A', CHECKED, MX(OW_CURRENTWB)| MX(OW_REALWB)),
   CHECK(OW_CURRENTWB,  "Current WB",    'W', 0, MX(OW_ACTIVESCRN)| MX(OW_REALWB)),
   CHECK(OW_REALWB,     "Real WB",       '=', 0, MX(OW_ACTIVESCRN)| MX(OW_CURRENTWB)),
   SLINE(OW_LINE,&Line[0]),
     #undef NEXTMENU
     #define NEXTMENU(n)   NULL
   CHECK(OW_AUTORESIZE, "Size to Fit",   'S', CHECKED| MENUTOGGLE, 0)

     #undef MENU_NAME
     #undef MENU_NUM
     #undef MENU_W
     #undef MENU_TOP
     #undef MENU_LEFT
     #undef OFFSET
     #undef NEXTMENU
};

struct wMenuItem NewScreenMenu[] =
{
     #define MENU_NAME      NewScreenMenu
     #define MENU_NUM       SCREEN_MENU
     #define MENU_W         MENUW(MAX_NSCR_LEN)
     #define MENU_TOP       (-MENUH)
     #define MENU_LEFT      ((NEWSCREEN_LEN+4)*CHARW)
     #define OFFSET         (-NS_DEPTH5+NS_DEPTH1)
     #define NEXTMENU(n)    NEXT(n)
   LABEL(NS_DEPTH,      "Depth:"),
   DEPTH(NS_DEPTH1,     "1"),
   DEPTH(NS_DEPTH2,     "2"),
   DEPTH(NS_DEPTH3,     "3"),
   DEPTH(NS_DEPTH4,     "4"),
   DEPTH(NS_DEPTH5,     "5"),
   LABL2(NS_TYPE,       "Type:"),
   CHECK(NS_HIRES,      "HIRES",     'H', CHECKED, MX(NS_LORES)),
   CHECK(NS_LORES,      "LORES",     'L', 0,       MX(NS_HIRES)),
   CHECK(NS_INTERLACE,  "Interlace", 'I', MENUTOGGLE,0),
     #undef NEXTMENU
     #define NEXTMENU(n)   NULL
   CHECK(NS_HAM,        "HAM",       '+', MENUTOGGLE,0),

     #undef MENU_NAME
     #undef MENU_NUM
     #undef MENU_W
     #undef NEXTMENU
};

struct wMenuItem IconMenu[] =
{
     #define MENU_NAME      IconMenu
     #define MENU_NUM       ICON_MENU
     #define MENU_W         MENUW(MAX_ICON_LEN)
     #define MENU_L         -CHARW
     #define NEXTMENU(n)    NEXT(n)
   MITEM(IM_OPEN,       "Open",     'O',DISABLED,NULL),
   MITEM(IM_CLOSE,      "Close",    'C',DISABLED,NULL),
   MITEM(IM_LOCK,       "Lock",     '#',DISABLED,NULL),
   MITEM(IM_CLEANUP,    "Clean Up", 'K',DISABLED,NULL),
   MLINE(IM_LINE1,&Line[6]),
   MITEM(IM_ORGANIZE,   "Organize", 'R',DISABLED,NULL),
   MITEM(IM_OPENALL,    "Open All", 'P',DISABLED,NULL),
   MLINE(IM_LINE2,&Line[6]),
   MITEM(IM_ABOUT,      "About...", '?',0,NULL),
     #undef NEXTMENU
     #define NEXTMENU(n)   NULL
   MITEM(IM_END,        "End",        0,-COMMSEQ,NULL),

     #undef MENU_NAME
     #undef MENU_NUM
     #undef MENU_W
     #undef MENU_L
     #undef NEXTMENU
};

struct wMenuItem ScreenMenu[] =
{
     #define MENU_NAME      ScreenMenu
     #define MENU_NUM       SCREEN_MENU
     #define MENU_W         MENUW(MAX_SCRN_LEN)
     #define MENU_L         -4*CHARW
     #define NEXTMENU(n)    NEXT(n)
   MITEM(SM_TOFRONT,    "To Front",     '>',0,NULL),
   MITEM(SM_TOBACK,     "To Back",      '<',0,NULL),
   MITEM(SM_WBTOFRONT,  "WB To Front",  'N',0,NULL),
   MLINE(SM_LINE1,&Line[2]),
   MITEM(SM_TOGGLE,     "Toggle Title", 'T',0,NULL),
   MITEM(SM_ICONIFY,    "Iconify",      '*',0,NULL),
   MLINE(SM_LINE2,&Line[2]),
   MITEM(SM_NEWCLI,     "New CLI",      '.',0,NULL),
   MITEM(SM_MAKEWB,     "Make WB",      'M',0,NULL),
   MITEM(SM_OPENWINDOW, "Open Windows", 0,-COMMSEQ,&OpenWindowMenu[0]),
   MITEM(SM_NEWSCREEN,  "New Screen",   0,-COMMSEQ,&NewScreenMenu[0]),
     #undef NEXTMENU
     #define NEXTMENU(n)   NULL
   MITEM(SM_CLOSESCREEN,"Close Screen", 0,-COMMSEQ,NULL),

     #undef MENU_NAME
     #undef MENU_NUM
     #undef MENU_W
     #undef NEXTMENU
};


#define MENU(i,t,n,l,s)\
   {&wMenu[i+1],l*CHARW+10,0,(n+1)*CHARW,MENUH,MENUENABLED,t,&s[0].Item,0,0,0,0}
#define LAST(i,t,n,l,s)\
   {NULL,l*CHARW+10,0,(n+1)*CHARW,MENUH,MENUENABLED,t,&s[0].Item,0,0,0,0}

struct Menu wMenu[] =
{
   MENU(ICON_MENU,   "Icon",   4, 0, IconMenu),
   LAST(SCREEN_MENU, "Screen", 6, 6, ScreenMenu),
};
