
/*
 *  REGION.C
 */

#include "defs.h"

Prototype void UpdateTplRegion(TplRegion *);
Prototype TplRegion *AllocTplRegion(void);
Prototype void DeleteTplRegion(TplRegion *);


TplRegion *
AllocTplRegion()
{
    TplRegion *rg = zalloc(sizeof(TplRegion));

    NewList(&rg->rg_ListSet);
    rg->rg_Id = ++IdNo;
    rg->rg_TextAttr = *Scr->Font;
    AddTail(&RegList, &rg->rg_Node);
    return(rg);
}

void
UpdateTplRegion(rg)
TplRegion *rg;
{
    if (rg->rg_Gad) {
	GT_SetGadgetAttrs(rg->rg_Gad, Win, NULL,
	    GA_Disabled, 1,
	    TAG_END
	);
    }
    if (NewType == RGT_ENTRY)
	rg->rg_MaxBufLen = atoi(MaxName);

    if (rg->rg_DefText)
	free(rg->rg_DefText);
    rg->rg_DefText = (DefName[0]) ? strdup(DefName) : (char *)NULL;

    if (rg->rg_LabText)
	free(rg->rg_LabText);
    rg->rg_LabText = (LabName[0]) ? strdup(LabName) : (char *)NULL;

    if (rg->rg_Node.ln_Name)
	free(rg->rg_Node.ln_Name);
    rg->rg_Node.ln_Name = strdup(RegName);

    if (rg->rg_Gad && (rg->rg_Type == RGT_CYCLE || rg->rg_Type == RGT_SELLIST)) {
	GT_SetGadgetAttrs(rg->rg_Gad, Win, NULL,
	    GTLV_Labels, -1,
	    TAG_END
	);
    }
    {
	MaxNode *mn;
	while (mn = RemHead(&rg->rg_ListSet)) {
	    free(mn->ln_Name);
	    free(mn);
	}
	if (rg->rg_CycleAry) {
	    free(rg->rg_CycleAry);
	    rg->rg_CycleAry = NULL;
	}
    }
    if (NewType == RGT_CYCLE || NewType == RGT_SELLIST) {
	MaxNode *mn;
	short cnt = 0;

	for (mn = GetHead(&EList); mn; mn = GetSucc(mn)) {
	    AddNode(&rg->rg_ListSet, mn->ln_Name, 1);
	    ++cnt;
	}
	rg->rg_CycleAry = zalloc(sizeof(char *) * (cnt + 1));
	cnt = 0;
	for (mn = GetHead(&rg->rg_ListSet); mn; mn = GetSucc(mn))
	    rg->rg_CycleAry[cnt++] = mn->ln_Name;
    }
    rg->rg_Flags = NewFlags;
    rg->rg_Type  = NewType;
}

void
DeleteTplRegion(rg)
TplRegion *rg;
{
    Remove(&rg->rg_Node);
    ClearLinks(rg);

    if (rg->rg_Node.ln_Name)
	free(rg->rg_Node.ln_Name);
    if (rg->rg_Gad && (rg->rg_Type == RGT_CYCLE || rg->rg_Type == RGT_SELLIST)) {
	GT_SetGadgetAttrs(rg->rg_Gad, Win, NULL,
	    GTLV_Labels, -1,
	    TAG_END
	);
    }
    if (rg->rg_DataBase)
	free(rg->rg_DataBase);
    if (rg->rg_ListRef)
	free(rg->rg_ListRef);
    if (rg->rg_CycleAry)
	free(rg->rg_CycleAry);
    {
	MaxNode *mn;
	while (mn = RemHead(&rg->rg_ListSet)) {
	    free(mn->ln_Name);
	    free(mn);
	}
    }
    if (rg->rg_DefText)
	free(rg->rg_DefText);
    if (rg->rg_LabText)
	free(rg->rg_LabText);
    free(rg);
    SetCurRegion(NULL);
}

