//**************************
//
// Name : IDCMP.c
//
//**************************

//**** Header files

//** OS Include files
#include <intuition/intuition.h>

//** OS function prototypes
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/icon_protos.h>
#include <clib/macros.h>

//** OS function inline calls
#include <pragmas/dos_pragmas.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/intuition_pragmas.h>
#include <pragmas/gadtools_pragmas.h>
#include <pragmas/icon_pragmas.h>

//** ANSI C includes
//#include <stdio.h>
#include <string.h>

//** Application includes

#include "GadToolsBox.h"
#include "GuiExtras.h"
#include "Node.h"
#include "read.h"
#include "Write.h"
#include "Prefs.h"
#include "Librarian.h"

void LoadWRTGUI(char *fname);
void SignalCX(void);

//**** Local Storage

static struct ProgNode *ipn;


//**** Misc functions

static long GetCurrentListView(void) {
  static long nth;
  GT_GetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Selected,&nth,TAG_END);
  ipn=(nth>=0)?(struct ProgNode *)FindNthNode(nth):NULL;
  return nth;
} // GetCurrentListView


//**** ListView block

int MenuItemsClicked( void ) {
  /* routine when gadget "_Menu Items" is clicked. */
  ipn=(struct ProgNode *)FindNthNode(ETMPMsg.Code);
  DisplayNode(ipn);
  return 1;
} // MenuItemsClicked

int ItemClicked( void ) {
  char *buffer;
  /* routine when gadget "" is clicked. */
  if (GetCurrentListView()>=0) {
    GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
    GT_GetGadgetAttrs(ETMPGadgets[GD_Item],ETMPWnd,NULL,GTST_String,&buffer,TAG_END);
    pnSetItem(ipn,buffer);
    GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,TAG_END);
  }
  return 1;
} // Item clicked

int NewClicked( void ) {
  /* routine when gadget "New" is clicked. */
  long count;

  if (ipn=NewNode()) {
    count=ListLength();
    GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
    pnSetItem(ipn,"(new tool)");
    pnSetFilename(ipn,"(new tool)");
    pnSetDirectory(ipn,"SYS:");
    ipn->pn_LaunchCode=LC_WB_NONE;
    ipn->pn_Stack=4096;
    ipn->pn_Priority=0L;
    ipn->pn_appmenu=NULL;
    AddTail( List, (struct Node *)ipn );
    GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,count,TAG_END);
    if (0==count) PropertyAble(TRUE);
    DisplayNode(ipn);
  }
  return 1;
} // NewClicked

int DelClicked( void ) {
  /* routine when gadget "Del" is clicked. */
  long count;
  long nth;

  nth=GetCurrentListView();
  if (nth>=0) {
    GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);

    count=ListLength();
    if (1==count) { // only one in list
      nth=0;
      DisplayNode(NULL);
      PropertyAble(FALSE);
    } else if (nth==count-1) { // was last in list
      nth--;
      DisplayNode((struct ProgNode *)(ipn->pn_Node.ln_Pred));
      // replicate
    } else {
      DisplayNode((struct ProgNode *)(ipn->pn_Node.ln_Succ));
      // replicate
    }

    Remove((struct Node *)ipn);
    DisposeNode(ipn);
    GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,nth,TAG_END);
  } // if nth
  return 1;
} // Del Clicked

int UpClicked( void ) {
  /* routine when gadget "Up" is clicked. */
  long nth=GetCurrentListView();
  struct Node *lpn;

  if (nth<0) return 1;
  if (0==nth) return 1;
  lpn=ipn->pn_Node.ln_Pred;

  GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
  Remove((struct Node *)ipn);
  if (List->lh_Head==lpn) { // insert at top
    AddHead(List,(struct Node *)ipn);
  } else {
    Insert(List,(struct Node *)ipn,lpn->ln_Pred);
  }
  GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,nth-1,TAG_END);
  return 1;
} // Up Clicked

int DownClicked( void ) {
  /* routine when gadget "Down" is clicked. */
  long nth=GetCurrentListView();
  long count=ListLength();
  struct ProgNode *lpn;

  if (nth<0) return 1;
  if (nth==count-1) return 1;

  lpn=(struct ProgNode *)ipn->pn_Node.ln_Succ;
  GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
  Remove((struct Node *)ipn);
  Insert(List,(struct Node *)ipn,(struct Node *)lpn);
  GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,nth+1,TAG_END);

  return 1;
} // Down Clicked


//**** Properties block

int ToolClicked( void ) {
  char *buffer;
  /* routine when gadget "_Tool" is clicked. */
  if (GetCurrentListView()>=0) {
    GT_GetGadgetAttrs(ETMPGadgets[GD_Tool],ETMPWnd,NULL,GTST_String,&buffer,TAG_END);
    pnSetFilename(ipn,buffer);
  }
  return 1;
} // Tool Clicked

int GetFileClicked( void ) {
  char f[64];
  char d[256];
  char *buffer;
  /* routine when gadget GetFile is clicked. */
  if (GetCurrentListView()>=0) {
    GT_GetGadgetAttrs(ETMPGadgets[GD_Tool],ETMPWnd,NULL,GTST_String,&buffer,TAG_END);
    strcpy(f,buffer);
    GT_GetGadgetAttrs(ETMPGadgets[GD_Drawer],ETMPWnd,NULL,GTST_String,&buffer,TAG_END);
    strcpy(d,buffer);
    if (1==Request_File("Select Tool",f,d)) {
      GT_SetGadgetAttrs(ETMPGadgets[GD_Tool],ETMPWnd,NULL,GTST_String,f,TAG_END);
      GT_SetGadgetAttrs(ETMPGadgets[GD_Drawer],ETMPWnd,NULL,GTST_String,d,TAG_END);
      pnSetFilename(ipn,f);
      pnSetDirectory(ipn,d);
    } // if Request_File
  }
  return 1;
} // GetFile Clicked

int DrawerClicked( void ) {
  char *buffer;
  /* routine when gadget "_Drawer" is clicked. */
  if (GetCurrentListView()>=0) {
    GT_GetGadgetAttrs(ETMPGadgets[GD_Drawer],ETMPWnd,NULL,GTST_String,&buffer,TAG_END);
    pnSetDirectory(ipn,buffer);
  }
  return 1;
} // Drawer Clicked

int StackClicked( void ) {
  long value;
  /* routine when gadget "_Stack" is clicked. */
  GT_GetGadgetAttrs(ETMPGadgets[GD_Stack],ETMPWnd,NULL,GTIN_Number,&value,TAG_END);
  if (value<4096) {
    Request_StackLow();
    GT_SetGadgetAttrs(ETMPGadgets[GD_Stack],ETMPWnd,NULL,GTIN_Number,4096L,TAG_END);
  } else {
    if (GetCurrentListView()>=0) {
      ipn->pn_Stack = value;
    } // get list view node
  }

  return 1;
} // Stack clicked

int GetSClicked( void ) {
  /* routine when gadget "Get" is clicked. */
  BPTR oldp,newp;
  struct DiskObject *dobj;
  char *file;
  char *drawer;
  long datum;

  if (GetCurrentListView()>=0) {
    GT_GetGadgetAttrs(ETMPGadgets[GD_Tool],ETMPWnd,NULL,GTST_String,&file,TAG_END);
    GT_GetGadgetAttrs(ETMPGadgets[GD_Drawer],ETMPWnd,NULL,GTST_String,&drawer,TAG_END);

    if (newp=Lock(drawer,SHARED_LOCK)) {
      if (oldp=CurrentDir(newp)) {
        if (dobj=GetDiskObject(file)) {
          datum=MAX(dobj->do_StackSize,4096);
          ipn->pn_Stack=datum;
          GT_SetGadgetAttrs(ETMPGadgets[GD_Stack],ETMPWnd,NULL,GTIN_Number,datum,TAG_END);
          FreeDiskObject(dobj);
        } else {
          Request_FileTrouble("reading file",file);
        } // if GetDiskObject
        CurrentDir(oldp);
      } else {
        // cannot CD to directory
      } // if CurrentDir
      UnLock(newp);
    } else {
      Request_FileTrouble("accessing drawer",drawer);
      // cannot lock directory
    } // if lock
  }
  return 1;
} // GetS clicked

int PriClicked( void ) {
  long value;
  /* routine when gadget "_Pri" is clicked. */
  GT_GetGadgetAttrs(ETMPGadgets[GD_Pri],ETMPWnd,NULL,GTIN_Number,&value,TAG_END);
  if ((value<-128) || (value>127) ) {
    Request_PriRange();
    GT_SetGadgetAttrs(ETMPGadgets[GD_Pri],ETMPWnd,NULL,GTIN_Number,0L,TAG_END);
  } else {
    if (GetCurrentListView()>=0) {
      ipn->pn_Priority = value;
    } // get list view node
  }
  return 1;
} // Pri clicked

int GetPClicked( void ) {
  /* routine when gadget "Get" is clicked. */
  char **toolArray;
  char *value;
  BPTR oldp,newp;
  struct DiskObject *dobj;
  char *file;
  char *drawer;
  long datum=0;

  if (GetCurrentListView()>=0) {
    GT_GetGadgetAttrs(ETMPGadgets[GD_Tool],ETMPWnd,NULL,GTST_String,&file,TAG_END);
    GT_GetGadgetAttrs(ETMPGadgets[GD_Drawer],ETMPWnd,NULL,GTST_String,&drawer,TAG_END);

    if (newp=Lock(drawer,SHARED_LOCK)) {
      if (oldp=CurrentDir(newp)) {
        if (dobj=GetDiskObject(file)) {
          toolArray=dobj->do_ToolTypes;
          if (value=FindToolType(toolArray,"TOOLPRI")) {
            StrToLong(value,&datum);
          } // if find tool type
          FreeDiskObject(dobj);
        } else {
          Request_FileTrouble("reading file",file);
        } // if GetDiskObject
        CurrentDir(oldp);
      } else {
        // cannot CD to directory
      } // if CurrentDir
      UnLock(newp);

      if ( (datum<-128) || (datum>127) ) {
        Request_PriRange();
        GT_SetGadgetAttrs(ETMPGadgets[GD_Pri],ETMPWnd,NULL,GTIN_Number,ipn->pn_Priority,TAG_END);
      } else {
        GT_SetGadgetAttrs(ETMPGadgets[GD_Pri],ETMPWnd,NULL,GTIN_Number,datum,TAG_END);
        ipn->pn_Priority=datum;
      }

    } else {
      Request_FileTrouble("accessing drawer",drawer);
      // cannot lock directory
    } // if lock
  }
  return 1;
} // GetP clicked

int EnvClicked( void ) {
  /* routine when gadget "_Env" is clicked. */
  if (GetCurrentListView()>=0) {
    ipn->pn_LaunchCode = ((ipn->pn_LaunchCode & LC_ARG_MASK) | ((1+ETMPMsg.Code & LC_ARG_MASK)<<4));
  }
  return 1;
} // EnvClicked

int ArgsClicked( void ) {
  /* routine when gadget "Ar_gs" is clicked. */
  if (GetCurrentListView()>=0) {
    ipn->pn_LaunchCode = ((ipn->pn_LaunchCode & LC_ENV_MASK) | (ETMPMsg.Code & LC_ARG_MASK));
  }
  return 1;
} // Args Clicked


//**** Exit block

int SaveClicked( void ) {
  /* routine when gadget "Save" is clicked. */
  if (1==WriteFile(ToolsFileName)) {
    SignalCX();
    if (1==WriteFile(ToolsArcName)) {
      return 0;
    } else {
      Request_FileTrouble("saveing file",ToolsArcName);
    }
  } else {
      Request_FileTrouble("saveing file",ToolsFileName);
  }
} // Save Clicked

int UseClicked( void ) {
  /* routine when gadget "Use" is clicked. */
  if (1==WriteFile(ToolsFileName)) {
    SignalCX();
    return 0;
  } else {
    Request_FileTrouble("saveing file",ToolsFileName);
    return 1;
  }
} // Use Clicked

int CancelClicked( void ) {
  /* routine when gadget "Cancel" is clicked. */
  return 0;
} // Cancel clicked


//**** Menus

int ETMPMENP_OPEN( void ) {
  /* routine when (sub)item "Open..." is selected. */
  char d[321];
  char f[65];
  char *v;

  // Deconstruct path
  strcpy(d,ToolsFileName);
  strcpy(f,FilePart(d));
  v=PathPart(d);
  *v=0;

  // do requester
  if (1==Request_File("Load Tools File",f,d)) {
    AddPart( d, f, 321L );
    LoadWRTGUI(d);
  } // if request file
  return 1;
} // Menu Open

int ETMPMENP_SAVE( void ) {
  /* routine when (sub)item "Save As..." is selected. */
  char d[321];
  char f[65];
  char *v;

  // Deconstruct path
  strcpy(d,ToolsFileName);
  strcpy(f,FilePart(d));
  v=PathPart(d);
  *v=0;

  // do requester
  if (1==Request_File("Save Tools File As",f,d)) {
    AddPart( d, f, 321L );
    if (0==WriteFile(d)) Request_FileTrouble("saveing file",d);
  }
  return 1;
} // Menu Save As

int ETMPMENP_ABOUT( void ) {
  /* routine when (sub)item "About" is selected. */
  Request_About();
  return 1;
} // Menu About

int ETMPMENP_QUIT( void ) {
  /* routine when (sub)item "Quit" is selected. */
  return 0;
} // Menu Quit

int ETMPMENE_DEF( void ) {
  /* routine when (sub)item "Reset To Defaults" is selected. */
  GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
  PropertyAble(FALSE);
  DisplayNode(NULL);
  FreeList(0);
  GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,0L,TAG_END);
  return 1;
} // Reset to Defaults

int ETMPMENE_LAST( void ) {
  /* routine when (sub)item "Last Saved" is selected. */
  LoadWRTGUI(ToolsArcName);
  return 1;
} // Menu Last Saved

int ETMPMENE_REST( void ) {
  /* routine when (sub)item "Restore" is selected. */
  LoadWRTGUI(ToolsFileName);
  return 1;
} // ETMPMENE_REST

int ETMPMENS_ICON( void ) {
  /* routine when (sub)item "Create Icons?" is selected. */
  return 1;
} // ETMPMENS_ICON


//**** System Gadgets

int ETMPCloseWindow( void ) {
  /* routine for "IDCMP_CLOSEWINDOW". */
//  CX_Hide();
  return 0;
} // ETMPCloseWindow

//**** Internal Aux Functions

void LoadWRTGUI(char *fname) {
  beginWait(ETMPWnd);
  GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
  ReadFile(fname);
  if (0==ListLength()) { // no entries
    PropertyAble(FALSE);
    DisplayNode(NULL);
  } else {
    PropertyAble(TRUE);
    DisplayNode((struct ProgNode *)List->lh_Head);
  }

  GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,0L,TAG_END);
  endWait(ETMPWnd);
} // LoadWRTGUI

void SignalCX(void) {
  struct Task *t;
  if (t=FindTask("EasyTM")) {
    Signal(t,SIGBREAKF_CTRL_D);
  } // if
} // SignalCX

//**** End of file
