home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / misc / xref_v1.1.lha / XRef / Tools / source / aguidexrefv39.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-09  |  59.7 KB  |  1,742 lines

  1. ;/* execute me to make with SAS 6.x
  2. sc NOSTKCHK CSRC aguidexrefv39.c OPT IGNORE=73
  3. slink lib:c.o aguidexrefv39.o //Goodies/extrdargs/extrdargs.o TO /c/aguidexrefv39 SMALLDATA SMALLCODE NOICONS LIB lib:amiga.lib lib:sc.lib /lib/xrefsupport.lib
  4. quit
  5. */
  6.  
  7. /*
  8. ** $PROJECT: XRef-Tools
  9. **
  10. ** $VER: aguidexrefv39.c 1.20 (02.11.94)
  11. **
  12. ** by
  13. **
  14. ** Stefan Ruppert , Windthorststraße 5 , 65439 Flörsheim , GERMANY
  15. **
  16. ** (C) Copyright 1994
  17. ** All Rights Reserved !
  18. **
  19. ** $HISTORY:
  20. **
  21. ** 02.11.94 : 001.020 :  ReplyMsg() was wrong, now uses the GT_ReplyIMsg
  22. ** 22.09.94 : 001.019 :  now uses the real nodename ENTRYA_NodeName
  23. ** 08.09.94 : 001.018 :  workbench support added (FinalReadArgs())
  24. ** 03.09.94 : 001.017 :  now uses ENTRYA_NodeName to generate the amigaguide node path
  25. ** 27.08.94 : 001.016 :  use now GM_LAYOUT method after font selection
  26. ** 27.08.94 : 001.015 :  bumped to version 1
  27. ** 23.08.94 : 000.014 :  screen font bug (propotional) fixed,
  28. **                       if a found xref is in the middle of a document
  29. **                       the line offset is now set correct
  30. ** 10.08.94 : 000.013 :  added file,font requester
  31. ** 07.08.94 : 000.012 :  v37,v39 splitted into two files
  32. ** 29.07.94 : 000.011 :  major changes to v39 version
  33. ** 12.06.94 : 000.010 :  font support for v39 version
  34. ** 10.06.94 : 000.009 :  file highlight added
  35. ** 05.06.94 : 000.008 :  now different tmpfiles and v39 datatype skeleton added
  36. ** 28.05.94 : 000.007 :  now uses the tags function
  37. ** 18.05.94 : 000.006 :  file support added
  38. ** 18.05.94 : 000.005 :  cachedir option added
  39. ** 14.05.94 : 000.004 :  XRefAddDynamicHost added
  40. ** 09.05.94 : 000.003 :  support of diffrent main pages (categories)
  41. ** 06.05.94 : 000.002 :  column support added
  42. ** 02.05.94 : 000.001 :  initial
  43. */
  44.  
  45. /* ------------------------------- includes ------------------------------- */
  46.  
  47. #include "aguidexref.h"
  48.  
  49. #include <datatypes/datatypes.h>
  50. #include <datatypes/datatypesclass.h>
  51.  
  52. #include <clib/datatypes_protos.h>
  53. #include <pragmas/datatypes_pragmas.h>
  54.  
  55. #include "aguidexrefv39_rev.h"
  56.  
  57. #include "/lib/xrefsupport.h"
  58.  
  59. #include "strings.c"
  60.  
  61. /* ------------------------------- defines -------------------------------- */
  62.  
  63. /*FS*/ /*"Defines"*/
  64.  
  65. #define GADID_Category             1
  66. #define GADID_String               2
  67. #define GADID_Mode                 3
  68. #define GADID_AmigaGuide           4
  69.  
  70. #define GADID_LeftButton           5
  71. #define GADID_UpButton             6
  72. #define GADID_RightButton          7
  73. #define GADID_DownButton           8
  74. #define GADID_HorizProp            9
  75. #define GADID_VertProp            10
  76.  
  77. /* default values for gadget layout */
  78. #define CYCLEGADGET_WIDTH         30
  79. #define DEFAULT_FONTHEIGHT         8
  80. #define FREEPIXELHEIGHT            9
  81.  
  82. /* rawkey */
  83. #define SHIFT_TAB                 66
  84.  
  85. /* ascii */
  86. #define CTRL_C                    3
  87. #define ESCAPE                    27
  88. #define TABULATOR                 '\t'
  89. #define RETURN                    13
  90. #define BROWSE_LEFT              '<'
  91. #define BROWSE_RIGHT             '>'
  92. #define SLASH                    '/'
  93. #define EOS                      '\0'
  94.  
  95. #define IDCMP_FLAGS              (IDCMP_IDCMPUPDATE | IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY | IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_GADGETDOWN | IDCMP_NEWSIZE | IDCMP_MENUPICK | IDCMP_CHANGEWINDOW | IDCMP_REFRESHWINDOW)
  96. #define WINDOW_FLAGS             (WFLG_CLOSEGADGET | WFLG_DEPTHGADGET | WFLG_SIZEGADGET | WFLG_DRAGBAR | WFLG_ACTIVATE | WFLG_SIZEBBOTTOM | WFLG_SIZEBRIGHT | WFLG_REPORTMOUSE)
  97.  
  98. #define GAD_STRING(gad)          (((struct StringInfo * ) (gad)->SpecialInfo)->Buffer)
  99.  
  100. #define AMIGAGUIDECLASS          "amigaguide.datatype"
  101.  
  102. #define IEQUALIFIER_ALT          (IEQUALIFIER_LALT   | IEQUALIFIER_RALT)
  103. #define IEQUALIFIER_SHIFT        (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)
  104.  
  105. #define USE_TAG(tag,x)           ((x) ? tag : TAG_IGNORE)
  106.  
  107. enum {
  108.    MYCMD_NOTHING,
  109.    MYCMD_OPEN,
  110.    MYCMD_SAVEAS,
  111.    MYCMD_PRINT,
  112.    MYCMD_ABOUT,
  113.    MYCMD_QUIT,
  114.    MYCMD_MARK,
  115.    MYCMD_COPY,
  116.    MYCMD_SELECTALL,
  117.    MYCMD_CLEARSELECTED,
  118.    MYCMD_MINIMIZE,
  119.    MYCMD_NORMAL,
  120.    MYCMD_MAXIMIZE,
  121.    MYCMD_FONTS,
  122.    MYCMD_SAVEDEFAULT,
  123. };
  124.  
  125. /*FE*/
  126.  
  127. /* ------------------------------- AutoDoc -------------------------------- */
  128.  
  129. /*FS*/ /*"AutoDoc"*/
  130. /*GB*** XRef-Tools/AGuideXRefV39 *********************************************
  131.  
  132. $VER: AGuideXRefV39.doc
  133.  
  134. NAME
  135.     AGuideXRefV39 - searches the xref-lists for a given string/pattern and
  136.                     shows a amigaguide text for the found entries
  137.  
  138. TEMPLATE
  139.     STRING,CATEGORY,FILE/K,CACHEDIR/K,LINELENGTH/N/K,COLUMNS/N/K,LIMIT/N/K,
  140.     NOPATTERN/S,NOCASE/S,PUBSCREEN/K,PORTNAME/K,FONTNAME/K,FONTSIZE/N/K
  141.  
  142. FORMAT
  143.     AGuideXRefV39 [[STRING (strg|pat)] [[CATEGORY] category] [FILE xreffile]
  144.                [CACHEDIR dir] [LINELENGTH numchars] [COLUMNS numcolumns]
  145.                [LIMIT maxentries] [NOPATTERN] [NOCASE] [PUBSCREEN pubname]
  146.                [PORTNAME agarexxport] [FONTNAME name.font] [FONTSIZE ysize]
  147.  
  148. FUNCTION
  149.     this command gives an CLI interface to the xref.library, which uses the
  150.     AmigaGuide system to display some found xref entries and have a link to
  151.     its real documentation.
  152.     If you specify the CACHEDIR, this directory will be used to save the
  153.     AmigaGuide files, if there are more the one entries for the given string
  154.     or pattern. Any next call with this CACHEDIR and the given string/pattern,
  155.     it will no longer call the xref.library function, but uses this file.
  156.     If you do not specify a CATEGORY all xreffiles in the xref.library are
  157.     parsed.From xref.library 1.8 the categorystring can be a pattern !
  158.  
  159.     New Gadgets
  160.     -----------
  161.  
  162.     AGuideXRefV39 has three additional gadgets, which allow direct access to
  163.     the xref.library.
  164.     
  165.     Category-Gadget :
  166.         The first string gadget is the category gadget. You can specify here
  167.         the category (pattern), you would search for.
  168.     String-Gadget :
  169.         The next string gadget is the string/pattern gadget. Enter here the
  170.         string/pattern you search for and press return to start the search.
  171.     SearchMode-Gadget:
  172.         The last gadget is a cycle gadget, which you can use to adjust the
  173.         search mode.
  174.  
  175.     Keycontrol
  176.     ----------
  177.  
  178.     The window has full keycontrol :
  179.         - Cursor keys work like in AmigaGuide (scroll through the document)
  180.         - Slash '/' key retrace to the last document
  181.         - '>' browse to the next document
  182.         - '<' browse to the previous document
  183.         - Tab select next field
  184.         - Shift Tab select previous field
  185.         - Return activate selected field document
  186.         - Space ' ' activate Table of Contents
  187.         - 'I','i' activate Index document
  188.         - 'P','p','S','s' activate string/pattern gadget
  189.         - 'C','c' activate category gadget
  190.  
  191. INPUTS
  192.     STRING (STRING) - string|pattern to search for
  193.  
  194.     CATEGORY (STRING) - category to parse (no specified category matches
  195.         all categories). Can be a pattern !
  196.  
  197.     FILE (STRING) - file to parse, this argument overrides the CATEGORY
  198.         argument
  199.  
  200.     CACHEDIR (STRING) - if you want to save all generated AmigaGuide files
  201.         to have a fast access to it, just specify here the directory, in which
  202.         these files will saved
  203.  
  204.     LIMIT (NUMBER) - specifies the maximal number of entries to match
  205.         (default : xref.library default (XREFBA_DefaultLimit))
  206.  
  207.     LINELENGTH (NUMBER) - specifies the number of chars for a line
  208.         (default : xref.library default (XREFBA_LineLength))
  209.  
  210.     COLUMNS (NUMBER) - specifies the number of columns, which will be used
  211.         if more than one entry matches
  212.         (default : xref.library default (XREFBA_Columns))
  213.  
  214.     NOPATTERN (BOOLEAN) - interprets the given string as a normal string
  215.         instead of a pattern
  216.  
  217.     NOCASE (BOOLEAN) - makes the search case-insensitive
  218.  
  219.     PUBSCREEN (STRING) - specifies the screen, on which the AmigaGuide winodw
  220.         should be opened
  221.  
  222.     PORTNAME (STRING) - arexxportname for the amigaguide.datatype process
  223.  
  224.     FONTNAME (STRING) - font to use for the document
  225.  
  226.     FONTSIZE (NUMBER) - font ysize to use for the document
  227.  
  228. EXAMPLES
  229.     The following example searches all xreffiles of the AutoDoc category for
  230.     xrefentries with the word "Window" inside and tries to open a window on the
  231.     GoldEd Screen, if it has found some entry matches this pattern :
  232.  
  233.         AGuideXRefV39 #?Window#? #?AutoDoc#? PUBSCREEN=GOLDED.1
  234.  
  235. SEE ALSO
  236.     LoadXRef, ExpungeXRef, MakeXRef, ParseXRef, dos.library/ParsePattern()
  237.  
  238. COPYRIGHT
  239.     by Stefan Ruppert (C) 1994
  240.  
  241. HISTORY
  242.     AGuideXRefV39 1.12 (2.11.94) :
  243.         - used ReplyMsg() instead of GT_ReplyIMsg(). This is now fixed !
  244.  
  245.     AGuideXRefV39 1.11 (22.9.94) :
  246.         - ENTRYA_NodeName wasn't used for opening the guide. This is fixed !
  247.  
  248.     AGuideXRefV39 1.10 (8.9.94) :
  249.         - workbench support added
  250.  
  251.     AGuideXRefV39 1.9 (3.9.94) :
  252.         - some changes to reflect the xref.library v1.13 changes
  253.         - insertbyname() insertion order fixed
  254.  
  255.     AGuideXRefV39 1.8 (27.8.94) :
  256.         - line offsets are handled right
  257.         - screenfont usage changes (don't worded before with proportional
  258.           fonts ! Found and fixed by Marius Gröger)
  259.         - now use GM_LAYOUT method after new font selection
  260.  
  261.     AGuideXRefV39 1.7 (10.8.94) :
  262.         - now V37 and V39 are two programs
  263.         - menu added
  264.         - ' ' - key shows Table of Contents
  265.         - 'I' - key shows Index
  266.         - prefs file
  267.  
  268.     AGuideXRef 1.6 (29.7.94) :
  269.         - major changes for V39 version
  270.         - entries now sorted to files
  271.  
  272.     AGuideXRef 1.5 (10.6.94) :
  273.         - File highlighted added
  274.  
  275.     AGuideXRef 1.4 (5.6.94) :
  276.         - now unique tempfiles
  277.         - V39 datatype skeleton
  278.         - V39 datatype entry with the FORCEV39 switch
  279.  
  280.     AGuideXRef 1.3 (28.5.94) :
  281.         - CACHEDIR and PORTNAME options added
  282.  
  283.     AGuideXRef 1.2 (20.5.94) :
  284.         - LINELENGTH and COLUMNS options added
  285.  
  286.     AGuideXRef 1.1 (10.5.94) :
  287.         - first beta release
  288.  
  289. *****************************************************************************/
  290. /*FE*/
  291.  
  292. /* ------------------------------ Prototypes ------------------------------ */
  293.  
  294. /*FS*/ /*"Prototypes"*/
  295.  
  296. LibCall ULONG dispatchmyguideclass(REGA0 Class *cl,REGA2 Object *obj,REGA1 Msg msg);
  297.  
  298. Class *initmyguideclass(struct GlobalData *gd);
  299. void freemyguideclass(struct GlobalData *gd,Class *cl);
  300.  
  301. void openamigaguide(struct GlobalData *gd);
  302.  
  303. void openfile(struct GlobalData *gd);
  304. void triggermethod(struct GlobalData *gd,ULONG triggermethod);
  305.  
  306. void changedttop(struct GlobalData *gd,UWORD code,UWORD qual);
  307. void addmygadgets(struct GlobalData *gd);
  308. void createmenu(struct GlobalData *gd);
  309. void createpropgadgets(struct GlobalData *gd);
  310. void drawmyline(struct GlobalData *gd);
  311. void setprops(struct GlobalData *gd);
  312.  
  313. void handlebuttons(struct GlobalData *gd,struct Gadget *mgad,WORD add);
  314. void handleprops(struct GlobalData *gd,struct Gadget *gad);
  315.  
  316. void executecmd(struct GlobalData *gd,UWORD cmd);
  317.  
  318. void easyrequest(struct GlobalData *gd,ULONG textid,ULONG gadid,APTR args,...);
  319. BOOL getpubscreenname(struct Screen *screen,STRPTR name);
  320. void saveprefs(struct GlobalData *gd,STRPTR path);
  321. void loadprefs(struct GlobalData *gd,STRPTR path);
  322. BOOL filerequest(struct GlobalData *gd,ULONG titleid,ULONG flags);
  323. void fontrequest(struct GlobalData *gd,ULONG titleid);
  324. void setwindowpointer(struct GlobalData *gd,BOOL busy);
  325. UWORD calctexts(struct GlobalData *gd, struct RastPort *rp, UBYTE **texts);
  326.  
  327. /*FE*/
  328.  
  329. /* ---------------------------- version string ---------------------------- */
  330.  
  331. /*FS*/ /*"Constants"*/
  332.  
  333. char *prgname = "AGuideXRefV39";
  334.  
  335. static char *vstring = VERS " (" DATE ")";
  336. static char *envpath = "Env:AGuideXRef";
  337. static char *arcpath = "EnvArc:AGuideXRef";
  338.  
  339. static char *search_modes[] = {
  340.    "Pattern",
  341.    "PatternNoCase",
  342.    "Compare",
  343.    "CompareNoCase",
  344.    "CompareNum",
  345.    "CompareNumNoCase",
  346.    NULL};
  347.  
  348. static struct MenuDef menudef[] = {
  349.    {NM_TITLE,TXT_MENUTITLE_PROJECT     ,              0,MYCMD_NOTHING},
  350.    {NM_ITEM ,TXT_MENUITEM_OPEN         ,              0,MYCMD_OPEN},
  351.    {NM_ITEM ,(ULONG) NM_BARLABEL       ,              0,MYCMD_NOTHING},
  352.    {NM_ITEM ,TXT_MENUITEM_SAVEAS       ,              0,MYCMD_SAVEAS},
  353.    {NM_ITEM ,TXT_MENUITEM_PRINT        ,NM_ITEMDISABLED,MYCMD_PRINT},
  354.    {NM_ITEM ,(ULONG) NM_BARLABEL       ,              0,MYCMD_NOTHING},
  355.    {NM_ITEM ,TXT_MENUITEM_ABOUT        ,              0,MYCMD_ABOUT},
  356.    {NM_ITEM ,(ULONG) NM_BARLABEL       ,              0,MYCMD_NOTHING},
  357.    {NM_ITEM ,TXT_MENUITEM_QUIT         ,              0,MYCMD_QUIT},
  358.    {NM_TITLE,TXT_MENUTITLE_EDIT        ,              0,MYCMD_NOTHING},
  359.    {NM_ITEM ,TXT_MENUITEM_MARK         ,NM_ITEMDISABLED,MYCMD_MARK},
  360.    {NM_ITEM ,TXT_MENUITEM_COPY         ,              0,MYCMD_COPY},
  361.    {NM_ITEM ,(ULONG) NM_BARLABEL       ,              0,MYCMD_NOTHING},
  362.    {NM_ITEM ,TXT_MENUITEM_SELECTALL    ,NM_ITEMDISABLED,MYCMD_SELECTALL},
  363.    {NM_ITEM ,TXT_MENUITEM_CLEARALL     ,              0,MYCMD_CLEARSELECTED},
  364.    {NM_TITLE,TXT_MENUTITLE_WINDOW      ,              0,MYCMD_NOTHING},
  365.    {NM_ITEM ,TXT_MENUITEM_MINIMIZE     ,              0,MYCMD_MINIMIZE},
  366.    {NM_ITEM ,TXT_MENUITEM_NORMAL       ,              0,MYCMD_NORMAL},
  367.    {NM_ITEM ,TXT_MENUITEM_MAXIMIZE     ,              0,MYCMD_MAXIMIZE},
  368.    {NM_TITLE,TXT_MENUTITLE_PREFS       ,              0,MYCMD_NOTHING},
  369.    {NM_ITEM ,TXT_MENUITEM_FONTS        ,              0,MYCMD_FONTS},
  370.    {NM_ITEM ,(ULONG) NM_BARLABEL       ,              0,MYCMD_NOTHING},
  371.    {NM_ITEM ,TXT_MENUITEM_SAVEDEFAULT  ,              0,MYCMD_SAVEDEFAULT}};
  372.  
  373. static const struct IBox abox[] =
  374. {
  375.     {-49, -9, 16, 10},     /* Left */
  376.     {-17, -31, 18, 10},    /* Up */
  377.     {-33, -9, 16, 10},     /* Right */
  378.     {-17, -20, 18, 10},    /* Down */
  379. };
  380.  
  381. /*FE*/
  382.  
  383. /* ------------------------- template definition -------------------------- */
  384.  
  385. /*FS*/ /*"Template Definition"*/
  386. #define template "STRING,CATEGORY,FILE/K,CACHEDIR/K,LINELENGTH/N/K," \
  387.                  "COLUMNS/N/K,LIMIT/N/K,NOPATTERN/S,NOCASE/S," \
  388.                  "PUBSCREEN/K,PORTNAME/K,FONTNAME/K,FONTSIZE/N/K,"
  389.  
  390. enum {
  391.    ARG_STRING,     /* string to parse for */
  392.    ARG_CATEGORY,   /* category to parse \  mutual   */
  393.    ARG_FILE,       /* file to parse     / exclusive */
  394.    ARG_CACHEDIR,   /* diretory to hold amigaguide files for a specified STRING */
  395.    ARG_LINELENGTH, /* line length of the amigaguide file */
  396.    ARG_COLUMNS,    /* number of columns */
  397.    ARG_LIMIT,      /* number of maximal entries */
  398.    ARG_NOPATTERN,  /* just a string instead of a pattern-string */
  399.    ARG_NOCASE,     /* ignore letter-case */
  400.    ARG_PUBSCREEN,  /* pubscreen to open the amigaguide window */
  401.    ARG_PORTNAME,   /* arexx port to assign the amigaguide window to */
  402.    ARG_FONTNAME,   /* font to use for the v39 datatype */
  403.    ARG_FONTSIZE,   /* fontsize to use */
  404.    ARG_MAX};
  405. /*FE*/
  406.  
  407. /* ------------------------ include generic parts ------------------------- */
  408.  
  409. #include "aguidexref.c"
  410.  
  411. /* ---------------------------- myguide class ----------------------------- */
  412.  
  413. /*FS*//*"LibCall ULONG dispatchmyguideclass(REGA0 Class *cl,REGA2 Object *obj,REGA1 Msg msg)"*/
  414. LibCall ULONG dispatchmyguideclass(REGA0 Class *cl,REGA2 Object *obj,REGA1 Msg msg)
  415. {
  416.    struct GlobalData *gd  = (struct GlobalData *) cl->cl_UserData;
  417.    ULONG retval;
  418.  
  419.    switch(msg->MethodID)
  420.    {
  421.    case OM_SET:
  422.    case OM_UPDATE:
  423.       if((retval = DoSuperMethodA(cl,obj,msg)) && OCLASS(obj) == cl && (!(gd->gd_Flags & GDF_SYNC)))
  424.       {
  425.          struct opUpdate *upd = (struct opUpdate *) msg;
  426.          struct RastPort *rp;
  427.  
  428.          if(rp = ObtainGIRPort(upd->opu_GInfo))
  429.          {
  430.             DoSuperMethod(cl,obj,GM_RENDER,upd->opu_GInfo,rp,GREDRAW_UPDATE);
  431.             ReleaseGIRPort(rp);
  432.          }
  433.       }
  434.       break;
  435.    case OM_NOTIFY:
  436.       msg->MethodID = OM_UPDATE;
  437.       DoMethodA(obj,msg);
  438.       msg->MethodID = OM_NOTIFY;
  439.       retval = DoSuperMethodA(cl,obj,msg);
  440.       break;
  441.    case DTM_GOTO:
  442.       DB(("goto : %s\n",((struct dtGoto *) msg)->dtg_NodeName));
  443.    case OM_NEW:
  444.       retval = DoSuperMethodA(cl,obj,msg);
  445.       break;
  446.    case OM_GET:
  447.       DB(("get attribute : %lx\n",((struct opGet *) msg)->opg_AttrID));
  448.    default:
  449.       DB(("method : %lx\n",msg->MethodID));
  450.       retval = DoSuperMethodA(cl,obj,msg);
  451.    }
  452.  
  453.    return(retval);
  454. }
  455. /*FE*/
  456.  
  457. /*FS*//*"Class *initmyguideclass(struct GlobalData *gd)"*/
  458. Class *initmyguideclass(struct GlobalData *gd)
  459. {
  460.    Class *cl;
  461.  
  462.    if((cl = MakeClass(NULL,AMIGAGUIDECLASS,NULL,0,0)))
  463.    {
  464.       cl->cl_Dispatcher.h_Entry = (HOOKFUNC) dispatchmyguideclass;
  465.       cl->cl_UserData = (ULONG) gd;
  466.    }
  467.    DB(("myguideclass : %lx\n",cl));
  468.  
  469.    return(cl);
  470. }
  471. /*FE*/
  472. /*FS*//*"void freemyguideclass(struct GlobalData *gd,Class *cl)"*/
  473. void freemyguideclass(struct GlobalData *gd,Class *cl)
  474. {
  475.    while(!FreeClass(cl))
  476.       Delay(5);
  477. }
  478. /*FE*/
  479.  
  480. /* ----------------------------- open window ------------------------------ */
  481.  
  482. /*FS*//*"void openamigaguide(struct GlobalData *gd)"*/
  483. void openamigaguide(struct GlobalData *gd)
  484. {
  485.    struct IBox     *winbox     = &gd->gd_WindowRect;
  486.  
  487.    struct IntuiMessage *msg;
  488.    struct Window *win;
  489.    struct Gadget *gad;
  490.    struct Gadget *mgad = NULL;
  491.    Object *agobj;
  492.  
  493.    STRPTR nodename = "main";
  494.  
  495.    ULONG i;
  496.  
  497.    if(gd->gd_Num == 0)
  498.       nodename = "xref.library_xreffile@main";
  499.    else if(gd->gd_Num == 1)
  500.    {
  501.       sprintf(gd->gd_FileBuffer,"%s%s",gd->gd_LastEntry.e_Path,gd->gd_LastEntry.e_File);
  502.       nodename = gd->gd_LastEntry.e_NodeName;
  503.    }
  504.  
  505.    /* open the amiga datatype library */
  506.    if((DataTypesBase = OpenLibrary ("datatypes.library", 39)))
  507.    {
  508.       GadToolsBase = OpenLibrary("gadtools.library",39);
  509.       AslBase      = OpenLibrary("asl.library",39);
  510.  
  511.       /* get localized strings */
  512.       if((LocaleBase   = OpenLibrary("locale.library",38)))
  513.       {
  514.          if((gd->gd_Catalog = OpenCatalog(NULL,
  515.                                           "xref-tools.catalog",
  516.                                           OC_BuiltInLanguage,"english",
  517.                                           TAG_DONE)))
  518.          {
  519.             for(i = 0 ; i < (sizeof(appStrings)/sizeof(STRPTR)) ; i++)
  520.                appStrings[i] = GetCatalogStr(gd->gd_Catalog,i,appStrings[i]);
  521.          }
  522.       }
  523.  
  524.       /* get public screen */
  525.       if((gd->gd_Screen = LockPubScreen((STRPTR) gd->gd_Para[ARG_PUBSCREEN])))
  526.       {
  527.          Class *myclass;
  528.  
  529.          /* set window dimensions default */
  530.          winbox->Left   = 0;
  531.          winbox->Top    = gd->gd_Screen->BarHeight + 1;
  532.          winbox->Width  = gd->gd_Screen->Width;
  533.          winbox->Height = gd->gd_Screen->Height - winbox->Top;
  534.  
  535.          gd->gd_WindowAltRect = gd->gd_WindowRect;
  536.  
  537.          loadprefs(gd,envpath);
  538.  
  539.          if(DiskFontBase = OpenLibrary("diskfont.library",39))
  540.          {
  541.             DB(("diskfont.library %lx\n",DiskFontBase));
  542.             gd->gd_TextFont = OpenDiskFont(&gd->gd_TextAttr);
  543.             DB(("textfont %lx\n",gd->gd_TextFont));
  544.          }
  545.  
  546.          DB(("fontname : %s\n",gd->gd_TextAttr.ta_Name));
  547.          DB(("fontsize : %ld\n",gd->gd_TextAttr.ta_YSize));
  548.  
  549.          gd->gd_InitialRect   = gd->gd_WindowRect;
  550.  
  551.          if((myclass = initmyguideclass(gd)))
  552.          if((gd->gd_VisualInfo = GetVisualInfoA(gd->gd_Screen,NULL)))
  553.          if((gd->gd_DrawInfo = GetScreenDrawInfo(gd->gd_Screen)))
  554.          {
  555.             gd->gd_NewGadget.ng_VisualInfo = gd->gd_VisualInfo;
  556.  
  557.             createmenu(gd);
  558.  
  559.             DB(("file : %s\n",gd->gd_FileBuffer));
  560.  
  561.             /* load the an object from the file in gd_FileBuffer */
  562.             if(agobj =  NewObject(myclass,NULL,
  563.                                   DTA_Name          ,gd->gd_FileBuffer,
  564.                                   DTA_NodeName      ,nodename,
  565.  
  566.                                   DTA_GroupID       ,GID_DOCUMENT,
  567.                                   DTA_ARexxPortName ,"AGUIDEXREF",
  568.                                   DTA_TextAttr      ,&gd->gd_TextAttr,
  569.  
  570.                                   GA_Immediate      ,TRUE,
  571.                                   GA_RelVerify      ,TRUE,
  572.                                   GA_ID             ,GADID_AmigaGuide,
  573.                                   /* set notify attributes for the window */
  574.                                   ICA_TARGET        ,ICTARGET_IDCMP,
  575.                                   TAG_DONE))
  576.             {
  577.                DB(("after newobject\n"));
  578.                gd->gd_AGObject = agobj;
  579.  
  580.                /* open the window and display the object */
  581.                if(win = OpenWindowTags(NULL,WA_Title        ,prgname,
  582.                                             WA_Left         ,winbox->Left,
  583.                                             WA_Top          ,winbox->Top,
  584.                                             WA_Width        ,winbox->Width,
  585.                                             WA_Height       ,winbox->Height,
  586.                                             WA_MinWidth     ,220,
  587.                                             WA_MinHeight    ,100,
  588.                                             WA_MaxWidth     , -1,
  589.                                             WA_MaxHeight    , -1,
  590.                                             WA_NewLookMenus ,TRUE,
  591.                                             WA_PubScreen    , gd->gd_Screen,
  592.                                             WA_Flags        , WINDOW_FLAGS,
  593.                                             WA_IDCMP        , IDCMP_FLAGS ,
  594.                                             WA_Zoom         , &gd->gd_WindowAltRect,
  595.                                             TAG_DONE))
  596.                {
  597.                   ULONG mticks   = 0;
  598.                   ULONG rcvd;
  599.  
  600.                   gd->gd_Window  = win;
  601.                   gd->gd_Flags  |= GDF_SYNC;
  602.  
  603.                   if(gd->gd_Menu)
  604.                      SetMenuStrip(win,gd->gd_Menu);
  605.  
  606.                   DB(("before propgadgets\n"));
  607.  
  608.                   createpropgadgets(gd);
  609.  
  610.                   addmygadgets(gd);
  611.  
  612.                   SetDTAttrs(agobj,NULL,NULL,
  613.                              GA_Left      ,gd->gd_ObjectBox.Left,
  614.                              GA_Top       ,gd->gd_ObjectBox.Top,
  615.                              GA_RelWidth  ,gd->gd_ObjectBox.Width,
  616.                              GA_RelHeight ,gd->gd_ObjectBox.Height,
  617.                              TAG_DONE);
  618.  
  619.                   AddDTObject(win,NULL,agobj,0);
  620.  
  621.                   setprops(gd);
  622.  
  623.                   DB(("getdtAttrs : %ld , nodename %lx \n",GetDTAttrs(agobj,DTA_Handle,&nodename,TAG_DONE),
  624.                                                             nodename));
  625.  
  626.                   drawmyline(gd);
  627.  
  628.                   gd->gd_Running = TRUE;
  629.  
  630.                   while(gd->gd_Running)
  631.                   {
  632.                      rcvd = Wait((1<<win->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C);
  633.  
  634.                      if(rcvd & SIGBREAKF_CTRL_C)
  635.                         gd->gd_Running = FALSE;
  636.  
  637.                      while((msg = GT_GetIMsg(win->UserPort)))
  638.                      {
  639.                         switch(msg->Class)
  640.                         {
  641.                         case IDCMP_MENUPICK: {
  642.                               struct MenuItem *item;
  643.                               UWORD code = msg->Code;
  644.  
  645.                               while(code != MENUNULL)
  646.                               {
  647.                                  if((item = ItemAddress(gd->gd_Menu,code)))
  648.                                  {
  649.                                     executecmd(gd,(UWORD) GTMENUITEM_USERDATA(item));
  650.                                     code = item->NextSelect;
  651.                                  } else
  652.                                     break;
  653.                               }
  654.                            }
  655.                            break;
  656.                         case IDCMP_RAWKEY:
  657.                            DB(("rawkey : %ld\n",msg->Code));
  658.                            switch(msg->Code)
  659.                            {
  660.                            case SHIFT_TAB:
  661.                               triggermethod(gd,STM_PREV_FIELD);
  662.                               break;
  663.                            default:
  664.                               changedttop(gd,msg->Code,msg->Qualifier);
  665.                            }
  666.                            break;
  667.                         case IDCMP_VANILLAKEY:
  668.                            DB(("ascii : %ld\n",msg->Code));
  669.                            switch(msg->Code)
  670.                            {
  671.                            case CTRL_C:
  672.                            case ESCAPE:
  673.                               gd->gd_Running = FALSE;
  674.                               break;
  675.                            case TABULATOR:
  676.                               triggermethod(gd,STM_NEXT_FIELD);
  677.                               break;
  678.                            case SLASH:
  679.                               triggermethod(gd,STM_RETRACE);
  680.                               break;
  681.                            case BROWSE_LEFT:
  682.                               triggermethod(gd,STM_BROWSE_PREV);
  683.                               break;
  684.                            case RETURN:
  685.                               triggermethod(gd,STM_ACTIVATE_FIELD);
  686.                               break;
  687.                            case BROWSE_RIGHT:
  688.                               triggermethod(gd,STM_BROWSE_NEXT);
  689.                               break;
  690.                            case 'I':
  691.                            case 'i':
  692.                               triggermethod(gd,STM_INDEX);
  693.                               break;
  694.                            case ' ':
  695.                               triggermethod(gd,STM_CONTENTS);
  696.                               break;
  697.                            case 'P':
  698.                            case 'p':
  699.                            case 'S':
  700.                            case 's':
  701.                               ActivateGadget(gd->gd_StringGad,win,NULL);
  702.                               break;
  703.                            case 'C':
  704.                            case 'c':
  705.                               ActivateGadget(gd->gd_CategoryGad,win,NULL);
  706.                               break;
  707.                            }
  708.                            break;
  709.                         case IDCMP_MOUSEMOVE:
  710.                            DB(("mousemove\n"));
  711.                            if(mgad && (mgad->GadgetID == GADID_HorizProp ||
  712.                                        mgad->GadgetID == GADID_VertProp))
  713.                               handleprops(gd,mgad);
  714.                            break;
  715.                         case IDCMP_INTUITICKS:
  716.                            DB(("intuitick\n"));
  717.                            if((mgad) && (mticks > 6))
  718.                               if(mgad->Flags & GFLG_SELECTED)
  719.                                  handlebuttons(gd,mgad,(mticks/3));
  720.                               else
  721.                                  mticks = 6;
  722.  
  723.                            mticks++;
  724.                            break;
  725.                         case IDCMP_GADGETDOWN:
  726.                            mticks = 0;
  727.                            mgad = (struct Gadget *) msg->IAddress;
  728.  
  729.                            switch(mgad->GadgetID)
  730.                            {
  731.                            case GADID_HorizProp:
  732.                            case GADID_VertProp:
  733.                               ModifyIDCMP(win,win->IDCMPFlags | IDCMP_MOUSEMOVE);
  734.                               handleprops(gd,mgad);
  735.                               break;
  736.                            default:
  737.                               ModifyIDCMP(win,win->IDCMPFlags | IDCMP_INTUITICKS);
  738.                               handlebuttons(gd,mgad,1);
  739.                            }
  740.                            break;
  741.                         case IDCMP_GADGETUP:
  742.                            mgad   = NULL;
  743.  
  744.                            gad = msg->IAddress;
  745.                            switch(gad->GadgetID)
  746.                            {
  747.                            case GADID_String:
  748.                               strcpy(gd->gd_String   ,GAD_STRING(gad));
  749.                               strcpy(gd->gd_Category ,GAD_STRING(gd->gd_CategoryGad));
  750.  
  751.                               setwindowpointer(gd,TRUE);
  752.                               if(parsexref(gd) && gd->gd_Num > 0)
  753.                                  openfile(gd);
  754.  
  755.                               setwindowpointer(gd,FALSE);
  756.                               break;
  757.                            case GADID_Mode:
  758.                               gd->gd_Matching = msg->Code;
  759.                               break;
  760.                            case GADID_HorizProp:
  761.                            case GADID_VertProp:
  762.                               ModifyIDCMP(win,win->IDCMPFlags & ~IDCMP_MOUSEMOVE);
  763.                               handleprops(gd,gad);
  764.                               break;
  765.                            default:
  766.                               ModifyIDCMP(win,win->IDCMPFlags & ~IDCMP_INTUITICKS);
  767.                            }
  768.                            break;
  769.                         case IDCMP_MOUSEBUTTONS:
  770.                            ModifyIDCMP(win,win->IDCMPFlags & ~IDCMP_INTUITICKS);
  771.                            break;
  772.                         case IDCMP_NEWSIZE:
  773.                            addmygadgets(gd);
  774.                            break;
  775.                         case IDCMP_IDCMPUPDATE:
  776.                            {
  777.                               struct TagItem *tstate = (struct TagItem *) msg->IAddress;
  778.                               struct TagItem *tag;
  779.  
  780.                               D({
  781.                                  struct TagItem *tags = tstate;
  782.                                  bug("idcmpudate\n");
  783.                                  while((tag = NextTagItem(&tags)))
  784.                                     bug("{0x%08lx,0x%08lx}\n",tag->ti_Tag,tag->ti_Data);
  785.                                 });
  786.  
  787.                               while((tag = NextTagItem(&tstate)))
  788.                               {
  789.                                  switch(tag->ti_Tag)
  790.                                  {
  791.                                  case DTA_Busy:
  792.                                     setwindowpointer(gd,tag->ti_Data);
  793.                                     break;
  794.                                  case DTA_Title:
  795.                                     DB(("new title : %s\n",tag->ti_Data));
  796.                                     SetWindowTitles(win,(STRPTR) tag->ti_Data,(STRPTR) -1);
  797.                                     break;
  798.                                  case DTA_ErrorString:
  799.                                     sprintf(gd->gd_TempBuffer,GetDTString(GetTagData(DTA_ErrorNumber,0,(struct TagItem *) msg->IAddress)),tag->ti_Data);
  800.                                     SetWindowTitles(win,(STRPTR) gd->gd_TempBuffer,(STRPTR) -1);
  801.                                     break;
  802.                                  case DTA_Sync:
  803.                                     if(gd->gd_Flags & GDF_SYNC)
  804.                                     {
  805.                                        SetDTAttrs(gd->gd_AGObject,gd->gd_Window,NULL,
  806.                                                   DTA_TopVert,gd->gd_LastEntry.e_Line - 1,
  807.                                                   TAG_DONE);
  808.                                        RefreshDTObjectA(agobj,win,NULL,NULL);
  809.                                        gd->gd_Flags &= ~GDF_SYNC;
  810.                                     }
  811.                                     break;
  812.                                  }
  813.                               }
  814.  
  815.                               setprops(gd);
  816.                            }
  817.                            break;
  818.                         case IDCMP_CLOSEWINDOW:
  819.                            /* user cancels the program */
  820.                            gd->gd_Running = FALSE;
  821.                            break;
  822.                         case IDCMP_CHANGEWINDOW:
  823.                            if(msg->Code == CWCODE_MOVESIZE)
  824.                            {
  825.                               if(win->Flags & WFLG_ZOOMED)
  826.                                  gd->gd_WindowAltRect = *((struct IBox *) &win->LeftEdge);
  827.                               else
  828.                                  gd->gd_WindowRect    = *((struct IBox *) &win->LeftEdge);
  829.                            }
  830.                            break;
  831.                         case IDCMP_REFRESHWINDOW:
  832.                            drawmyline(gd);
  833.                            break;
  834.                         }
  835.  
  836.                         GT_ReplyIMsg(msg);
  837.                      }
  838.                   }
  839.  
  840.                   RemoveDTObject(win,agobj);
  841.  
  842.                   CloseWindow(win);
  843.                }
  844.                DB(("before disposeobject\n"));
  845.                DisposeObject(agobj);
  846.                DB(("after disposeobject\n"));
  847.             } else
  848.             {
  849.                PrintFault(IoErr(),"AGuideXRef:");
  850.                if(GetDTString(IoErr()))
  851.                   Printf (GetDTString(IoErr()),gd->gd_FileBuffer);
  852.             }
  853.  
  854.             for(i = 0 ; i < 4 ; i++)
  855.             {
  856.                if(gd->gd_Buttons[i])
  857.                   DisposeObject(gd->gd_Buttons[i]);
  858.  
  859.                if(gd->gd_Images[i])
  860.                   DisposeObject(gd->gd_Images[i]);
  861.             }
  862.  
  863.             if(gd->gd_HorizProp)
  864.                DisposeObject(gd->gd_HorizProp);
  865.  
  866.             if(gd->gd_VertProp)
  867.                DisposeObject(gd->gd_VertProp);
  868.  
  869.             if(gd->gd_Menu)
  870.                FreeMenus(gd->gd_Menu);
  871.  
  872.             if(gd->gd_NewMenu)
  873.                FreeVec(gd->gd_NewMenu);
  874.  
  875.             FreeScreenDrawInfo(gd->gd_Screen,gd->gd_DrawInfo);
  876.          }
  877.  
  878.          if(gd->gd_VisualInfo);
  879.             FreeVisualInfo(gd->gd_VisualInfo);
  880.  
  881.          if(myclass)
  882.             freemyguideclass(gd,myclass);
  883.  
  884.          UnlockPubScreen(NULL,gd->gd_Screen);
  885.       }
  886.  
  887.       if(LocaleBase)
  888.       {
  889.          if(gd->gd_Catalog)
  890.             CloseCatalog(gd->gd_Catalog);
  891.  
  892.          CloseLibrary(LocaleBase);
  893.       }
  894.  
  895.       if(gd->gd_TextFont)
  896.          CloseFont(gd->gd_TextFont);
  897.  
  898.       /* close diskbase libraries */
  899.       if(DiskFontBase)
  900.          CloseLibrary(DiskFontBase);
  901.       if(AslBase)
  902.          CloseLibrary(AslBase);
  903.  
  904.       CloseLibrary(DataTypesBase);
  905.  
  906.       /* close rom libraries */
  907.       CloseLibrary(GadToolsBase);
  908.    }
  909. }
  910. /*FE*/
  911.  
  912. /*FS*//*"void changedttop(struct GlobalData *gd,UWORD code,UWORD qual)"*/
  913. void changedttop(struct GlobalData *gd,UWORD code,UWORD qual)
  914. {
  915.    LONG direct = 1;
  916.    LONG num = 0;
  917.    LONG top;
  918.    LONG add;
  919.    LONG visible;
  920.    LONG total;
  921.  
  922.    if(code == CURSORDOWN || code == CURSORUP)
  923.    {
  924.       if(code == CURSORUP)
  925.          direct = -1;
  926.  
  927.       num = GetDTAttrs(gd->gd_AGObject,DTA_TopVert      ,&top,
  928.                                        DTA_VertUnit     ,&add,
  929.                                        DTA_VisibleVert  ,&visible,
  930.                                        DTA_TotalVert    ,&total,
  931.                                        TAG_DONE);
  932.    } else if(code == CURSORLEFT || code == CURSORRIGHT)
  933.    {
  934.       if(code == CURSORLEFT)
  935.          direct = -1;
  936.  
  937.       num = GetDTAttrs(gd->gd_AGObject,DTA_TopHoriz     ,&top,
  938.                                        DTA_HorizUnit    ,&add,
  939.                                        DTA_VisibleHoriz ,&visible,
  940.                                        DTA_TotalHoriz   ,&total,
  941.                                        TAG_DONE);
  942.    }
  943.  
  944.    if(num == 4)
  945.    {
  946.       if(qual & IEQUALIFIER_ALT)
  947.       {
  948.          if(direct == -1)
  949.             top = 0;
  950.          else
  951.             top = total;
  952.       } else if(qual & IEQUALIFIER_SHIFT)
  953.       {
  954.          if(direct == -1)
  955.             top -= visible;
  956.          else             
  957.             top += visible;
  958.       } else
  959.       {
  960.          if(direct == -1)
  961.             top--;
  962.          else
  963.             top++;
  964.       }
  965.  
  966.       if(top < 0)
  967.          top = 0;
  968.  
  969.       if(code == CURSORDOWN || code == CURSORUP)
  970.       {
  971.          SetDTAttrs(gd->gd_AGObject,gd->gd_Window,NULL,DTA_TopVert ,top,TAG_DONE);
  972.          SetGadgetAttrs(gd->gd_VertProp,gd->gd_Window,NULL,PGA_Top ,top,TAG_DONE);
  973.       } else
  974.       {
  975.          SetDTAttrs(gd->gd_AGObject,gd->gd_Window,NULL,DTA_TopHoriz,top,TAG_DONE);
  976.          SetGadgetAttrs(gd->gd_HorizProp,gd->gd_Window,NULL,PGA_Top ,top,TAG_DONE);
  977.       }
  978.    }
  979. }
  980. /*FE*/
  981.  
  982. /*FS*//*"void addmygadgets(struct GlobalData *gd)"*/
  983. void addmygadgets(struct GlobalData *gd)
  984. {
  985.    struct Window *win = gd->gd_Window;
  986.    struct NewGadget *ng = &gd->gd_NewGadget;
  987.    struct TextFont *tf;
  988.  
  989.    struct Gadget *gad;
  990.  
  991.    if(gd->gd_FirstGadget)
  992.    {
  993.       if(gd->gd_StringGad)
  994.          strcpy(gd->gd_String  ,GAD_STRING(gd->gd_StringGad));
  995.  
  996.       if(gd->gd_CategoryGad)
  997.          strcpy(gd->gd_Category,GAD_STRING(gd->gd_CategoryGad));
  998.  
  999.       RemoveGList(win,gd->gd_FirstGadget,-1);
  1000.  
  1001.       DB(("eraserect\n"));
  1002.       EraseRect(win->RPort,win->BorderLeft,ng->ng_TopEdge - 3,
  1003.                            win->Width - win->BorderRight - 1,ng->ng_TopEdge + gd->gd_OldFHeight + FREEPIXELHEIGHT);
  1004.       FreeGadgets(gd->gd_FirstGadget);
  1005.       gd->gd_FirstGadget = NULL;
  1006.    }
  1007.  
  1008.    /* calculate the amigaguide object rectangle */
  1009.    gd->gd_ObjectBox.Left   = win->BorderLeft + 2;
  1010.    gd->gd_ObjectBox.Top    = win->BorderTop  + 1;
  1011.    gd->gd_ObjectBox.Width  = - win->BorderRight  - win->BorderLeft - 3;
  1012.    gd->gd_ObjectBox.Height = - win->BorderBottom - win->BorderTop - DEFAULT_FONTHEIGHT - FREEPIXELHEIGHT;
  1013.  
  1014.    gd->gd_NumGadgets = 0;
  1015.  
  1016.    ng->ng_TextAttr = gd->gd_Screen->Font;
  1017.  
  1018.    if (tf = OpenFont(ng->ng_TextAttr))
  1019.    {
  1020.       UWORD fheight = tf->tf_YSize;
  1021.       struct RastPort rp;
  1022.       UWORD cycle_width;
  1023.  
  1024.       gd->gd_OldFHeight = fheight;
  1025.  
  1026.       gd->gd_ObjectBox.Height = - win->BorderBottom - win->BorderTop - fheight - 9;
  1027.  
  1028.       InitRastPort(&rp);
  1029.       SetFont(&rp, tf);
  1030.  
  1031.       cycle_width = calctexts(gd, &rp, search_modes) + CYCLEGADGET_WIDTH;
  1032.  
  1033.       gd->gd_CategoryGad = NULL;
  1034.       gd->gd_StringGad   = NULL;
  1035.  
  1036.       if((gad = CreateContext(&gd->gd_FirstGadget)))
  1037.       {
  1038.          UWORD width = win->Width - (win->BorderLeft + win->BorderRight + 3 * INTERWIDTH) - cycle_width;
  1039.  
  1040.          DB(("width : %ld\n",width));
  1041.  
  1042.          /* create category string gadget */
  1043.          ng->ng_LeftEdge = win->BorderLeft + (INTERWIDTH / 2);
  1044.          ng->ng_TopEdge  = win->Height - win->BorderBottom - fheight - 5;
  1045.          ng->ng_Height   = fheight + 4;
  1046.  
  1047.          if((width / 3) > 40)
  1048.          {
  1049.             ng->ng_Width    = width / 3;
  1050.             ng->ng_GadgetID = GADID_Category;
  1051.  
  1052.             if((gad = CreateGadget(STRING_KIND,gad,ng,
  1053.                                    GTST_String   ,gd->gd_Category,
  1054.                                    GTST_MaxChars ,40,
  1055.                                    TAG_DONE)))
  1056.             {
  1057.                gd->gd_CategoryGad = gad;
  1058.                gd->gd_NumGadgets++;
  1059.  
  1060.                DB(("category gad : %lx\n",gad));
  1061.  
  1062.                ng->ng_LeftEdge += ng->ng_Width + INTERWIDTH;
  1063.                ng->ng_Width     = ng->ng_Width * 2;
  1064.             }
  1065.          } else
  1066.             ng->ng_Width = width + INTERWIDTH;
  1067.  
  1068.          /* create search string gadget */
  1069.          ng->ng_GadgetID  = GADID_String;
  1070.  
  1071.          if((gad = CreateGadget(STRING_KIND,gad,ng,
  1072.                                 GTST_String   ,gd->gd_String,
  1073.                                 GTST_MaxChars ,256,
  1074.                                 TAG_DONE)))
  1075.          {
  1076.             gd->gd_StringGad = gad;
  1077.             gd->gd_NumGadgets++;
  1078.  
  1079.             ng->ng_LeftEdge += ng->ng_Width + INTERWIDTH;
  1080.             ng->ng_Width     = cycle_width;
  1081.  
  1082.             ng->ng_GadgetID  = GADID_Mode;
  1083.  
  1084.             if((gad = CreateGadget(CYCLE_KIND,gad,ng,GTCY_Labels,search_modes,
  1085.                                                      GTCY_Active,gd->gd_Matching,
  1086.                                                      TAG_DONE)))
  1087.                gd->gd_NumGadgets++;
  1088.  
  1089.             DB(("create cycle : %lx\n",gad));
  1090.  
  1091.          }
  1092.       }
  1093.  
  1094.       if(!gad)
  1095.       {
  1096.          FreeGadgets(gd->gd_FirstGadget);
  1097.          gd->gd_FirstGadget = NULL;
  1098.       }else
  1099.       {
  1100.          AddGList(win,gd->gd_FirstGadget,-1,-1,NULL);
  1101.          RefreshGList(gd->gd_FirstGadget,win,NULL,gd->gd_NumGadgets);
  1102.          GT_RefreshWindow(gd->gd_Window,NULL);
  1103.       }
  1104.       
  1105.       RefreshWindowFrame(win);
  1106.  
  1107.       CloseFont(tf);
  1108.    }
  1109. }
  1110. /*FE*/
  1111. /*FS*/ /*"void createmenu(struct GlobalData *gd) "*/
  1112. void createmenu(struct GlobalData *gd)
  1113. {
  1114.    ULONG num = (sizeof(menudef)/sizeof(struct MenuDef));
  1115.  
  1116.    if((gd->gd_NewMenu = AllocVec(sizeof(struct NewMenu) * (num+1),MEMF_CLEAR)))
  1117.    {
  1118.       struct NewMenu *ptr = gd->gd_NewMenu;
  1119.       struct MenuDef *md  = menudef;
  1120.  
  1121.       while(num)
  1122.       {
  1123.          ptr->nm_Type = md->md_MenuType;
  1124.          if(ptr->nm_Type == NM_TITLE)
  1125.             ptr->nm_Label = appStrings[md->md_MenuTextID];
  1126.          else if(md->md_MenuTextID != (ULONG) NM_BARLABEL)
  1127.          {
  1128.             ptr->nm_CommKey = appStrings[md->md_MenuTextID];
  1129.             ptr->nm_Label   = ptr->nm_CommKey + 2;
  1130.             if(*ptr->nm_CommKey == ' ')
  1131.                ptr->nm_CommKey = NULL;
  1132.          } else
  1133.             ptr->nm_Label   = (STRPTR) NM_BARLABEL;
  1134.  
  1135.          ptr->nm_Flags = md->md_MenuFlags;
  1136.          ptr->nm_UserData = (APTR) md->md_MenuCmd;
  1137.          ptr++;
  1138.          md++;
  1139.          num--;
  1140.       }
  1141.  
  1142.       if((gd->gd_Menu = CreateMenus(gd->gd_NewMenu,GTMN_FullMenu,TRUE,TAG_DONE)))
  1143.          if(!LayoutMenus(gd->gd_Menu,gd->gd_VisualInfo,GTMN_NewLookMenus,TRUE,TAG_DONE))
  1144.          {
  1145.             FreeVec(gd->gd_NewMenu);
  1146.             gd->gd_NewMenu = NULL;
  1147.             FreeMenus(gd->gd_Menu);
  1148.             gd->gd_Menu = NULL;
  1149.          }
  1150.    }
  1151. }
  1152. /*FE*/
  1153. /*FS*/ /*"void createpropgadgets(struct GlobalData *gd) "*/
  1154. void createpropgadgets(struct GlobalData *gd)
  1155. {
  1156.    struct Gadget *tmpgad = NULL;
  1157.    struct Window *win    = gd->gd_Window;
  1158.    ULONG i;
  1159.  
  1160.    for(i = 0 ; i < 4 ; i++)
  1161.    {
  1162.       if((gd->gd_Images[i] = (struct Image *) NewObject(NULL,SYSICLASS,
  1163.                                                         SYSIA_DrawInfo,  gd->gd_DrawInfo,
  1164.                                                         SYSIA_Which,     i + LEFTIMAGE,
  1165.                                                         SYSIA_Size,      SYSISIZE_MEDRES,
  1166.                                                         TAG_DONE)))
  1167.       {
  1168.          if(gd->gd_Buttons[i] = (struct Gadget *) NewObject(NULL,BUTTONGCLASS,
  1169.                                                   GA_ID,          GADID_LeftButton + i,
  1170.                                                   GA_Immediate,   TRUE,
  1171.                                                   GA_RelVerify,   TRUE,
  1172.                                                   GA_RelRight,    abox[i].Left,
  1173.                                                   GA_RelBottom,   abox[i].Top,
  1174.                                                   GA_Width,       abox[i].Width,
  1175.                                                   GA_Height,      abox[i].Height,
  1176.                                                   GA_Image,       gd->gd_Images[i],
  1177.                                                   GA_BottomBorder,(i % 2) == 0,
  1178.                                                   GA_RightBorder, (i % 2) == 1,
  1179.                                                   USE_TAG(GA_Previous,(tmpgad)),    tmpgad,
  1180.                                                   TAG_END))
  1181.          {
  1182.             tmpgad = gd->gd_Buttons[i];
  1183.          }
  1184.       } else
  1185.          break;
  1186.    }
  1187.  
  1188.    if(i == 4)
  1189.    {
  1190.       if(gd->gd_HorizProp = (struct Gadget *) NewObject(NULL,PROPGCLASS,
  1191.                                                GA_ID,          GADID_HorizProp,
  1192.                                                GA_Immediate,   TRUE,
  1193.                                                GA_RelVerify,   TRUE,
  1194.                                                PGA_Freedom,    FREEHORIZ,
  1195.                                                PGA_Borderless, TRUE,
  1196.                                                PGA_NewLook,    TRUE,
  1197.                                                GA_RelBottom,   -win->BorderBottom+3,
  1198.                                                GA_Left,        win->BorderLeft+2,
  1199.                                                GA_Height,      win->BorderBottom-4,
  1200.                                                GA_RelWidth,    -win->BorderLeft-win->BorderRight- 2 * 16 - 4,
  1201.                                                GA_BottomBorder,TRUE,
  1202.                                                GA_FollowMouse, TRUE,
  1203.                                                GA_Previous,    tmpgad,
  1204.                                                TAG_END))
  1205.       if(gd->gd_VertProp = (struct Gadget *) NewObject(NULL,PROPGCLASS,
  1206.                                                GA_ID,          GADID_VertProp,
  1207.                                                GA_Immediate,   TRUE,
  1208.                                                GA_RelVerify,   TRUE,
  1209.                                                PGA_Freedom,    FREEVERT,
  1210.                                                PGA_Borderless, TRUE,
  1211.                                                PGA_NewLook,    TRUE,
  1212.                                                GA_RelRight,    -win->BorderRight+5,
  1213.                                                GA_Top,          win->BorderTop+1,
  1214.                                                GA_Width,        win->BorderRight-8,
  1215.                                                GA_RelHeight,   -win->BorderBottom - win->BorderTop- 2 * 10 - 4,
  1216.                                                GA_RightBorder, TRUE,
  1217.                                                GA_FollowMouse, TRUE,
  1218.                                                GA_Previous,    tmpgad,
  1219.                                                TAG_END))
  1220.       {
  1221.          AddGList(win,gd->gd_Buttons[0],-1,-1,NULL);
  1222.          RefreshGList(gd->gd_Buttons[0],win,NULL,-1);
  1223.       }
  1224.    }
  1225. }
  1226. /*FE*/
  1227. /*FS*/ /*"void setprops(struct GlobalData *gd) "*/
  1228. void setprops(struct GlobalData *gd)
  1229. {
  1230.    ULONG ytop,yvisible,ytotal;
  1231.    ULONG xtop,xvisible,xtotal;
  1232.  
  1233.    if(GetDTAttrs(gd->gd_AGObject,DTA_TopVert      ,&ytop,
  1234.                                  DTA_VisibleVert  ,&yvisible,
  1235.                                  DTA_TotalVert    ,&ytotal,
  1236.                                  DTA_TopHoriz     ,&xtop,
  1237.                                  DTA_VisibleHoriz ,&xvisible,
  1238.                                  DTA_TotalHoriz   ,&xtotal,
  1239.                                  TAG_DONE) == 6)
  1240.    {
  1241.       SetGadgetAttrs(gd->gd_HorizProp,gd->gd_Window,NULL,
  1242.                      PGA_Top      ,xtop,
  1243.                      PGA_Visible  ,xvisible,
  1244.                      PGA_Total    ,xtotal,
  1245.                      TAG_DONE);
  1246.  
  1247.       SetGadgetAttrs(gd->gd_VertProp,gd->gd_Window,NULL,
  1248.                      PGA_Top      ,ytop,
  1249.                      PGA_Visible  ,yvisible,
  1250.                      PGA_Total    ,ytotal,
  1251.                      TAG_DONE);
  1252.    }
  1253. }
  1254. /*FE*/
  1255. /*FS*/ /*"void drawmyline(struct GlobalData *gd) "*/
  1256. void drawmyline(struct GlobalData *gd)
  1257. {
  1258.    struct Window   *win = gd->gd_Window;
  1259.    struct RastPort *rp  = win->RPort;
  1260.    UWORD y = gd->gd_NewGadget.ng_TopEdge - 3;
  1261.  
  1262.    SetDrMd(rp,JAM1);
  1263.    SetAPen(rp,gd->gd_DrawInfo->dri_Pens[SHINEPEN]);
  1264.  
  1265.    Move(rp,win->BorderLeft + 2,y);
  1266.    Draw(rp,win->Width - win->BorderRight - 2,y);
  1267.    SetAPen(rp,gd->gd_DrawInfo->dri_Pens[SHADOWPEN]);
  1268.    Move(rp,win->BorderLeft + 2,y + 1);
  1269.    Draw(rp,win->Width - win->BorderRight - 2,y + 1);
  1270. }
  1271. /*FE*/
  1272.  
  1273. /*FS*/ /*"void handlebuttons(struct GlobalData *gd,struct Gadget *mgad,UWORD add) "*/
  1274. void handlebuttons(struct GlobalData *gd,struct Gadget *mgad,WORD add)
  1275. {
  1276.    struct Window *win   = gd->gd_Window;
  1277.    LONG top;
  1278.  
  1279.    switch(mgad->GadgetID)
  1280.    {
  1281.    case GADID_LeftButton:
  1282.    case GADID_RightButton:
  1283.       if(mgad->GadgetID == GADID_LeftButton)
  1284.          add *= -1;
  1285.  
  1286.       if(GetAttr(PGA_Top,gd->gd_HorizProp,(ULONG *) &top))
  1287.       {
  1288.          top += add;
  1289.  
  1290.          if(top < 0)
  1291.             top = 0;
  1292.  
  1293.          SetGadgetAttrs(gd->gd_HorizProp,win,NULL,PGA_Top,top,TAG_DONE);
  1294.          SetDTAttrs(gd->gd_AGObject,win,NULL,DTA_TopHoriz,top,TAG_DONE);
  1295.       }
  1296.       break;
  1297.    case GADID_UpButton:
  1298.    case GADID_DownButton:
  1299.       /* vertical scroll a little bit slower */
  1300.       add /= 2;
  1301.       if(add == 0)
  1302.          add = 1;
  1303.  
  1304.       if(mgad->GadgetID == GADID_UpButton)
  1305.          add *= -1;
  1306.  
  1307.       if(GetAttr(PGA_Top,gd->gd_VertProp,(ULONG *) &top))
  1308.       {
  1309.          top += add;
  1310.  
  1311.          if(top < 0)
  1312.             top = 0;
  1313.  
  1314.          SetGadgetAttrs(gd->gd_VertProp,win,NULL,PGA_Top,top,TAG_DONE);
  1315.          SetDTAttrs(gd->gd_AGObject,win,NULL,DTA_TopVert,top,TAG_DONE);
  1316.       }
  1317.       break;
  1318.    }
  1319. }
  1320. /*FE*/
  1321. /*FS*/ /*"void handleprops(struct GlobalData *gd,struct Gadget *gad) "*/
  1322. void handleprops(struct GlobalData *gd,struct Gadget *gad)
  1323. {
  1324.    LONG top;
  1325.  
  1326.    if(GetAttr(PGA_Top,gad, (ULONG *) &top))
  1327.    {
  1328.       if(gad->GadgetID == GADID_HorizProp)
  1329.          SetDTAttrs(gd->gd_AGObject,gd->gd_Window,NULL,DTA_TopHoriz,top,TAG_DONE);
  1330.       else
  1331.          SetDTAttrs(gd->gd_AGObject,gd->gd_Window,NULL,DTA_TopVert,top,TAG_DONE);
  1332.    }
  1333. }
  1334. /*FE*/
  1335.  
  1336. /*FS*/ /*"void saveprefs(struct GlobalData *gd,STRPTR path) "*/
  1337. void saveprefs(struct GlobalData *gd,STRPTR path)
  1338. {
  1339.    UBYTE name[MAXPUBSCREENNAME];
  1340.    BPTR fh;
  1341.    
  1342.    if(getpubscreenname(gd->gd_Screen,name))
  1343.    {
  1344.       BPTR lock;
  1345.  
  1346.       if(!(lock = Lock(path,SHARED_LOCK)))
  1347.          lock = CreateDir(path);
  1348.       UnLock(lock);
  1349.  
  1350.       strcpy(gd->gd_TempBuffer,path);
  1351.       if(AddPart(gd->gd_TempBuffer,name,sizeof(gd->gd_TempBuffer)))
  1352.          if((fh = Open(gd->gd_TempBuffer,MODE_NEWFILE)))
  1353.          {
  1354.             UWORD fontlen = strlen(gd->gd_FontName) + 1;
  1355.  
  1356.             /* write window dimensions */
  1357.             Write(fh,&gd->gd_WindowRect   ,sizeof(gd->gd_WindowRect));
  1358.             Write(fh,&gd->gd_WindowAltRect,sizeof(gd->gd_WindowAltRect));
  1359.  
  1360.             /* write actual font */
  1361.             Write(fh,&gd->gd_TextAttr.ta_YSize,sizeof(gd->gd_TextAttr.ta_YSize));
  1362.             Write(fh,&fontlen,sizeof(fontlen));
  1363.             Write(fh,gd->gd_FontName,fontlen);
  1364.             Close(fh);
  1365.          }
  1366.    }
  1367. }
  1368. /*FE*/
  1369. /*FS*/ /*"void loadprefs(struct GlobalData *gd,STRPTR path) "*/
  1370. void loadprefs(struct GlobalData *gd,STRPTR path)
  1371. {
  1372.    UBYTE name[MAXPUBSCREENNAME];
  1373.    BPTR fh;
  1374.    
  1375.    if(getpubscreenname(gd->gd_Screen,name))
  1376.    {
  1377.       strcpy(gd->gd_TempBuffer,path);
  1378.       if(AddPart(gd->gd_TempBuffer,name,sizeof(gd->gd_TempBuffer)))
  1379.          if((fh = Open(gd->gd_TempBuffer,MODE_OLDFILE)))
  1380.          {
  1381.             UWORD fontlen = 0;
  1382.  
  1383.             /* read window dimensions */
  1384.             Read(fh,&gd->gd_WindowRect   ,sizeof(gd->gd_WindowRect));
  1385.             Read(fh,&gd->gd_WindowAltRect,sizeof(gd->gd_WindowAltRect));
  1386.  
  1387.             /* read font setting */
  1388.             Read(fh,&gd->gd_TextAttr.ta_YSize,sizeof(gd->gd_TextAttr.ta_YSize));
  1389.             Read(fh,&fontlen,sizeof(fontlen));
  1390.             Read(fh,gd->gd_FontName,fontlen);
  1391.  
  1392.             Close(fh);
  1393.          }
  1394.    }
  1395. }
  1396. /*FE*/
  1397.  
  1398. /*FS*/ /*"void openfile(struct GlobalData *gd) "*/
  1399. void openfile(struct GlobalData *gd)
  1400. {
  1401.    struct TagItem tags[2] = {
  1402.       {DTA_TopVert,0},
  1403.       {TAG_DONE,}};
  1404.  
  1405.    if(gd->gd_Num == 0)
  1406.       strcpy(gd->gd_FileBuffer,"xref.library_xreffile@main");
  1407.    else if(gd->gd_Num > 1)
  1408.       strcat(gd->gd_FileBuffer,"/main");
  1409.    else
  1410.    {
  1411.       sprintf(gd->gd_FileBuffer,"%s%s/%s",gd->gd_LastEntry.e_Path,
  1412.                                           gd->gd_LastEntry.e_File,
  1413.                                           gd->gd_LastEntry.e_NodeName);
  1414.    }
  1415.  
  1416.    tags[0].ti_Data = gd->gd_LastEntry.e_Line;
  1417.  
  1418.    DB(("node : %s\n"
  1419.          "line : %ld\n",gd->gd_FileBuffer,gd->gd_LastEntry.e_Line));
  1420.  
  1421.    gd->gd_Flags |= GDF_SYNC;
  1422.    DoDTMethod(gd->gd_AGObject,gd->gd_Window,NULL,DTM_GOTO,
  1423.                                                  NULL,
  1424.                                                  gd->gd_FileBuffer,
  1425.                                                  tags);
  1426. }
  1427. /*FE*/
  1428. /*FS*/ /*"void triggermethod(struct GlobalData *gd,ULONG triggermethod) "*/
  1429. void triggermethod(struct GlobalData *gd,ULONG triggermethod)
  1430. {
  1431.    DoDTMethod(gd->gd_AGObject,gd->gd_Window,NULL,
  1432.               DTM_TRIGGER,
  1433.               NULL,
  1434.               triggermethod,
  1435.               NULL);
  1436. }
  1437. /*FE*/
  1438.  
  1439. /*FS*/ /*"void executecmd(struct GlobalData *gd,UWORD cmd) "*/
  1440. void executecmd(struct GlobalData *gd,UWORD cmd)
  1441. {
  1442.    struct Window *win = gd->gd_Window;
  1443.    Object *obj        = gd->gd_AGObject;
  1444.  
  1445.    switch(cmd)
  1446.    {
  1447.    case MYCMD_OPEN:
  1448.       if(filerequest(gd,TXT_OPEN_TITLE,0))
  1449.       {
  1450.          strcat(gd->gd_FileBuffer,"/main");
  1451.          openfile(gd);
  1452.       }
  1453.       break;
  1454.    case MYCMD_SAVEAS:
  1455.       {
  1456.          BPTR fh;
  1457.          if(filerequest(gd,TXT_SAVEAS_TITLE,FRF_DOSAVEMODE))
  1458.             if((fh = Open(gd->gd_FileBuffer,MODE_NEWFILE)))
  1459.             {
  1460.                DoDTMethod(obj,win,NULL,DTM_WRITE,
  1461.                                        NULL,
  1462.                                        fh,
  1463.                                        DTWM_RAW,
  1464.                                        NULL);
  1465.                Close(fh);
  1466.             }
  1467.       }
  1468.       break;
  1469.    case MYCMD_PRINT:
  1470.       break;
  1471.    case MYCMD_ABOUT:
  1472.       easyrequest(gd,TXT_ABOUTTEXT,TXT_CONTINUE,vstring);
  1473.       break;
  1474.    case MYCMD_QUIT:
  1475.       gd->gd_Running = FALSE;
  1476.       break;
  1477.    case MYCMD_COPY:
  1478.       DoDTMethod(obj,win,NULL,DTM_COPY,NULL);
  1479.       break;
  1480.    case MYCMD_CLEARSELECTED:
  1481.       DoDTMethod(obj,win,NULL,DTM_CLEARSELECTED,NULL);
  1482.       break;
  1483.    case MYCMD_MINIMIZE:
  1484.       ChangeWindowBox(win,win->LeftEdge ,win->TopEdge,
  1485.                           win->MinWidth ,win->MinHeight);
  1486.       break;
  1487.    case MYCMD_NORMAL:
  1488.       ChangeWindowBox(win,gd->gd_InitialRect.Left  ,gd->gd_InitialRect.Top,
  1489.                           gd->gd_InitialRect.Width ,gd->gd_InitialRect.Height);
  1490.       break;
  1491.    case MYCMD_MAXIMIZE:
  1492.       ChangeWindowBox(win,0                  ,win->WScreen->BarHeight + 1,
  1493.                           win->WScreen->Width,win->WScreen->Height - win->WScreen->BarHeight - 1);
  1494.       break;
  1495.    case MYCMD_FONTS:
  1496.       fontrequest(gd,TXT_FONT_TITLE);
  1497.       break;
  1498.    case MYCMD_SAVEDEFAULT:
  1499.       saveprefs(gd,arcpath);
  1500.       saveprefs(gd,envpath);
  1501.       break;
  1502.    }
  1503. }
  1504. /*FE*/
  1505.  
  1506. /* -------------------------- support functions --------------------------- */
  1507.  
  1508. /*FS*/ /*"void easyrequest(struct GlobalData *gd,ULONG textid,ULONG gadid,APTR args,...) "*/
  1509. void easyrequest(struct GlobalData *gd,ULONG textid,ULONG gadid,APTR args,...)
  1510. {
  1511.    struct EasyStruct easy;
  1512.  
  1513.    easy.es_StructSize   = sizeof(struct EasyStruct);
  1514.    easy.es_Flags        = 0;
  1515.    easy.es_Title        = prgname;
  1516.    easy.es_TextFormat   = appStrings[textid];
  1517.    easy.es_GadgetFormat = appStrings[gadid];
  1518.  
  1519.    EasyRequestArgs(gd->gd_Window,&easy,NULL,&args);
  1520. }
  1521. /*FE*/
  1522. /*FS*/ /*"BOOL getpubscreenname(struct Screen *screen,STRPTR name) "*/
  1523. BOOL getpubscreenname(struct Screen *screen,STRPTR name)
  1524. {
  1525.    struct PubScreenNode *screennode;
  1526.    struct List *list;
  1527.    BOOL retval = FALSE;
  1528.  
  1529.    if(list = LockPubScreenList())
  1530.       for(screennode = (struct PubScreenNode *) list->lh_Head ;
  1531.           screennode ;
  1532.           screennode = (struct PubScreenNode *) screennode->psn_Node.ln_Succ)
  1533.       {
  1534.          if(screennode->psn_Screen == screen)
  1535.          {
  1536.             strcpy(name,screennode->psn_Node.ln_Name);
  1537.             retval = TRUE;
  1538.             break;
  1539.          }
  1540.       }
  1541.  
  1542.    UnlockPubScreenList();
  1543.  
  1544.    return(retval);
  1545. }
  1546. /*FE*/
  1547. /*FS*/ /*"BOOL filerequest(struct GlobalData *gd,ULONG titleid,ULONG flags) "*/
  1548. BOOL filerequest(struct GlobalData *gd,ULONG titleid,ULONG flags)
  1549. {
  1550.    struct FileRequester *filereq;
  1551.    BOOL retval = FALSE;
  1552.  
  1553.    if(AslBase)
  1554.       if(filereq=AllocAslRequestTags(ASL_FileRequest,
  1555.                                      ASLFR_Flags1,          flags | FRF_DOPATTERNS,
  1556.                                      ASLFR_Window,          gd->gd_Window,
  1557.                                      ASLFR_TitleText,       appStrings[titleid],
  1558.                                      ASLFR_InitialDrawer,   gd->gd_Directory,
  1559.                                      ASLFR_InitialFile,     FilePart(gd->gd_FileBuffer),
  1560.                                      ASLFR_InitialHeight,   gd->gd_Screen->Height - 50,
  1561.                                      TAG_DONE))
  1562.       {
  1563.          if(retval = AslRequest(filereq,NULL))
  1564.          {
  1565.             strcpy(gd->gd_Directory,filereq->rf_Dir);
  1566.             strcpy(gd->gd_FileBuffer,filereq->rf_Dir);
  1567.             if(!AddPart(gd->gd_FileBuffer,filereq->rf_File,sizeof(gd->gd_FileBuffer)))
  1568.                retval = FALSE;
  1569.  
  1570.          }
  1571.          FreeAslRequest(filereq);
  1572.       }
  1573.    return(retval);
  1574. }
  1575. /*FE*/
  1576. /*FS*/ /*"void fontrequest(struct GlobalData *gd,ULONG titleid) "*/
  1577. void fontrequest(struct GlobalData *gd,ULONG titleid)
  1578. {
  1579.    struct FontRequester *fontreq;
  1580.  
  1581.    if(AslBase)
  1582.       if(fontreq = AllocAslRequestTags(ASL_FontRequest,
  1583.                                        ASLFO_Window         ,gd->gd_Window,
  1584.                                        ASLFO_TitleText      ,appStrings[titleid],
  1585.                                        ASLFO_InitialName    ,gd->gd_TextAttr.ta_Name,
  1586.                                        ASLFO_InitialSize    ,gd->gd_TextAttr.ta_YSize,
  1587.                                        ASLFO_InitialStyle   ,gd->gd_TextAttr.ta_Style,
  1588.                                        ASLFO_InitialHeight  ,gd->gd_Screen->Height - 50,
  1589.                                        TAG_DONE))
  1590.       {
  1591.          if(AslRequest(fontreq,NULL))
  1592.          {
  1593.             strcpy(gd->gd_FontName,fontreq->fo_Attr.ta_Name);
  1594.             gd->gd_TextAttr.ta_YSize = fontreq->fo_Attr.ta_YSize;
  1595.  
  1596.             if(gd->gd_TextFont)
  1597.                CloseFont(gd->gd_TextFont);
  1598.  
  1599.             gd->gd_TextFont = NULL;
  1600.  
  1601.             if((gd->gd_TextFont = OpenFont(&gd->gd_TextAttr)))
  1602.             {
  1603.                DB(("set new font\n"));
  1604.                SetDTAttrs(gd->gd_AGObject,gd->gd_Window,NULL,DTA_TextAttr,&gd->gd_TextAttr,TAG_DONE);
  1605.  
  1606.                DoDTMethod(gd->gd_AGObject,gd->gd_Window,NULL,GM_LAYOUT,NULL,0);
  1607.             }
  1608.  
  1609.          }
  1610.          FreeAslRequest(fontreq);
  1611.       }
  1612. }
  1613. /*FE*/
  1614. /*FS*/ /*"void setwindowpointer(struct GlobalData *gd,BOOL busy) "*/
  1615. void setwindowpointer(struct GlobalData *gd,BOOL busy)
  1616. {
  1617.    if(busy)
  1618.       SetWindowPointer(gd->gd_Window,WA_BusyPointer,TRUE,TAG_DONE);
  1619.    else
  1620.       SetWindowPointer(gd->gd_Window,TAG_DONE);
  1621. }
  1622. /*FE*/
  1623. /*FS*//*"UWORD calctexts(struct GlobalData *gd, struct RastPort *rp, UBYTE **texts)"*/
  1624. UWORD calctexts(struct GlobalData *gd, struct RastPort *rp, UBYTE **texts)
  1625. {
  1626.    USHORT i,max,x;
  1627.  
  1628.    for(i=0,max=0;texts[i];i++)
  1629.    {
  1630.       x = TextLength(rp,texts[i],strlen((char*)texts[i]));
  1631.       if (x>max) max=x;
  1632.    }
  1633.    return(max);
  1634. }
  1635. /*FE*/
  1636.  
  1637. /* ---------------------------- main function ----------------------------- */
  1638.  
  1639. /*FS*/ /*"int main(int ac,char *av[]) "*/
  1640. int main(int ac,char *av[])
  1641. {
  1642.    struct ExtRDArgs eargs = {NULL};
  1643.    struct GlobalData *gd;
  1644.  
  1645.    ULONG para[ARG_MAX];
  1646.    STRPTR obj = prgname;
  1647.    LONG err;
  1648.  
  1649.    LONG i;
  1650.  
  1651.    /* clear args buffer */
  1652.    for(i = 0 ; i < ARG_MAX ; i++)
  1653.       para[i] = 0;
  1654.  
  1655.    eargs.erda_Template      = template;
  1656.    eargs.erda_Parameter     = para;
  1657.    eargs.erda_FileParameter = ARG_FILE;
  1658.  
  1659.    if((err = ExtReadArgs(ac,av,&eargs)) == 0)
  1660.    {
  1661.       if(gd = AllocMem(sizeof(struct GlobalData) , MEMF_CLEAR))
  1662.       {
  1663.          if((GfxBase = OpenLibrary("graphics.library",39)))
  1664.          {
  1665.             obj = "xref.library";
  1666.             if(XRefBase = OpenLibrary(obj,0))
  1667.             {
  1668.                GetCurrentDirName(gd->gd_Directory,sizeof(gd->gd_Directory));
  1669.  
  1670.                getstdargs(gd,para);
  1671.  
  1672.                /* use cache dir as default asl dir */
  1673.                if(para[ARG_CACHEDIR])
  1674.                   strcpy(gd->gd_Directory,(STRPTR) para[ARG_CACHEDIR]);
  1675.  
  1676.                /* get system defautl font */
  1677.                #undef  GfxBase
  1678.                gd->gd_TextFont = ((struct GfxBase *) gd->gd_GfxBase)->DefaultFont;
  1679.                #define GfxBase gd->gd_GfxBase
  1680.  
  1681.                strcpy(gd->gd_FontName,gd->gd_TextFont->tf_Message.mn_Node.ln_Name);
  1682.  
  1683.                gd->gd_TextAttr.ta_Name  = gd->gd_FontName;
  1684.                gd->gd_TextAttr.ta_YSize = gd->gd_TextFont->tf_YSize;
  1685.                gd->gd_TextAttr.ta_Style = gd->gd_TextFont->tf_Style;
  1686.                gd->gd_TextAttr.ta_Flags = gd->gd_TextFont->tf_Flags;
  1687.  
  1688.                /* get user defined font */
  1689.                if(para[ARG_FONTNAME])
  1690.                {
  1691.                   gd->gd_Flags |= GDF_FORCEFONT;
  1692.  
  1693.                   strcpy(gd->gd_FontName,(STRPTR) para[ARG_FONTNAME]);
  1694.                   gd->gd_TextAttr.ta_Style = FS_NORMAL;
  1695.                   gd->gd_TextAttr.ta_Flags = 0;
  1696.                }
  1697.  
  1698.                if(para[ARG_FONTSIZE])
  1699.                   gd->gd_TextAttr.ta_YSize = *((LONG *) para[ARG_FONTSIZE]);
  1700.  
  1701.                parsexref(gd);
  1702.  
  1703.                openamigaguide(gd);
  1704.  
  1705.                /* last object that caused an error */
  1706.                obj = gd->gd_Object;
  1707.                err = gd->gd_Error;
  1708.  
  1709.                /* delete all tempory files */
  1710.                while(gd->gd_TempCount > 0)
  1711.                {
  1712.                   gd->gd_TempCount--;
  1713.                   DeleteFile(tmpname(gd));
  1714.                   gd->gd_TempCount--;
  1715.                }
  1716.                CloseLibrary(XRefBase);
  1717.             }
  1718.             CloseLibrary(GfxBase);
  1719.          }
  1720.          FreeMem(gd,sizeof(struct GlobalData));
  1721.       } else
  1722.          err = ERROR_NO_FREE_STORE;
  1723.    }
  1724.    ExtFreeArgs(&eargs);
  1725.  
  1726.    if(!err)
  1727.       err = IoErr();
  1728.  
  1729.    if(err)
  1730.    {
  1731.       if(ac == 0)
  1732.          showerror(prgname,obj,err);
  1733.       else
  1734.          PrintFault(err,obj);
  1735.       return(RETURN_ERROR);
  1736.    }
  1737.  
  1738.    return(RETURN_OK);
  1739. }
  1740. /*FE*/
  1741.  
  1742.