
/*
 *  GAD.C
 *
 *  Gadget [re]construction
 */

#include "defs.h"

Prototype void ReMakeEverything(void);
Prototype Gadget *MakeGadget(TplRegion *, Gadget *);
Prototype Gadget *MakeAllGadgets(void);
Prototype void DisableGadgets(void);
Prototype void EnableGadgets(void);

Prototype short GadDisabled;

short GadDisabled;

void
ReMakeEverything()
{
    MakeAllGadgets();
    RefreshGList(GList, Win, NULL, -1);
    GT_RefreshWindow(Win, NULL);
}


Gadget *
MakeAllGadgets()
{
    TplRegion *rg;
    Gadget *gad;

    if (GList) {
	if (Win) {
	    short cnt = 0;
	    for (gad = GList; gad; ++cnt, gad = gad->NextGadget) {
		if (gad->GadgetType & GTYP_SYSGADGET)
		    break;
	    }
	    RemoveGList(Win, GList, cnt);
	    SetRast(Win->RPort, 0);
	    RefreshWindowFrame(Win);
	}
	FreeGadgets(GList);
	GList = NULL;
    }
    if (gad = CreateContext(&GList)) {
	if (DDebug)
	    printf("GLIST %08lx gad %08lx\n", GList, gad);
	for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node))
	    rg->rg_Flags &= ~RGF_DEFERED;
	for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
	    if (rg->rg_LockedTo && rg->rg_Type == RGT_SELLIST)
		rg->rg_Flags |= RGF_DEFERED;
	    else
		gad = MakeGadget(rg, gad);
	}
	for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
	    if (rg->rg_Flags & RGF_DEFERED)
		gad = MakeGadget(rg, gad);
	}
    }
    if (Win) {
	AddGList(Win, GList, 0, -1, NULL);
	if (GadDisabled)
	    DisableGadgets();
    }
    return(gad);
}

Gadget *
MakeGadget(rg, gad)
TplRegion *rg;
Gadget *gad;
{
    if (rg->rg_Type == 0)
	return(gad);

    Ng.ng_LeftEdge  = rg->rg_Box.bo_Xs;
    Ng.ng_TopEdge   = rg->rg_Box.bo_Ys;
    Ng.ng_Width     = rg->rg_Box.bo_Xe - rg->rg_Box.bo_Xs + 1;
    Ng.ng_Height    = rg->rg_Box.bo_Ye - rg->rg_Box.bo_Ys + 1;
    Ng.ng_GadgetText= rg->rg_LabText;
    Ng.ng_TextAttr  = &rg->rg_TextAttr;
    Ng.ng_GadgetID  = rg->rg_Id;
    Ng.ng_Flags     = rg->rg_Flags;
    Ng.ng_UserData  = rg;

    if (Ng.ng_Width < 8 || Ng.ng_Height < 8) {
	printf("Size Error %d %d\n", Ng.ng_Width, Ng.ng_Height);
	return;
    }

    if (DDebug)
	printf("TYPE %d\n", rg->rg_Type);

    switch(rg->rg_Type) {
    case RGT_INVISIBLE:
	break;
    case RGT_BUTTON:
	rg->rg_Gad = CreateGadget(BUTTON_KIND, gad, &Ng,
	    TAG_END
	);
	break;
    case RGT_ENTRY:
	rg->rg_Gad = CreateGadget(STRING_KIND, gad, &Ng,
	    GTST_MaxChars, rg->rg_MaxBufLen,
	    GTST_String, rg->rg_DefText,
	    TAG_END
	);
	break;
    case RGT_SELLIST:
	rg->rg_Gad = CreateGadget(LISTVIEW_KIND, gad, &Ng,
	    GTLV_Labels, &rg->rg_ListSet,
	    GTLV_Selected, (rg->rg_DefText ? atoi(rg->rg_DefText) : 0),
	    ((rg->rg_LockedTo) ? GTLV_ShowSelected : TAG_IGNORE), rg->rg_LockedTo->rg_Gad,
	    TAG_END
	);
	break;
    case RGT_CYCLE:
	rg->rg_Gad = CreateGadget(CYCLE_KIND, gad, &Ng,
	    GTCY_Labels, rg->rg_CycleAry,
	    GTCY_Active, (rg->rg_DefText ? atoi(rg->rg_DefText) : 0),
	    TAG_END
	);
	break;
    default:
	break;
    }
    return(rg->rg_Gad);
}

void
DisableGadgets()
{
    TplRegion *rg;

    GadDisabled = 1;
    for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
	if (rg->rg_Gad) {
	    GT_SetGadgetAttrs(rg->rg_Gad, Win, NULL,
		GA_Disabled, 1,
		TAG_END
	    );
	}
    }
}

void
EnableGadgets()
{
    TplRegion *rg;

    GadDisabled = 0;
    for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
	if (rg->rg_Gad) {
	    GT_SetGadgetAttrs(rg->rg_Gad, Win, NULL,
		GA_Disabled, 0,
		TAG_END
	    );
	}
    }
    GT_RefreshWindow(Win, NULL);
}

