/*----------------------------------------------------------------------*
   pref.c Version 2.0 - © Copyright 1990 Jaba Development

   Author  : Jan van den Baard
   Purpose : the preferences requester
 *----------------------------------------------------------------------*/

static UBYTE UNDOBUFFER[80];

static SHORT MainPairs2[] =
 { 0,0,296,0,296,85,0,85,0,0
 };
static struct Border MainBorder2 =
 { 2,1,0,0,JAM1,5,MainPairs2,NULL
 };
static SHORT MainPairs1[] =
 { 0,0,296,0
 };
static struct Border MainBorder1 =
 { 2,12,0,0,JAM1,2,MainPairs1,&MainBorder2
 };

static SHORT SUPairs[] =
 { 0,0,87,0,87,13,0,13,0,0
 };
static struct Border SUBorder =
 { -1,-1,0,0,JAM1,5,SUPairs,NULL
 };

static struct IntuiText SUText =
 { 0,0,JAM1,3,2,NULL,(UBYTE *)"Save & Use",NULL
 };
static struct Gadget SU =
 { NULL,203,71,86,12,NULL,RELVERIFY,BOOLGADGET,
   (APTR)&SUBorder,NULL,&SUText,NULL,NULL,9,NULL
 };

static struct IntuiText USText =
 { 0,0,JAM1,33,2,NULL,(UBYTE *)"Use",NULL
 };
static struct Gadget US =
 { &SU,107,71,86,12,NULL,RELVERIFY,BOOLGADGET,
   (APTR)&SUBorder,NULL,&USText,NULL,NULL,8,NULL
 };

static struct IntuiText SAText =
 { 0,0,JAM1,27,2,NULL,(UBYTE *)"Save",NULL
 };
static struct Gadget SA =
 { &US,12,71,86,12,NULL,RELVERIFY,BOOLGADGET,
   (APTR)&SUBorder,NULL,&SAText,NULL,NULL,7,NULL
 };

static SHORT RWPairs[] =
 { 0,0,136,0,136,10,0,10,0,0
 };
static struct Border RWBorder =
 { -1,-1,0,0,JAM1,5,RWPairs,NULL
 };

static struct IntuiText REText =
 { 0,0,JAM1,30,1,NULL,(UBYTE *)"REQUESTER",NULL
 };
static struct Gadget RE =
 { &SA,155,57,135,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&RWBorder,NULL,&REText,1L,NULL,3,NULL
 };

static struct IntuiText WDText =
 { 0,0,JAM1,43,1,NULL,(UBYTE *)"WINDOW",NULL
 };
static struct Gadget WD =
 { &RE,12,57,135,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&RWBorder,NULL,&WDText,2L,NULL,2,NULL
 };

static SHORT OPPairs[] =
 { 0,0,279,0,279,11,0,11,0,0
 };
static struct Border OPBorder =
 { -1,-1,0,0,JAM1,5,OPPairs,NULL
 };

static struct IntuiText ICText =
 { 0,0,JAM1,99,1,NULL,(UBYTE *)"Image Copy",NULL
 };
static struct Gadget IC =
 { &WD,12,43,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&OPBorder,NULL,&ICText,NULL,NULL,1,NULL
 };

static struct IntuiText AUSText =
 { 0,0,JAM1,40,1,NULL,(UBYTE *)"Auto Gadget -> Image size",NULL
 };
static struct Gadget AUS =
 { &IC,12,29,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&OPBorder,NULL,&AUSText,1,NULL,0,NULL
 };

static struct IntuiText SZPText =
 { 0,0,JAM1,58,1,NULL,(UBYTE *)"Skip zero bit-planes",NULL
 };
static struct Gadget SZP =
 { &AUS,12,15,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&OPBorder,NULL,&SZPText,NULL,NULL,0,NULL
 };

static struct IntuiText MainText =
 { 0,0,JAM1,107,3,NULL,(UBYTE *)"Preferences",NULL
 };

static struct NewWindow pr_req =
 { 10,15,301,88,0,1,GADGETUP+GADGETDOWN,
   NOCAREREFRESH+SMART_REFRESH+ACTIVATE+RMBTRAP,
   NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN
 };

extern struct Window     *MainWindow;
extern struct Screen     *MainScreen;
extern BOOL               REQUESTER;
extern struct ge_prefs    prefs;
extern ULONG              Class;
extern USHORT             GadgetCount, BackFill, BackPen, FrontPen;
extern struct Gadget     *Gadget;
extern struct RastPort   *MainRP;
extern struct NewWindow   nw_main;
extern struct GadgetList  Gadgets;
extern UBYTE              wdt[80],wlb[MAXLABEL];
extern ULONG              WindowFlags;
extern struct Gadget      TextGadget;

static struct Window *pw;

/*
 * write the preferences to "DEVS:GadgetEd.PREFS"
 */
static BOOL save_prefs()
{
    BPTR file;
    BOOL ret = TRUE;

    if(NOT(file = Open("DEVS:GadgetEd.PREFS",MODE_NEWFILE))) return(FALSE);

    if(Write(file,(char *)&prefs,sizeof(struct ge_prefs)) == -1) ret = FALSE;
    Close(file);

    return(ret);
}

/*
 * set the preferences
 */
static VOID set_prefs()
{
    if(SelectTest(&SZP))  prefs.skip_zero_planes = TRUE;
    else                  prefs.skip_zero_planes = FALSE;
    if(SelectTest(&AUS))  prefs.auto_size        = TRUE;
    else                  prefs.auto_size = FALSE;
    if(SelectTest(&IC))   prefs.image_copy = TRUE;
    else                  prefs.image_copy = FALSE;
    if(SelectTest(&RE)) { REQUESTER = TRUE; BackFill = BackPen; }
    else                  REQUESTER = FALSE;
    refresh();
}

#define REQ WINDOWDRAG+WINDOWSIZING+SIZEBRIGHT+SIZEBBOTTOM+GIMMEZEROZERO+BORDERLESS;

/*
 * re arrange the gadget list
 */
struct Gadget *re_arrange()
{
    register struct MyGadget *g;
    register struct Gadget *gd;

    if(Gadgets.TailPred == (struct MyGadget *)&Gadgets) return(NULL);

    for(g = Gadgets.TailPred; g != (struct MyGadget *)&Gadgets; g = g->Pred)
    {   gd = &g->Gadget;
        if(g->Pred == (struct MyGadget *)&Gadgets) gd->NextGadget = NULL;
        else gd->NextGadget = &g->Pred->Gadget;
    }
    return(&Gadgets.TailPred->Gadget);
}

/*
 * change the window to requester or viceversa
 */
BOOL change_window()
{
    register struct Gadget    *g, *g1, *gl;
    register struct IntuiText *t;
    struct Window             *w;

    nw_main.LeftEdge       =   MainWindow->LeftEdge;
    nw_main.TopEdge        =   MainWindow->TopEdge;
    nw_main.Width          =   MainWindow->Width;
    nw_main.Height         =   MainWindow->Height;
    nw_main.Flags          =   NULL;
    nw_main.FirstGadget    =   NULL;
    nw_main.Screen         =   MainScreen;
    nw_main.MinWidth       =   MainWindow->MinWidth;
    nw_main.MinHeight      =   MainWindow->MinHeight;
    nw_main.MaxWidth       =   MainScreen->Width;
    nw_main.MaxHeight      =   MainScreen->Height;

    add_bo();

    g = gl = re_arrange();

    if(REQUESTER)
    {   nw_main.DetailPen    =   0;
        nw_main.BlockPen     =   1;
        BackFill             =   1;
        FrontPen             =   0;
        BackPen              =   1;
        nw_main.Flags        =   REQ;
        strcpy((char *)&wlb,"requester");
        strcpy((char *)&wdt,"Requester");
        nw_main.Title        =   (UBYTE *)"Work Requester";
        if((nw_main.LeftEdge + nw_main.Width + 17) < MainScreen->Width)
            nw_main.Width += 17;
        if((nw_main.TopEdge + nw_main.Height + 8) < MainScreen->Height)
            nw_main.Height += 8;
    }
    else
    {   nw_main.DetailPen    =   MainWindow->DetailPen;
        nw_main.BlockPen     =   MainWindow->BlockPen;
        strcpy((char *)&wdt,"Work Window");
        nw_main.Title        =   (UBYTE *)&wdt;
        strcpy((char *)&wlb,"new_window");
        FrontPen             =   1;
        BackPen              =   0;
        nw_main.Width       -=   17;
        nw_main.Height      -=   8;
        if(TestBits(WindowFlags,WINDOWCLOSE))  nw_main.Flags |= WINDOWCLOSE;
        if(TestBits(WindowFlags,WINDOWDRAG))   nw_main.Flags |= WINDOWDRAG;
        if(TestBits(WindowFlags,WINDOWDEPTH))  nw_main.Flags |= WINDOWDEPTH;
        if(TestBits(WindowFlags,WINDOWSIZING)) nw_main.Flags |= WINDOWSIZING;
        if(TestBits(WindowFlags,SIZEBRIGHT))   nw_main.Flags |= SIZEBRIGHT;
        if(TestBits(WindowFlags,SIZEBBOTTOM))  nw_main.Flags |= SIZEBBOTTOM;
    }
    nw_main.Flags |= NOCAREREFRESH+SMART_REFRESH+ACTIVATE;

    if(NOT(w = OpenWindow(&nw_main)))
    {   Error("Can't change window !");
        if(g) AddGList(MainWindow,g,-1L,GadgetCount,NULL);
        return;
    }

    if(REQUESTER)
    {  if(g)
       {   while(1)
           {   g1 = g->NextGadget;
               un_grel(MainWindow,g);
               if(TestBits((ULONG)g->Flags,GRELWIDTH))  g->Flags ^= GRELWIDTH;
               if(TestBits((ULONG)g->Flags,GRELHEIGHT)) g->Flags ^= GRELHEIGHT;
               if(TestBits((ULONG)g->Flags,GRELRIGHT))  g->Flags ^= GRELRIGHT;
               if(TestBits((ULONG)g->Flags,GRELBOTTOM)) g->Flags ^= GRELBOTTOM;

               if(TestBits((ULONG)g->Activation,RIGHTBORDER))
                    g->Activation ^= RIGHTBORDER;
               if(TestBits((ULONG)g->Activation,LEFTBORDER))
                    g->Activation ^= LEFTBORDER;
               if(TestBits((ULONG)g->Activation,TOPBORDER))
                    g->Activation ^= TOPBORDER;
               if(TestBits((ULONG)g->Activation,BOTTOMBORDER))
                    g->Activation ^= BOTTOMBORDER;

               g->TopEdge  -= MainWindow->BorderTop - 1;

               if(NOT g1) break;
               g = g1;
           }
       }
       if((t = TextGadget.GadgetText))
       {   while(1)
           {   t->TopEdge -= MainWindow->BorderTop - 1;
               if(NOT(t = t->NextText)) break;
           }
       }
    }
    else
    {   if(g)
        {   while(1)
            {   g1 = g->NextGadget;
                if(TestBits((ULONG)g->Activation,ENDGADGET))
                g->Activation ^= ENDGADGET;
                g->TopEdge  += MainWindow->BorderTop + 1;
                if(NOT g1) break;
                g = g1;
            }
        }
        if((t = TextGadget.GadgetText))
        {   while(1)
            {   t->TopEdge += MainWindow->BorderTop + 1;
                if(NOT(t = t->NextText)) break;
            }
        }
    }

    ClearMenuStrip(MainWindow);
    CloseWindow(MainWindow);
    MainWindow = w;
    MainRP     = MainWindow->RPort;
    SetMenu(MainWindow);
    if(gl) AddGList(MainWindow,gl,-1L,GadgetCount,NULL);
    rem_bo();
    refresh();
}

/*
 * open the preferences window
 */
VOID preferences()
{
    struct RastPort *rp;
    BOOL             running = TRUE, req;
    USHORT           g_id;

    pr_req.Screen = MainScreen;
    if(NOT(pw = OpenWindow(&pr_req))) return;
    disable_window();
    rp = pw->RPort;
    draw(pw,&SZP,&MainBorder1,&MainText);
    DeSelectGList(pw,&SZP,NULL,5);
    if(prefs.skip_zero_planes) SelectGadget(pw,&SZP,NULL);
    if(prefs.auto_size) SelectGadget(pw,&AUS,NULL);
    if(prefs.image_copy) SelectGadget(pw,&IC,NULL);
    if(REQUESTER) SelectGadget(pw,&RE,NULL);
    else SelectGadget(pw,&WD,NULL);
    req = REQUESTER;
    do
    {   Wait(1 << pw->UserPort->mp_SigBit);
        while(read_msg(pw))
        {   g_id = Gadget->GadgetID;
            switch(g_id)
            {   case 2:
                case 3: MutualExclude(pw,Gadget,&WD,NULL);
                        SelectGadget(pw,Gadget,NULL);
                        break;
                case 7:
                case 8:
                case 9: running = FALSE;
                        break;
            }
        }
    } while(running == TRUE);
    CloseWindow(pw);
    enable_window();
    if(g_id == 7)
    {    if(NOT save_prefs())
         {   Error("Error writing preferences !");
             return;
         }
    }
    else if(g_id == 8)
    {   set_prefs();
        if(REQUESTER != req) change_window();
        set_extra_items(MainWindow);
    }
    else
    {   set_prefs();
        if(REQUESTER != req) change_window();
        set_extra_items(MainWindow);
        if(NOT save_prefs())
        {   Error("Error writing preferences !");
            return;
        }
    }
}
