/***************************************************************************/
/*									   */
/*		D O P R O   V1.5					   */
/*									   */
/***************************************************************************/
/*									   */
/* This file defines the data structures and routines for loading, saving  */
/* and maintaning of the database					   */
/*									   */
/***************************************************************************/

/* maximum length of a screen title */
#define MaxTitleLen 40

/* structure for data saving */
struct MyNewScreen
{
    WORD LeftEdge, TopEdge, Width, Height, Depth;
    WORD OldLeftEdge, OldTopEdge, OldWidth, OldHeight;
    UBYTE DetailPen, BlockPen;
    UWORD ViewModes;
    UWORD Type;
    UBYTE DefaultTitle[MaxTitleLen];

    BOOL  Topaz;
    ULONG DisplayID;
    struct MyNewScreen *Next;
};

#define mnsSize sizeof(struct MyNewScreen)

/* the list of MyNewScreen structures */
static struct MyNewScreen *Root = NULL;

/* compares a MyNewsScreen with a NewScreen */
static BOOL CompScreen(struct MyNewScreen *mns, struct NewScreen *ns)
{
 return   (mns->OldLeftEdge == ns->LeftEdge)
       && (mns->OldTopEdge == ns->TopEdge)
       && (mns->OldWidth == ns->Width)
       && (mns->OldHeight == ns->Height)
       && (mns->Depth == ns->Depth)
       && (mns->DetailPen == ns->DetailPen)
       && (mns->BlockPen == ns->BlockPen)
       && (mns->ViewModes == ns->ViewModes)
       && (mns->Type == ns->Type)
       && (!strncmp(mns->DefaultTitle, ns->DefaultTitle, MaxTitleLen));
}

/* tries to find the screen in database */
ULONG CheckScreen(struct NewScreen *ns)
{
 struct MyNewScreen *List = Root;
 extern struct TextAttr MyAttr;
 
 /* screen already in list ? */
 while ((List != NULL) && (!CompScreen(List, ns))) List = List->Next;

 if (!List)
 {
  /* no! */
  List = AllocMem(mnsSize, MEMF_ANY);
  List->OldLeftEdge = ns->LeftEdge;
  List->OldTopEdge = ns->TopEdge;
  List->OldWidth = ns->Width;
  List->OldHeight = ns->Height;
  List->Depth = ns->Depth;
  List->DetailPen = ns->DetailPen;
  List->BlockPen = ns->BlockPen;
  List->ViewModes = ns->ViewModes;
  List->Type = ns->Type;
  strncpy(List->DefaultTitle, ns->DefaultTitle, MaxTitleLen);
  List->Topaz = FALSE;

  /* show the requester */
  List->DisplayID = ScreenRequest(ns, &List->Topaz);

  List->LeftEdge = ns->LeftEdge;
  List->TopEdge = ns->TopEdge;
  List->Width = ns->Width;
  List->Height = ns->Height;

  List->Next = Root;

  Root = List;
 }

 ns->LeftEdge = List->LeftEdge;
 ns->TopEdge = List->TopEdge;
 ns->Width = List->Width;
 ns->Height = List->Height;
 if (List->Topaz) ns->Font = &MyAttr;
 
 /* return the new DisplayID */
 return List->DisplayID;
}

/* save the database and free it */
void SaveData(void)
{
 struct MyNewScreen *List, *Next;
 BPTR		     File;

 File = Open("s:DoPro.config", MODE_NEWFILE);
 List = Root;
 if (List) Next = List->Next;

 while (List)
 {
  Write(File, List, mnsSize);
  FreeMem(List, mnsSize);
  List = Next;
  if (List) Next = List->Next;
 }
 Close(File);
}

/* load and allocate the database */
void LoadData(void)
{
 struct MyNewScreen *List;
 BPTR		     File;

 if (File = Open("s:DoPro.config", MODE_OLDFILE))
 {
  List = AllocMem(mnsSize, MEMF_ANY);
  while (Read(File, List, mnsSize) == mnsSize)
  {
   List->Next = Root;
   Root = List;
   List = AllocMem(mnsSize, MEMF_ANY);
  }
  FreeMem(List, mnsSize);
  Close(File);
 }
}