/*
 * ScrManager.c :
 * --------------
 * Auteur        : Xavier Mertens
 * Version   $VER: 1.01
 * Création      : 03 Mar 1993 - 10:50
 * Modification  : 04 Mar 1993 - 8:30
 * Langage       : SAS/C v6.00
 * Compatibilité : 2.x - 3.0
 * Description   : Programme de gestion d'écrans. 
 * Remarques     : Interface générée par Precognition v1.0.
 *                 Linker avec LIB:Precognition.o
 *                 Nécessite la iff.library v16
 */

#include <exec/types.h>
#include <precognition/precognition.h>
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <graphics/gfx.h>
#include <workbench/workbench.h>
#include "iff/iff.h"

#include <clib/exec_protos_bis.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/wb_protos.h>

#include "iff/iffpragmas.h"

#define MAXSCREEN  50
#define OS_VERSION 37
#define WARN       5
#define OK         0
#define ICONIFIED  10
#define VERSION    "1.01"
#define DATE       "04.03.93"
#define MX         iWindow(&Fenetre)->MouseY

static char *VER = " $VER: 1.01(04.03.93)";

struct IntuitionBase *IntuitionBase;
struct WorkbenchBase *WorkbenchBase;
struct Library       *IFFBase;
struct GfxBase       *GfxBase;
struct Screen        *Ecran[MAXSCREEN],
                     *EcranSelectionne;
struct EasyStruct    AboutRequester = {
                       sizeof(struct EasyStruct),
                       0,
                       (UBYTE *)"A propos...",
                       (UBYTE *)"ScrManager © Xavier Mertens\n  Version %s (%s)\nCe programme est shareware!",
                       (UBYTE *)"Continue"
                     }, 
                     WarningRequester = {
                       sizeof(struct EasyStruct),
                       0,
                       (UBYTE *)"Attention...",
                       (UBYTE *)"Fermer l'écran '%s' ?",
                       (UBYTE *)"Oui|Non"
                     },
                     InfoRequester = {
                       sizeof(struct EasyStruct),
                       0,
                       (UBYTE *)"Informations...",
                       (UBYTE *)"%s",
                       (UBYTE *)"Continue"
                     },
                     SavedRequester = {
                       sizeof(struct EasyStruct), 
                       0,
                       (UBYTE *)"Informations...",
                       (UBYTE *)"Ecran '%s' sauvé avec succès!",
                       (UBYTE *)"Continue"
                     };

struct AppMenuItem    *IconifyMenu;
struct AppMessage     *AppMsg;
struct MsgPort        *Port;
struct IntuiMessage   *MessageMenu;

extern void __exit(int);
int do_Fenetre(void);
void UpDateScreenList(void);
int CountWindows(struct Screen *EcranActif);

ScrollingList ScrollingList0;

int Left   = 181,
    Top    = 62,
    IffNum = 0;

__stdargs __main(char *argv){
  int rc;
  if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",OS_VERSION)) ||
     !(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",OS_VERSION)) ||
     !(WorkbenchBase=(struct WorkbenchBase *)OpenLibrary("workbench.library",OS_VERSION))){

    if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
    if(GfxBase)       CloseLibrary((struct Library *)GfxBase);
    if(WorkbenchBase) CloseLibrary((struct Library *)WorkbenchBase);
    __exit(WARN);
  }
  for(;;){
    rc=do_Fenetre();
    switch(rc){
      case WARN:
        DisplayBeep(NULL);
      case OK:
        CloseLibrary((struct Library *)IntuitionBase);
        CloseLibrary((struct Library *)GfxBase);
        CloseLibrary((struct Library *)WorkbenchBase);
        __exit(OK);
        break;
      case ICONIFIED:
        if(!(Port = CreateMsgPort())){
          DisplayBeep(NULL);
          break;
        }
        else
          if(!(IconifyMenu = AddAppMenuItem(0,0,"ScrManager...",Port,NULL))){
            DisplayBeep(NULL);
            DeletePort(Port);
            break;
          }
          else{
            Wait(1<<Port->mp_SigBit);/* Dodo... */
            RemoveAppMenuItem(IconifyMenu);
            DeletePort(Port);
            break;
        }
        break;
      default:
        break;
    }
  }
  CloseLibrary((struct Library *)IntuitionBase);
  CloseLibrary((struct Library *)GfxBase);
  CloseLibrary((struct Library *)WorkbenchBase);
  __exit(OK);
}

int do_Fenetre(){
  int rc;
  char InfoMsg[200];
  
  pcgWindow     Fenetre;
  pcg_3DPens    pens;
  BOOL          done;
  IntuiMessage *message, event;
  BoolGadget    BoolGadget1;
  BoolGadget    BoolGadget2;
  BoolGadget    BoolGadget3;
  BoolGadget    BoolGadget4;
  BoolGadget    BoolGadget5;
  BoolGadget    BoolGadget6;
  BoolGadget    BoolGadget7;

  pens = StandardPens();

  pcgWindow_Init( &Fenetre,
    Left,Top,277,132,
    100,50,65535,65535,
    "ScrManager v1.00",
    REFRESHWINDOW | CLOSEWINDOW,
    WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | SIMPLE_REFRESH | ACTIVATE,
    NULL );

  ScrollingList_Init( &ScrollingList0,12, 12, 150, 116,pens,FALSE);
  UpDateScreenList();
  AddWindowObject(&Fenetre,(GraphicObject*) &ScrollingList0 );

  BoolGadget_Init(&BoolGadget1,168, 13, 96, 14,pens, "Rescan" );
  AddWindowObject(&Fenetre, (GraphicObject*) &BoolGadget1 );

  BoolGadget_Init(&BoolGadget2,168, 29, 96, 14,pens, "En avant" );
  AddWindowObject(&Fenetre, (GraphicObject*) &BoolGadget2 );

  BoolGadget_Init(&BoolGadget3,168, 46, 96, 14,pens, "Fermer" );
  AddWindowObject(&Fenetre, (GraphicObject*) &BoolGadget3 );

  BoolGadget_Init(&BoolGadget4,168, 63, 96, 14,pens, "Infos" );
  AddWindowObject(&Fenetre, (GraphicObject*) &BoolGadget4 );

  BoolGadget_Init(&BoolGadget5,168, 79, 96, 14,pens, "Sauver" );
  AddWindowObject(&Fenetre, (GraphicObject*) &BoolGadget5 );

  BoolGadget_Init(&BoolGadget6,168, 96, 96, 14,pens, "Iconifier" );
  AddWindowObject(&Fenetre, (GraphicObject*) &BoolGadget6 );

  BoolGadget_Init(&BoolGadget7,168, 112, 96, 14,pens, "A Propos" );
  AddWindowObject(&Fenetre, (GraphicObject*) &BoolGadget7 );

  if(pcgOpenWindow(&Fenetre)){
    Refresh((Interactor *)&Fenetre);
    done = FALSE;
    while(!done){
      message = WaitForMsg(Fenetre.Window->UserPort);
      event   = *message;
      ReplyMsg((struct Message *)message);
      switch(event.Class){
        case CLOSEWINDOW:
          rc = OK;
          done = TRUE;
          break;
        case REFRESHWINDOW:
          BeginRefresh( iWindow( &Fenetre ) );
          Refresh((Interactor *)&Fenetre);
          EndRefresh( iWindow( &Fenetre ), TRUE );
          break;
        default:
          Left = iWindow(&Fenetre)->LeftEdge;
          Top = iWindow(&Fenetre)->TopEdge;

          /* Gadget LISTE */

          if(Respond( (Interactor*) &ScrollingList0, &event) & CHANGED_STATE){
            EcranSelectionne = Ecran[ScrollingList0.list.YOffset];
            break;
          }

          /* Gadget RESCAN */

          if(Respond( (Interactor*) &BoolGadget1, &event) & CHANGED_STATE){
            RemoveWindowObject(&Fenetre,(GraphicObject*) &ScrollingList0);
            ScrollingList_Init( &ScrollingList0,12, 12, 150, 116,pens,FALSE);
            UpDateScreenList();
            AddWindowObject(&Fenetre,(GraphicObject*) &ScrollingList0 );
            Refresh((Interactor *)&ScrollingList0);
            break;
          }

          /* Gadget EN AVANT */

          if(Respond( (Interactor*) &BoolGadget2, &event) & CHANGED_STATE){
            ScreenToFront(EcranSelectionne);
            ActiveWindow(EcranSelectionne->FirstWindow);
            break;
          }

          /* Gadget FERMER */

          if(Respond( (Interactor*) &BoolGadget3, &event) & CHANGED_STATE){
            DisplayBeep(NULL);
            if(EasyRequest(NULL,&WarningRequester,NULL,EcranSelectionne->Title))
              CloseScreen(EcranSelectionne);
            break;
          }

          /* Gadget INFOS */

          if(Respond( (Interactor*) &BoolGadget4, &event) & CHANGED_STATE){
            sprintf(InfoMsg,"Nom        : %-20s\nAdresse    : 0x%X\nPosition   : (%d,%d)\nTaille     : %dx%d\nProfondeur : %d\nFenêtre(s) : %d",
                EcranSelectionne->Title,
                EcranSelectionne,
                EcranSelectionne->LeftEdge,
                EcranSelectionne->TopEdge,
                EcranSelectionne->Width,
                EcranSelectionne->Height,
                EcranSelectionne->BitMap.Depth,
                CountWindows(EcranSelectionne));
            EasyRequest(NULL,&InfoRequester,NULL,InfoMsg);
            break;
          }

          /* Gadget SAUVER */

          if(Respond( (Interactor*) &BoolGadget5, &event) & CHANGED_STATE){
            if(!(IFFBase=OpenLibrary(IFFNAME,IFFVERSION))){
              DisplayBeep(NULL);
              break;
            }
            sprintf(InfoMsg,"RAM:ScrManager.%d.iff",IffNum++);
            if(!(SaveBitMap(InfoMsg,EcranSelectionne->BitMap,EcranSelectionne->ViewPort.ColorMap->ColorTable,NULL)))
              DisplayBeep(NULL);
              CloseLibrary(IFFBase);
            EasyRequest(NULL,&SavedRequester,NULL,EcranSelectionne->Title);
            break;
          }

          /* Gadget ICONIFIER */

          if(Respond( (Interactor*) &BoolGadget6, &event) & CHANGED_STATE){
            rc = ICONIFIED;
            done = TRUE;
            break;
          }

          /* Gadget A PROPOS */

          if(Respond( (Interactor*) &BoolGadget7, &event) & CHANGED_STATE){
            EasyRequest(NULL,&AboutRequester,NULL,VERSION,DATE);
            break;
          }
      }
    }
    pcgCloseWindow( &Fenetre );
  }
  else{ 
    rc = WARN;
  }

  CleanUp((Object*)&Fenetre);
  CleanUp((Object*)&ScrollingList0);
  CleanUp((Object*)&BoolGadget1);
  CleanUp((Object*)&BoolGadget2);
  CleanUp((Object*)&BoolGadget3);
  CleanUp((Object*)&BoolGadget4);
  CleanUp((Object*)&BoolGadget5);
  CleanUp((Object*)&BoolGadget6);
  CleanUp((Object*)&BoolGadget7);
  return(rc);
}

void UpDateScreenList(){
  struct Screen *ecran;
  int i,j;
  for(ecran=IntuitionBase->FirstScreen,i=0;ecran;ecran=ecran->NextScreen,i++){
  If(i==MAXSCREEN)
    break;
    AddString((StringLister*) &ScrollingList0,ecran->Title,0);
    Ecran[i]=ecran;
  }
  for(j=i;j<MAXSCREEN;j++)
    AddString((StringLister*) &ScrollingList0,"",0);
}

int CountWindows(struct Screen *EcranActif){
  struct Window *W;
  int i=0;
  for(W=EcranActif->FirstWindow;W;W=W->NextWindow)
    i++;
  return(i);
}

/* Eof */
