/*
 * REGION.C
 */

#include "defs.h"

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


/***********************  AllocTplRegion()  **************************/
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);
}

/***********************  UpdateTplRegion(rg) ************************/
void
UpdateTplRegion(rg)
  TplRegion *rg;
{
  if (rg->rg_Gad)
    GT_SetGadgetAttrs(rg->rg_Gad, Win, NULL,
                      GA_Disabled, 1,
                      TAG_END);

  if (rg->rg_DefText)
    free(rg->rg_DefText);

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

  if (rg->rg_LabText)
    free(rg->rg_LabText);

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

  if (rg->rg_Node.ln_Name)
    free(rg->rg_Node.ln_Name);

  rg->rg_Node.ln_Name = strdup(Buf_region_str);

  if (rg->rg_Gad)
  {
    switch(rg->rg_Type)
    {
    case RGT_CYCLE:
    case RGT_LISTVIEW:
      GT_SetGadgetAttrs(rg->rg_Gad, Win, NULL,
                        GTLV_Labels, -1,
                        TAG_END);
      break;

    case RGT_MX:
      GT_SetGadgetAttrs(rg->rg_Gad, Win, NULL,
                        GTMX_Labels, -1,
                        TAG_END);

    default:
      break;
    }
  }

  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_LISTVIEW ||
      NewType == RGT_MX)
  {
    MaxNode *mn;
    short  cnt = 0;

    for (mn = GetHead(&List_items_lv); mn; mn = GetSucc(mn))
    {
      AddNode(&rg->rg_ListSet, mn->ln_Name, 1);
      ++cnt;
    }
    rg->rg_CycleAry = zalloc(sizeof(char *) * (cnt + 1));

    if (cnt)
    {
      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;
  rg->rg_SpecFlags  = SpecFlag;
  rg->rg_MaxVal     = MaxVal;
  rg->rg_DefVal     = DefVal;
  rg->rg_BufSpace   = BufSpace;

  if (DDebug)
  {
    printf("rg->rg_Flags      = %d\n", NewFlags);
    printf("rg->rg_Type       = %d\n", NewType);
    printf("rg->rg_SpecFlags  = %d\n", SpecFlag);
    printf("rg->rg_MaxVal     = %d\n", MaxVal);
    printf("rg->rg_DefVal     = %d\n", DefVal);
    printf("rg->rg_BufSpace   = %d\n", BufSpace);
  }
}

/***********************  DeleteTplRegion(rg) ************************/
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)
  {
    switch(rg->rg_Type)
    {
    case RGT_CYCLE:
    case RGT_LISTVIEW:
      GT_SetGadgetAttrs(rg->rg_Gad, Win, NULL,
                        GTLV_Labels, -1,
                        TAG_END);
      break;

    case RGT_MX:
      GT_SetGadgetAttrs(rg->rg_Gad, Win, NULL,
                        GTMX_Labels, -1,
                        TAG_END);
    default:
      break;
    }
  }

  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);
}
