/***************************************************************************
 *
 *                 MandelVroom Menu Manipulation routines
 *
 *                         Kevin L. Clague
 *
 *                        Copyright (C) 1987
 *
 **************************************************************************/

#include "mand.h"

extern struct Menu Menu, GenMenu;

extern struct NewScreen NewScreen;
extern struct Screen *screen;
extern struct Window *MandWind, *PalWind, *ContWind;
extern struct NewWindow *NewMand;

extern SHORT MaxCount, Zoom;
extern UBYTE MandType, QuitScreen;
extern USHORT CmdMode;

/*
 * Decide what to do for Project menu's Items
 */
ScreenProject(code)
  USHORT code;
{
  static char File[80] = "", Path[80] = "df1:";
  char Name[160];
  char *p;

  switch (ITEMNUM(code))
    {
    case LOADITEM:

         SetSystemColors(1);

         if (get_fname(MandWind,screen,"Load Pics",File,Path)) {

           SetSystemColors(0);

           strcpy(Name,Path);
           if (Name[strlen(Name)-1] != ':') {
             strcat(Name,"/");
           }
           strcat(Name,File);

           if (PalWind) {
             ClosePalWind();
           }
           if (ContWind) {
             CloseContWind();
           }
           ClearMenuStrip(MandWind);

           LoadCounts(Name);

           SetNormPointer();
           SetMenuStrip(MandWind, &Menu);
         } else {
           SetSystemColors(0);
         }

         break;

    case SAVEITEM:
         switch (SUBNUM(code)) {
           case 0:
                p = "Save Pics";
                break;
           case 1:
                p = "Save ILBM";
                break;
         }
         SetSystemColors(1);

         if (get_fname(MandWind, screen, p, File, Path )) {

           SetSystemColors(0);

           strcpy(Name, Path);
           if (Name[strlen(Name)-1] != ':') {
             strcat(Name,"/");
           }
           strcat(Name,File);

           ClearMenuStrip(MandWind);

           switch (SUBNUM(code)) {
             case 0:
                  SaveCounts(Name);
                  break;
             case 1:
                  SaveILBM(Name);
                  break;
           }
           DisplayBeep(screen);

           SetNormPointer();

           SetMenuStrip(MandWind, &Menu);
         } else {
           SetSystemColors(0);
         }
         break;

    case GENERATEITEM:

         GenerateIt();

         break;

    case USEITEM:
         CloseDisp();
         OpenDisp();
         break;

    case QUITITEM:
         QuitScreen = TRUE;
    }
} /* DoProjectScreen */

/*
 * Decide what to do for Edit menu's Items
 */
EditScreen(code)
  USHORT code;
{
  float gapy,gapx;
  extern LONG NavLeft,NavTop,NavBot,NavRight;

  switch (ITEMNUM(code))
    {
    case COLORITEM:
         OpenPalWind();
         break;

    case DEPTHITEM:
         NewScreen.Depth = SUBNUM(code) + 1;
         if (NewScreen.ViewModes & HIRES)
           if (NewScreen.Depth > 4) {
             NewScreen.Depth = 4;
             InitDepthSubs();
           }
         break;

    case CONTOURITEM:
         OpenContWind();
         break;

    case VIEWMODEITEM:
         EditScreenViewModes(code);
         break;

    case GENERATORITEM:   /* generator type */
         MandType = SUBNUM(code);
         break;

    case ZOOMITEM:
         switch (SUBNUM(code)) {
           case ZOOMINON:
             if (Zoom == 0) {
               CmdMode = STARTBOX;
               SetToPointer();
             }
             break;
           case ZOOMINOFF:
             if (Zoom == 1) {
               DrawExtras(NavLeft, NavTop, NavRight, NavBot );
               DrawBox(NavLeft, NavTop, NavRight, NavBot );
               Zoom = 0;
             }
         }
         break;

    case COUNTITEM:
         switch (SUBNUM(code)) {
           case 0:
             MaxCount = 32;
             break;
           case 1:
             MaxCount = 64;
             break;
           case 2:
             MaxCount = 128;
             break;
           case 3:
             MaxCount = 256;
             break;
           case 4:
             MaxCount = 512;
             break;
           case 5:
             MaxCount = 1023;
             break;
         }
    }
} /* EditScreen */

/*
 * Modify the NewScreens ViewModes to match the menu
 */
EditScreenViewModes(code)
  USHORT code;
{
  switch (SUBNUM(code))
    {
    case HIRESSUB:
         if (NewScreen.ViewModes & HIRES) {
            NewScreen.Width = 320;
            NewScreen.ViewModes &= ~HIRES;
         } else {
            NewScreen.Width = 640;
            NewScreen.ViewModes |= HIRES;
            NewScreen.ViewModes &= ~EXTRA_HALFBRITE;
            if (NewScreen.Depth > 4)
              NewScreen.Depth = 4;
         }
         break;

    case INTERLACESUB:
         if (NewScreen.ViewModes & INTERLACE) {
            NewScreen.ViewModes &= ~INTERLACE;
            NewScreen.Height = 200;
         } else {
            NewScreen.ViewModes |= INTERLACE;
            NewScreen.Height = 400;
         }
         break;

    case HALFBRITESUB:
         if (NewScreen.ViewModes & EXTRA_HALFBRITE) {
            NewScreen.ViewModes &= ~EXTRA_HALFBRITE;
            NewScreen.Depth = 5;
         } else {
            NewScreen.ViewModes |= EXTRA_HALFBRITE;
            NewScreen.ViewModes &= ~HIRES;
            NewScreen.Depth = 6;
         }
         break;
    }

  InitViewModesSubs();
  InitDepthSubs();
} /* EditScreenViewMode */

/*
 * Set up Menu's check marks to reflect viewmodes.
 */
InitViewModesSubs()
{
  SHORT i;
  extern struct MenuItem ViewModeSubs[];

  for (i = HIRESSUB; i <= HALFBRITESUB; i++) {
    ViewModeSubs[i].Flags &= ~CHECKED;
    switch (i) {
      case HIRESSUB:
           if (NewScreen.ViewModes & HIRES)
             ViewModeSubs[i].Flags |= CHECKED;
           break;
      case INTERLACESUB:
           if (NewScreen.ViewModes & INTERLACE)
             ViewModeSubs[i].Flags |= CHECKED;
           break;
      case HALFBRITESUB:
           if (NewScreen.ViewModes & EXTRA_HALFBRITE)
             ViewModeSubs[i].Flags |= CHECKED;
           break;
      }
  }
} /* InitViewModesSubs */

/*
 * Set up Menu's check marks to reflect Depth.
 */
InitDepthSubs()
{
  SHORT i;
  extern struct MenuItem DepthSubs[];

  for (i = 0; i <= 6; i++) {
    DepthSubs[i].Flags &= ~CHECKED;
  }
  DepthSubs[NewScreen.Depth-1].Flags |= CHECKED;

} /* InitScreenViewMode */

/*
 * Set up Menu's check marks to reflect Generator Type
 */
InitGenSubs()
{
  SHORT i;
  extern struct MenuItem GenerateSubs[];
  extern UBYTE MandType;

  for (i = 0; i <= 1; i++) {
    GenerateSubs[i].Flags &= ~CHECKED;
  }
  GenerateSubs[MandType].Flags |= CHECKED;

} /* InitGenSubs */

/*
 * Set up Menu's check marks to reflect Iteration count
 */
InitMaxISubs()
{
  SHORT i;
  extern struct MenuItem CountSubs[];
  extern SHORT MaxCount;

  for (i = 0; i <= 1; i++) {
    CountSubs[i].Flags &= ~CHECKED;
  }

  if (MaxCount <= 32)
    CountSubs[0].Flags |= CHECKED;
  else
  if (MaxCount <= 64)
    CountSubs[1].Flags |= CHECKED;
  else
  if (MaxCount <= 128)
    CountSubs[2].Flags |= CHECKED;
  else
  if (MaxCount <= 256)
    CountSubs[3].Flags |= CHECKED;
  else
  if (MaxCount <= 512)
    CountSubs[4].Flags |= CHECKED;
  else
  if (MaxCount <= 1024)
    CountSubs[5].Flags |= CHECKED;

} /* InitGenSubs */
