/****************************************************************************
 *
 *  Screen - Screen Configurator (almost useless example of FileRequest use)
 *
 *  By Kevin Lee Clague
 *     408 Tortolla Way
 *     San Jose, Ca 95033
 *     408-258-9891       work 408-737-5481
 *
 *  Copyright (C) 1986. All rights reserved.
 *
 *  This program is freely distributable as long as this copyright notice
 *  is retained. It intended for personal, non-commercial use.  
 *
 ***************************************************************************/
   
#include "screen.h"

struct GfxBase       *GfxBase;
struct IntuitionBase *IntuitionBase;

struct Window       *window = NULL;
struct Screen       *screen = NULL;
struct IntuiMessage *message;
struct RastPort     *rp;
struct ViewPort     *vp;

UBYTE  QuitScreen = FALSE;

extern struct Menu   Menu;

struct NewScreen NewScreen = {
   0,0,                      /* start position           */
   320, 200, 6,              /* width, height, depth     */
   0,1,                      /* detail pen, block pen    */
   NULL,                     /* HIRES, INTERLACE, SPRITES, DUAL, HAM */
   CUSTOMSCREEN,             /* screen type              */
   NULL,                     /* font to use              */
   (UBYTE *) "Screen Configurator", /* default title for screen */
   NULL                      /* pointer to extra gadgets */
   };

struct NewWindow NewWindow = {
   0,0,                      /* start position           */
   320,200,                  /* width, height            */
   0,1,                      /* detail pen, block pen    */
   MENUPICK|GADGETDOWN|GADGETUP|REQCLEAR, /* IDCMP flags */
   ACTIVATE|BORDERLESS|BACKDROP, /* window flags */
   NULL,                     /* first gadget             */
   NULL,                     /* user checkmark           */
   NULL,                     /* window title             */
   NULL,                     /* pointer to screen        */
   NULL,                     /* pointer to superbitmap   */
   0,0,320,200,              /* sizing                   */
   CUSTOMSCREEN              /* type of screen           */
   };

UBYTE ScreenName[80] = "df0:";
BOOL  FileRequest();

main () {
  if (OpenLibs() | OpenDisp())
    CleanUp();
  else {
    ConfScreen();
    CleanUp();
  }
} /* main */ 

CleanUp() {
  CloseDisp();
  CloseLibs();
} /* CleanUp */

OpenLibs() {
  IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",0);
  if (IntuitionBase == NULL) {
     printf("Couldn't get Intuition\n");
     return(100);
     }
  GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0);
  if (GfxBase == NULL) {
     printf("Couldn't get Graphics\n");
     return(100);
     }
  return(0);
} /* OpenLibs */

CloseLibs() {
  if (IntuitionBase != NULL) CloseLibrary(IntuitionBase);
  if (GfxBase       != NULL) CloseLibrary(GfxBase);
} /* CloseLibs */ 

OpenDisp() {
  screen = (struct Screen *) OpenScreen(&NewScreen);
  if (screen == NULL) {
     printf("Can't open new screen!\n");
     exit(200);
     }

  NewWindow.Screen = screen;

  window = (struct Window *) OpenWindow(&NewWindow);
  if (window == NULL) {
     CloseScreen(screen);
     printf("Can't open backdrop window\n");
     exit(201);
     }
  SetMenuStrip(window, &Menu);

  rp = window->RPort;
  vp = &screen->ViewPort;

  InitFNR();

  return(0);
} /* opendisp */

CloseDisp() {
  if (window)
    {
     ClearMenuStrip(window);
     CloseWindow(window);
    }
  if (screen)   CloseScreen(screen);
} /* CloseDisp */

ConfScreen()
{
  ULONG   class;
  USHORT  code = 0;
  struct  MenuItem *Item;

  while (QuitScreen == FALSE) {
    if ((message=(struct IntuiMessage *) GetMsg(window->UserPort)) == 0L) {
       Wait(1L<<window->UserPort->mp_SigBit);
       continue;
      }
      class  = message->Class;
      code   = message->Code;
      ReplyMsg(message);
      if (class == MENUPICK)
        while (code != MENUNULL)
          {
          switch (MENUNUM(code))
            {
            case PROJECTMENU:
                 ScreenProject(code);
                 break;
            case EDITMENU: 
                 EditScreen(code);
                 break;
            } 
          Item = ItemAddress(&Menu,code);
          code = Item->NextSelect; 
          }
  }
} /* ConfScreen */

ScreenProject(code)
  USHORT code;
{
  switch (ITEMNUM(code))
    {
    case LOADITEM:
         if (FileRequest("Load NewScreen","Load",&ScreenName,window))
           printf("You picked %s\n",&ScreenName);
         else
           printf("You punted\n");
         break;
    case SAVEITEM:
         if (FileRequest("Save NewScreen","Save",&ScreenName,window))
           printf("You picked %s\n",&ScreenName);
         else
           printf("You punted\n");
         break;
    case USEITEM:
         CloseDisp();
         OpenDisp();
         break;
    case QUITITEM:
         QuitScreen = TRUE;
    }
} /* DoProjectScreen */

EditScreen(code)
  USHORT code;
{
  switch (ITEMNUM(code))
    {
    case DEPTHITEM:
         NewScreen.Depth = SUBNUM(code) + 1;
         AdjustScreenDepth();
         break;
    case VIEWMODEITEM:
         EditScreenViewModes(code);
         break;
    }
} /* EditScreen */

EditScreenViewModes(code)
  USHORT code;
{
  struct MenuItem *Item;

  Item = ItemAddress((struct Menu *) &Menu,code);
  if (Item->Flags & TOGGLED11)
     Item->Flags ^= CHECKED;
  Item->Flags = Item->Flags ^ TOGGLED11;

  switch (SUBNUM(code))
    {
    case HIRESSUB:
         if (!((NewScreen.ViewModes ^= HIRES) & HIRES))
            NewScreen.Width = 320;
         else
            {
            NewScreen.Width = 640;
            AdjustScreenDepth();
            }
         break;
    case INTERLACESUB:
         if ((NewScreen.ViewModes ^= INTERLACE) & INTERLACE)
            NewScreen.Height = 400;
         else
            NewScreen.Height = 200;
         break;
    case SPRITESSUB:
         NewScreen.ViewModes ^= SPRITES;
         break;
    case DUALPFSUB:
         NewScreen.ViewModes ^= DUALPF;
         break;
    case HAMSUB:
         NewScreen.ViewModes ^= HAM;
    }
} /* EditScreenViewMode */

AdjustScreenDepth()
{ /* Adjust the Number of bit planes to a sane number */
  USHORT code;
  struct MenuItem *Item;

  if (NewScreen.Depth > 4 && NewScreen.ViewModes & HIRES)
    {
    code = SHIFTMENU(EDITMENU)|SHIFTITEM(DEPTHITEM)|SHIFTSUB((NewScreen.Depth - 1));
    Item = ItemAddress((struct Menu *) &Menu,code);
    Item->Flags ^= CHECKED;

    NewScreen.Depth = 4;
    code = SHIFTMENU(EDITMENU)|SHIFTITEM(DEPTHITEM)|SHIFTSUB((NewScreen.Depth - 1));
    Item = ItemAddress((struct Menu *) &Menu,code);
    Item->Flags ^= CHECKED;
    }
} /* AdjustScreenDepth */
