#include <CrashTickPrefs.h>

void LV_CreateListView(struct LayoutHandle *handle,ulong lines,ulong basenum)
{
   LT_New(handle,
      LA_Type,      STRING_KIND,
      GTST_MaxChars,30,
      LA_ID,        basenum,
      LAST_Link,    basenum+1,
      TAG_DONE);

   LT_New(handle,
      LA_Type,       LISTVIEW_KIND,
      LALV_Lines,    lines,
      LALV_CursorKey,TRUE,
      LALV_Link,     basenum,
      LA_ID,         basenum+1,
      LA_Chars,      21,
      LALV_LockSize, TRUE,
      TAG_DONE);

   LT_New(handle,
      LA_Type,      HORIZONTAL_KIND,
      LAGR_SameSize,TRUE,
      TAG_DONE);

      LT_New(handle,
         LA_Type,      VERTICAL_KIND,
         LAGR_SameSize,TRUE,
         TAG_DONE);

         LT_New(handle,
            LA_Type,      BUTTON_KIND,
            LA_LabelID,   PREFS_LIST_ADD,
            LA_Chars,     10,
            LA_ID,        basenum+10,
            TAG_DONE);

         LT_New(handle,
            LA_Type,      BUTTON_KIND,
            LA_LabelID,   PREFS_LIST_UP,
            LA_Chars,     10,
            LA_ID,        basenum+12,
            TAG_DONE);

      LT_EndGroup(handle);

      LT_New(handle,
         LA_Type,      VERTICAL_KIND,
         LAGR_SameSize,TRUE,
         TAG_DONE);

         LT_New(handle,
            LA_Type,      BUTTON_KIND,
            LA_LabelID,   PREFS_LIST_REMOVE,
            LA_Chars,     10,
            LA_ID,        basenum+11,
            TAG_DONE);

         LT_New(handle,
            LA_Type,      BUTTON_KIND,
            LA_LabelID,   PREFS_LIST_DOWN,
            LA_Chars,     10,
            LA_ID,        basenum+13,
            TAG_DONE);

      LT_EndGroup(handle);

   LT_EndGroup(handle);
}

void LV_DetachList(struct LayoutHandle *handle,ulong basenum)
{
   LT_SetAttributes(handle,basenum+1,GTLV_Labels,~0,TAG_END);
}

void LV_AttachList(struct LayoutHandle *handle,ulong basenum,struct List *list)
{
   LT_SetAttributes(handle,basenum+1,GTLV_Labels,list,TAG_END);
}

void LV_ChangedNum(struct LayoutHandle *handle,ulong basenum,struct List *list)
{
   if(!list->lh_Head->ln_Succ)
   {
      /* Tom lista, ghost på allt utom add */

      LT_SetAttributes(parthandle,basenum,GA_Disabled,TRUE,TAG_DONE);
      LT_SetAttributes(parthandle,basenum+1,GA_Disabled,TRUE,TAG_DONE);
      LT_SetAttributes(parthandle,basenum+11,GA_Disabled,TRUE,TAG_DONE);
      LT_SetAttributes(parthandle,basenum+12,GA_Disabled,TRUE,TAG_DONE);
      LT_SetAttributes(parthandle,basenum+13,GA_Disabled,TRUE,TAG_DONE);
   }
   else
   {
      /* Återställa, Up/Down sköts av SetCurrent */

      LT_SetAttributes(parthandle,basenum,GA_Disabled,FALSE,TAG_DONE);
      LT_SetAttributes(parthandle,basenum+1,GA_Disabled,FALSE,TAG_DONE);
      LT_SetAttributes(parthandle,basenum+11,GA_Disabled,FALSE,TAG_DONE);
   }
}

void LV_SetCurrent(struct LayoutHandle *handle,ulong basenum,struct List *list,struct TempNode *currentnode)
{
   /* tom lista eller ingen currentnode */

   if(!currentnode || !list->lh_Head->ln_Succ)
      return;

   LT_SetAttributes(parthandle,basenum+12,GA_Disabled,FALSE,TAG_DONE); /* up */
   LT_SetAttributes(parthandle,basenum+13,GA_Disabled,FALSE,TAG_DONE); /* down */

   if((struct Node *)currentnode == list->lh_Head)
      LT_SetAttributes(parthandle,basenum+12,GA_Disabled,TRUE,TAG_DONE); /* up */

   if(!currentnode->Node.ln_Succ->ln_Succ)
      LT_SetAttributes(parthandle,basenum+13,GA_Disabled,TRUE,TAG_DONE); /* down */

   LT_SetAttributes(handle,basenum+1,
      GTLV_Selected,    currentnode->num,
      TAG_DONE);

   if(currentnode->num == 0)
      LT_SetAttributes(handle,basenum+1,
         GTLV_MakeVisible, currentnode->num,
         TAG_DONE);
}

void LV_MoveUp(struct LayoutHandle *handle,ulong basenum,struct List *list,struct TempNode *tempnode,struct jbList *jblist)
{
   struct jbNode *jbn;
   struct TempNode *prevnode;

   if((struct Node *)tempnode == list->lh_Head)
      return;

   /* Modify the list */

   LV_DetachList(handle,basenum);

   /* Swap in jbList */

   for(jbn=jblist->First;jbn;jbn=jbn->Next)
      if(jbn->Next == (struct jbNode *)tempnode->UserData) break;

   jbSwapNodes(jblist,jbn);

   prevnode=(struct TempNode *)tempnode->Node.ln_Pred;

   /* Change position numbers */

   prevnode->num++;
   tempnode->num--;

   /* Swap in templist */

   Remove((struct Node *)prevnode);
   Insert(list,(struct Node *)prevnode,(struct Node *)tempnode);

   LV_AttachList(handle,basenum,list);

   /* Set new */

   LV_SetCurrent(handle,basenum,list,tempnode);

   LT_SetAttributes(handle,basenum+1,
      GTLV_MakeVisible, tempnode->num,
      TAG_DONE);
}

void LV_MoveDown(struct LayoutHandle *handle,ulong basenum,struct List *list,struct TempNode *tempnode,struct jbList *jblist)
{
   struct jbNode *jbn;
   struct TempNode *succnode;

   if((struct Node *)tempnode == list->lh_TailPred)
      return;

   /* Modify the list */

   LV_DetachList(handle,basenum);

   /* Swap in jbList */

   for(jbn=jblist->First;jbn;jbn=jbn->Next)
      if(jbn == (struct jbNode *)tempnode->UserData) break;

   jbSwapNodes(jblist,jbn);

   succnode=(struct TempNode *)tempnode->Node.ln_Succ;

   /* Change position numbers */

   tempnode->num++;
   succnode->num--;

   /* Swap in templist */

   Remove((struct Node *)tempnode);
   Insert(list,(struct Node *)tempnode,(struct Node *)succnode);

   LV_AttachList(handle,basenum,list);

   /* Set new */

   LV_SetCurrent(handle,basenum,list,tempnode);

   LT_SetAttributes(handle,basenum+1,
      GTLV_MakeVisible, tempnode->num,
      TAG_DONE);
}
