home *** CD-ROM | disk | FTP | other *** search
/ MACD 4 / MACD4.iso / cdity / EasyTM_src.lha / EasyTM-src / idcmp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-27  |  12.6 KB  |  491 lines

  1. //**************************
  2. //
  3. // Name : IDCMP.c
  4. //
  5. //**************************
  6.  
  7. //**** Header files
  8.  
  9. //** OS Include files
  10. #include <intuition/intuition.h>
  11.  
  12. //** OS function prototypes
  13. #include <clib/dos_protos.h>
  14. #include <clib/exec_protos.h>
  15. #include <clib/intuition_protos.h>
  16. #include <clib/gadtools_protos.h>
  17. #include <clib/icon_protos.h>
  18. #include <clib/macros.h>
  19.  
  20. //** OS function inline calls
  21. #include <pragmas/dos_pragmas.h>
  22. #include <pragmas/exec_pragmas.h>
  23. #include <pragmas/intuition_pragmas.h>
  24. #include <pragmas/gadtools_pragmas.h>
  25. #include <pragmas/icon_pragmas.h>
  26.  
  27. //** ANSI C includes
  28. //#include <stdio.h>
  29. #include <string.h>
  30.  
  31. //** Application includes
  32.  
  33. #include "GadToolsBox.h"
  34. #include "GuiExtras.h"
  35. #include "Node.h"
  36. #include "read.h"
  37. #include "Write.h"
  38. #include "Prefs.h"
  39. #include "Librarian.h"
  40.  
  41. void LoadWRTGUI(char *fname);
  42. void SignalCX(void);
  43.  
  44. //**** Local Storage
  45.  
  46. static struct ProgNode *ipn;
  47.  
  48.  
  49. //**** Misc functions
  50.  
  51. static long GetCurrentListView(void) {
  52.   static long nth;
  53.   GT_GetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Selected,&nth,TAG_END);
  54.   ipn=(nth>=0)?(struct ProgNode *)FindNthNode(nth):NULL;
  55.   return nth;
  56. } // GetCurrentListView
  57.  
  58.  
  59. //**** ListView block
  60.  
  61. int MenuItemsClicked( void ) {
  62.   /* routine when gadget "_Menu Items" is clicked. */
  63.   ipn=(struct ProgNode *)FindNthNode(ETMPMsg.Code);
  64.   DisplayNode(ipn);
  65.   return 1;
  66. } // MenuItemsClicked
  67.  
  68. int ItemClicked( void ) {
  69.   char *buffer;
  70.   /* routine when gadget "" is clicked. */
  71.   if (GetCurrentListView()>=0) {
  72.     GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
  73.     GT_GetGadgetAttrs(ETMPGadgets[GD_Item],ETMPWnd,NULL,GTST_String,&buffer,TAG_END);
  74.     pnSetItem(ipn,buffer);
  75.     GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,TAG_END);
  76.   }
  77.   return 1;
  78. } // Item clicked
  79.  
  80. int NewClicked( void ) {
  81.   /* routine when gadget "New" is clicked. */
  82.   long count;
  83.  
  84.   if (ipn=NewNode()) {
  85.     count=ListLength();
  86.     GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
  87.     pnSetItem(ipn,"(new tool)");
  88.     pnSetFilename(ipn,"(new tool)");
  89.     pnSetDirectory(ipn,"SYS:");
  90.     ipn->pn_LaunchCode=LC_WB_NONE;
  91.     ipn->pn_Stack=4096;
  92.     ipn->pn_Priority=0L;
  93.     ipn->pn_appmenu=NULL;
  94.     AddTail( List, (struct Node *)ipn );
  95.     GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,count,TAG_END);
  96.     if (0==count) PropertyAble(TRUE);
  97.     DisplayNode(ipn);
  98.   }
  99.   return 1;
  100. } // NewClicked
  101.  
  102. int DelClicked( void ) {
  103.   /* routine when gadget "Del" is clicked. */
  104.   long count;
  105.   long nth;
  106.  
  107.   nth=GetCurrentListView();
  108.   if (nth>=0) {
  109.     GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
  110.  
  111.     count=ListLength();
  112.     if (1==count) { // only one in list
  113.       nth=0;
  114.       DisplayNode(NULL);
  115.       PropertyAble(FALSE);
  116.     } else if (nth==count-1) { // was last in list
  117.       nth--;
  118.       DisplayNode((struct ProgNode *)(ipn->pn_Node.ln_Pred));
  119.       // replicate
  120.     } else {
  121.       DisplayNode((struct ProgNode *)(ipn->pn_Node.ln_Succ));
  122.       // replicate
  123.     }
  124.  
  125.     Remove((struct Node *)ipn);
  126.     DisposeNode(ipn);
  127.     GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,nth,TAG_END);
  128.   } // if nth
  129.   return 1;
  130. } // Del Clicked
  131.  
  132. int UpClicked( void ) {
  133.   /* routine when gadget "Up" is clicked. */
  134.   long nth=GetCurrentListView();
  135.   struct Node *lpn;
  136.  
  137.   if (nth<0) return 1;
  138.   if (0==nth) return 1;
  139.   lpn=ipn->pn_Node.ln_Pred;
  140.  
  141.   GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
  142.   Remove((struct Node *)ipn);
  143.   if (List->lh_Head==lpn) { // insert at top
  144.     AddHead(List,(struct Node *)ipn);
  145.   } else {
  146.     Insert(List,(struct Node *)ipn,lpn->ln_Pred);
  147.   }
  148.   GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,nth-1,TAG_END);
  149.   return 1;
  150. } // Up Clicked
  151.  
  152. int DownClicked( void ) {
  153.   /* routine when gadget "Down" is clicked. */
  154.   long nth=GetCurrentListView();
  155.   long count=ListLength();
  156.   struct ProgNode *lpn;
  157.  
  158.   if (nth<0) return 1;
  159.   if (nth==count-1) return 1;
  160.  
  161.   lpn=(struct ProgNode *)ipn->pn_Node.ln_Succ;
  162.   GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
  163.   Remove((struct Node *)ipn);
  164.   Insert(List,(struct Node *)ipn,(struct Node *)lpn);
  165.   GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,nth+1,TAG_END);
  166.  
  167.   return 1;
  168. } // Down Clicked
  169.  
  170.  
  171. //**** Properties block
  172.  
  173. int ToolClicked( void ) {
  174.   char *buffer;
  175.   /* routine when gadget "_Tool" is clicked. */
  176.   if (GetCurrentListView()>=0) {
  177.     GT_GetGadgetAttrs(ETMPGadgets[GD_Tool],ETMPWnd,NULL,GTST_String,&buffer,TAG_END);
  178.     pnSetFilename(ipn,buffer);
  179.   }
  180.   return 1;
  181. } // Tool Clicked
  182.  
  183. int GetFileClicked( void ) {
  184.   char f[64];
  185.   char d[256];
  186.   char *buffer;
  187.   /* routine when gadget GetFile is clicked. */
  188.   if (GetCurrentListView()>=0) {
  189.     GT_GetGadgetAttrs(ETMPGadgets[GD_Tool],ETMPWnd,NULL,GTST_String,&buffer,TAG_END);
  190.     strcpy(f,buffer);
  191.     GT_GetGadgetAttrs(ETMPGadgets[GD_Drawer],ETMPWnd,NULL,GTST_String,&buffer,TAG_END);
  192.     strcpy(d,buffer);
  193.     if (1==Request_File("Select Tool",f,d)) {
  194.       GT_SetGadgetAttrs(ETMPGadgets[GD_Tool],ETMPWnd,NULL,GTST_String,f,TAG_END);
  195.       GT_SetGadgetAttrs(ETMPGadgets[GD_Drawer],ETMPWnd,NULL,GTST_String,d,TAG_END);
  196.       pnSetFilename(ipn,f);
  197.       pnSetDirectory(ipn,d);
  198.     } // if Request_File
  199.   }
  200.   return 1;
  201. } // GetFile Clicked
  202.  
  203. int DrawerClicked( void ) {
  204.   char *buffer;
  205.   /* routine when gadget "_Drawer" is clicked. */
  206.   if (GetCurrentListView()>=0) {
  207.     GT_GetGadgetAttrs(ETMPGadgets[GD_Drawer],ETMPWnd,NULL,GTST_String,&buffer,TAG_END);
  208.     pnSetDirectory(ipn,buffer);
  209.   }
  210.   return 1;
  211. } // Drawer Clicked
  212.  
  213. int StackClicked( void ) {
  214.   long value;
  215.   /* routine when gadget "_Stack" is clicked. */
  216.   GT_GetGadgetAttrs(ETMPGadgets[GD_Stack],ETMPWnd,NULL,GTIN_Number,&value,TAG_END);
  217.   if (value<4096) {
  218.     Request_StackLow();
  219.     GT_SetGadgetAttrs(ETMPGadgets[GD_Stack],ETMPWnd,NULL,GTIN_Number,4096L,TAG_END);
  220.   } else {
  221.     if (GetCurrentListView()>=0) {
  222.       ipn->pn_Stack = value;
  223.     } // get list view node
  224.   }
  225.  
  226.   return 1;
  227. } // Stack clicked
  228.  
  229. int GetSClicked( void ) {
  230.   /* routine when gadget "Get" is clicked. */
  231.   BPTR oldp,newp;
  232.   struct DiskObject *dobj;
  233.   char *file;
  234.   char *drawer;
  235.   long datum;
  236.  
  237.   if (GetCurrentListView()>=0) {
  238.     GT_GetGadgetAttrs(ETMPGadgets[GD_Tool],ETMPWnd,NULL,GTST_String,&file,TAG_END);
  239.     GT_GetGadgetAttrs(ETMPGadgets[GD_Drawer],ETMPWnd,NULL,GTST_String,&drawer,TAG_END);
  240.  
  241.     if (newp=Lock(drawer,SHARED_LOCK)) {
  242.       if (oldp=CurrentDir(newp)) {
  243.         if (dobj=GetDiskObject(file)) {
  244.           datum=MAX(dobj->do_StackSize,4096);
  245.           ipn->pn_Stack=datum;
  246.           GT_SetGadgetAttrs(ETMPGadgets[GD_Stack],ETMPWnd,NULL,GTIN_Number,datum,TAG_END);
  247.           FreeDiskObject(dobj);
  248.         } else {
  249.           Request_FileTrouble("reading file",file);
  250.         } // if GetDiskObject
  251.         CurrentDir(oldp);
  252.       } else {
  253.         // cannot CD to directory
  254.       } // if CurrentDir
  255.       UnLock(newp);
  256.     } else {
  257.       Request_FileTrouble("accessing drawer",drawer);
  258.       // cannot lock directory
  259.     } // if lock
  260.   }
  261.   return 1;
  262. } // GetS clicked
  263.  
  264. int PriClicked( void ) {
  265.   long value;
  266.   /* routine when gadget "_Pri" is clicked. */
  267.   GT_GetGadgetAttrs(ETMPGadgets[GD_Pri],ETMPWnd,NULL,GTIN_Number,&value,TAG_END);
  268.   if ((value<-128) || (value>127) ) {
  269.     Request_PriRange();
  270.     GT_SetGadgetAttrs(ETMPGadgets[GD_Pri],ETMPWnd,NULL,GTIN_Number,0L,TAG_END);
  271.   } else {
  272.     if (GetCurrentListView()>=0) {
  273.       ipn->pn_Priority = value;
  274.     } // get list view node
  275.   }
  276.   return 1;
  277. } // Pri clicked
  278.  
  279. int GetPClicked( void ) {
  280.   /* routine when gadget "Get" is clicked. */
  281.   char **toolArray;
  282.   char *value;
  283.   BPTR oldp,newp;
  284.   struct DiskObject *dobj;
  285.   char *file;
  286.   char *drawer;
  287.   long datum=0;
  288.  
  289.   if (GetCurrentListView()>=0) {
  290.     GT_GetGadgetAttrs(ETMPGadgets[GD_Tool],ETMPWnd,NULL,GTST_String,&file,TAG_END);
  291.     GT_GetGadgetAttrs(ETMPGadgets[GD_Drawer],ETMPWnd,NULL,GTST_String,&drawer,TAG_END);
  292.  
  293.     if (newp=Lock(drawer,SHARED_LOCK)) {
  294.       if (oldp=CurrentDir(newp)) {
  295.         if (dobj=GetDiskObject(file)) {
  296.           toolArray=dobj->do_ToolTypes;
  297.           if (value=FindToolType(toolArray,"TOOLPRI")) {
  298.             StrToLong(value,&datum);
  299.           } // if find tool type
  300.           FreeDiskObject(dobj);
  301.         } else {
  302.           Request_FileTrouble("reading file",file);
  303.         } // if GetDiskObject
  304.         CurrentDir(oldp);
  305.       } else {
  306.         // cannot CD to directory
  307.       } // if CurrentDir
  308.       UnLock(newp);
  309.  
  310.       if ( (datum<-128) || (datum>127) ) {
  311.         Request_PriRange();
  312.         GT_SetGadgetAttrs(ETMPGadgets[GD_Pri],ETMPWnd,NULL,GTIN_Number,ipn->pn_Priority,TAG_END);
  313.       } else {
  314.         GT_SetGadgetAttrs(ETMPGadgets[GD_Pri],ETMPWnd,NULL,GTIN_Number,datum,TAG_END);
  315.         ipn->pn_Priority=datum;
  316.       }
  317.  
  318.     } else {
  319.       Request_FileTrouble("accessing drawer",drawer);
  320.       // cannot lock directory
  321.     } // if lock
  322.   }
  323.   return 1;
  324. } // GetP clicked
  325.  
  326. int EnvClicked( void ) {
  327.   /* routine when gadget "_Env" is clicked. */
  328.   if (GetCurrentListView()>=0) {
  329.     ipn->pn_LaunchCode = ((ipn->pn_LaunchCode & LC_ARG_MASK) | ((1+ETMPMsg.Code & LC_ARG_MASK)<<4));
  330.   }
  331.   return 1;
  332. } // EnvClicked
  333.  
  334. int ArgsClicked( void ) {
  335.   /* routine when gadget "Ar_gs" is clicked. */
  336.   if (GetCurrentListView()>=0) {
  337.     ipn->pn_LaunchCode = ((ipn->pn_LaunchCode & LC_ENV_MASK) | (ETMPMsg.Code & LC_ARG_MASK));
  338.   }
  339.   return 1;
  340. } // Args Clicked
  341.  
  342.  
  343. //**** Exit block
  344.  
  345. int SaveClicked( void ) {
  346.   /* routine when gadget "Save" is clicked. */
  347.   if (1==WriteFile(ToolsFileName)) {
  348.     SignalCX();
  349.     if (1==WriteFile(ToolsArcName)) {
  350.       return 0;
  351.     } else {
  352.       Request_FileTrouble("saveing file",ToolsArcName);
  353.     }
  354.   } else {
  355.       Request_FileTrouble("saveing file",ToolsFileName);
  356.   }
  357. } // Save Clicked
  358.  
  359. int UseClicked( void ) {
  360.   /* routine when gadget "Use" is clicked. */
  361.   if (1==WriteFile(ToolsFileName)) {
  362.     SignalCX();
  363.     return 0;
  364.   } else {
  365.     Request_FileTrouble("saveing file",ToolsFileName);
  366.     return 1;
  367.   }
  368. } // Use Clicked
  369.  
  370. int CancelClicked( void ) {
  371.   /* routine when gadget "Cancel" is clicked. */
  372.   return 0;
  373. } // Cancel clicked
  374.  
  375.  
  376. //**** Menus
  377.  
  378. int ETMPMENP_OPEN( void ) {
  379.   /* routine when (sub)item "Open..." is selected. */
  380.   char d[321];
  381.   char f[65];
  382.   char *v;
  383.  
  384.   // Deconstruct path
  385.   strcpy(d,ToolsFileName);
  386.   strcpy(f,FilePart(d));
  387.   v=PathPart(d);
  388.   *v=0;
  389.  
  390.   // do requester
  391.   if (1==Request_File("Load Tools File",f,d)) {
  392.     AddPart( d, f, 321L );
  393.     LoadWRTGUI(d);
  394.   } // if request file
  395.   return 1;
  396. } // Menu Open
  397.  
  398. int ETMPMENP_SAVE( void ) {
  399.   /* routine when (sub)item "Save As..." is selected. */
  400.   char d[321];
  401.   char f[65];
  402.   char *v;
  403.  
  404.   // Deconstruct path
  405.   strcpy(d,ToolsFileName);
  406.   strcpy(f,FilePart(d));
  407.   v=PathPart(d);
  408.   *v=0;
  409.  
  410.   // do requester
  411.   if (1==Request_File("Save Tools File As",f,d)) {
  412.     AddPart( d, f, 321L );
  413.     if (0==WriteFile(d)) Request_FileTrouble("saveing file",d);
  414.   }
  415.   return 1;
  416. } // Menu Save As
  417.  
  418. int ETMPMENP_ABOUT( void ) {
  419.   /* routine when (sub)item "About" is selected. */
  420.   Request_About();
  421.   return 1;
  422. } // Menu About
  423.  
  424. int ETMPMENP_QUIT( void ) {
  425.   /* routine when (sub)item "Quit" is selected. */
  426.   return 0;
  427. } // Menu Quit
  428.  
  429. int ETMPMENE_DEF( void ) {
  430.   /* routine when (sub)item "Reset To Defaults" is selected. */
  431.   GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
  432.   PropertyAble(FALSE);
  433.   DisplayNode(NULL);
  434.   FreeList(0);
  435.   GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,0L,TAG_END);
  436.   return 1;
  437. } // Reset to Defaults
  438.  
  439. int ETMPMENE_LAST( void ) {
  440.   /* routine when (sub)item "Last Saved" is selected. */
  441.   LoadWRTGUI(ToolsArcName);
  442.   return 1;
  443. } // Menu Last Saved
  444.  
  445. int ETMPMENE_REST( void ) {
  446.   /* routine when (sub)item "Restore" is selected. */
  447.   LoadWRTGUI(ToolsFileName);
  448.   return 1;
  449. } // ETMPMENE_REST
  450.  
  451. int ETMPMENS_ICON( void ) {
  452.   /* routine when (sub)item "Create Icons?" is selected. */
  453.   return 1;
  454. } // ETMPMENS_ICON
  455.  
  456.  
  457. //**** System Gadgets
  458.  
  459. int ETMPCloseWindow( void ) {
  460.   /* routine for "IDCMP_CLOSEWINDOW". */
  461. //  CX_Hide();
  462.   return 0;
  463. } // ETMPCloseWindow
  464.  
  465. //**** Internal Aux Functions
  466.  
  467. void LoadWRTGUI(char *fname) {
  468.   beginWait(ETMPWnd);
  469.   GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,~0,TAG_END);
  470.   ReadFile(fname);
  471.   if (0==ListLength()) { // no entries
  472.     PropertyAble(FALSE);
  473.     DisplayNode(NULL);
  474.   } else {
  475.     PropertyAble(TRUE);
  476.     DisplayNode((struct ProgNode *)List->lh_Head);
  477.   }
  478.  
  479.   GT_SetGadgetAttrs(ETMPGadgets[GD_MenuItems],ETMPWnd,NULL,GTLV_Labels,List,GTLV_Selected,0L,TAG_END);
  480.   endWait(ETMPWnd);
  481. } // LoadWRTGUI
  482.  
  483. void SignalCX(void) {
  484.   struct Task *t;
  485.   if (t=FindTask("EasyTM")) {
  486.     Signal(t,SIGBREAKF_CTRL_D);
  487.   } // if
  488. } // SignalCX
  489.  
  490. //**** End of file
  491.