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

   Author  : Jan van den Baard
   Purpose : The window flags requester
 *----------------------------------------------------------------------*/

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

static SHORT OCPairs[] =
 { 0,0,115,0,115,16,0,16,0,0
 };
static struct Border OCBorder =
 { -1,-1,0,0,JAM1,5,OCPairs,NULL
 };

static struct IntuiText CNCText =
 { 0,0,JAM1,33,4,NULL,(UBYTE *)"CANCEL",NULL
 };
static struct Gadget CNC =
 { NULL,132,122,114,15,NULL,RELVERIFY,BOOLGADGET,
   (APTR)&OCBorder,NULL,&CNCText,NULL,NULL,17,NULL
 };

static struct IntuiText OKText =
 { 0,0,JAM1,48,4,NULL,(UBYTE *)"OK",NULL
 };
static struct Gadget OK =
 { &CNC,12,122,114,15,NULL,RELVERIFY,BOOLGADGET,
   (APTR)&OCBorder,NULL,&OKText,NULL,NULL,16,NULL
 };

static SHORT FPairs[] =
 { 0,0,115,0,115,10,0,10,0,0
 };
static struct Border FBorder =
 { -1,-1,0,0,JAM1,5,FPairs,NULL
 };

static struct IntuiText RMTText =
 { 0,0,JAM1,28,1,NULL,(UBYTE *)"RMBTRAP",NULL
 };
static struct Gadget RMT =
 { &OK,132,106,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&RMTText,NULL,NULL,15,NULL
 };

static struct IntuiText RPMText =
 { 0,0,JAM1,13,1,NULL,(UBYTE *)"REPORTMOUSE",NULL
 };
static struct Gadget RPM =
 { &RMT,132,93,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&RPMText,NULL,NULL,14,NULL
 };

static struct IntuiText ACTText =
 { 0,0,JAM1,24,1,NULL,(UBYTE *)"ACTIVATE",NULL
 };
static struct Gadget ACT =
 { &RPM,132,80,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&ACTText,NULL,NULL,13,NULL
 };

static struct IntuiText BDLText =
 { 0,0,JAM1,16,1,NULL,(UBYTE *)"BORDERLESS",NULL
 };
static struct Gadget BDL =
 { &ACT,132,67,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&BDLText,NULL,NULL,12,NULL
 };

static struct IntuiText GZZText =
 { 0,0,JAM1,5,1,NULL,(UBYTE *)"GIMMEZEROZERO",NULL
 };
static struct Gadget GZZ =
 { &BDL,132,54,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&GZZText,NULL,NULL,11,NULL
 };

static struct IntuiText BDRText =
 { 0,0,JAM1,25,1,NULL,(UBYTE *)"BACKDROP",NULL
 };
static struct Gadget BDR =
 { &GZZ,132,41,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&BDRText,NULL,NULL,10,NULL
 };

static struct IntuiText SBMText =
 { 0,0,JAM1,8,1,NULL,(UBYTE *)"SUPER_BITMAP",NULL
 };
static struct Gadget SBM =
 { &BDR,132,28,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&SBMText,3L,NULL,9,NULL
 };

static struct IntuiText SMFText =
 { 0,0,JAM1,4,1,NULL,(UBYTE *)"SMART_REFRESH",NULL
 };
static struct Gadget SMF =
 { &SBM,132,15,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&SMFText,5L,NULL,8,NULL
 };

static struct IntuiText SRFText =
 { 0,0,JAM1,0,1,NULL,(UBYTE *)"SIMPLE_REFRESH",NULL
 };
static struct Gadget SRF =
 { &SMF,12,106,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&SRFText,6L,NULL,7,NULL
 };

static struct IntuiText NCRText =
 { 0,0,JAM1,6,1,NULL,(UBYTE *)"NOCAREREFRESH",NULL
 };
static struct Gadget NCR =
 { &SRF,12,93,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&NCRText,NULL,NULL,6,NULL
 };

static struct IntuiText SBBText =
 { 0,0,JAM1,13,1,NULL,(UBYTE *)"SIZEBBOTTOM",NULL
 };
static struct Gadget SBB =
 { &NCR,12,80,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&SBBText,NULL,NULL,5,NULL
 };

static struct IntuiText SBRText =
 { 0,0,JAM1,17,1,NULL,(UBYTE *)"SIZEBRIGHT",NULL
 };
static struct Gadget SBR =
 { &SBB,12,67,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&SBRText,NULL,NULL,4,NULL
 };

static struct IntuiText WDCText =
 { 0,0,JAM1,13,1,NULL,(UBYTE *)"WINDOWCLOSE",NULL
 };
static struct Gadget WDC =
 { &SBR,12,54,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&WDCText,NULL,NULL,3,NULL
 };

static struct IntuiText WDDText =
 { 0,0,JAM1,13,1,NULL,(UBYTE *)"WINDOWDEPTH",NULL
 };
static struct Gadget WDD =
 { &WDC,12,41,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&WDDText,NULL,NULL,2,NULL
 };

static struct IntuiText WDRText =
 { 0,0,JAM1,18,1,NULL,(UBYTE *)"WINDOWDRAG",NULL
 };
static struct Gadget WDR =
 { &WDD,12,28,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&WDRText,NULL,NULL,1,NULL
 };

static struct IntuiText WDSText =
 { 0,0,JAM1,10,1,NULL,(UBYTE *)"WINDOWSIZING",NULL
 };
static struct Gadget WDS =
 { &WDR,12,15,114,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
   (APTR)&FBorder,NULL,&WDSText,NULL,NULL,0,NULL
 };

static struct IntuiText EText =
 { 0,0,JAM1,55,3,NULL,(UBYTE *)"Edit Window Flags",NULL
 };

static struct NewWindow sf_req =
 { 30,15,259,142,0,1,GADGETDOWN+GADGETUP,
   ACTIVATE+RMBTRAP+NOCAREREFRESH+SMART_REFRESH,
   NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN
 };

extern struct Window     *MainWindow;
extern struct Screen     *MainScreen;
extern struct NewWindow   nw_main;
extern struct RastPort   *MainRP;
extern struct GadgetList  Gadgets;
extern struct Gadget     *Gadget;
extern ULONG              WindowFlags;
extern USHORT             GadgetCount;
extern BOOL               Saved;

struct Gadget *re_arrange();

/*
 * clear all selected flags
 */
static VOID clear()
{
    register struct Gadget *g;

    g = &WDS;
    while(1)
    {   if(g == &OK) break;
        g->Flags = NULL;
        g = g->NextGadget;
    }
}

/*
 * open the flags window
 */
VOID set_flags()
{
    struct Window *sfw, *w;
    struct NewWindow nw;

    sf_req.Screen = MainScreen;
    clear();
    if(NOT(sfw = OpenWindow(&sf_req))) return;

    draw(sfw,&WDS,&MainBorder1,&EText);
    disable_window();

    if(TestBits(WindowFlags,WINDOWSIZING))   SelectGadget(sfw,&WDS,NULL);
    if(TestBits(WindowFlags,WINDOWDRAG))     SelectGadget(sfw,&WDR,NULL);
    if(TestBits(WindowFlags,WINDOWDEPTH))    SelectGadget(sfw,&WDD,NULL);
    if(TestBits(WindowFlags,WINDOWCLOSE))    SelectGadget(sfw,&WDC,NULL);
    if(TestBits(WindowFlags,SIZEBRIGHT))     SelectGadget(sfw,&SBR,NULL);
    if(TestBits(WindowFlags,SIZEBBOTTOM))    SelectGadget(sfw,&SBB,NULL);
    if(TestBits(WindowFlags,NOCAREREFRESH))  SelectGadget(sfw,&NCR,NULL);
    if(TestBits(WindowFlags,SIMPLE_REFRESH)) SelectGadget(sfw,&SRF,NULL);
    if(TestBits(WindowFlags,SMART_REFRESH))  SelectGadget(sfw,&SMF,NULL);
    if(TestBits(WindowFlags,SUPER_BITMAP))   SelectGadget(sfw,&SBM,NULL);
    if(TestBits(WindowFlags,BACKDROP))       SelectGadget(sfw,&BDR,NULL);
    if(TestBits(WindowFlags,GIMMEZEROZERO))  SelectGadget(sfw,&GZZ,NULL);
    if(TestBits(WindowFlags,BORDERLESS))     SelectGadget(sfw,&BDL,NULL);
    if(TestBits(WindowFlags,ACTIVATE))       SelectGadget(sfw,&ACT,NULL);
    if(TestBits(WindowFlags,REPORTMOUSE))    SelectGadget(sfw,&RPM,NULL);
    if(TestBits(WindowFlags,RMBTRAP))        SelectGadget(sfw,&RMT,NULL);

    do
    {   Wait(1 << sfw->UserPort->mp_SigBit);
        while(read_msg(sfw))
        {   switch(Gadget->GadgetID)
            {   case 7:
                case 8:
                case 9: MutualExclude(sfw,Gadget,&SRF,NULL);
                        SelectGadget(sfw,Gadget,NULL);
                        break;
            }
        }
    } while(Gadget->GadgetID < 16);
    CloseWindow(sfw);
    enable_window();
    if(Gadget->GadgetID == 16)
    {   WindowFlags = NULL;
        if(SelectTest(&WDS)) WindowFlags |= WINDOWSIZING;
        if(SelectTest(&WDR)) WindowFlags |= WINDOWDRAG;
        if(SelectTest(&WDD)) WindowFlags |= WINDOWDEPTH;
        if(SelectTest(&WDC)) WindowFlags |= WINDOWCLOSE;
        if(SelectTest(&SBR)) WindowFlags |= SIZEBRIGHT;
        if(SelectTest(&SBB)) WindowFlags |= SIZEBBOTTOM;
        if(SelectTest(&NCR)) WindowFlags |= NOCAREREFRESH;
        if(SelectTest(&SRF)) WindowFlags |= SIMPLE_REFRESH;
        if(SelectTest(&SMF)) WindowFlags |= SMART_REFRESH;
        if(SelectTest(&SBM)) WindowFlags |= SUPER_BITMAP;
        if(SelectTest(&BDR)) WindowFlags |= BACKDROP;
        if(SelectTest(&GZZ)) WindowFlags |= GIMMEZEROZERO;
        if(SelectTest(&BDL)) WindowFlags |= BORDERLESS;
        if(SelectTest(&ACT)) WindowFlags |= ACTIVATE;
        if(SelectTest(&RPM)) WindowFlags |= REPORTMOUSE;
        if(SelectTest(&RMT)) WindowFlags |= RMBTRAP;

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

        if(TestBits(WindowFlags,WINDOWSIZING))
              nw_main.Flags |= WINDOWSIZING;
        else if(TestBits(nw_main.Flags,WINDOWSIZING))
              nw_main.Flags ^= WINDOWSIZING;

        if(TestBits(WindowFlags,WINDOWDRAG))
              nw_main.Flags |= WINDOWDRAG;
        else if(TestBits(nw_main.Flags,WINDOWDRAG))
              nw_main.Flags ^= WINDOWDRAG;

        if(TestBits(WindowFlags,WINDOWDEPTH))
              nw_main.Flags |= WINDOWDEPTH;
        else if(TestBits(nw_main.Flags,WINDOWDEPTH))
              nw_main.Flags ^= WINDOWDEPTH;

        if(TestBits(WindowFlags,WINDOWCLOSE))
              nw_main.Flags |= WINDOWCLOSE;
        else if(TestBits(nw_main.Flags,WINDOWCLOSE))
              nw_main.Flags ^= WINDOWCLOSE;

        if(TestBits(WindowFlags,SIZEBRIGHT))
              nw_main.Flags |= SIZEBRIGHT;
        else if(TestBits(nw_main.Flags,SIZEBRIGHT))
              nw_main.Flags ^= SIZEBRIGHT;

        if(TestBits(WindowFlags,SIZEBBOTTOM))
              nw_main.Flags |= SIZEBBOTTOM;
        else if(TestBits(nw_main.Flags,SIZEBBOTTOM))
              nw_main.Flags ^= SIZEBBOTTOM;

        nw_main.Flags |= NOCAREREFRESH+SMART_REFRESH+ACTIVATE;

        add_bo();
        nw_main.FirstGadget = re_arrange();

        if(NOT(w = OpenWindow(&nw_main)))
        {   Error("Can't change window !");
            return;
        }
        ClearMenuStrip(MainWindow);
        CloseWindow(MainWindow);
        MainWindow = w;
        MainRP     = MainWindow->RPort;
        SetMenu(MainWindow);
        rem_bo();
        refresh();
        Saved = FALSE;
    }
}
