home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 3 / AACD03.BIN / AACD / Programming / Triton / Source / prefs / Triton.c next >
C/C++ Source or Header  |  1998-05-23  |  78KB  |  2,331 lines

  1. /*
  2.  *  OpenTriton -- A free release of the triton.library source code
  3.  *  Copyright (C) 1993-1998  Stefan Zeiger
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  */
  20.  
  21.  
  22. #define TRPREFS_VERSION "6.2"
  23. #define TRPREFS_RELEASE "2.0"
  24. #define TRPREFS_DATE    "23.5.98"
  25.  
  26.  
  27. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  28. //////////////////////////////////////////////////////////////////////////////////////// Include our stuff //
  29. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  30.  
  31. #define TR_THIS_IS_TRITON
  32. #define TR_PREFSONLY
  33.  
  34. #include <exec/memory.h>
  35. #include <dos/dos.h>
  36. #include <graphics/gfx.h>
  37. #include <libraries/reqtools.h>
  38. #include <libraries/asl.h>
  39. #include <libraries/triton.h>
  40. #include <proto/intuition.h>
  41. #include <proto/graphics.h>
  42. #include <proto/dos.h>
  43. #include <proto/reqtools.h>
  44. #include <proto/asl.h>
  45. #include <proto/triton.h>
  46. #include <clib/alib_protos.h>
  47. #include <clib/exec_protos.h>
  48. #include <pragmas/exec_pragmas.h>
  49.  
  50. #include <stdio.h>
  51. #include <stdlib.h>
  52. #include <string.h>
  53.  
  54. #include <time.h>
  55. #include <math.h>
  56.  
  57. #include "Triton.h"
  58. #include "/internal.h"
  59.  
  60.  
  61. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  62. //////////////////////////////////////////////////////////////////////////////////////////// Library bases //
  63. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64.  
  65. struct ReqToolsBase *ReqToolsBase;
  66. struct Library *ASLBase;
  67.  
  68.  
  69. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70. ////////////////////////////////////////////////////////////////////////////////////////// Stack extending //
  71. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  72.  
  73. long __stack=16384;
  74.  
  75.  
  76. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. /////////////////////////////////////////////////////////////////////////////////////////// Locale support //
  78. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79.  
  80. #define CATCOMP_NUMBERS
  81. #define LS(num) GetString(&li,num)
  82. #include <libraries/locale.h>
  83. #include <proto/locale.h>
  84. #include "/catalogs/tritonprefs.h"
  85. struct Library *LocaleBase;
  86. struct LocaleInfo li;
  87.  
  88.  
  89. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  90. ///////////////////////////////////////////////////////////////////////////////////////// Global variables //
  91. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92.  
  93. enum object_ids
  94. {
  95.   ID_MAIN_LIST=1, ID_MAIN_INFO_BUTTON, ID_MAIN_DELETE_BUTTON,
  96.   ID_MAIN_FRAMES_BUTTON, ID_MAIN_PENS_BUTTON, ID_MAIN_IMAGES_BUTTON, ID_MAIN_WINDOWS_BUTTON, ID_MAIN_SYSTEM_BUTTON,
  97.   ID_MAIN_SAVE_BUTTON, ID_MAIN_USE_BUTTON, ID_MAIN_TEST_BUTTON, ID_MAIN_CANCEL_BUTTON,
  98.   ID_MAIN_PROJECT_ABOUT, ID_MAIN_PROJECT_REMOVE,
  99.   ID_MAIN_EDIT_DEFAULTS, ID_MAIN_EDIT_LASTSAVED, ID_MAIN_EDIT_RESTORE, ID_MAIN_EDIT_GLOBAL,
  100.   ID_FRAMES_CYCLE_WIDTH, ID_FRAMES_CYCLE_TITLE,
  101.   ID_FRAMES_CYCLE_KIND_BUTTON, ID_FRAMES_CYCLE_RAISED_BUTTON,
  102.   ID_FRAMES_CYCLE_KIND_FRAMEBOX, ID_FRAMES_CYCLE_RAISED_FRAMEBOX,
  103.   ID_FRAMES_CYCLE_KIND_GROUPBOX, ID_FRAMES_CYCLE_RAISED_GROUPBOX,
  104.   ID_FRAMES_CYCLE_KIND_ICONDROPBOX, ID_FRAMES_CYCLE_RAISED_ICONDROPBOX,
  105.   ID_FRAMES_CYCLE_KIND_PROGRESS, ID_FRAMES_CYCLE_RAISED_PROGRESS,
  106.   ID_PENS_LIST_FROM, ID_PENS_LIST_TO, ID_PENS_CYCLE_TO,
  107.   ID_IMAGES_LIST_FROM, ID_IMAGES_LIST_TO, ID_IMAGES_CYCLE_TO, ID_IMAGES_RETURN_CHECKBOX,
  108.   ID_WINDOWS_WINDOWS_LIST,
  109.   ID_WINDOWS_INFO_BUTTON, ID_WINDOWS_SNAPSHOT_BUTTON, ID_WINDOWS_UNSNAPSHOT_BUTTON,
  110.   ID_WINDOWS_SNAPSHOTALL_BUTTON, ID_WINDOWS_UNSNAPSHOTALL_BUTTON,
  111.   ID_SYSTEM_SCREENS_LIST,
  112.   ID_SYSTEM_ADD_BUTTON, ID_SYSTEM_DELETE_BUTTON, ID_SYSTEM_EDIT_BUTTON, ID_SYSTEM_TEST_BUTTON, ID_SYSTEM_USE_BUTTON,
  113.   ID_SYSTEM_PUBSCREEN,
  114.   ID_SYSTEM_SIMPLEREFRESH_CHECKBOX,
  115.   ID_SCREEN_SCREENMODE, ID_SCREEN_SCREENMODEDISPLAY, ID_SCREEN_PUBNAME, ID_SCREEN_SCREENTITLE,
  116.   ID_SCREEN_OK_BUTTON, ID_SCREEN_CANCEL_BUTTON
  117. };
  118.  
  119. enum window_ids
  120. {
  121.   WINID_MAIN=1, WINID_FRAMES, WINID_PENS, WINID_WINDOWS, WINID_SYSTEM, WINID_SCREEN, WINID_IMAGES
  122. };
  123.  
  124.  
  125. struct AppNode
  126. {
  127.   struct Node node;
  128.   STRPTR name;
  129.   STRPTR longname;
  130.   STRPTR info;
  131.   STRPTR version;
  132.   STRPTR release;
  133.   STRPTR date;
  134.   struct TR_AppPrefs *prefs;
  135.   BOOL globalprefs;
  136. };
  137.  
  138. struct WindowNode
  139. {
  140.   struct Node node;
  141.   ULONG id;
  142.   struct TR_Dimensions dim;
  143.   BOOL hasname;
  144. };
  145.  
  146. struct FileList
  147. {
  148.   struct List list;
  149.   APTR mempool;
  150. };
  151.  
  152. struct ScreenList
  153. {
  154.   struct FileList fl;
  155.   ULONG numnodes;
  156. };
  157.  
  158.  
  159. UBYTE *versionstring="\0$VER: Triton " TRPREFS_VERSION " (" TRPREFS_DATE ") Triton Preferences Editor, © 1994-1995 by Stefan Zeiger";
  160. struct TR_App *app;
  161. struct TR_Project *maingui, *framesgui, *pensgui, *imagesgui, *windowsgui, *systemgui;
  162. struct FileList *applist, *systempenlist, *penkindlist, *penlist, *windowlist, *imagekindlist, *patternlist, *gfxpenlist;
  163. struct ScreenList *screenlist;
  164. struct AppNode *currentnode, *globalnode, *origglobalnode, *lastnode;
  165. BOOL isglobal=TRUE,backedup=FALSE;
  166.  
  167. void update_all(void);
  168.  
  169.  
  170. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  171. ////////////////////////////////////////////////////////////////////////////////////////// Project locking //
  172. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  173.  
  174. void LockAllProjects(void)
  175. {
  176.   if(maingui) TR_LockProject(maingui);
  177.   if(framesgui) TR_LockProject(framesgui);
  178.   if(windowsgui) TR_LockProject(windowsgui);
  179.   if(pensgui) TR_LockProject(pensgui);
  180.   if(imagesgui) TR_LockProject(imagesgui);
  181.   if(systemgui) TR_LockProject(systemgui);
  182. }
  183.  
  184. void UnlockAllProjects(void)
  185. {
  186.   if(maingui) TR_UnlockProject(maingui);
  187.   if(framesgui) TR_UnlockProject(framesgui);
  188.   if(windowsgui) TR_UnlockProject(windowsgui);
  189.   if(pensgui) TR_UnlockProject(pensgui);
  190.   if(imagesgui) TR_UnlockProject(imagesgui);
  191.   if(systemgui) TR_UnlockProject(systemgui);
  192. }
  193.  
  194.  
  195. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  196. /////////////////////////////////////////////////////////////////////////////////////////////// Requesters //
  197. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  198.  
  199. void About(void)
  200. {
  201.   UBYTE reqstr[600];
  202.  
  203.   LockAllProjects();
  204.   sprintf(reqstr,LS(MSG_ABOUT_REG),TRPREFS_RELEASE,TRPREFS_VERSION,TRPREFS_DATE,"OpenTriton","OpenTriton");
  205.   TR_EasyRequestTags(app,reqstr,LS(MSG_OK_GAD),TREZ_Return,0,TREZ_Title,LS(MSG_ABOUT_TITLE),TAG_END);
  206.   UnlockAllProjects();
  207. }
  208.  
  209.  
  210. void DisplayError(STRPTR str)
  211. {
  212.   if(app) TR_EasyRequestTags(app,str,LS(MSG_OK_GAD),TREZ_Title,LS(MSG_ERROR_TITLE),TAG_END);
  213.   else puts(str);
  214. }
  215.  
  216.  
  217. void AppInfo(void)
  218. {
  219.   UBYTE reqstr[600];
  220.  
  221.   LockAllProjects();
  222.   sprintf(reqstr,LS(MSG_APPINFO_REQUESTER),
  223.     currentnode->longname?currentnode->longname:"???",
  224.     currentnode->name,
  225.     currentnode->info?currentnode->info:"???",
  226.     currentnode->version?currentnode->version:"???",
  227.     currentnode->release?currentnode->release:"???",
  228.     currentnode->date?currentnode->date:"???");
  229.   TR_EasyRequestTags(app,reqstr,LS(MSG_OK_GAD),TREZ_Title,LS(MSG_APPINFO_TITLE),TAG_END);
  230.   UnlockAllProjects();
  231. }
  232.  
  233.  
  234. void WinInfo(struct WindowNode *WindowNode)
  235. {
  236.   UBYTE reqstr[600];
  237.  
  238.   LockAllProjects();
  239.   sprintf(reqstr,LS(MSG_WININFO_REQUESTER),
  240.     WindowNode->hasname?WindowNode->node.ln_Name:"???",
  241.     WindowNode->id,
  242.     WindowNode->dim.trd_Left,
  243.     WindowNode->dim.trd_Top,
  244.     WindowNode->dim.trd_Width,
  245.     WindowNode->dim.trd_Height,
  246.     WindowNode->dim.trd_Left2,
  247.     WindowNode->dim.trd_Top2,
  248.     WindowNode->dim.trd_Width2,
  249.     WindowNode->dim.trd_Height2);
  250.   TR_EasyRequestTags(app,reqstr,LS(MSG_OK_GAD),TREZ_Title,LS(MSG_WININFO_TITLE),TAG_END);
  251.   UnlockAllProjects();
  252. }
  253.  
  254.  
  255. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  256. ///////////////////////////////////////////////////////////////////////////////////// Public screen editor //
  257. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  258.  
  259. VOID SelectScreenMode(ULONG *screenmode, ULONG *screendepth)
  260. {
  261.   struct rtScreenModeRequester *rtreq;
  262.   APTR aslreq;
  263.   struct Screen *lockedscreen;
  264.  
  265.   lockedscreen=TR_LockScreen(maingui);
  266.  
  267.   if(ASLBase)
  268.   {
  269.     if(!(aslreq=AllocAslRequest(ASL_ScreenModeRequest,NULL))) { DisplayError(LS(MSG_ERROR_NOMEM)); return; }
  270.     if(AslRequestTags(aslreq,ASLSM_InitialDisplayID,*screenmode,ASLSM_InitialDisplayDepth,*screendepth,ASLSM_DoDepth,TRUE,ASLSM_Screen,lockedscreen,TAG_END))
  271.     {
  272.       *screenmode=((struct ScreenModeRequester *)(aslreq))->sm_DisplayID;
  273.       *screendepth=((struct ScreenModeRequester *)(aslreq))->sm_DisplayDepth;
  274.     }
  275.     FreeAslRequest(aslreq);
  276.   }
  277.   else if(ReqToolsBase)
  278.   {
  279.     if(!(rtreq=(struct rtScreenModeRequester *)rtAllocRequestA(RT_SCREENMODEREQ,NULL))) { DisplayError(LS(MSG_ERROR_NOMEM)); return; }
  280.     rtChangeReqAttr((APTR)rtreq,RTSC_DisplayID,*screenmode,RTSC_DisplayDepth,*screendepth,TAG_END);
  281.     if(rtScreenModeRequest(rtreq,LS(MSG_PICKSCREENMODE_TITLE),RT_Underscore,'_',RTSC_Flags,SCREQF_DEPTHGAD|SCREQF_GUIMODES,RT_Screen,lockedscreen,TAG_END))
  282.     {
  283.       *screenmode=rtreq->DisplayID;
  284.       *screendepth=rtreq->DisplayDepth;
  285.     }
  286.     rtFreeRequest((APTR)rtreq);
  287.   }
  288.   else DisplayError(LS(MSG_ERROR_NOREQTOOLSNOASLLIB));
  289.  
  290.   if(lockedscreen) TR_UnlockScreen(lockedscreen);
  291. }
  292.  
  293.  
  294. void EditScreen(struct TR_ScreenNode *ScreenNode)
  295. {
  296.   struct TR_Project *screengui;
  297.   BOOL close_me=FALSE,close_ok=FALSE;
  298.   struct TR_Message *trmsg;
  299.   ULONG screenmode=ScreenNode->screenmode, screendepth=ScreenNode->depth;
  300.   struct NameInfo nameinfo;
  301.   UBYTE smname[40];
  302.  
  303.   if(!(GetDisplayInfoData(NULL,(UBYTE *)(&nameinfo),sizeof(struct NameInfo),DTAG_NAME,screenmode))) nameinfo.Name[0]=0;
  304.   sprintf(smname,LS(MSG_SCREEN_INFOLINE),nameinfo.Name,2<<(screendepth-1));
  305.  
  306.   if(screengui=TR_OpenProjectTags(app,
  307.     WindowID(WINID_SCREEN), WindowTitle(LS(MSG_SCREEN_TITLE)), WindowPosition(TRWP_CENTERDISPLAY),
  308.     WindowFlags(TRWF_NOCLOSEGADGET|TRWF_NOESCCLOSE),
  309.     HorizGroupA,
  310.       Space,
  311.       VertGroupA,
  312.         Space,
  313.         LineArray,
  314.           BeginLine,
  315.             TextNR(LS(MSG_SCREEN_SCREENMODE_GADGET)), TRAT_ID,ID_SCREEN_SCREENMODE,
  316.             Space,
  317.             HorizGroupA,TextBox(smname,ID_SCREEN_SCREENMODEDISPLAY,40),SpaceS,GetEntryButton(ID_SCREEN_SCREENMODE),EndGroup,
  318.           EndLine,
  319.           Space,
  320.           BeginLine,
  321.             TextNR(LS(MSG_SCREEN_PUBLICNAME_GADGET)), TRAT_ID,ID_SCREEN_PUBNAME,
  322.             Space,
  323.             StringGadget(ScreenNode->pubname,ID_SCREEN_PUBNAME),TRAT_Value,31,
  324.           EndLine,
  325.           Space,
  326.           BeginLine,
  327.             TextNR(LS(MSG_SCREEN_SCREENTITLE_GADGET)), TRAT_ID,ID_SCREEN_SCREENTITLE,
  328.             Space,
  329.             StringGadget(ScreenNode->title,ID_SCREEN_SCREENTITLE),TRAT_Value,123,
  330.           EndLine,
  331.         EndArray,
  332.         Space,
  333.         Line(TROF_HORIZ),
  334.         Space,
  335.         HorizGroupS,
  336.           Button(LS(MSG_OK_GAD),ID_SCREEN_OK_BUTTON),
  337.           Space,
  338.           ButtonE(LS(MSG_CANCEL_GAD),ID_SCREEN_CANCEL_BUTTON),
  339.         EndGroup,
  340.         Space,
  341.       EndGroup,
  342.       Space,
  343.     EndGroup, EndProject))
  344.   {
  345.     LockAllProjects();
  346.     while(!close_me)
  347.     {
  348.       TR_Wait(app,NULL);
  349.       while(trmsg=TR_GetMsg(app))
  350.       {
  351.         switch(trmsg->trm_Class)
  352.         {
  353.           case TRMS_ACTION:
  354.             switch(trmsg->trm_ID)
  355.             {
  356.               case ID_SCREEN_SCREENMODE:
  357.                 TR_LockProject(screengui);
  358.                 SelectScreenMode(&screenmode,&screendepth);
  359.                 if(!(GetDisplayInfoData(NULL,(UBYTE *)(&nameinfo),sizeof(struct NameInfo),DTAG_NAME,screenmode))) nameinfo.Name[0]=0;
  360.                 sprintf(smname,LS(MSG_SCREEN_INFOLINE),nameinfo.Name,2<<(screendepth-1));
  361.                 TR_SetAttribute(screengui,ID_SCREEN_SCREENMODEDISPLAY,TRAT_Text,(ULONG)smname);
  362.                 TR_UnlockProject(screengui);
  363.                 break;
  364.               case ID_SCREEN_OK_BUTTON:
  365.                 close_me=TRUE;
  366.                 close_ok=TRUE;
  367.                 break;
  368.               case ID_SCREEN_CANCEL_BUTTON:
  369.                 close_me=TRUE;
  370.                 break;
  371.             }
  372.         }
  373.         TR_ReplyMsg(trmsg);
  374.       }
  375.     }
  376.     if(close_ok)
  377.     {
  378.       ScreenNode->screenmode=screenmode;
  379.       ScreenNode->depth=screendepth;
  380.       strcpy(ScreenNode->title,(STRPTR)TR_GetAttribute(screengui,ID_SCREEN_SCREENTITLE,NULL));
  381.       TR_SetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,NULL,(ULONG)(~0));
  382.       strcpy(ScreenNode->pubname,(STRPTR)TR_GetAttribute(screengui,ID_SCREEN_PUBNAME,NULL));
  383.       TR_SetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,NULL,(ULONG)screenlist);
  384.     }
  385.     UnlockAllProjects();
  386.     TR_CloseProject(screengui);
  387.   }
  388.   else DisplayBeep(NULL);
  389. }
  390.  
  391.  
  392. struct Screen * __regargs TR_OpenScreen(struct TR_ScreenNode *sn)
  393. {
  394.   UWORD pens[]={(UWORD)(~0)};
  395.  
  396.   return OpenScreenTags(NULL,
  397.     SA_LikeWorkbench, TRUE,
  398.     SA_Title,         sn->title,
  399.     SA_Depth,         sn->depth,
  400.     SA_Type,          CUSTOMSCREEN,
  401.     SA_DisplayID,     sn->screenmode,
  402.     //SA_PubName,       sn->pubname,
  403.     SA_AutoScroll,    TRUE,
  404.     SA_Pens,          pens,
  405.     SA_FullPalette,   TRUE,
  406.     TAG_DONE);
  407. }
  408.  
  409.  
  410. VOID __regargs TR_CloseScreen(struct TR_ScreenNode *sn)
  411. {
  412.   struct Screen *screen;
  413.  
  414.   if(screen=LockPubScreen(sn->pubname))
  415.   {
  416.     UnlockPubScreen(NULL,screen);
  417.     CloseScreen(screen);
  418.   }
  419. }
  420.  
  421.  
  422. void TestScreen(struct TR_ScreenNode *ScreenNode)
  423. {
  424.   struct TR_Project *testscreengui;
  425.   BOOL close_me=FALSE;
  426.   struct TR_Message *trmsg;
  427.   struct Screen *screen;
  428.  
  429.   if(screen=TR_OpenScreen(ScreenNode))
  430.   {
  431.     if(testscreengui=TR_OpenProjectTags(app,
  432.       WindowTitle(LS(MSG_TESTSCREEN_TITLE)),
  433.       WindowPosition(TRWP_BELOWTITLEBAR),
  434.       CustomScreen(screen),EndProject))
  435.     {
  436.       LockAllProjects();
  437.       while(!close_me)
  438.       {
  439.         TR_Wait(app,NULL);
  440.         while(trmsg=TR_GetMsg(app))
  441.         {
  442.           switch(trmsg->trm_Class)
  443.           {
  444.             case TRMS_CLOSEWINDOW:
  445.               close_me=TRUE;
  446.               break;
  447.           }
  448.           TR_ReplyMsg(trmsg);
  449.         }
  450.       }
  451.       UnlockAllProjects();
  452.       TR_CloseProject(testscreengui);
  453.     } else DisplayBeep(NULL);
  454.     CloseScreen(screen);
  455.   } else DisplayBeep(NULL);
  456. }
  457.  
  458.  
  459. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  460. ////////////////////////////////////////////////////////////////////////////////// Node and prefs handling //
  461. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  462.  
  463. BOOL EqualAppPrefs(struct TR_AppPrefs *p1, struct TR_AppPrefs *p2)
  464. {
  465.   int i;
  466.  
  467.   if(p1->frames_width!=p2->frames_width) return FALSE;
  468.   if(p1->frames_title!=p2->frames_title) return FALSE;
  469.   for(i=0;i<3;i++)
  470.   {
  471.     if(p1->pentype[i]!=p2->pentype[i]) return FALSE;
  472.     if(p1->pendata[i]!=p2->pendata[i]) return FALSE;
  473.   }
  474.   for(i=0;i<4;i++)
  475.   {
  476.     if(p1->imgtype[i]!=p2->imgtype[i]) return FALSE;
  477.     if(p1->imgdata[i]!=p2->imgdata[i]) return FALSE;
  478.     if(p1->frames_type[i-TRFT_ABSTRACT_BUTTON]!=p2->frames_type[i-TRFT_ABSTRACT_BUTTON]) return FALSE;
  479.     if(p1->frames_raised[i-TRFT_ABSTRACT_BUTTON]!=p2->frames_raised[i-TRFT_ABSTRACT_BUTTON]) return FALSE;
  480.   }
  481.   if(strcmp(p1->pubscreen,p2->pubscreen)) return FALSE;
  482.   if(p1->flags!=p2->flags) return FALSE;
  483.  
  484.   return TRUE;
  485. }
  486.  
  487.  
  488. struct TR_AppPrefs *GetEditorPrefs(void)
  489. {
  490.   struct Node *worknode,*nextnode;
  491.   struct TR_AppPrefs *prefs;
  492.  
  493.   worknode=(struct Node *)(((struct List *)applist)->lh_Head);
  494.   while(nextnode=(struct Node *)(worknode->ln_Succ))
  495.   {
  496.     if(!(strcmp(((struct AppNode *)worknode)->name,"TritonPrefs"))) goto got_one;
  497.     worknode=nextnode;
  498.   }
  499.   return NULL;
  500.  
  501.   got_one:
  502.     prefs=((struct AppNode *)worknode)->prefs;
  503.     if(EqualAppPrefs(prefs,origglobalnode->prefs)) prefs=origglobalnode->prefs;
  504.     return prefs;
  505. }
  506.  
  507.  
  508. struct Node *NodeFromNumber(struct List *list, ULONG num)
  509. {
  510.   ULONG i;
  511.   struct Node *node=list->lh_Head;
  512.  
  513.   for(i=0;i<num;i++) node=node->ln_Succ;
  514.  
  515.   return node;
  516. }
  517.  
  518.  
  519. ULONG NumberFromNode(struct List *list, struct Node *finalnode)
  520. {
  521.   ULONG num=0;
  522.   struct Node *node;
  523.  
  524.   for(node=list->lh_Head;node->ln_Succ;node=node->ln_Succ)
  525.   {
  526.     if(node==finalnode) return num;
  527.     num++;
  528.   }
  529.  
  530.   return 0;
  531. }
  532.  
  533.  
  534. BOOL LoadAppPrefs(void *pool, struct AppNode *appnode, BOOL saved)
  535. {
  536.   BPTR lock;
  537.   UBYTE totalfilename[50];
  538.   struct TR_AppPrefs *prefs;
  539.  
  540.   if(!(prefs=LibAllocPooled(pool,sizeof(struct TR_AppPrefs)))) return FALSE;
  541.   appnode->prefs=prefs;
  542.  
  543.   if(saved) sprintf(totalfilename,"envarc:Triton/%s.tri",appnode->name);
  544.   else sprintf(totalfilename,"env:Triton/%s.tri",appnode->name);
  545.   if(!(lock=Open(totalfilename,MODE_OLDFILE)))
  546.   {
  547.     appnode->globalprefs=TRUE;
  548.     if(!(lock=Open("env:Triton/__GLOBAL__.tri",MODE_OLDFILE)))
  549.     {
  550.       CopyMem((APTR)(&TR_DefaultAppPrefs),(APTR)prefs,sizeof(struct TR_AppPrefs));
  551.       strcpy(prefs->pubscreen,LS(MSG_PRDEFSCREEN_LABEL));
  552.       return TRUE;
  553.     }
  554.   }
  555.  
  556.   FRead(lock,(STRPTR)prefs,sizeof(struct TR_AppPrefs),1);
  557.  
  558.   switch(prefs->pubscreen[0])
  559.   {
  560.     case 1:
  561.       strcpy(prefs->pubscreen,LS(MSG_PRDEFSCREEN_LABEL));
  562.       break;
  563.     case 2:
  564.       strcpy(prefs->pubscreen,LS(MSG_DEFSCREEN_LABEL));
  565.       break;
  566.     case 3:
  567.       strcpy(prefs->pubscreen,LS(MSG_WBSCREEN_LABEL));
  568.       break;
  569.   }
  570.   Close(lock);
  571.  
  572.   return TRUE;
  573. }
  574.  
  575.  
  576. void FreeAppPrefs(void *pool, struct AppNode *appnode)
  577. {
  578.   if(!(appnode->prefs)) return;
  579.  
  580.   LibFreePooled(pool,appnode->prefs,sizeof(struct TR_AppPrefs));
  581.   appnode->prefs=NULL;
  582. }
  583.  
  584.  
  585. BOOL SaveAppPrefs(struct AppNode *appnode, BOOL save)
  586. {
  587.   BPTR lock;
  588.   UBYTE totalfilename[50],totalfilename2[50],command[100];
  589.   struct TR_AppPrefs newprefs,*prefs=&newprefs;
  590.   BOOL equal=FALSE;
  591.  
  592.   if(!(appnode->prefs)) return TRUE;
  593.  
  594.   CopyMem(&TR_DefaultAppPrefs,prefs,sizeof(struct TR_AppPrefs));
  595.   prefs->flags=(appnode->prefs->flags)&(~TRPF_RETURNARROW);
  596.   strcpy(prefs->pubscreen,appnode->prefs->pubscreen);
  597.   CopyMem(appnode->prefs,prefs,sizeof(struct TR_AppPrefs));
  598.   prefs->version=TR_PREFSVERSION;
  599.  
  600.   if(appnode!=globalnode)
  601.   {
  602.     if(appnode->globalprefs)
  603.     {
  604.       if(EqualAppPrefs(appnode->prefs,origglobalnode->prefs))
  605.       {
  606.         equal=TRUE;
  607.       }
  608.       else
  609.       {
  610.     sprintf(command,"c:copy env:Triton/%s.app envarc:Triton/",appnode->name);
  611.     SystemTagList(command,NULL);
  612.       }
  613.     }
  614.   }
  615.  
  616.   sprintf(totalfilename,"env:Triton/%s.tri",appnode->name);
  617.   sprintf(totalfilename2,"envarc:Triton/%s.tri",appnode->name);
  618.  
  619.   if(equal)
  620.   {
  621.     DeleteFile(totalfilename);
  622.     if(save) DeleteFile(totalfilename2);
  623.     return TRUE;
  624.   }
  625.  
  626.   if(!strcmp(prefs->pubscreen,LS(MSG_PRDEFSCREEN_LABEL))) prefs->pubscreen[0]=1;
  627.   else if(!strcmp(prefs->pubscreen,LS(MSG_DEFSCREEN_LABEL))) prefs->pubscreen[0]=2;
  628.   else if(!strcmp(prefs->pubscreen,LS(MSG_WBSCREEN_LABEL))) prefs->pubscreen[0]=3;
  629.  
  630.   if(!(lock=Open(totalfilename,MODE_NEWFILE))) return FALSE;
  631.   FWrite(lock,(STRPTR)prefs,sizeof(struct TR_AppPrefs),1);
  632.   Close(lock);
  633.  
  634.   if(save)
  635.   {
  636.     if(!(lock=Open(totalfilename2,MODE_NEWFILE))) return FALSE;
  637.     FWrite(lock,(STRPTR)prefs,sizeof(struct TR_AppPrefs),1);
  638.     Close(lock);
  639.   }
  640.  
  641.   return TRUE;
  642. }
  643.  
  644.  
  645. BOOL SaveAllAppPrefs(struct FileList *fl, BOOL save)
  646. {
  647.   struct Node *worknode,*nextnode;
  648.   BOOL retval=TRUE;
  649.  
  650.   worknode=(struct Node *)(((struct List *)fl)->lh_Head);
  651.   while(nextnode=(struct Node *)(worknode->ln_Succ))
  652.   {
  653.     if(!(SaveAppPrefs((struct AppNode *)worknode,save))) retval=FALSE;
  654.     worknode=nextnode;
  655.   }
  656.  
  657.   return retval;
  658. }
  659.  
  660.  
  661. struct AppNode *GetAppNode(void *pool, STRPTR filename)
  662. {
  663.   struct AppNode *appnode;
  664.   BPTR lock;
  665.   ULONG val;
  666.  
  667.   if(!(strstr(filename,".app"))) return NULL;
  668.  
  669.   if(!(appnode=LibAllocPooled(pool,sizeof(struct AppNode)))) return NULL;
  670.  
  671.   if(lock=Open(filename,MODE_OLDFILE))
  672.   {
  673.     // Short name
  674.     FRead(lock,(STRPTR)(&val),4,1);
  675.     if(val) if(appnode->name=LibAllocPooled(pool,val+1))
  676.     {
  677.       FRead(lock,appnode->name,val,1);
  678.       appnode->name[val]=0;
  679.     }
  680.     else goto broken;
  681.  
  682.     // Long name
  683.     FRead(lock,(STRPTR)(&val),4,1);
  684.     if(val) if(appnode->longname=LibAllocPooled(pool,val+1))
  685.     {
  686.       FRead(lock,appnode->longname,val,1);
  687.       appnode->longname[val]=0;
  688.     }
  689.     else goto broken;
  690.  
  691.     // Info
  692.     FRead(lock,(STRPTR)(&val),4,1);
  693.     if(val) if(appnode->info=LibAllocPooled(pool,val+1))
  694.     {
  695.       FRead(lock,appnode->info,val,1);
  696.       appnode->info[val]=0;
  697.     }
  698.     else goto broken;
  699.  
  700.     // Version
  701.     FRead(lock,(STRPTR)(&val),4,1);
  702.     if(val) if(appnode->version=LibAllocPooled(pool,val+1))
  703.     {
  704.       FRead(lock,appnode->version,val,1);
  705.       appnode->version[val]=0;
  706.     }
  707.     else goto broken;
  708.  
  709.     // Release
  710.     FRead(lock,(STRPTR)(&val),4,1);
  711.     if(val) if(appnode->release=LibAllocPooled(pool,val+1))
  712.     {
  713.       FRead(lock,appnode->release,val,1);
  714.       appnode->release[val]=0;
  715.     }
  716.     else goto broken;
  717.  
  718.     // Date
  719.     FRead(lock,(STRPTR)(&val),4,1);
  720.     if(val) if(appnode->date=LibAllocPooled(pool,val+1))
  721.     {
  722.       FRead(lock,appnode->date,val,1);
  723.       appnode->date[val]=0;
  724.     }
  725.     else goto broken;
  726.  
  727.     Close(lock);
  728.   }
  729.   broken:
  730.  
  731.   appnode->node.ln_Name=appnode->longname?appnode->longname:appnode->name;
  732.  
  733.   if(!(LoadAppPrefs(pool,appnode,FALSE))) return NULL;
  734.  
  735.   return appnode;
  736. }
  737.  
  738.  
  739. struct AppNode *GetGlobalNode(void *pool)
  740. {
  741.   struct AppNode *appnode;
  742.   STRPTR  longname  = LS(MSG_GLOBALNAME);
  743.  
  744.   if(!(appnode=LibAllocPooled(pool,sizeof(struct AppNode)))) return NULL;
  745.   if(!(appnode->name=LibAllocPooled(pool,11))) return NULL;
  746.   if(!(appnode->longname=LibAllocPooled(pool,strlen(longname)+1))) return NULL;
  747.  
  748.   strcpy(appnode->name,"__GLOBAL__");
  749.   strcpy(appnode->longname,longname);
  750.  
  751.   appnode->node.ln_Name=appnode->longname;
  752.  
  753.   if(!(LoadAppPrefs(pool,appnode,FALSE))) return NULL;
  754.  
  755.   lastnode=currentnode;
  756.   currentnode=appnode;
  757.   return appnode;
  758. }
  759.  
  760.  
  761. void DeleteFileList(struct FileList *fl)
  762. {
  763.   if(!fl) return;
  764.   LibDeletePool(fl->mempool);
  765. }
  766.  
  767.  
  768. struct FileList *CreateAppList(void)
  769. {
  770.   struct FileList *fl;
  771.   struct Node *node;
  772.   void *pool;
  773.   struct FileInfoBlock *fib=NULL;
  774.   BPTR lock;
  775.   BOOL ok=TRUE;
  776.   UBYTE totalfilename[50];
  777.  
  778.   if(!(pool=LibCreatePool(MEMF_CLEAR,1024,512))) return NULL;
  779.   if(!(fl=LibAllocPooled(pool,sizeof(struct FileList)))) { LibDeletePool(pool); return NULL; }
  780.   fl->mempool=pool;
  781.   NewList((struct List *)fl);
  782.  
  783.   origglobalnode=GetGlobalNode(pool);
  784.   if(node=GetGlobalNode(pool)) AddTail((struct List *)fl,node);
  785.   globalnode=(struct AppNode *)node;
  786.  
  787.   if(!(lock=Lock("env:Triton",ACCESS_READ))) { ok=FALSE; goto cleanup; }
  788.   if(!(fib=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL))) { ok=FALSE; goto cleanup; }
  789.   if(!(Examine(lock,fib))) { ok=FALSE; goto cleanup; }
  790.   while(ExNext(lock,fib))
  791.   {
  792.     sprintf(totalfilename,"env:Triton/%s",fib->fib_FileName);
  793.     if(node=GetAppNode(pool,totalfilename)) AddTail((struct List *)fl,node);
  794.   }
  795.  
  796.   cleanup:
  797.   if(fib) FreeDosObject(DOS_FIB,(void *)fib);
  798.   if(lock) UnLock(lock);
  799.   if(ok) return fl;
  800.   DeleteFileList(fl);
  801.   return NULL;
  802. }
  803.  
  804.  
  805. struct Node *GetTextNode(void *pool, STRPTR text)
  806. {
  807.   struct Node *node;
  808.  
  809.   if(!(node=LibAllocPooled(pool,sizeof(struct Node)))) return NULL;
  810.   if(!(node->ln_Name=LibAllocPooled(pool,strlen(text)+1))) return NULL;
  811.   strcpy(node->ln_Name,text);
  812.   return node;
  813. }
  814.  
  815.  
  816. struct FileList *CreateSystemPenList(void)
  817. {
  818.   struct FileList *fl;
  819.   struct Node *node;
  820.   void *pool;
  821.  
  822.   if(!(pool=LibCreatePool(MEMF_CLEAR,1024,512))) return NULL;
  823.   if(!(fl=LibAllocPooled(pool,sizeof(struct FileList)))) { LibDeletePool(pool); return NULL; }
  824.   fl->mempool=pool;
  825.   NewList((struct List *)(fl));
  826.  
  827.   if(node=GetTextNode(pool,LS(MSG_SYSTEMPEN_DETAILPEN))) AddTail((struct List *)fl,node);
  828.   if(node=GetTextNode(pool,LS(MSG_SYSTEMPEN_BLOCKPEN))) AddTail((struct List *)fl,node);
  829.   if(node=GetTextNode(pool,LS(MSG_SYSTEMPEN_TEXTPEN))) AddTail((struct List *)fl,node);
  830.   if(node=GetTextNode(pool,LS(MSG_SYSTEMPEN_SHINEPEN))) AddTail((struct List *)fl,node);
  831.   if(node=GetTextNode(pool,LS(MSG_SYSTEMPEN_SHADOWPEN))) AddTail((struct List *)fl,node);
  832.   if(node=GetTextNode(pool,LS(MSG_SYSTEMPEN_FILLPEN))) AddTail((struct List *)fl,node);
  833.   if(node=GetTextNode(pool,LS(MSG_SYSTEMPEN_FILLTEXTPEN))) AddTail((struct List *)fl,node);
  834.   if(node=GetTextNode(pool,LS(MSG_SYSTEMPEN_BACKGROUNDPEN))) AddTail((struct List *)fl,node);
  835.   if(node=GetTextNode(pool,LS(MSG_SYSTEMPEN_HIGHLIGHTTEXTPEN))) AddTail((struct List *)fl,node);
  836.  
  837.   cleanup:
  838.   return fl;
  839. }
  840.  
  841.  
  842. struct FileList *CreatePenKindList(void)
  843. {
  844.   struct FileList *fl;
  845.   struct Node *node;
  846.   void *pool;
  847.  
  848.   if(!(pool=LibCreatePool(MEMF_CLEAR,1024,512))) return NULL;
  849.   if(!(fl=LibAllocPooled(pool,sizeof(struct FileList)))) { LibDeletePool(pool); return NULL; }
  850.   fl->mempool=pool;
  851.   NewList((struct List *)(fl));
  852.  
  853.   if(node=GetTextNode(pool,LS(MSG_PENKIND_NORMUSCORE))) AddTail((struct List *)fl,node);
  854.   if(node=GetTextNode(pool,LS(MSG_PENKIND_HIGHUSCORE))) AddTail((struct List *)fl,node);
  855.   if(node=GetTextNode(pool,LS(MSG_PENKIND_HALFSHINE))) AddTail((struct List *)fl,node);
  856.   if(node=GetTextNode(pool,LS(MSG_PENKIND_HALFSHADOW))) AddTail((struct List *)fl,node);
  857.   if(node=GetTextNode(pool,LS(MSG_PENKIND_USSTRINGGADBACK))) AddTail((struct List *)fl,node);
  858.   if(node=GetTextNode(pool,LS(MSG_PENKIND_SSTRINGGADBACK))) AddTail((struct List *)fl,node);
  859.   if(node=GetTextNode(pool,LS(MSG_PENKIND_USSTRINGGADFRONT))) AddTail((struct List *)fl,node);
  860.   if(node=GetTextNode(pool,LS(MSG_PENKIND_SSTRINGGADFRONT))) AddTail((struct List *)fl,node);
  861.  
  862.   cleanup:
  863.   return fl;
  864. }
  865.  
  866.  
  867. struct FileList *CreatePenList(void)
  868. {
  869.   struct FileList *fl;
  870.   struct Node *node;
  871.   void *pool;
  872.  
  873.   if(!(pool=LibCreatePool(MEMF_CLEAR,1024,512))) return NULL;
  874.   if(!(fl=LibAllocPooled(pool,sizeof(struct FileList)))) { LibDeletePool(pool); return NULL; }
  875.   fl->mempool=pool;
  876.   NewList((struct List *)(fl));
  877.  
  878.   if(node=GetTextNode(pool,LS(MSG_COLOR_0))) AddTail((struct List *)fl,node);
  879.   if(node=GetTextNode(pool,LS(MSG_COLOR_1))) AddTail((struct List *)fl,node);
  880.   if(node=GetTextNode(pool,LS(MSG_COLOR_2))) AddTail((struct List *)fl,node);
  881.   if(node=GetTextNode(pool,LS(MSG_COLOR_3))) AddTail((struct List *)fl,node);
  882.   if(node=GetTextNode(pool,LS(MSG_COLOR_4))) AddTail((struct List *)fl,node);
  883.   if(node=GetTextNode(pool,LS(MSG_COLOR_5))) AddTail((struct List *)fl,node);
  884.   if(node=GetTextNode(pool,LS(MSG_COLOR_6))) AddTail((struct List *)fl,node);
  885.   if(node=GetTextNode(pool,LS(MSG_COLOR_7))) AddTail((struct List *)fl,node);
  886.  
  887.   cleanup:
  888.   return fl;
  889. }
  890.  
  891.  
  892. struct FileList *CreatePatternList(void)
  893. {
  894.   struct FileList *fl;
  895.   struct Node *node;
  896.   void *pool;
  897.  
  898.   if(!(pool=LibCreatePool(MEMF_CLEAR,1024,512))) return NULL;
  899.   if(!(fl=LibAllocPooled(pool,sizeof(struct FileList)))) { LibDeletePool(pool); return NULL; }
  900.   fl->mempool=pool;
  901.   NewList((struct List *)(fl));
  902.  
  903.   if(node=GetTextNode(pool,LS(MSG_PATTERN_BACKGROUND))) AddTail((struct List *)fl,node);
  904.   if(node=GetTextNode(pool,LS(MSG_PATTERN_SHINE))) AddTail((struct List *)fl,node);
  905.   if(node=GetTextNode(pool,LS(MSG_PATTERN_SHINE_SHADOW))) AddTail((struct List *)fl,node);
  906.   if(node=GetTextNode(pool,LS(MSG_PATTERN_SHINE_FILL))) AddTail((struct List *)fl,node);
  907.   if(node=GetTextNode(pool,LS(MSG_PATTERN_SHINE_BACKGROUND))) AddTail((struct List *)fl,node);
  908.   if(node=GetTextNode(pool,LS(MSG_PATTERN_SHADOW))) AddTail((struct List *)fl,node);
  909.   if(node=GetTextNode(pool,LS(MSG_PATTERN_SHADOW_FILL))) AddTail((struct List *)fl,node);
  910.   if(node=GetTextNode(pool,LS(MSG_PATTERN_SHADOW_BACKGROUND))) AddTail((struct List *)fl,node);
  911.   if(node=GetTextNode(pool,LS(MSG_PATTERN_FILL))) AddTail((struct List *)fl,node);
  912.   if(node=GetTextNode(pool,LS(MSG_PATTERN_FILL_BACKGROUND))) AddTail((struct List *)fl,node);
  913.  
  914.   cleanup:
  915.   return fl;
  916. }
  917.  
  918. struct FileList *CreateImageKindList(void)
  919. {
  920.   struct FileList *fl;
  921.   struct Node *node;
  922.   void *pool;
  923.  
  924.   if(!(pool=LibCreatePool(MEMF_CLEAR,1024,512))) return NULL;
  925.   if(!(fl=LibAllocPooled(pool,sizeof(struct FileList)))) { LibDeletePool(pool); return NULL; }
  926.   fl->mempool=pool;
  927.   NewList((struct List *)(fl));
  928.  
  929.   if(node=GetTextNode(pool,LS(MSG_IMAGE_WINBACK))) AddTail((struct List *)fl,node);
  930.   if(node=GetTextNode(pool,LS(MSG_IMAGE_REQBACK))) AddTail((struct List *)fl,node);
  931.   if(node=GetTextNode(pool,LS(MSG_IMAGE_USBUTTONBACK))) AddTail((struct List *)fl,node);
  932.   if(node=GetTextNode(pool,LS(MSG_IMAGE_SBUTTONBACK))) AddTail((struct List *)fl,node);
  933.  
  934.   cleanup:
  935.   return fl;
  936. }
  937.  
  938. void DeleteApp(struct AppNode *node)
  939. {
  940.   UBYTE commandname[200];
  941.   ULONG cnodenum;
  942.  
  943.   sprintf(commandname,"c:delete <nil: >nil: envarc:Triton/%s.#? env:Triton/%s.#?",node->name,node->name);
  944.   SystemTagList(commandname,NULL);
  945.  
  946.   TR_SetAttribute(maingui,ID_MAIN_LIST,NULL,(ULONG)(~0));
  947.   Remove((struct Node *)node);
  948.   TR_SetAttribute(maingui,ID_MAIN_LIST,NULL,(ULONG)(applist));
  949.  
  950.   cnodenum=TR_GetAttribute(maingui,ID_MAIN_LIST,TRAT_Value);
  951.   lastnode=currentnode;
  952.   currentnode=(struct AppNode *)NodeFromNumber((struct List *)applist,cnodenum);
  953.   update_all();
  954.   if(!cnodenum)
  955.   {
  956.     if(!isglobal)
  957.     {
  958.       TR_SetAttribute(maingui,ID_MAIN_DELETE_BUTTON,TRAT_Disabled,TRUE);
  959.       TR_SetAttribute(maingui,ID_MAIN_INFO_BUTTON,TRAT_Disabled,TRUE);
  960.       TR_SetAttribute(maingui,ID_MAIN_EDIT_GLOBAL,TRAT_Disabled,TRUE);
  961.     }
  962.     isglobal=TRUE;
  963.   }
  964. }
  965.  
  966.  
  967. void SetScreenListPos(ULONG pos)
  968. {
  969.   BOOL disabled=FALSE;
  970.  
  971.   TR_SetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,TRAT_Value,pos);
  972.   if(pos<3) disabled=TRUE;
  973.   TR_SetAttribute(systemgui,ID_SYSTEM_DELETE_BUTTON,TRAT_Disabled,disabled);
  974.   TR_SetAttribute(systemgui,ID_SYSTEM_EDIT_BUTTON,TRAT_Disabled,disabled);
  975.   TR_SetAttribute(systemgui,ID_SYSTEM_TEST_BUTTON,TRAT_Disabled,disabled);
  976. }
  977.  
  978.  
  979. struct Node *AddScreenNode(struct ScreenList *sl, STRPTR pubname)
  980. {
  981.   struct TR_ScreenNode *node;
  982.   void *pool=sl->fl.mempool;
  983.   struct Screen *wbscreen;
  984.  
  985.   if(!(node=(struct TR_ScreenNode *)LibAllocPooled(pool,sizeof(struct TR_ScreenNode)))) return NULL;
  986.   strcpy(node->pubname,pubname);
  987.   node->node.ln_Name=node->pubname;
  988.   AddTail((struct List *)sl,node);
  989.   node->id=++(sl->numnodes);
  990.   node->version=TR_PREFSVERSION;
  991.  
  992.   if(node->id>2)
  993.   {
  994.     if(wbscreen=LockPubScreen(NULL))
  995.     {
  996.       node->screenmode=GetVPModeID(&wbscreen->ViewPort);
  997.       if(node->screenmode==INVALID_ID) node->screenmode=167936;
  998.       node->depth=wbscreen->BitMap.Depth;
  999.       UnlockPubScreen(NULL,wbscreen);
  1000.     }
  1001.     else
  1002.     {
  1003.       node->screenmode=167936;
  1004.       node->depth=2;
  1005.     }
  1006.   }
  1007.  
  1008.   return node;
  1009. }
  1010.  
  1011.  
  1012. void DeleteScreenNode(struct ScreenList *sl, struct TR_ScreenNode *node)
  1013. {
  1014.   ULONG csnodenum;
  1015.   struct Node *realnode=(struct Node *)node;
  1016.  
  1017.   // Calculate new selected node
  1018.   csnodenum=TR_GetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,TRAT_Value);
  1019.   if(!(((struct Node *)(node))->ln_Succ->ln_Succ)) csnodenum--;
  1020.  
  1021.   // Actually remove the node
  1022.   TR_SetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,NULL,(ULONG)(~0));
  1023.   Remove(realnode);
  1024.   TR_SetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,NULL,(ULONG)(sl));
  1025.  
  1026.   // Update the listview gadget
  1027.   SetScreenListPos(csnodenum);
  1028. }
  1029.  
  1030.  
  1031. BOOL LoadScreenList(struct ScreenList *sl)
  1032. {
  1033.   BPTR lock;
  1034.   struct TR_ScreenNode *node;
  1035.  
  1036.   if(!(lock=Open("env:Triton/Screens.trc",MODE_OLDFILE))) return TRUE;
  1037.  
  1038.   if(!(FRead(lock,(STRPTR)(&(sl->numnodes)),4,1))) { Close(lock); return FALSE; }
  1039.  
  1040.   for(;;)
  1041.   {
  1042.     if(!(node=LibAllocPooled(sl->fl.mempool,sizeof(struct TR_ScreenNode)))) { Close(lock); return FALSE; }
  1043.     if(!(FRead(lock,(STRPTR)node,sizeof(struct TR_ScreenNode),1))) break;
  1044.     node->node.ln_Name=node->pubname;
  1045.     AddTail((struct List *)sl,node);
  1046.   }
  1047.  
  1048.   Close(lock);
  1049.   return TRUE;
  1050. }
  1051.  
  1052.  
  1053. BOOL SaveScreenList(struct ScreenList *sl,STRPTR filename)
  1054. {
  1055.   BPTR lock;
  1056.   struct Node *node;
  1057.  
  1058.   if(!(lock=Open(filename,MODE_NEWFILE))) return FALSE;
  1059.  
  1060.   if(!(FWrite(lock,(STRPTR)(&(sl->numnodes)),4,1))) { Close(lock); return FALSE; }
  1061.  
  1062.   for(node=sl->fl.list.lh_Head->ln_Succ->ln_Succ->ln_Succ;node->ln_Succ;node=node->ln_Succ)
  1063.   {
  1064.     FWrite(lock,(STRPTR)node,sizeof(struct TR_ScreenNode),1);
  1065.   }
  1066.  
  1067.   Close(lock);
  1068.   return TRUE;
  1069. }
  1070.  
  1071.  
  1072. struct ScreenList *CreateScreenList(void)
  1073. {
  1074.   struct ScreenList *sl;
  1075.   void *pool;
  1076.  
  1077.   if(!(pool=LibCreatePool(MEMF_CLEAR,1024,512))) return NULL;
  1078.   if(!(sl=LibAllocPooled(pool,sizeof(struct ScreenList)))) { LibDeletePool(pool); return NULL; }
  1079.   sl->fl.mempool=pool;
  1080.   NewList((struct List *)(sl));
  1081.  
  1082.   AddScreenNode(sl,LS(MSG_PRDEFSCREEN_LABEL));
  1083.   AddScreenNode(sl,LS(MSG_DEFSCREEN_LABEL));
  1084.   AddScreenNode(sl,LS(MSG_WBSCREEN_LABEL));
  1085.  
  1086.   LoadScreenList(sl);
  1087.  
  1088.   return sl;
  1089. }
  1090.  
  1091.  
  1092. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1093. ///////////////////////////////////////////////////////////////////////////// Window manager file handling //
  1094. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1095.  
  1096. struct WindowNode *GetWindowNode(void *pool, struct AppNode *app, STRPTR filename)
  1097. {
  1098.   struct WindowNode *WindowNode;
  1099.   BPTR lock;
  1100.   ULONG val;
  1101.   UBYTE name[50];
  1102.  
  1103.   sprintf(name,"%s.win.",app->name);
  1104.   if(!(strstr(filename,name))) return NULL;
  1105.  
  1106.   if(!(WindowNode=LibAllocPooled(pool,sizeof(struct WindowNode)))) return NULL;
  1107.  
  1108.   if(lock=Open(filename,MODE_OLDFILE))
  1109.   {
  1110.     FRead(lock,(STRPTR)(&(WindowNode->dim)),sizeof(struct TR_Dimensions),1);
  1111.  
  1112.     WindowNode->id=atol(&filename[strlen(app->name)+16]);
  1113.  
  1114.     FRead(lock,(STRPTR)(&val),4,1);
  1115.     if(val)
  1116.     {
  1117.       if(WindowNode->node.ln_Name=LibAllocPooled(pool,val+1))
  1118.       {
  1119.         WindowNode->hasname=TRUE;
  1120.         FRead(lock,WindowNode->node.ln_Name,val,1);
  1121.         WindowNode->node.ln_Name[val]=0;
  1122.       }
  1123.       else { WindowNode->node.ln_Name=NULL; DisplayBeep(NULL); }
  1124.     }
  1125.     else
  1126.     {
  1127.       sprintf(name,"[%ld]",WindowNode->id);
  1128.       if(WindowNode->node.ln_Name=LibAllocPooled(pool,strlen(name)+1))
  1129.       {
  1130.         CopyMem((APTR)name,(APTR)(WindowNode->node.ln_Name),strlen(name)+1);
  1131.       }
  1132.       else { WindowNode->node.ln_Name=NULL; DisplayBeep(NULL); }
  1133.     }
  1134.  
  1135.     Close(lock);
  1136.   }
  1137.  
  1138.   return WindowNode;
  1139. }
  1140.  
  1141.  
  1142. VOID SaveWindowNode(struct AppNode *app, struct WindowNode *WindowNode)
  1143. {
  1144.   BPTR lock;
  1145.   ULONG val;
  1146.   UBYTE name[50];
  1147.  
  1148.   sprintf(name,"envarc:Triton/%s.win.%ld",app->name,WindowNode->id);
  1149.  
  1150.   if(lock=Open(name,MODE_NEWFILE))
  1151.   {
  1152.     FWrite(lock,(STRPTR)(&(WindowNode->dim)),sizeof(struct TR_Dimensions),1);
  1153.     if(WindowNode->hasname)
  1154.     {
  1155.       val=strlen(WindowNode->node.ln_Name);
  1156.       FWrite(lock,(STRPTR)(&val),4,1);
  1157.       FWrite(lock,WindowNode->node.ln_Name,val,1);
  1158.     }
  1159.     else { val=NULL; FWrite(lock,(STRPTR)val,4,1); }
  1160.     Close(lock);
  1161.   }
  1162.   else DisplayBeep(NULL);
  1163. }
  1164.  
  1165.  
  1166. VOID SaveAllWindowNodes(struct AppNode *app, struct FileList *fl)
  1167. {
  1168.   struct Node *node=((struct List *)fl)->lh_Head;
  1169.   for(;node->ln_Succ;node=node->ln_Succ) SaveWindowNode(app,(struct WindowNode *)node);
  1170. }
  1171.  
  1172.  
  1173. VOID DeleteWindowNode(struct AppNode *app, struct WindowNode *WindowNode)
  1174. {
  1175.   UBYTE name[50];
  1176.  
  1177.   sprintf(name,"env:Triton/%s.win.%ld",app->name,WindowNode->id);
  1178.   DeleteFile(name);
  1179.   sprintf(name,"envarc:Triton/%s.win.%ld",app->name,WindowNode->id);
  1180.   DeleteFile(name);
  1181. }
  1182.  
  1183.  
  1184. VOID DeleteAllWindowNodes(struct AppNode *app, struct FileList *fl)
  1185. {
  1186.   struct Node *node=((struct List *)fl)->lh_Head;
  1187.   for(;node->ln_Succ;node=node->ln_Succ) DeleteWindowNode(app,(struct WindowNode *)node);
  1188. }
  1189.  
  1190.  
  1191. struct FileList *CreateWindowList(struct AppNode *app)
  1192. {
  1193.   struct FileList *fl;
  1194.   struct Node *node;
  1195.   void *pool;
  1196.   struct FileInfoBlock *fib=NULL;
  1197.   BPTR lock;
  1198.   BOOL ok=TRUE;
  1199.   UBYTE totalfilename[50];
  1200.  
  1201.   if(!(pool=LibCreatePool(MEMF_CLEAR,1024,512))) return NULL;
  1202.   if(!(fl=LibAllocPooled(pool,sizeof(struct FileList)))) { LibDeletePool(pool); return NULL; }
  1203.   fl->mempool=pool;
  1204.   NewList((struct List *)fl);
  1205.  
  1206.   if(!(lock=Lock("env:Triton",ACCESS_READ))) { ok=FALSE; goto cleanup; }
  1207.   if(!(fib=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL))) { ok=FALSE; goto cleanup; }
  1208.   if(!(Examine(lock,fib))) { ok=FALSE; goto cleanup; }
  1209.   while(ExNext(lock,fib))
  1210.   {
  1211.     sprintf(totalfilename,"env:Triton/%s",fib->fib_FileName);
  1212.     if(node=GetWindowNode(pool,app,totalfilename)) AddTail((struct List *)fl,node);
  1213.   }
  1214.  
  1215.   cleanup:
  1216.   if(fib) FreeDosObject(DOS_FIB,(void *)fib);
  1217.   if(lock) UnLock(lock);
  1218.   if(ok) return fl;
  1219.   DeleteFileList(fl);
  1220.   return NULL;
  1221. }
  1222.  
  1223.  
  1224. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1225. ////////////////////////////////////////////////////////////////////////////////////////////// Main window //
  1226. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1227.  
  1228. BOOL open_main(void)
  1229. {
  1230.   if(maingui=TR_OpenProjectTags
  1231.   (
  1232.     app,
  1233.     WindowID(WINID_MAIN), WindowTitle(LS(MSG_MAIN_TITLE)), WindowPosition(TRWP_CENTERDISPLAY),
  1234.     WindowFlags(TRWF_NOESCCLOSE),
  1235.     BeginMenu(LS(MSG_MAIN_PROJECT_MENU)),
  1236.       MenuItem(LS(MSG_MAIN_PROJECT_REMOVE),ID_MAIN_PROJECT_REMOVE),
  1237.       ItemBarlabel,
  1238.       MenuItem(LS(MSG_MAIN_PROJECT_ABOUT),ID_MAIN_PROJECT_ABOUT),
  1239.       ItemBarlabel,
  1240.       MenuItem(LS(MSG_MAIN_PROJECT_QUIT),ID_MAIN_CANCEL_BUTTON),
  1241.     BeginMenu(LS(MSG_MAIN_EDIT_MENU)),
  1242.       MenuItem(LS(MSG_MAIN_EDIT_DEFAULTS),ID_MAIN_EDIT_DEFAULTS),
  1243.       MenuItem(LS(MSG_MAIN_EDIT_LASTSAVED),ID_MAIN_EDIT_LASTSAVED),
  1244.       MenuItem(LS(MSG_MAIN_EDIT_RESTORE),ID_MAIN_EDIT_RESTORE),
  1245.       ItemBarlabel,
  1246.       MenuItemD(LS(MSG_MAIN_EDIT_GLOBAL),ID_MAIN_EDIT_GLOBAL),
  1247.     HorizGroupA,
  1248.       Space,
  1249.       VertGroupA,
  1250.         Space,
  1251.         HorizGroupA,
  1252.           VertGroupA,
  1253.             HorizGroupAC,
  1254.               Line(TROF_HORIZ),
  1255.               Space,
  1256.               TextT(LS(MSG_MAIN_APPLICATIONS_GADGET)),
  1257.               Space,
  1258.               Line(TROF_HORIZ),
  1259.             EndGroup,
  1260.             Space,
  1261.             ListSS(applist,ID_MAIN_LIST,0,0),
  1262.             HorizGroupEA,
  1263.               Button(LS(MSG_MAIN_INFO_GADGET),ID_MAIN_INFO_BUTTON),TRAT_Disabled,TRUE,
  1264.               Button(LS(MSG_MAIN_DELETE_GADGET),ID_MAIN_DELETE_BUTTON),TRAT_Disabled,TRUE,
  1265.             EndGroup,
  1266.           EndGroup,
  1267.           Space,
  1268.           Line(TROF_VERT),
  1269.           Space,
  1270.           VertGroupA|TRGR_FIXHORIZ,
  1271.             Button(LS(MSG_MAIN_FRAMES_GADGET),ID_MAIN_FRAMES_BUTTON),
  1272.             Space,
  1273.             Button(LS(MSG_MAIN_PENS_GADGET),ID_MAIN_PENS_BUTTON),
  1274.             Space,
  1275.             Button(LS(MSG_MAIN_IMAGES_GADGET),ID_MAIN_IMAGES_BUTTON),
  1276.             Space,
  1277.             Button(LS(MSG_MAIN_WINDOWS_GADGET),ID_MAIN_WINDOWS_BUTTON),
  1278.             VertGroupS, Space, EndGroup,
  1279.             Button(LS(MSG_MAIN_SYSTEM_GADGET),ID_MAIN_SYSTEM_BUTTON),
  1280.           EndGroup,
  1281.         EndGroup,
  1282.         Space,
  1283.         Line(TROF_HORIZ),
  1284.         Space,
  1285.         HorizGroupS,
  1286.           Button(LS(MSG_MAIN_SAVE_GADGET),ID_MAIN_SAVE_BUTTON),
  1287.           Space,
  1288.           Button(LS(MSG_MAIN_USE_GADGET),ID_MAIN_USE_BUTTON),
  1289.           Space,
  1290.           Button(LS(MSG_MAIN_TEST_GADGET),ID_MAIN_TEST_BUTTON),
  1291.           Space,
  1292.           ButtonE(LS(MSG_CANCEL_GAD),ID_MAIN_CANCEL_BUTTON),
  1293.         EndGroup,
  1294.         Space,
  1295.       EndGroup,
  1296.       Space,
  1297.     EndGroup,
  1298.     EndProject
  1299.   )) return TRUE; else return FALSE;
  1300. }
  1301.  
  1302.  
  1303. void close_main(void)
  1304. {
  1305.   if(maingui)
  1306.   {
  1307.     TR_CloseProject(maingui);
  1308.     maingui=NULL;
  1309.   }
  1310. }
  1311.  
  1312.  
  1313. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1314. //////////////////////////////////////////////////////////////////////////////////////////// Frames window //
  1315. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1316.  
  1317. STRPTR frames_width_entries[3];
  1318. STRPTR frames_title_entries[4];
  1319. STRPTR frames_raised_entries[3];
  1320. STRPTR frames_kind_entries[7];
  1321.  
  1322.  
  1323. BOOL open_frames(void)
  1324. {
  1325.   frames_width_entries[0]=LS(MSG_CYCLE_WIDTH_THIN);
  1326.   frames_width_entries[1]=LS(MSG_CYCLE_WIDTH_THICK);
  1327.   frames_title_entries[0]=LS(MSG_CYCLE_TITLE_NORMAL);
  1328.   frames_title_entries[1]=LS(MSG_CYCLE_TITLE_HIGHLIGHT);
  1329.   frames_title_entries[2]=LS(MSG_CYCLE_TITLE_SHADOW);
  1330.   frames_raised_entries[0]=LS(MSG_CYCLE_RAISED_RAISED);
  1331.   frames_raised_entries[1]=LS(MSG_CYCLE_RAISED_RECESSED);
  1332.   frames_kind_entries[0]=LS(MSG_CYCLE_KIND_STANDARD);
  1333.   frames_kind_entries[1]=LS(MSG_CYCLE_KIND_STRING);
  1334.   frames_kind_entries[2]=LS(MSG_CYCLE_KIND_ICONDROPBOX);
  1335.   frames_kind_entries[3]=LS(MSG_CYCLE_KIND_XENBUTTON1);
  1336.   frames_kind_entries[4]=LS(MSG_CYCLE_KIND_XENBUTTON2);
  1337.   frames_kind_entries[5]=LS(MSG_CYCLE_KIND_NEXTBUTTON);
  1338.  
  1339.   if(framesgui=TR_OpenProjectTags
  1340.   (
  1341.     app,
  1342.     WindowID(WINID_FRAMES), WindowTitle(LS(MSG_FRAMES_TITLE)), WindowPosition(TRWP_CENTERDISPLAY),
  1343.     VertGroupA,
  1344.       Space,
  1345.       LineArray,
  1346.         BeginLine,
  1347.           Space,
  1348.           TextNR(LS(MSG_FRAMES_WIDTH_GADGET)), TRAT_ID,ID_FRAMES_CYCLE_WIDTH,
  1349.           Space,
  1350.           CycleGadget(frames_width_entries,currentnode->prefs->frames_width,ID_FRAMES_CYCLE_WIDTH),
  1351.           Space,
  1352.         EndLine,
  1353.         Space,
  1354.         BeginLine,
  1355.           Space,
  1356.           TextNR(LS(MSG_FRAMES_TITLE_GADGET)), TRAT_ID,ID_FRAMES_CYCLE_TITLE,
  1357.           Space,
  1358.           CycleGadget(frames_title_entries,currentnode->prefs->frames_title,ID_FRAMES_CYCLE_TITLE),
  1359.           Space,
  1360.         EndLine,
  1361.       EndArray,
  1362.       Space,
  1363.       HorizGroupA,
  1364.         Space,
  1365.         NamedFrameBox(LS(MSG_FRAMES_FRAMETYPES_TEXT)),ObjectBackfillWin,
  1366.           LineArray,
  1367.             Space,
  1368.             BeginLine,
  1369.               Space,
  1370.               TextNR(LS(MSG_FRAMES_KIND_BUTTON_GADGET)), TRAT_ID,ID_FRAMES_CYCLE_KIND_BUTTON,
  1371.               Space,
  1372.               CycleGadget(frames_kind_entries,currentnode->prefs->frames_type[TRFT_ABSTRACT_BUTTON-TRFT_ABSTRACT_BUTTON]-1,ID_FRAMES_CYCLE_KIND_BUTTON),
  1373.               Space,
  1374.               TextN("_1"), TRAT_ID,ID_FRAMES_CYCLE_RAISED_BUTTON,
  1375.               Space,
  1376.               CycleGadget(frames_raised_entries,(currentnode->prefs->frames_raised[TRFT_ABSTRACT_BUTTON-TRFT_ABSTRACT_BUTTON])?0:1,ID_FRAMES_CYCLE_RAISED_BUTTON),
  1377.               Space,
  1378.             EndLine,
  1379.             Space,
  1380.             BeginLine,
  1381.               Space,
  1382.               TextNR(LS(MSG_FRAMES_KIND_FRAMEBOX_GADGET)), TRAT_ID,ID_FRAMES_CYCLE_KIND_FRAMEBOX,
  1383.               Space,
  1384.               CycleGadget(frames_kind_entries,currentnode->prefs->frames_type[TRFT_ABSTRACT_FRAMEBOX-TRFT_ABSTRACT_BUTTON]-1,ID_FRAMES_CYCLE_KIND_FRAMEBOX),
  1385.               Space,
  1386.               TextN("_2"), TRAT_ID,ID_FRAMES_CYCLE_RAISED_FRAMEBOX,
  1387.               Space,
  1388.               CycleGadget(frames_raised_entries,(currentnode->prefs->frames_raised[TRFT_ABSTRACT_FRAMEBOX-TRFT_ABSTRACT_BUTTON])?0:1,ID_FRAMES_CYCLE_RAISED_FRAMEBOX),
  1389.               Space,
  1390.             EndLine,
  1391.             Space,
  1392.             BeginLine,
  1393.               Space,
  1394.               TextNR(LS(MSG_FRAMES_KIND_GROUPBOX_GADGET)), TRAT_ID,ID_FRAMES_CYCLE_KIND_GROUPBOX,
  1395.               Space,
  1396.               CycleGadget(frames_kind_entries,currentnode->prefs->frames_type[TRFT_ABSTRACT_GROUPBOX-TRFT_ABSTRACT_BUTTON]-1,ID_FRAMES_CYCLE_KIND_GROUPBOX),
  1397.               Space,
  1398.               TextN("_3"), TRAT_ID,ID_FRAMES_CYCLE_RAISED_GROUPBOX,
  1399.               Space,
  1400.               CycleGadget(frames_raised_entries,(currentnode->prefs->frames_raised[TRFT_ABSTRACT_GROUPBOX-TRFT_ABSTRACT_BUTTON])?0:1,ID_FRAMES_CYCLE_RAISED_GROUPBOX),
  1401.               Space,
  1402.             EndLine,
  1403.             Space,
  1404.             BeginLine,
  1405.               Space,
  1406.               TextNR(LS(MSG_FRAMES_KIND_ICONDROPBOX_GADGET)), TRAT_ID,ID_FRAMES_CYCLE_KIND_ICONDROPBOX,
  1407.               Space,
  1408.               CycleGadget(frames_kind_entries,currentnode->prefs->frames_type[TRFT_ABSTRACT_ICONDROPBOX-TRFT_ABSTRACT_BUTTON]-1,ID_FRAMES_CYCLE_KIND_ICONDROPBOX),
  1409.               Space,
  1410.               TextN("_4"), TRAT_ID,ID_FRAMES_CYCLE_RAISED_ICONDROPBOX,
  1411.               Space,
  1412.               CycleGadget(frames_raised_entries,(currentnode->prefs->frames_raised[TRFT_ABSTRACT_ICONDROPBOX-TRFT_ABSTRACT_BUTTON])?0:1,ID_FRAMES_CYCLE_RAISED_ICONDROPBOX),
  1413.               Space,
  1414.             EndLine,
  1415.             Space,
  1416.             BeginLine,
  1417.               Space,
  1418.               TextNR(LS(MSG_FRAMES_KIND_PROGRESS_GADGET)), TRAT_ID,ID_FRAMES_CYCLE_KIND_PROGRESS,
  1419.               Space,
  1420.               CycleGadget(frames_kind_entries,currentnode->prefs->frames_type[TRFT_ABSTRACT_PROGRESS-TRFT_ABSTRACT_BUTTON]-1,ID_FRAMES_CYCLE_KIND_PROGRESS),
  1421.               Space,
  1422.               TextN("_5"), TRAT_ID,ID_FRAMES_CYCLE_RAISED_PROGRESS,
  1423.               Space,
  1424.               CycleGadget(frames_raised_entries,(currentnode->prefs->frames_raised[TRFT_ABSTRACT_PROGRESS-TRFT_ABSTRACT_BUTTON])?0:1,ID_FRAMES_CYCLE_RAISED_PROGRESS),
  1425.               Space,
  1426.             EndLine,
  1427.             Space,
  1428.           EndArray,
  1429.         Space,
  1430.       EndGroup,
  1431.       Space,
  1432.     EndGroup,
  1433.     EndProject
  1434.   )) return TRUE; else return FALSE;
  1435. }
  1436.  
  1437.  
  1438. void update_frames(void)
  1439. {
  1440.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_WIDTH,TRAT_Value,currentnode->prefs->frames_width);
  1441.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_TITLE,TRAT_Value,currentnode->prefs->frames_title);
  1442.  
  1443.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_KIND_FRAMEBOX,TRAT_Value,currentnode->prefs->frames_type[TRFT_ABSTRACT_FRAMEBOX-TRFT_ABSTRACT_BUTTON]-1);
  1444.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_RAISED_FRAMEBOX,TRAT_Value,(currentnode->prefs->frames_raised[TRFT_ABSTRACT_FRAMEBOX-TRFT_ABSTRACT_BUTTON])?0:1);
  1445.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_KIND_GROUPBOX,TRAT_Value,currentnode->prefs->frames_type[TRFT_ABSTRACT_GROUPBOX-TRFT_ABSTRACT_BUTTON]-1);
  1446.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_RAISED_GROUPBOX,TRAT_Value,(currentnode->prefs->frames_raised[TRFT_ABSTRACT_GROUPBOX-TRFT_ABSTRACT_BUTTON])?0:1);
  1447.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_KIND_BUTTON,TRAT_Value,currentnode->prefs->frames_type[TRFT_ABSTRACT_BUTTON-TRFT_ABSTRACT_BUTTON]-1);
  1448.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_RAISED_BUTTON,TRAT_Value,(currentnode->prefs->frames_raised[TRFT_ABSTRACT_BUTTON-TRFT_ABSTRACT_BUTTON])?0:1);
  1449.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_KIND_ICONDROPBOX,TRAT_Value,currentnode->prefs->frames_type[TRFT_ABSTRACT_ICONDROPBOX-TRFT_ABSTRACT_BUTTON]-1);
  1450.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_RAISED_ICONDROPBOX,TRAT_Value,(currentnode->prefs->frames_raised[TRFT_ABSTRACT_ICONDROPBOX-TRFT_ABSTRACT_BUTTON])?0:1);
  1451.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_KIND_PROGRESS,TRAT_Value,currentnode->prefs->frames_type[TRFT_ABSTRACT_PROGRESS-TRFT_ABSTRACT_BUTTON]-1);
  1452.   TR_SetAttribute(framesgui,ID_FRAMES_CYCLE_RAISED_PROGRESS,TRAT_Value,(currentnode->prefs->frames_raised[TRFT_ABSTRACT_PROGRESS-TRFT_ABSTRACT_BUTTON])?0:1);
  1453. }
  1454.  
  1455.  
  1456. void close_frames(void)
  1457. {
  1458.   if(framesgui)
  1459.   {
  1460.     TR_CloseProject(framesgui);
  1461.     framesgui=NULL;
  1462.   }
  1463. }
  1464.  
  1465.  
  1466. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1467. ////////////////////////////////////////////////////////////////////////////////////////////// Pens window //
  1468. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1469.  
  1470. STRPTR pens_to_entries[3];
  1471.  
  1472.  
  1473. BOOL open_pens(void)
  1474. {
  1475.   BOOL rightpens;
  1476.   ULONG rightnum;
  1477.  
  1478.   pens_to_entries[0]=LS(MSG_CYCLE_PENTYPE_SYSTEMPEN);
  1479.   pens_to_entries[1]=LS(MSG_CYCLE_PENTYPE_PEN);
  1480.  
  1481.   systempenlist=CreateSystemPenList();
  1482.   penkindlist=CreatePenKindList();
  1483.   penlist=CreatePenList();
  1484.  
  1485.   rightpens=(BOOL)(currentnode->prefs->pentype[0]);
  1486.   rightnum=currentnode->prefs->pendata[0];
  1487.  
  1488.   if(pensgui=TR_OpenProjectTags
  1489.   (
  1490.     app,
  1491.     WindowID(WINID_PENS), WindowTitle(LS(MSG_PENS_TITLE)), WindowPosition(TRWP_CENTERDISPLAY),
  1492.     HorizGroupEAC,
  1493.       Space,
  1494.       VertGroupAC,
  1495.         Space,
  1496.         ListSSN(penkindlist,ID_PENS_LIST_FROM,0,0),
  1497.         Space,
  1498.       EndGroup,
  1499.       Space,
  1500.       VertGroupAC,
  1501.         Space,
  1502.         HorizGroupAC, TextN(LS(MSG_PENS_TYPE_GADGET)),TRAT_ID,ID_PENS_CYCLE_TO, Space, CycleGadget(pens_to_entries,rightpens?1:0,ID_PENS_CYCLE_TO), EndGroup,
  1503.         Space,
  1504.         ListSSC(rightpens?penlist:systempenlist,ID_PENS_LIST_TO,0,rightnum),
  1505.         Space,
  1506.       EndGroup,
  1507.       Space,
  1508.     EndGroup,
  1509.     EndProject
  1510.   )) return TRUE; else return FALSE;
  1511. }
  1512.  
  1513.  
  1514. void update_pens(void)
  1515. {
  1516.   BOOL rightpens;
  1517.   UBYTE cback;
  1518.   ULONG pennum;
  1519.  
  1520.   pennum=TR_GetAttribute(pensgui,ID_PENS_LIST_FROM,TRAT_Value);
  1521.   cback=currentnode->prefs->pendata[pennum];
  1522.   rightpens=(BOOL)(currentnode->prefs->pentype[pennum]);
  1523.  
  1524.   TR_SetAttribute(pensgui,ID_PENS_CYCLE_TO,TRAT_Value,rightpens?1:0);
  1525.   TR_SetAttribute(pensgui,ID_PENS_LIST_TO,NULL,(ULONG)(rightpens?penlist:systempenlist));
  1526.   TR_SetAttribute(pensgui,ID_PENS_LIST_TO,TRAT_Value,cback);
  1527. }
  1528.  
  1529.  
  1530. void close_pens(void)
  1531. {
  1532.   if(pensgui)
  1533.   {
  1534.     TR_CloseProject(pensgui);
  1535.     if(penlist) DeleteFileList(penlist);
  1536.     if(penkindlist) DeleteFileList(penkindlist);
  1537.     if(systempenlist) DeleteFileList(systempenlist);
  1538.     pensgui=NULL;
  1539.   }
  1540. }
  1541.  
  1542.  
  1543. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1544. //////////////////////////////////////////////////////////////////////////////////////////// Images window //
  1545. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1546.  
  1547. STRPTR images_to_entries[3];
  1548.  
  1549.  
  1550. BOOL open_images(void)
  1551. {
  1552.   BOOL rightimages;
  1553.   ULONG rightnum;
  1554.  
  1555.   images_to_entries[0]=LS(MSG_CYCLE_PATTERNTYPE_BFPATTERN);
  1556.   images_to_entries[1]=LS(MSG_CYCLE_PATTERNTYPE_PEN);
  1557.  
  1558.   imagekindlist=CreateImageKindList();
  1559.   patternlist=CreatePatternList();
  1560.   gfxpenlist=CreatePenList();
  1561.  
  1562.   rightimages=(BOOL)(currentnode->prefs->imgtype[0]);
  1563.   rightnum=currentnode->prefs->imgdata[0]-2;
  1564.  
  1565.   if(imagesgui=TR_OpenProjectTags
  1566.   (
  1567.     app,
  1568.     WindowID(WINID_IMAGES), WindowTitle(LS(MSG_IMAGES_TITLE)), WindowPosition(TRWP_CENTERDISPLAY),
  1569.     VertGroupAC,
  1570.       HorizGroupEAC,
  1571.         Space,
  1572.         VertGroupAC,
  1573.           Space,
  1574.           ListSSN(imagekindlist,ID_IMAGES_LIST_FROM,0,0),
  1575.           Space,
  1576.         EndGroup,
  1577.         Space,
  1578.         VertGroupAC,
  1579.           Space,
  1580.           HorizGroupAC, TextN(LS(MSG_IMAGES_TYPE_GADGET)),TRAT_ID,ID_IMAGES_CYCLE_TO, Space, CycleGadget(images_to_entries,rightimages?1:0,ID_IMAGES_CYCLE_TO), EndGroup,
  1581.           Space,
  1582.           ListSSC(rightimages?gfxpenlist:patternlist,ID_IMAGES_LIST_TO,0,rightnum),
  1583.           Space,
  1584.         EndGroup,
  1585.         Space,
  1586.       EndGroup,
  1587.       HorizGroupA,
  1588.         Space,
  1589.         CheckBox(ID_IMAGES_RETURN_CHECKBOX),TRAT_Value, (currentnode->prefs->flags&TRPF_RETURNARROW)?TRUE:FALSE,
  1590.         Space,
  1591.         TextID(LS(MSG_IMAGES_RETURN_CHECKBOX),ID_IMAGES_RETURN_CHECKBOX),
  1592.         HorizGroupS,Space,EndGroup,
  1593.       EndGroup,
  1594.       Space,
  1595.     EndGroup,
  1596.     EndProject
  1597.   )) return TRUE; else return FALSE;
  1598. }
  1599.  
  1600.  
  1601. void update_images(void)
  1602. {
  1603.   BOOL rightimages;
  1604.   UBYTE cback;
  1605.   ULONG imagenum;
  1606.  
  1607.   imagenum=TR_GetAttribute(imagesgui,ID_IMAGES_LIST_FROM,TRAT_Value);
  1608.   cback=currentnode->prefs->imgdata[imagenum]-2;
  1609.   rightimages=(BOOL)(currentnode->prefs->imgtype[imagenum]);
  1610.  
  1611.   TR_SetAttribute(imagesgui,ID_IMAGES_CYCLE_TO,TRAT_Value,rightimages?1:0);
  1612.   TR_SetAttribute(imagesgui,ID_IMAGES_LIST_TO,NULL,(ULONG)(rightimages?gfxpenlist:patternlist));
  1613.   TR_SetAttribute(imagesgui,ID_IMAGES_LIST_TO,TRAT_Value,cback);
  1614.   TR_SetAttribute(imagesgui,ID_IMAGES_RETURN_CHECKBOX,TRAT_Value,(ULONG)((currentnode->prefs->flags&TRPF_RETURNARROW)?TRUE:FALSE));
  1615. }
  1616.  
  1617.  
  1618. void close_images(void)
  1619. {
  1620.   if(imagesgui)
  1621.   {
  1622.     TR_CloseProject(imagesgui);
  1623.     if(imagekindlist) DeleteFileList(imagekindlist);
  1624.     if(patternlist) DeleteFileList(patternlist);
  1625.     if(gfxpenlist) DeleteFileList(gfxpenlist);
  1626.     imagesgui=NULL;
  1627.   }
  1628. }
  1629.  
  1630.  
  1631. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1632. /////////////////////////////////////////////////////////////////////////////////////////// Windows window //
  1633. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1634.  
  1635. BOOL open_windows(void)
  1636. {
  1637.   BOOL WinDisabled=FALSE;
  1638.  
  1639.   LockAllProjects();
  1640.   windowlist=CreateWindowList(currentnode);
  1641.   UnlockAllProjects();
  1642.  
  1643.   if(((struct List *)(windowlist))->lh_Head->ln_Succ==NULL) WinDisabled=TRUE;
  1644.  
  1645.   if(windowsgui=TR_OpenProjectTags
  1646.   (
  1647.     app,
  1648.     WindowID(WINID_WINDOWS), WindowTitle(LS(MSG_WINDOWS_TITLE)), WindowPosition(TRWP_CENTERDISPLAY),
  1649.     HorizGroupA,
  1650.       Space,
  1651.       VertGroupA,
  1652.         Space,
  1653.         HorizGroupA,
  1654.           VertGroupA,
  1655.             HorizGroupAC,
  1656.               Line(TROF_HORIZ),
  1657.               Space,
  1658.               TextT(LS(MSG_WINDOWS_WINDOWS_GADGET)),
  1659.               Space,
  1660.               Line(TROF_HORIZ),
  1661.             EndGroup,
  1662.             Space,
  1663.             ListSS(windowlist,ID_WINDOWS_WINDOWS_LIST,0,0),
  1664.             Button(LS(MSG_WINDOWS_INFO_GADGET),ID_WINDOWS_INFO_BUTTON),TRAT_Disabled,WinDisabled,
  1665.             HorizGroupEA,
  1666.               Button(LS(MSG_WINDOWS_SNAPSHOT_GADGET),ID_WINDOWS_SNAPSHOT_BUTTON),TRAT_Disabled,WinDisabled,
  1667.               Button(LS(MSG_WINDOWS_UNSNAPSHOT_GADGET),ID_WINDOWS_UNSNAPSHOT_BUTTON),TRAT_Disabled,WinDisabled,
  1668.             EndGroup,
  1669.             HorizGroupEA,
  1670.               Button(LS(MSG_WINDOWS_SNAPSHOTALL_GADGET),ID_WINDOWS_SNAPSHOTALL_BUTTON),TRAT_Disabled,WinDisabled,
  1671.               Button(LS(MSG_WINDOWS_UNSNAPSHOTALL_GADGET),ID_WINDOWS_UNSNAPSHOTALL_BUTTON),TRAT_Disabled,WinDisabled,
  1672.             EndGroup,
  1673.           EndGroup,
  1674.           Space,
  1675.         EndGroup,
  1676.         Space,
  1677.       EndGroup,
  1678.     EndGroup,
  1679.     EndProject
  1680.   )) return TRUE; else return FALSE;
  1681. }
  1682.  
  1683.  
  1684. void update_windows(void)
  1685. {
  1686.   BOOL WinDisabled=FALSE;
  1687.  
  1688.   LockAllProjects();
  1689.  
  1690.   if(windowlist)
  1691.   {
  1692.     DeleteFileList(windowlist);
  1693.     windowlist=CreateWindowList(currentnode);
  1694.     if(((struct List *)(windowlist))->lh_Head->ln_Succ==NULL) WinDisabled=TRUE;
  1695.     TR_SetAttribute(windowsgui,ID_WINDOWS_WINDOWS_LIST,NULL,(ULONG)windowlist);
  1696.     TR_SetAttribute(windowsgui,ID_WINDOWS_INFO_BUTTON,TRAT_Disabled,WinDisabled);
  1697.     TR_SetAttribute(windowsgui,ID_WINDOWS_SNAPSHOT_BUTTON,TRAT_Disabled,WinDisabled);
  1698.     TR_SetAttribute(windowsgui,ID_WINDOWS_SNAPSHOTALL_BUTTON,TRAT_Disabled,WinDisabled);
  1699.     TR_SetAttribute(windowsgui,ID_WINDOWS_UNSNAPSHOT_BUTTON,TRAT_Disabled,WinDisabled);
  1700.     TR_SetAttribute(windowsgui,ID_WINDOWS_UNSNAPSHOTALL_BUTTON,TRAT_Disabled,WinDisabled);
  1701.   }
  1702.  
  1703.   UnlockAllProjects();
  1704. }
  1705.  
  1706.  
  1707. void close_windows(void)
  1708. {
  1709.   if(windowsgui)
  1710.   {
  1711.     TR_CloseProject(windowsgui);
  1712.     windowsgui=NULL;
  1713.     if(windowlist) DeleteFileList(windowlist);
  1714.     windowlist=NULL;
  1715.   }
  1716. }
  1717.  
  1718.  
  1719. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1720. //////////////////////////////////////////////////////////////////////////////////////////// System window //
  1721. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1722.  
  1723. BOOL open_system(void)
  1724. {
  1725.   if(systemgui=TR_OpenProjectTags
  1726.   (
  1727.     app,
  1728.     WindowID(WINID_SYSTEM), WindowTitle(LS(MSG_SYSTEM_TITLE)), WindowPosition(TRWP_CENTERDISPLAY),
  1729.     HorizGroupA,
  1730.       Space,
  1731.       VertGroupA,
  1732.         Space,
  1733.         NamedSeparatorN(LS(MSG_SYSTEM_PUBSCREENS_GADGET)),
  1734.         Space,
  1735.         StringGadget(currentnode->prefs->pubscreen,ID_SYSTEM_PUBSCREEN),TRAT_Value,31,
  1736.         Space,
  1737.         ListSS(screenlist,ID_SYSTEM_SCREENS_LIST,0,0),
  1738.         HorizGroupEA,
  1739.           Button(LS(MSG_SYSTEM_ADD_GADGET),ID_SYSTEM_ADD_BUTTON),
  1740.           Button(LS(MSG_SYSTEM_DELETE_GADGET),ID_SYSTEM_DELETE_BUTTON),TRAT_Disabled,TRUE,
  1741.           Button(LS(MSG_SYSTEM_EDIT_GADGET),ID_SYSTEM_EDIT_BUTTON),TRAT_Disabled,TRUE,
  1742.         EndGroup,
  1743.         HorizGroupEA,
  1744.           Button(LS(MSG_SYSTEM_TEST_GADGET),ID_SYSTEM_TEST_BUTTON),TRAT_Disabled,TRUE,
  1745.           Button(LS(MSG_SYSTEM_USE_GADGET),ID_SYSTEM_USE_BUTTON),
  1746.         EndGroup,
  1747.         Space,
  1748.         NamedSeparatorN(LS(MSG_SYSTEM_MISC_LABEL)),
  1749.         Space,
  1750.         HorizGroupA,
  1751.           CheckBox(ID_SYSTEM_SIMPLEREFRESH_CHECKBOX),TRAT_Value, (currentnode->prefs->flags&TRPF_SIMPLEREFRESH)?TRUE:FALSE,
  1752.           Space,
  1753.           TextID(LS(MSG_SYSTEM_SIMPLEREFRESH_CHECKBOX),ID_SYSTEM_SIMPLEREFRESH_CHECKBOX),
  1754.           HorizGroupS,Space,EndGroup,
  1755.         EndGroup,
  1756.         Space,
  1757.       EndGroup,
  1758.       Space,
  1759.     EndGroup,
  1760.     EndProject
  1761.   )) return TRUE; else return FALSE;
  1762. }
  1763.  
  1764.  
  1765. void update_system(void)
  1766. {
  1767.   strcpy(lastnode->prefs->pubscreen,(STRPTR)(TR_GetAttribute(systemgui,ID_SYSTEM_PUBSCREEN,NULL)));
  1768.   TR_SetAttribute(systemgui,ID_SYSTEM_PUBSCREEN,NULL,(ULONG)(currentnode->prefs->pubscreen));
  1769.   TR_SetAttribute(systemgui,ID_SYSTEM_SIMPLEREFRESH_CHECKBOX,TRAT_Value,(ULONG)((currentnode->prefs->flags&TRPF_SIMPLEREFRESH)?TRUE:FALSE));
  1770. }
  1771.  
  1772.  
  1773. void close_system(void)
  1774. {
  1775.   if(systemgui)
  1776.   {
  1777.     strcpy(currentnode->prefs->pubscreen,(STRPTR)(TR_GetAttribute(systemgui,ID_SYSTEM_PUBSCREEN,NULL)));
  1778.     TR_CloseProject(systemgui);
  1779.     systemgui=NULL;
  1780.   }
  1781. }
  1782.  
  1783.  
  1784. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1785. /////////////////////////////////////////////////////////////////////////////////// Volatile data handling //
  1786. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1787.  
  1788. void BackupVolatile(void)
  1789. {
  1790.   LockAllProjects();
  1791.   SystemTagList("c:copy env:Triton/Screens.trc env:Triton/Screens.trc.bak",NULL);
  1792.   UnlockAllProjects();
  1793. }
  1794.  
  1795.  
  1796. void RemoveVolatile(void)
  1797. {
  1798.   LockAllProjects();
  1799.   DeleteFile("env:Triton/Screens.trc.bak");
  1800.   UnlockAllProjects();
  1801. }
  1802.  
  1803.  
  1804. void RestoreVolatile(void)
  1805. {
  1806.   LockAllProjects();
  1807.   SystemTagList("c:copy env:Triton/Screens.trc.bak env:Triton/Screens.trc",NULL);
  1808.   RemoveVolatile();
  1809.   UnlockAllProjects();
  1810. }
  1811.  
  1812.  
  1813. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1814. //////////////////////////////////////////////////////////////////////////////////////////////// Main loop //
  1815. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1816.  
  1817. void SaveAndQuit(void)
  1818. {
  1819.   close_system();
  1820.   LockAllProjects();
  1821.   SaveAllAppPrefs(applist,TRUE);
  1822.   SaveScreenList(screenlist,"env:Triton/Screens.trc");
  1823.   SaveScreenList(screenlist,"envarc:Triton/Screens.trc");
  1824.   UnlockAllProjects();
  1825. }
  1826.  
  1827.  
  1828. void UseAndQuit(void)
  1829. {
  1830.   close_system();
  1831.   LockAllProjects();
  1832.   SaveAllAppPrefs(applist,FALSE);
  1833.   SaveScreenList(screenlist,"env:Triton/Screens.trc");
  1834.   UnlockAllProjects();
  1835. }
  1836.  
  1837.  
  1838. BOOL mainloop(void)
  1839. {
  1840.   BOOL close_me=FALSE,reopen=FALSE;
  1841.   struct TR_Message *trmsg;
  1842.   UBYTE reqstr[600];
  1843.   ULONG newnum;
  1844.  
  1845.   while(!close_me)
  1846.   {
  1847.     TR_Wait(app,NULL);
  1848.     while(trmsg=TR_GetMsg(app))
  1849.     {
  1850.       switch(trmsg->trm_Class)
  1851.       {
  1852.         case TRMS_CLOSEWINDOW:
  1853.           if(trmsg->trm_Project==framesgui) close_frames();
  1854.           else if(trmsg->trm_Project==pensgui) close_pens();
  1855.           else if(trmsg->trm_Project==imagesgui) close_images();
  1856.           else if(trmsg->trm_Project==systemgui) close_system();
  1857.           else if(trmsg->trm_Project==windowsgui) close_windows();
  1858.           else
  1859.           {
  1860.             if(backedup) RestoreVolatile();
  1861.             close_me=TRUE;
  1862.           }
  1863.           break;
  1864.  
  1865.         case TRMS_ERROR:
  1866.           puts(TR_GetErrorString(trmsg->trm_Data));
  1867.           break;
  1868.  
  1869.         case TRMS_ACTION:
  1870.           switch(trmsg->trm_ID)
  1871.           {
  1872.             case ID_MAIN_PROJECT_ABOUT:
  1873.               About();
  1874.               break;
  1875.  
  1876.             case ID_MAIN_PROJECT_REMOVE:
  1877.               LockAllProjects();
  1878.               if(TR_EasyRequestTags(app,LS(MSG_REMOVE_REQUESTER),
  1879.                 LS(MSG_REMOVEIT_ABORT_GAD),TREZ_Return,0,TAG_END))
  1880.               {
  1881.                 SystemTagList("c:delete <nil: >nil: envarc:triton env:triton all",NULL);
  1882.                 close_me=TRUE;
  1883.               }
  1884.               UnlockAllProjects();
  1885.               break;
  1886.  
  1887.             case ID_MAIN_EDIT_DEFAULTS:
  1888.               CopyMem((void *)(&TR_DefaultAppPrefs),(void *)(currentnode->prefs),sizeof(struct TR_AppPrefs));
  1889.               update_all();
  1890.               break;
  1891.  
  1892.             case ID_MAIN_EDIT_LASTSAVED:
  1893.               FreeAppPrefs(applist->mempool,currentnode);
  1894.               if(LoadAppPrefs(applist->mempool,currentnode,TRUE)) update_all();
  1895.               else
  1896.               {
  1897.                 DisplayError(LS(MSG_ERROR_LOADSETTINGS));
  1898.                 close_me=TRUE;
  1899.               }
  1900.               break;
  1901.  
  1902.             case ID_MAIN_EDIT_RESTORE:
  1903.               FreeAppPrefs(applist->mempool,currentnode);
  1904.               if(LoadAppPrefs(applist->mempool,currentnode,FALSE)) update_all();
  1905.               else
  1906.               {
  1907.                 DisplayError(LS(MSG_ERROR_LOADSETTINGS));
  1908.                 close_me=TRUE;
  1909.               }
  1910.               break;
  1911.  
  1912.             case ID_MAIN_EDIT_GLOBAL:
  1913.               currentnode->globalprefs=TRUE;
  1914.               CopyMem((void *)(globalnode->prefs),(void *)(currentnode->prefs),sizeof(struct TR_AppPrefs));
  1915.               update_all();
  1916.               break;
  1917.  
  1918.             case ID_MAIN_INFO_BUTTON:
  1919.               AppInfo();
  1920.               break;
  1921.  
  1922.             case ID_MAIN_DELETE_BUTTON:
  1923.               LockAllProjects();
  1924.               sprintf(reqstr,LS(MSG_DELETEAPP_REQUESTER),
  1925.                 currentnode->longname?currentnode->longname:"???",
  1926.                 currentnode->name);
  1927.               if(TR_EasyRequestTags(app,reqstr,LS(MSG_YES_NO_GAD),TAG_END)) DeleteApp(currentnode);
  1928.               UnlockAllProjects();
  1929.               break;
  1930.  
  1931.             case ID_MAIN_SAVE_BUTTON:
  1932.               if(backedup) RemoveVolatile();
  1933.               SaveAndQuit();
  1934.               close_me=TRUE;
  1935.               break;
  1936.  
  1937.             case ID_MAIN_USE_BUTTON:
  1938.               if(backedup) RemoveVolatile();
  1939.               UseAndQuit();
  1940.               close_me=TRUE;
  1941.               break;
  1942.  
  1943.             case ID_MAIN_TEST_BUTTON:
  1944.               if(!backedup) { BackupVolatile(); backedup=TRUE; }
  1945.               reopen=TRUE;
  1946.               close_me=TRUE;
  1947.               break;
  1948.  
  1949.             case ID_MAIN_CANCEL_BUTTON:
  1950.               if(backedup) RestoreVolatile();
  1951.               close_me=TRUE;
  1952.               break;
  1953.  
  1954.             case ID_MAIN_FRAMES_BUTTON:
  1955.               if(framesgui) close_frames(); else open_frames();
  1956.               break;
  1957.  
  1958.             case ID_MAIN_PENS_BUTTON:
  1959.               if(pensgui) close_pens(); else open_pens();
  1960.               break;
  1961.  
  1962.             case ID_MAIN_IMAGES_BUTTON:
  1963.               if(imagesgui) close_images(); else open_images();
  1964.               break;
  1965.  
  1966.             case ID_MAIN_WINDOWS_BUTTON:
  1967.               if(windowsgui) close_windows(); else open_windows();
  1968.               break;
  1969.  
  1970.             case ID_MAIN_SYSTEM_BUTTON:
  1971.               if(systemgui) close_system(); else open_system();
  1972.               break;
  1973.  
  1974.             case ID_WINDOWS_SNAPSHOT_BUTTON:
  1975.               SaveWindowNode(currentnode,(struct WindowNode *)NodeFromNumber((struct List *)windowlist,TR_GetAttribute(windowsgui,ID_WINDOWS_WINDOWS_LIST,TRAT_Value)));
  1976.               break;
  1977.  
  1978.             case ID_WINDOWS_INFO_BUTTON:
  1979.               WinInfo((struct WindowNode *)NodeFromNumber((struct List *)windowlist,TR_GetAttribute(windowsgui,ID_WINDOWS_WINDOWS_LIST,TRAT_Value)));
  1980.               break;
  1981.  
  1982.             case ID_WINDOWS_UNSNAPSHOT_BUTTON:
  1983.               DeleteWindowNode(currentnode,(struct WindowNode *)NodeFromNumber((struct List *)windowlist,TR_GetAttribute(windowsgui,ID_WINDOWS_WINDOWS_LIST,TRAT_Value)));
  1984.               break;
  1985.  
  1986.             case ID_WINDOWS_SNAPSHOTALL_BUTTON:
  1987.               SaveAllWindowNodes(currentnode,windowlist);
  1988.               break;
  1989.  
  1990.             case ID_WINDOWS_UNSNAPSHOTALL_BUTTON:
  1991.               DeleteAllWindowNodes(currentnode,windowlist);
  1992.               break;
  1993.  
  1994.             case ID_SYSTEM_ADD_BUTTON:
  1995.               TR_SetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,NULL,(ULONG)(~0));
  1996.               newnum=NumberFromNode(screenlist,AddScreenNode(screenlist,LS(MSG_UNNAMEDSCREEN_LABEL)));
  1997.               TR_SetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,NULL,(ULONG)screenlist);
  1998.               SetScreenListPos(newnum);
  1999.               break;
  2000.  
  2001.             case ID_SYSTEM_DELETE_BUTTON:
  2002.               DeleteScreenNode(screenlist,(struct TR_ScreenNode *)NodeFromNumber(screenlist,TR_GetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,TRAT_Value)));
  2003.               break;
  2004.  
  2005.             case ID_SYSTEM_EDIT_BUTTON:
  2006.               EditScreen((struct TR_ScreenNode *)NodeFromNumber(screenlist,TR_GetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,TRAT_Value)));
  2007.               break;
  2008.  
  2009.             case ID_SYSTEM_TEST_BUTTON:
  2010.               TestScreen((struct TR_ScreenNode *)NodeFromNumber(screenlist,TR_GetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,TRAT_Value)));
  2011.               break;
  2012.  
  2013.             case ID_SYSTEM_USE_BUTTON:
  2014.               strcpy(currentnode->prefs->pubscreen,((struct TR_ScreenNode *)(NodeFromNumber(screenlist,TR_GetAttribute(systemgui,ID_SYSTEM_SCREENS_LIST,TRAT_Value))))->pubname);
  2015.               TR_SetAttribute(systemgui,ID_SYSTEM_PUBSCREEN,NULL,(ULONG)(currentnode->prefs->pubscreen));
  2016.               break;
  2017.           }
  2018.           break;
  2019.  
  2020.         case TRMS_NEWVALUE:
  2021.           switch(trmsg->trm_ID)
  2022.           {
  2023.             case ID_MAIN_LIST:
  2024.               lastnode=currentnode;
  2025.               currentnode=(struct AppNode *)NodeFromNumber((struct List *)applist,trmsg->trm_Data);
  2026.               update_all();
  2027.               if(trmsg->trm_Data)
  2028.               {
  2029.                 if(isglobal)
  2030.                 {
  2031.                   TR_SetAttribute(maingui,ID_MAIN_DELETE_BUTTON,TRAT_Disabled,FALSE);
  2032.                   TR_SetAttribute(maingui,ID_MAIN_INFO_BUTTON,TRAT_Disabled,FALSE);
  2033.                   TR_SetAttribute(maingui,ID_MAIN_EDIT_GLOBAL,TRAT_Disabled,TRUE);
  2034.                   isglobal=FALSE;
  2035.                 }
  2036.               }
  2037.               else
  2038.               {
  2039.                 if(!isglobal)
  2040.                 {
  2041.                   TR_SetAttribute(maingui,ID_MAIN_DELETE_BUTTON,TRAT_Disabled,TRUE);
  2042.                   TR_SetAttribute(maingui,ID_MAIN_INFO_BUTTON,TRAT_Disabled,TRUE);
  2043.                   TR_SetAttribute(maingui,ID_MAIN_EDIT_GLOBAL,TRAT_Disabled,FALSE);
  2044.                   isglobal=TRUE;
  2045.                 }
  2046.               }
  2047.               if(!isglobal) if(trmsg->trm_Qualifier&IEQUALIFIER_REPEAT) AppInfo();
  2048.               break;
  2049.  
  2050.             case ID_FRAMES_CYCLE_WIDTH:
  2051.               currentnode->prefs->frames_width=trmsg->trm_Data;
  2052.               break;
  2053.  
  2054.             case ID_FRAMES_CYCLE_TITLE:
  2055.               currentnode->prefs->frames_title=trmsg->trm_Data;
  2056.               break;
  2057.  
  2058.             case ID_FRAMES_CYCLE_KIND_FRAMEBOX:
  2059.               currentnode->prefs->frames_type[TRFT_ABSTRACT_FRAMEBOX-TRFT_ABSTRACT_BUTTON]=trmsg->trm_Data+1;
  2060.               break;
  2061.  
  2062.             case ID_FRAMES_CYCLE_RAISED_FRAMEBOX:
  2063.               currentnode->prefs->frames_raised[TRFT_ABSTRACT_FRAMEBOX-TRFT_ABSTRACT_BUTTON]=(trmsg->trm_Data)?0:1;
  2064.               break;
  2065.  
  2066.             case ID_FRAMES_CYCLE_KIND_BUTTON:
  2067.               currentnode->prefs->frames_type[TRFT_ABSTRACT_BUTTON-TRFT_ABSTRACT_BUTTON]=trmsg->trm_Data+1;
  2068.               break;
  2069.  
  2070.             case ID_FRAMES_CYCLE_RAISED_BUTTON:
  2071.               currentnode->prefs->frames_raised[TRFT_ABSTRACT_BUTTON-TRFT_ABSTRACT_BUTTON]=(trmsg->trm_Data)?0:1;
  2072.               break;
  2073.  
  2074.             case ID_FRAMES_CYCLE_KIND_GROUPBOX:
  2075.               currentnode->prefs->frames_type[TRFT_ABSTRACT_GROUPBOX-TRFT_ABSTRACT_BUTTON]=trmsg->trm_Data+1;
  2076.               break;
  2077.  
  2078.             case ID_FRAMES_CYCLE_RAISED_GROUPBOX:
  2079.               currentnode->prefs->frames_raised[TRFT_ABSTRACT_GROUPBOX-TRFT_ABSTRACT_BUTTON]=(trmsg->trm_Data)?0:1;
  2080.               break;
  2081.  
  2082.             case ID_FRAMES_CYCLE_KIND_ICONDROPBOX:
  2083.               currentnode->prefs->frames_type[TRFT_ABSTRACT_ICONDROPBOX-TRFT_ABSTRACT_BUTTON]=trmsg->trm_Data+1;
  2084.               break;
  2085.  
  2086.             case ID_FRAMES_CYCLE_RAISED_ICONDROPBOX:
  2087.               currentnode->prefs->frames_raised[TRFT_ABSTRACT_ICONDROPBOX-TRFT_ABSTRACT_BUTTON]=(trmsg->trm_Data)?0:1;
  2088.               break;
  2089.  
  2090.             case ID_FRAMES_CYCLE_KIND_PROGRESS:
  2091.               currentnode->prefs->frames_type[TRFT_ABSTRACT_PROGRESS-TRFT_ABSTRACT_BUTTON]=trmsg->trm_Data+1;
  2092.               break;
  2093.  
  2094.             case ID_FRAMES_CYCLE_RAISED_PROGRESS:
  2095.               currentnode->prefs->frames_raised[TRFT_ABSTRACT_PROGRESS-TRFT_ABSTRACT_BUTTON]=(trmsg->trm_Data)?0:1;
  2096.               break;
  2097.  
  2098.             case ID_PENS_LIST_FROM:
  2099.               update_pens();
  2100.               break;
  2101.  
  2102.             case ID_PENS_LIST_TO:
  2103.               currentnode->prefs->pendata[TR_GetAttribute(pensgui,ID_PENS_LIST_FROM,TRAT_Value)]=trmsg->trm_Data;
  2104.               break;
  2105.  
  2106.             case ID_PENS_CYCLE_TO:
  2107.               currentnode->prefs->pentype[TR_GetAttribute(pensgui,ID_PENS_LIST_FROM,TRAT_Value)]=trmsg->trm_Data;
  2108.               currentnode->prefs->pendata[TR_GetAttribute(pensgui,ID_PENS_LIST_FROM,TRAT_Value)]=0;
  2109.               TR_SetAttribute(pensgui,ID_PENS_LIST_TO,TRAT_Value,0);
  2110.               if(trmsg->trm_Data) TR_SetAttribute(pensgui,ID_PENS_LIST_TO,NULL,(ULONG)penlist);
  2111.                 else TR_SetAttribute(pensgui,ID_PENS_LIST_TO,NULL,(ULONG)systempenlist);
  2112.               break;
  2113.  
  2114.             case ID_IMAGES_LIST_FROM:
  2115.               update_images();
  2116.               break;
  2117.  
  2118.             case ID_IMAGES_LIST_TO:
  2119.               currentnode->prefs->imgdata[TR_GetAttribute(imagesgui,ID_IMAGES_LIST_FROM,TRAT_Value)]=trmsg->trm_Data+2;
  2120.               break;
  2121.  
  2122.             case ID_IMAGES_CYCLE_TO:
  2123.               currentnode->prefs->imgtype[TR_GetAttribute(imagesgui,ID_IMAGES_LIST_FROM,TRAT_Value)]=trmsg->trm_Data;
  2124.               currentnode->prefs->imgdata[TR_GetAttribute(imagesgui,ID_IMAGES_LIST_FROM,TRAT_Value)]=0;
  2125.               TR_SetAttribute(imagesgui,ID_IMAGES_LIST_TO,TRAT_Value,0);
  2126.               if(trmsg->trm_Data) TR_SetAttribute(imagesgui,ID_IMAGES_LIST_TO,NULL,(ULONG)gfxpenlist);
  2127.                 else TR_SetAttribute(imagesgui,ID_IMAGES_LIST_TO,NULL,(ULONG)patternlist);
  2128.               break;
  2129.  
  2130.             case ID_WINDOWS_WINDOWS_LIST:
  2131.               if(trmsg->trm_Qualifier&IEQUALIFIER_REPEAT) WinInfo((struct WindowNode *)NodeFromNumber((struct List *)windowlist,trmsg->trm_Data));
  2132.               break;
  2133.  
  2134.             case ID_SYSTEM_SCREENS_LIST:
  2135.               SetScreenListPos(trmsg->trm_Data);
  2136.               if(trmsg->trm_Qualifier&IEQUALIFIER_REPEAT)
  2137.               {
  2138.                 strcpy(currentnode->prefs->pubscreen,((struct TR_ScreenNode *)(NodeFromNumber(screenlist,trmsg->trm_Data)))->pubname);
  2139.                 TR_SetAttribute(systemgui,ID_SYSTEM_PUBSCREEN,NULL,(ULONG)(currentnode->prefs->pubscreen));
  2140.               }
  2141.               break;
  2142.  
  2143.             case ID_IMAGES_RETURN_CHECKBOX:
  2144.               if(trmsg->trm_Data) currentnode->prefs->flags|=TRPF_RETURNARROW;
  2145.                 else currentnode->prefs->flags&=(~TRPF_RETURNARROW);
  2146.               break;
  2147.  
  2148.             case ID_SYSTEM_SIMPLEREFRESH_CHECKBOX:
  2149.               if(trmsg->trm_Data) currentnode->prefs->flags|=TRPF_SIMPLEREFRESH;
  2150.                 else currentnode->prefs->flags&=(~TRPF_SIMPLEREFRESH);
  2151.               break;
  2152.           }
  2153.           break;
  2154.       }
  2155.       TR_ReplyMsg(trmsg);
  2156.     }
  2157.   }
  2158.   return reopen;
  2159. }
  2160.  
  2161.  
  2162. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2163. ////////////////////////////////////////////////////////////////////////// Update all windows with new app //
  2164. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2165.  
  2166. void update_all(void)
  2167. {
  2168.   if(framesgui) update_frames();
  2169.   if(pensgui) update_pens();
  2170.   if(imagesgui) update_images();
  2171.   if(windowsgui) update_windows();
  2172.   if(systemgui) update_system();
  2173. }
  2174.  
  2175.  
  2176. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2177. /////////////////////////////////////////////////////////////////////////// Open and close the application //
  2178. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2179.  
  2180. BOOL createapp(struct TR_AppPrefs *prefs)
  2181. {
  2182.   return (BOOL)(app=TR_CreateAppTags(
  2183.     TRCA_Name,        "TritonPrefs",
  2184.     TRCA_LongName,    LS(MSG_TRITON_APP_LONGNAME),
  2185.     TRCA_Info,        LS(MSG_TRITON_APP_INFO),
  2186.     TRCA_Version,     TRPREFS_VERSION,
  2187.     TRCA_Release,     TRPREFS_RELEASE,
  2188.     TRCA_Date,        TRPREFS_DATE,
  2189.     prefs?TRCA_MagicPrefs:TAG_END,prefs,
  2190.     TAG_END));
  2191. }
  2192.  
  2193.  
  2194. void deleteapp(void)
  2195. {
  2196.   if(app)
  2197.   {
  2198.     TR_DeleteApp(app);
  2199.     app=NULL;
  2200.   }
  2201. }
  2202.  
  2203.  
  2204. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2205. ////////////////////////////////////////////////////////////////////////////////////////////// Check prefs //
  2206. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2207.  
  2208. BOOL checkprefs(void)
  2209. {
  2210.   BPTR lock;
  2211.   BOOL retval=TRUE;
  2212.  
  2213.   if(lock=Lock("env:Triton",ACCESS_READ)) UnLock(lock);
  2214.   else
  2215.   {
  2216.     if(TR_EasyRequestTags(app,LS(MSG_INSTALLPREFS_REQUESTER),LS(MSG_INSTALLIT_QUIT_GAD),
  2217.       TREZ_ReqPos,TRWP_CENTERDISPLAY,
  2218.       TAG_END))
  2219.     {
  2220.       lock=CreateDir("env:Triton");
  2221.       if(lock) UnLock(lock); else retval=FALSE;
  2222.       lock=CreateDir("envarc:Triton");
  2223.       if(lock) UnLock(lock); else retval=FALSE;
  2224.       if(screenlist=CreateScreenList())
  2225.       {
  2226.         SaveScreenList(screenlist,"env:Triton/Screens.trc");
  2227.         SaveScreenList(screenlist,"envarc:Triton/Screens.trc");
  2228.         DeleteFileList((struct FileList *)screenlist);
  2229.         screenlist=NULL;
  2230.       }
  2231.       if(!retval) DisplayError(LS(MSG_ERROR_INSTALLTRITON));
  2232.       else
  2233.       {
  2234.         deleteapp();
  2235.         if(!(createapp(NULL)))
  2236.         {
  2237.           retval=FALSE;
  2238.           DisplayError(LS(MSG_ERROR_CREATEAPP));
  2239.         }
  2240.       }
  2241.     }
  2242.     else retval=FALSE;
  2243.   }
  2244.   return retval;
  2245. }
  2246.  
  2247.  
  2248. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2249. /////////////////////////////////////////////////////////////////////////////////////////////////// main() //
  2250. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2251.  
  2252. int main(void)
  2253. {
  2254.   int retval=0;
  2255.   BOOL opened_frames, opened_pens, opened_images, opened_system, opened_windows;
  2256.  
  2257.   if(LocaleBase=OpenLibrary("locale.library",38))
  2258.   {
  2259.     li.li_LocaleBase=LocaleBase;
  2260.     li.li_Catalog=OpenCatalogA(NULL,"tritonprefs.catalog",NULL);
  2261.   }
  2262.  
  2263.   ASLBase=OpenLibrary("asl.library",38L);
  2264.   if(!ASLBase) ReqToolsBase=(struct ReqToolsBase *)OpenLibrary("reqtools.library",0L);
  2265.  
  2266.   if(TritonBase=OpenLibrary(TRITONNAME,TRITON12VERSION))
  2267.   {
  2268.     if(createapp(NULL))
  2269.     {
  2270.       if(checkprefs())
  2271.       {
  2272.         if(screenlist=CreateScreenList())
  2273.         {
  2274.           if(applist=CreateAppList())
  2275.           {
  2276.             if(open_main())
  2277.             {
  2278.               while(mainloop())
  2279.               {
  2280.                 if(framesgui) opened_frames=TRUE; else opened_frames=FALSE;
  2281.                 close_frames();
  2282.                 if(pensgui) opened_pens=TRUE; else opened_pens=FALSE;
  2283.                 close_pens();
  2284.                 if(imagesgui) opened_images=TRUE; else opened_images=FALSE;
  2285.                 close_images();
  2286.                 if(systemgui) opened_system=TRUE; else opened_system=FALSE;
  2287.                 close_system();
  2288.                 if(windowsgui) opened_windows=TRUE; else opened_windows=FALSE;
  2289.                 close_windows();
  2290.                 close_main();
  2291.                 deleteapp();
  2292.                 //-- Use proper error reporting
  2293.                 if(!createapp(GetEditorPrefs())) break;
  2294.                 currentnode=(struct AppNode *)NodeFromNumber((struct List *)applist,0);
  2295.                 isglobal=TRUE;
  2296.                 if(!open_main()) break;
  2297.                 if(opened_frames) open_frames();
  2298.                 if(opened_pens) open_pens();
  2299.                 if(opened_images) open_images();
  2300.                 if(opened_system) open_system();
  2301.                 if(opened_windows) open_windows();
  2302.               }
  2303.               close_frames();
  2304.               close_pens();
  2305.               close_images();
  2306.               close_system();
  2307.               close_windows();
  2308.               close_main();
  2309.             } else { DisplayError(LS(MSG_ERROR_MAINWINDOW)); retval=20; }
  2310.             DeleteFileList(applist);
  2311.           } else { DisplayError(LS(MSG_ERROR_NOMEM)); retval=20; }
  2312.           DeleteFileList((struct FileList *)screenlist);
  2313.         } else { DisplayError(LS(MSG_ERROR_NOMEM)); retval=20; }
  2314.       }
  2315.       deleteapp();
  2316.     } else { DisplayError(LS(MSG_ERROR_CREATEAPP)); retval=20; }
  2317.     CloseLibrary(TritonBase);
  2318.   } else { DisplayError(LS(MSG_ERROR_NOTRITONLIB)); retval=20; }
  2319.  
  2320.   if(ASLBase) CloseLibrary(ASLBase);
  2321.   if(ReqToolsBase) CloseLibrary((struct Library *)ReqToolsBase);
  2322.  
  2323.   if(li.li_LocaleBase)
  2324.   {
  2325.     CloseCatalog(li.li_Catalog);
  2326.     CloseLibrary(LocaleBase);
  2327.   }
  2328.  
  2329.   return retval;
  2330. }
  2331.