
/*
 * SUBS.C
 */

#include "defs.h"

Prototype TplRegion *IdToRegion(long);
Prototype TplRegion *FindRegion(short, short);
Prototype TplRegion *FindRegionByGad(Gadget *);
Prototype void      ClearLinks(TplRegion *);
Prototype void      UnLink(TplRegion *);
Prototype void      *zalloc(long);
Prototype void      DrawBox(Box *);
Prototype void      FixBounds(Box *);
Prototype void      AddNode(List *, char *, short);
Prototype void      SortList(List *);
Prototype void      SortRegions(void);
Prototype int       GetSaveFile(char *);
Prototype char      *itoa(int);



/***********************  itoa(int);  ********************************/
char *
itoa(num)
  int num;
{
  char *str;
  int   tmp;
  int   cnt;

  for (cnt = 0, tmp = num; tmp > 10; tmp = tmp/10, ++cnt);

  str = (char *)zalloc(cnt + 1);

  sprintf(str, "%d", num);
  printf("num: %d\n", num);

  return(str);

}

/***********************  IdToRegion(id)  ****************************/
TplRegion *
IdToRegion(id)
  long   id;
{
  TplRegion *rg;

  for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node))
  {
    if (rg->rg_Id == id)
      break;
  }
  return (rg);
}

/***********************  FindRegion(x, ******************************/
TplRegion *
FindRegion(x, y)
  short  x;
  short  y;
{
  TplRegion *rg;

  for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node))
  {
    if (rg->rg_Box.bo_Xs - 2 <= x && x <= rg->rg_Box.bo_Xe + 2)
    {
      if (rg->rg_Box.bo_Ys - 2 <= y && y <= rg->rg_Box.bo_Ye + 2)
        return (rg);
    }
  }

  return (NULL);
}

/***********************  FindRegionByGad(gad)  **********************/
TplRegion *
FindRegionByGad(gad)
  Gadget *gad;
{
  TplRegion *rg;

  for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node))
  {
    if (rg->rg_Gad == gad)
      return (rg);
  }
  return (NULL);
}

/***********************  zalloc(bytes) ******************************/
void  *
zalloc(bytes)
  long   bytes;
{
  void  *ptr;

  if (ptr = malloc(bytes))
  {
    clrmem(ptr, bytes);
    return (ptr);
  }
  puts("No Memory!");
  exit(30);
}

/***********************  DrawBox(box)  ******************************/
void
DrawBox(box)
  Box   *box;
{
  RastPort *rp = Win->RPort;

  SetDrMd(rp, COMPLEMENT);
  Move(rp, box->bo_Xs, box->bo_Ys);
  Draw(rp, box->bo_Xe, box->bo_Ys);
  Draw(rp, box->bo_Xe, box->bo_Ye);
  Draw(rp, box->bo_Xs, box->bo_Ye);
  Draw(rp, box->bo_Xs, box->bo_Ys);
}

/***********************  FixBounds(box)  ****************************/
void
FixBounds(box)
  Box   *box;
{
  long   t;

  if (box->bo_Xe < box->bo_Xs)
  {
    t = box->bo_Xe;
    box->bo_Xe = box->bo_Xs;
    box->bo_Xs = t;
  }
  if (box->bo_Ye < box->bo_Ys)
  {
    t = box->bo_Ye;
    box->bo_Ye = box->bo_Ys;
    box->bo_Ys = t;
  }
}

/***********************  AddNode(list, ******************************/
void
AddNode(list, str, alloc)
  List  *list;
  char  *str;
  short  alloc;
{
  MaxNode *node;

  node = zalloc(sizeof(MaxNode));

  node->ln_Name = (alloc) ? strdup(str) : str;

  AddTail((MaxList *) list, node);
}
/***********************  SortList(list, ******************************/
void
SortList(list)
  List  *list;
{
  MaxNode *mn;
  short pri = 0;
  for (mn = (MaxNode *)GetTail(list); mn; mn = (MaxNode *)GetPred(mn))
    mn->ln_Pri = pri++;

  MaxVal = --pri;
  if (DefVal > pri)
    DefVal = pri;

  GT_SetGadgetAttrs(Gad_maxval_sl, EWin, NULL,
                    GTSL_Level, pri,
                    TAG_END);


  GT_SetGadgetAttrs(Gad_defval_sl, EWin, NULL,
                    GTSL_Max,   pri,
                    GTSL_Level, DefVal,
                    TAG_END);

  if (CurRegion)
  {
    CurRegion->rg_DefVal = DefVal;
    CurRegion->rg_MaxVal = pri;
  }
}
/***********************  GetSaveFile(buf)  **************************/
int
GetSaveFile(buf)
  char  *buf;
{
  FileRequester *freq;
  int    r = -1;

  if (freq = AllocFileRequest())
  {
    if (RequestFile(freq))
    {
      short  i = strlen(freq->rf_Dir) - 1;

      strcpy(buf, freq->rf_Dir);
      if (i >= 0 && buf[i] != '/' && buf[i] != ':')
        strcat(buf, "/");
      strcat(buf, freq->rf_File);
      r = 0;
    }
    FreeFileRequest(freq);
  }
  return (r);
}

/***********************  ClearLinks(rn)  ****************************/
void
ClearLinks(rn)
  TplRegion *rn;
{
  long  excl   = rn->rg_ExclGroup;

  TplRegion *rg;

  for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node))
  {
    if (rn == rg->rg_LinkLeft)
      rg->rg_LinkLeft = NULL;
    if (rn == rg->rg_LinkRight)
      rg->rg_LinkRight = NULL;
    if (rn == rg->rg_LinkUp)
      rg->rg_LinkUp = NULL;
    if (rn == rg->rg_LinkDown)
      rg->rg_LinkDown = NULL;
    if (rn == rg->rg_LockedTo)
      rg->rg_LockedTo = NULL;

    if (rg->rg_ExclGroup & excl)
      rg->rg_ExclGroup -= excl;
  }
}

/***********************  SortRegions(void) **************************/
void
SortRegions(void)
{
  UnResolveIDs();

  TplRegion *rg;

  for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node))
  {
    if (rg->rg_Type == RGT_BEVELBOX)
      rg->rg_Node.ln_Pri = 0;
    else
      rg->rg_Node.ln_Pri = (RGT_TEXT + 1) - rg->rg_Type;
  }

  TplRegion *trg;

  for (rg = (TplRegion *)GetTail(&RegList); rg;)
  {
    trg = (TplRegion *)GetPred(&rg->rg_Node);
    Remove(&rg->rg_Node);
    Enqueue(&RegList, &rg->rg_Node);
    rg  = trg;
  }

  ResolveIDs();
}















/***********************  UnLink(rn); ********************************/
void
UnLink(rn)
  TplRegion *rn;
{
  TplRegion *rg;
  if (rg = rn->rg_LockedTo)
  {
      rg->rg_LockedTo  = NULL;
      rn->rg_LockedTo  = NULL;
      rn->rg_Box.bo_Ye = rg->rg_Box.bo_Ys - 1;
  }
}


