ftp.nice.ch/pub/next/unix/developer/plplot.3.0.s.tar.gz#/plplot/amiga/src/plmenu.c

This is plmenu.c in view mode; [Download] [Up]

#include "plamiga.h"
#include <math.h>

#define MAX(a,b)     ((a)>(b) ? (a) : (b))

void eventwait()
{
   for(;;) {
      /* Wait for message */
      Wait(1<<PLWindow->UserPort->mp_SigBit);
      if(procmess())
         return;
   }
}

int procmess()
{
   ULONG class;
   USHORT code;
   struct IntuiMessage *message;

   while(message = (struct IntuiMessage *)GetMsg(PLWindow->UserPort)) {
      class = message->Class;
      code = message->Code;
      ReplyMsg((struct Message *)message);
      if(eventhandler(class,code))
         return((int)1);
   }
   return((int)0);
}

int eventhandler(class, code)
ULONG class;
USHORT code;
{
   switch (class) {
      case CLOSEWINDOW:
         return((int)1);
      case MENUPICK:
         menuselect(class,code);
         break;
      case SIZEVERIFY:
         break;
      case NEWSIZE:
         if(!(PLCurPrefs.WinType & PLCUST)) {
            PLCurPrefs.WWidth = PLWindow->Width;
            PLCurPrefs.WHeight = PLWindow->Height;
         }
         else {
            PLCurPrefs.CWidth = PLWindow->Width;
            PLCurPrefs.CHeight = PLWindow->Height;
         }
         setlimits();
         disablegads(0);
         disablemenus();
         remakeplot();
         enablemenus();
         enablegads();
         break;
      default:
         break;
   }

   return((int)0);
}

struct IntuiText IText0ItemScrSubs[] = {
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"WorkBench", NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Custom", NULL}
};

struct MenuItem Menu0ItemScrSubs[] = {
   {
      &Menu0ItemScrSubs[1],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT,
      0xFFFE,
      (APTR)&IText0ItemScrSubs[0],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      NULL,
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT,
      0xFFFD,
      (APTR)&IText0ItemScrSubs[1],
      NULL,
      NULL,
      NULL,
      NULL
   }
};

struct IntuiText IText0ItemPriSubs[] = {
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Bitmap Dump", NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Full Page (Landscape)", NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Full Page (Portrait)", NULL}
};

struct MenuItem Menu0ItemPriSubs[] = {
   {
      &Menu0ItemPriSubs[1],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP,
      NULL,
      (APTR)&IText0ItemPriSubs[0],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      &Menu0ItemPriSubs[2],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP,
      NULL,
      (APTR)&IText0ItemPriSubs[1],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      NULL,
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP,
      NULL,
      (APTR)&IText0ItemPriSubs[2],
      NULL,
      NULL,
      NULL,
      NULL
   }
};

struct IntuiText IText0[] = {
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Save Configuration",NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Reset",NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Maintain Plot Aspect",NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Redraw Enabled",NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Select Screen Type",NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Print",NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Save Bitmap as IFF file",NULL}
};

struct MenuItem Menu0Items[] = {
   {
      &Menu0Items[1],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP,
      0,
      (APTR)&IText0[0],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      &Menu0Items[2],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP,
      0,
      (APTR)&IText0[1],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      &Menu0Items[3],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT | MENUTOGGLE,
      0,
      (APTR)&IText0[2],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      &Menu0Items[4],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT | MENUTOGGLE,
      0,
      (APTR)&IText0[3],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      &Menu0Items[5],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP,
      0,
      (APTR)&IText0[4],
      NULL,
      NULL,
      &Menu0ItemScrSubs[0],
      NULL
   },
   {
      &Menu0Items[6],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP,
      0,
      (APTR)&IText0[5],
      NULL,
      NULL,
      &Menu0ItemPriSubs[0],
      NULL
   },
   {
      NULL,
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP,
      0,
      (APTR)&IText0[6],
      NULL,
      NULL,
      NULL,
      NULL
   }
};

struct IntuiText IText1Item2Subs[] = {
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)" 2", NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)" 4", NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)" 8", NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"16", NULL}
};

struct MenuItem Menu1Item2Subs[] = {
   {
      &Menu1Item2Subs[1],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT,
      0xFFFE,
      (APTR)&IText1Item2Subs[0],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      &Menu1Item2Subs[2],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT,
      0xFFFD,
      (APTR)&IText1Item2Subs[1],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      &Menu1Item2Subs[3],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT,
      0xFFFB,
      (APTR)&IText1Item2Subs[2],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      NULL,
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT,
      0xFFF7,
      (APTR)&IText1Item2Subs[3],
      NULL,
      NULL,
      NULL,
      NULL
   }
};

struct IntuiText IText1[] = {
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Interlaced", NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"High Resolution",NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Number of Colors",NULL},
   {0, 1, JAM1, 0, 0, NULL, (UBYTE *)"Set Color Palette",NULL}
};


struct MenuItem Menu1Items[] = {
   {
      &Menu1Items[1],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT | MENUTOGGLE,
      0,
      (APTR)&IText1[0],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      &Menu1Items[2],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT | MENUTOGGLE,
      0,
      (APTR)&IText1[1],
      NULL,
      NULL,
      NULL,
      NULL
   },
   {
      &Menu1Items[3],
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP,
      0,
      (APTR)&IText1[2],
      NULL,
      NULL,
      &Menu1Item2Subs[0],
      NULL
   },
   {
      NULL,
      0, 0, 0, 0,
      ITEMTEXT | ITEMENABLED | HIGHCOMP,
      0,
      (APTR)&IText1[3],
      NULL,
      NULL,
      NULL,
      NULL
   }
};

struct Menu Menu[] = {
   {
      &Menu[1],
      0, 0, 0, 0,
      MENUENABLED,
      "PLPlot",
      &Menu0Items[0]
   },
   {
      NULL,
      0, 0, 0, 0,
      MENUENABLED,
      "Screen Format",
      &Menu1Items[0]
   }
};

enum menus { PLMCONTROL, PLMSCREEN };

/* Control menu items */
enum menu0items { PLMSAVECONFIG, PLMRECONFIG, PLMASPECT, PLMBUFF,
                  PLMSCREENTYPE, PLMSCRDUMP, PLMSIFF };
enum menu0itemscrsubs { PLMWBENCH, PLMCUSTOM };
enum menu0itemprisubs { PLMPRWIN, PLMPRPLAN, PLMPRPPOR };

/* Custom screen menu items */
enum menu1items { PLMLACE, PLMHIRES, PLMCOLORS, PLMCOLREQ };
/* Number color subitems */
enum menu1item2subs {PLMC2, PLMC4, PLMC8, PLMC16 };

void MakePLMenu()
{
   short mtx, mledge;
   short itx, itxlen, itedge, ichk;
   short stx, stxlen, stedge, schk;
   short fheight;
   char *string;
   struct Menu *menu;
   struct MenuItem *item, *subitem;
   struct IntuiText *itext;

   fheight = PLScreen->Font->ta_YSize;

   if(PLCurPrefs.WinType & PLCUST)
      Menu[0].NextMenu = &Menu[1];
   else
      Menu[0].NextMenu = NULL;

   mledge = 0;
   for(menu=Menu; menu!=NULL; menu=menu->NextMenu) {
      string = (char *)menu->MenuName;
      mtx = (short)TextLength(PLSRPort,string,(long)strlen(string));
      /* Leave two character space between menus */
      mtx += (2*mtx)/strlen(string);
      menu->LeftEdge = mledge;
      menu->Width = mtx;
      mledge += mtx;

      /* Find length of longest menuitem in this menu */
      itxlen = 0;
      ichk = 0;
      for(item=menu->FirstItem; item!=NULL; item=item->NextItem) {
         itext = (struct IntuiText *)item->ItemFill;
         string = (char *)itext->IText;
         itx = (short)TextLength(PLSRPort,string,(long)strlen(string));
         itxlen = MAX(itxlen,itx);
         if(item->Flags & CHECKIT)
            ichk = 1;
      }
      itedge = 0;
      for(item=menu->FirstItem; item!=NULL; item=item->NextItem) {
         item->Width = itxlen;
         item->LeftEdge = 0;
         item->TopEdge = itedge;
         item->Height = fheight;
         if(ichk) {
            item->Width += CHECKWIDTH;
            itext = (struct IntuiTest *)item->ItemFill;
            itext->LeftEdge = CHECKWIDTH;
         }
         itedge += fheight;
         stxlen = 0;
         schk = 0;
         for(subitem=item->SubItem;subitem!=NULL;subitem=subitem->NextItem){
            itext = (struct IntuiText *)subitem->ItemFill;
            string = (char *)itext->IText;
            stx = (short)TextLength(PLSRPort,string,(long)strlen(string));
            stxlen = MAX(stxlen,stx);
            if(subitem->Flags & CHECKIT)
               schk = 1;
         }
         stedge = 0;
         for(subitem=item->SubItem;subitem!=NULL;subitem=subitem->NextItem){
            subitem->Width = stxlen;
            subitem->LeftEdge = item->Width/2;
            subitem->TopEdge = stedge;
            subitem->Height = fheight;
            if(schk) {
               subitem->Width += CHECKWIDTH;
               itext = (struct IntuiTest *)subitem->ItemFill;
               itext->LeftEdge = CHECKWIDTH;
            }
            stedge += fheight;
         }
      }
   }

   if(PLCurPrefs.WinType & PLCUST) {
      Menu0ItemScrSubs[PLMCUSTOM].Flags |= CHECKED;
      Menu0ItemScrSubs[PLMWBENCH].Flags &= ~CHECKED;
      Menu1Items[PLMLACE].Flags |= ITEMENABLED;
      Menu1Items[PLMHIRES].Flags |= ITEMENABLED;
      Menu1Items[PLMCOLORS].Flags |= ITEMENABLED;
   }
   else {
      Menu0ItemScrSubs[PLMCUSTOM].Flags &= ~CHECKED;
      Menu0ItemScrSubs[PLMWBENCH].Flags |= CHECKED;
   }

   Menu1Item2Subs[PLMC2].Flags &= ~CHECKED;
   Menu1Item2Subs[PLMC4].Flags &= ~CHECKED;
   Menu1Item2Subs[PLMC8].Flags &= ~CHECKED;
   Menu1Item2Subs[PLMC16].Flags &= ~CHECKED;
   Menu1Item2Subs[PLCurPrefs.Depth-1].Flags |= CHECKED;

   if(PLCurPrefs.ScrType & PLLACE)
      Menu1Items[PLMLACE].Flags |= CHECKED;
   else
      Menu1Items[PLMLACE].Flags &= ~CHECKED;

   if(PLCurPrefs.ScrType & PLHIRES)
      Menu1Items[PLMHIRES].Flags |= CHECKED;
   else
      Menu1Items[PLMHIRES].Flags &= ~CHECKED;

   if(PLCurPrefs.WinType & PLASP)
      Menu0Items[PLMASPECT].Flags |= CHECKED;
   else
      Menu0Items[PLMASPECT].Flags &= ~CHECKED;

   if(PLCurPrefs.WinType & PLBUFF)
      Menu0Items[PLMBUFF].Flags |= CHECKED;
   else
      Menu0Items[PLMBUFF].Flags &= ~CHECKED;

   SetMenuStrip(PLWindow,Menu);
}

void disablemenus()
{
   OffMenu(PLWindow, PLMCONTROL | SHIFTITEM(NOITEM));
   OffMenu(PLWindow, PLMSCREEN  | SHIFTITEM(NOITEM));
}

void enablemenus()
{
   OnMenu(PLWindow, PLMCONTROL | SHIFTITEM(NOITEM));
   OnMenu(PLWindow, PLMSCREEN  | SHIFTITEM(NOITEM));
}

void menuselect(class, code)
ULONG class;
USHORT code;
{
   int ItemNumber, MenuNumber, SubNumber;
   int remake=0;
   struct MenuItem *Item;

   if(class == VANILLAKEY)
      ;
   else if(class == MENUPICK) {
      while(code != MENUNULL) {
         Item = ItemAddress(Menu,code);
         MenuNumber = MENUNUM(code);
         ItemNumber = ITEMNUM(code);
         SubNumber = SUBNUM(code);
         if(MenuNumber == PLMCONTROL) {
            if(ItemNumber == PLMSAVECONFIG) {
               if(!(PLCurPrefs.WinType & PLCUST)) {
                  PLCurPrefs.WXPos = PLWindow->LeftEdge;
                  PLCurPrefs.WYPos = PLWindow->TopEdge;
               }
               else {
                  PLCurPrefs.CXPos = PLWindow->LeftEdge;
                  PLCurPrefs.CYPos = PLWindow->TopEdge;
               }
               SetPLDefs();
            }
            else if(ItemNumber == PLMRECONFIG) {
               RestorePrefs();
               remake = 1;
            }
            else if(ItemNumber == PLMASPECT) {
               if(Item->Flags & CHECKED) {
                  PLCurPrefs.WinType |= PLASP;
               }
               else {
                  PLCurPrefs.WinType &= ~PLASP;
               }
               setlimits();
               disablegads(0);
               disablemenus();
               remakeplot();
               enablemenus();
               enablegads();
            }
            else if(ItemNumber == PLMBUFF) {
               if(Item->Flags & CHECKED) {
                  PLCurPrefs.WinType |= PLBUFF;
               }
               else {
                  PLCurPrefs.WinType &= ~PLBUFF;
               }
            }
            else if(ItemNumber == PLMSCREENTYPE) {
               if(SubNumber == PLMWBENCH) {
                  if(!(PLCurPrefs.WinType & PLCUST)) goto reselect;
                  PLCurPrefs.CXPos = PLWindow->LeftEdge;
                  PLCurPrefs.CYPos = PLWindow->TopEdge;
                  PLCurPrefs.WinType &= ~PLCUST;
               }
               else if(SubNumber == PLMCUSTOM) {
                  if(PLCurPrefs.WinType & PLCUST) goto reselect;
                  /* Save wbench window position */
                  PLCurPrefs.WXPos = PLWindow->LeftEdge;
                  PLCurPrefs.WYPos = PLWindow->TopEdge;
                  PLCurPrefs.WinType |= PLCUST;
               }
               remake = 1;
            }
            else if(ItemNumber == PLMSCRDUMP) {
               /* Disable system gadgets */
               disablegads(SubNumber);
               disablemenus();
               screendump(SubNumber);
               enablemenus();
               enablegads();
            }
            else if(ItemNumber == PLMSIFF) {
               disablegads(0);
               disablemenus();
               saveiff();
               enablemenus();
               enablegads();
            }
         }
         else if(MenuNumber == PLMSCREEN) {
            if(ItemNumber == PLMLACE) {
               if(Item->Flags & CHECKED)
                  PLCurPrefs.ScrType |= PLLACE;
               else
                  PLCurPrefs.ScrType &= ~PLLACE;
               PLCurPrefs.CWidth = 0;
               PLCurPrefs.CHeight = 0;
               remake = 1;
            }
            else if(ItemNumber == PLMHIRES) {
               if(Item->Flags & CHECKED)
                  PLCurPrefs.ScrType |= PLHIRES;
               else
                  PLCurPrefs.ScrType &= ~PLHIRES;
               PLCurPrefs.CWidth = 0;
               PLCurPrefs.CHeight = 0;
               remake = 1;
            }
            else if(ItemNumber == PLMCOLORS) {
               if(SubNumber == PLMC2) {
                  if(PLCurPrefs.Depth == 1) goto reselect;
                  PLCurPrefs.Depth = 1;
               }
               else if(SubNumber == PLMC4) {
                  if(PLCurPrefs.Depth == 2) goto reselect;
                  PLCurPrefs.Depth = 2;
               }
               else if(SubNumber == PLMC8) {
                  if(PLCurPrefs.Depth == 3) goto reselect;
                  PLCurPrefs.Depth = 3;
               }
               else if(SubNumber == PLMC16) {
                  if(PLCurPrefs.Depth == 4) goto reselect;
                  PLCurPrefs.Depth = 4;
               }
               PLCurPrefs.CXPos = PLWindow->LeftEdge;
               PLCurPrefs.CYPos = PLWindow->TopEdge;
               remake = 1;
            }
            else if(ItemNumber == PLMCOLREQ) {
               disablegads(1);
               disablemenus();
               plcolreq();
               enablemenus();
               enablegads();
            }
         }
reselect:
         code = Item->NextSelect;
      }
   }
   if(remake) {
      ClosePLWind();
      OpenPLWind();
      setlimits();
      disablegads(0);
      disablemenus();
      remakeplot();
      enablemenus();
      enablegads();
   }
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.