home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 (Alt) / MACD 5.bin / workbench / libs / intuisup.lha / Intuisup / source.lha / Editor / source.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-06  |  39.2 KB  |  1,503 lines

  1. /* $Revision Header *** Header built automatically - do not edit! ***********
  2.  *
  3.  *    (C) Copyright 1991 by Torsten Jürgeleit
  4.  *
  5.  *    Name .....: source.c
  6.  *    Created ..: Sunday 22-Dec-91 21:35:45
  7.  *    Revision .: 0
  8.  *
  9.  *    Date        Author                 Comment
  10.  *    =========   ====================   ====================
  11.  *    02-Oct-92   Michael Bjerking       New realese, better Screen/Window editor
  12.  *    22-Dec-91   Torsten Jürgeleit      Created this file!
  13.  *
  14.  ****************************************************************************
  15.  *
  16.  *    C source code generator
  17.  *
  18.  * $Revision Header ********************************************************/
  19.  
  20.  /* Includes */
  21.  
  22. #include "includes.h"
  23. #include "defines.h"
  24. #include "imports.h"
  25. #include "protos.h"
  26.  
  27.  /* Defines */
  28.  
  29. #define GADGET_TEXT    (gads ? gad_y : gad_n)
  30. #define GADGET_ALL(x) (((x) & GADGET_IDCMP_FLAGS_ALL) && (IDCMPflags & GADGET_IDCMP_FLAGS_ALL))
  31.  
  32.  /* Defines for source title */
  33.  
  34. #define SOURCE_TITLE_LEFT_EDGE    0
  35. #define SOURCE_TITLE_TOP_EDGE    5
  36. #define SOURCE_TITLE_TYPE    TEXT_DATA_TYPE_TEXT
  37. #define SOURCE_TITLE_FLAGS    (TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_BOLD)
  38. #define SOURCE_TITLE_TEXT    "Save C source code of project"
  39. #define SOURCE_TITLE_TEXT_ATTR    &topaz80_attr
  40.  
  41.  /* Defines for source gadgets */
  42.  
  43. #define SOURCE_SELECTION_OK    1
  44.  
  45. #define SOURCE_GADGET_OK    0
  46. #define SOURCE_GADGET_CANCEL    1
  47. #define SOURCE_GADGET_ID    2
  48. #define SOURCE_GADGET_STATIC    3
  49. #define SOURCE_GADGET_INNER    4
  50. #define SOURCE_GADGET_WINDOW    5
  51. #define SOURCE_GADGET_PROGRAM    6
  52.  
  53. #define SOURCE_GADGET1_TYPE        GADGET_DATA_TYPE_BUTTON
  54. #define SOURCE_GADGET1_FLAGS        GADGET_DATA_FLAG_HOTKEY
  55. #define SOURCE_GADGET1_TEXT        "_Ok"
  56. #define SOURCE_GADGET1_LEFT_EDGE    ((EDITOR_WINDOW_WIDTH / 2 - SOURCE_GADGET1_WIDTH) / 2)
  57. #define SOURCE_GADGET1_TOP_EDGE        (EDITOR_WINDOW_HEIGHT - SOURCE_GADGET1_HEIGHT - 5)
  58. #define SOURCE_GADGET1_WIDTH        ((6 + 2) * 8)
  59. #define SOURCE_GADGET1_HEIGHT        15
  60. #define SOURCE_GADGET1_TEXT_ATTR    &topaz80_attr
  61.  
  62. #define SOURCE_GADGET2_TYPE        GADGET_DATA_TYPE_BUTTON
  63. #define SOURCE_GADGET2_FLAGS        GADGET_DATA_FLAG_HOTKEY
  64. #define SOURCE_GADGET2_TEXT        "_Cancel"
  65. #define SOURCE_GADGET2_LEFT_EDGE    (EDITOR_WINDOW_WIDTH / 2 + (EDITOR_WINDOW_WIDTH / 2 - SOURCE_GADGET1_WIDTH) / 2)
  66. #define SOURCE_GADGET2_TOP_EDGE        (EDITOR_WINDOW_HEIGHT - SOURCE_GADGET1_HEIGHT - 5)
  67. #define SOURCE_GADGET2_WIDTH        SOURCE_GADGET1_WIDTH
  68. #define SOURCE_GADGET2_HEIGHT        SOURCE_GADGET1_HEIGHT
  69. #define SOURCE_GADGET2_TEXT_ATTR    &topaz80_attr
  70.  
  71. #define SOURCE_GADGET3_TYPE        GADGET_DATA_TYPE_STRING
  72. #define SOURCE_GADGET3_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_LEFT)
  73. #define SOURCE_GADGET3_LEFT_EDGE    (110 + (10 + 1) * 8)
  74. #define SOURCE_GADGET3_TOP_EDGE        22
  75. #define SOURCE_GADGET3_WIDTH        76
  76. #define SOURCE_GADGET3_HEIGHT        12
  77. #define SOURCE_GADGET3_TEXT        "Project I_D"
  78. #define SOURCE_GADGET3_TEXT_ATTR    &topaz80_attr
  79. #define SOURCE_GADGET3_INPUT_LEN    MAX_PROJECT_ID_LEN
  80. #define SOURCE_GADGET3_INPUT_ACTIVATE    0
  81. #define SOURCE_GADGET3_INPUT_DEFAULT    NULL
  82.  
  83. #define SOURCE_GADGET4_TYPE        GADGET_DATA_TYPE_CHECK
  84. #define SOURCE_GADGET4_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  85. #define SOURCE_GADGET4_TEXT        "_Static data"
  86. #define SOURCE_GADGET4_LEFT_EDGE    (SOURCE_GADGET3_LEFT_EDGE + SOURCE_GADGET3_WIDTH + 50)
  87. #define SOURCE_GADGET4_TOP_EDGE        (SOURCE_GADGET3_TOP_EDGE + 1)
  88. #define SOURCE_GADGET4_WIDTH        0
  89. #define SOURCE_GADGET4_HEIGHT        0
  90. #define SOURCE_GADGET4_TEXT_ATTR    &topaz80_attr
  91.  
  92. #define SOURCE_GADGET5_TYPE        GADGET_DATA_TYPE_CHECK
  93. #define SOURCE_GADGET5_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  94. #define SOURCE_GADGET5_TEXT        "_Inner window"
  95. #define SOURCE_GADGET5_LEFT_EDGE    SOURCE_GADGET4_LEFT_EDGE
  96. #define SOURCE_GADGET5_TOP_EDGE        (SOURCE_GADGET4_TOP_EDGE + 16)
  97. #define SOURCE_GADGET5_WIDTH        0
  98. #define SOURCE_GADGET5_HEIGHT        0
  99. #define SOURCE_GADGET5_TEXT_ATTR    &topaz80_attr
  100.  
  101. #define SOURCE_GADGET6_TYPE        GADGET_DATA_TYPE_CHECK
  102. #define SOURCE_GADGET6_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  103. #define SOURCE_GADGET6_TEXT        "_Window"
  104. #define SOURCE_GADGET6_LEFT_EDGE    SOURCE_GADGET5_LEFT_EDGE
  105. #define SOURCE_GADGET6_TOP_EDGE        (SOURCE_GADGET5_TOP_EDGE + 16)
  106. #define SOURCE_GADGET6_WIDTH        0
  107. #define SOURCE_GADGET6_HEIGHT        0
  108. #define SOURCE_GADGET6_TEXT_ATTR    &topaz80_attr
  109.  
  110. #define SOURCE_GADGET7_TYPE        GADGET_DATA_TYPE_CHECK
  111. #define SOURCE_GADGET7_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  112. #define SOURCE_GADGET7_TEXT        "_Program"
  113. #define SOURCE_GADGET7_LEFT_EDGE    SOURCE_GADGET6_LEFT_EDGE
  114. #define SOURCE_GADGET7_TOP_EDGE        (SOURCE_GADGET6_TOP_EDGE + 16)
  115. #define SOURCE_GADGET7_WIDTH        0
  116. #define SOURCE_GADGET7_HEIGHT        0
  117. #define SOURCE_GADGET7_TEXT_ATTR    &topaz80_attr
  118.  
  119.  /* Statics for source requester */
  120.  
  121. STATIC struct GadgetData source_gadget_data[]=
  122. {
  123.     {
  124.         SOURCE_GADGET1_TYPE,    /* gd_Type */
  125.         SOURCE_GADGET1_FLAGS,    /* gd_Flags */
  126.         SOURCE_GADGET1_LEFT_EDGE,        /* gd_LeftEdge */
  127.         SOURCE_GADGET1_TOP_EDGE,/* gd_TopEdge */
  128.         SOURCE_GADGET1_WIDTH,    /* gd_Width */
  129.         SOURCE_GADGET1_HEIGHT,    /* gd_Height */
  130.         SOURCE_GADGET1_TEXT,    /* *gd_Text */
  131.         SOURCE_GADGET1_TEXT_ATTR,        /* *gd_TextAttr */
  132.         {0, 0, 0}
  133.     },
  134.     {
  135.         SOURCE_GADGET2_TYPE,    /* gd_Type */
  136.         SOURCE_GADGET2_FLAGS,    /* gd_Flags */
  137.         SOURCE_GADGET2_LEFT_EDGE,        /* gd_LeftEdge */
  138.         SOURCE_GADGET2_TOP_EDGE,/* gd_TopEdge */
  139.         SOURCE_GADGET2_WIDTH,    /* gd_Width */
  140.         SOURCE_GADGET2_HEIGHT,    /* gd_Height */
  141.         SOURCE_GADGET2_TEXT,    /* *gd_Text */
  142.         SOURCE_GADGET2_TEXT_ATTR,        /* *gd_TextAttr */
  143.         {0, 0, 0}
  144.     },
  145.     {
  146.         SOURCE_GADGET3_TYPE,    /* gd_Type */
  147.         SOURCE_GADGET3_FLAGS,    /* gd_Flags */
  148.         SOURCE_GADGET3_LEFT_EDGE,        /* gd_LeftEdge */
  149.         SOURCE_GADGET3_TOP_EDGE,/* gd_TopEdge */
  150.         SOURCE_GADGET3_WIDTH,    /* gd_Width */
  151.         SOURCE_GADGET3_HEIGHT,    /* gd_Height */
  152.         SOURCE_GADGET3_TEXT,    /* *gd_Text */
  153.         SOURCE_GADGET3_TEXT_ATTR,        /* *gd_TextAttr */
  154.         {
  155.             SOURCE_GADGET3_INPUT_LEN,    /* gd_InputLen */
  156.             SOURCE_GADGET3_INPUT_ACTIVATE,        /* gd_InputActivate */
  157.             SOURCE_GADGET3_INPUT_DEFAULT        /* gd_InputDefault */
  158.         }
  159.     },
  160.     {
  161.         SOURCE_GADGET4_TYPE,    /* gd_Type */
  162.         SOURCE_GADGET4_FLAGS,    /* gd_Flags */
  163.         SOURCE_GADGET4_LEFT_EDGE,        /* gd_LeftEdge */
  164.         SOURCE_GADGET4_TOP_EDGE,/* gd_TopEdge */
  165.         SOURCE_GADGET4_WIDTH,    /* gd_Width */
  166.         SOURCE_GADGET4_HEIGHT,    /* gd_Height */
  167.         SOURCE_GADGET4_TEXT,    /* *gd_Text */
  168.         SOURCE_GADGET4_TEXT_ATTR,        /* *gd_TextAttr */
  169.         {0, 0, 0}
  170.     },
  171.     {
  172.         SOURCE_GADGET5_TYPE,    /* gd_Type */
  173.         SOURCE_GADGET5_FLAGS,    /* gd_Flags */
  174.         SOURCE_GADGET5_LEFT_EDGE,        /* gd_LeftEdge */
  175.         SOURCE_GADGET5_TOP_EDGE,/* gd_TopEdge */
  176.         SOURCE_GADGET5_WIDTH,    /* gd_Width */
  177.         SOURCE_GADGET5_HEIGHT,    /* gd_Height */
  178.         SOURCE_GADGET5_TEXT,    /* *gd_Text */
  179.         SOURCE_GADGET5_TEXT_ATTR,        /* *gd_TextAttr */
  180.         {0, 0, 0}
  181.     },
  182.     {
  183.         SOURCE_GADGET6_TYPE,    /* gd_Type */
  184.         SOURCE_GADGET6_FLAGS,    /* gd_Flags */
  185.         SOURCE_GADGET6_LEFT_EDGE,        /* gd_LeftEdge */
  186.         SOURCE_GADGET6_TOP_EDGE,/* gd_TopEdge */
  187.         SOURCE_GADGET6_WIDTH,    /* gd_Width */
  188.         SOURCE_GADGET6_HEIGHT,    /* gd_Height */
  189.         SOURCE_GADGET6_TEXT,    /* *gd_Text */
  190.         SOURCE_GADGET6_TEXT_ATTR,        /* *gd_TextAttr */
  191.         {0, 0, 0}
  192.     },
  193.     {
  194.         SOURCE_GADGET7_TYPE,    /* gd_Type */
  195.         SOURCE_GADGET7_FLAGS,    /* gd_Flags */
  196.         SOURCE_GADGET7_LEFT_EDGE,        /* gd_LeftEdge */
  197.         SOURCE_GADGET7_TOP_EDGE,/* gd_TopEdge */
  198.         SOURCE_GADGET7_WIDTH,    /* gd_Width */
  199.         SOURCE_GADGET7_HEIGHT,    /* gd_Height */
  200.         SOURCE_GADGET7_TEXT,    /* *gd_Text */
  201.         SOURCE_GADGET7_TEXT_ATTR,        /* *gd_TextAttr */
  202.         {0, 0, 0}
  203.     },
  204.     {
  205.         INTUISUP_DATA_END        /* mark end of gadget data */
  206.     }
  207. };
  208.  /* Save project as C source code */
  209.  
  210. SHORT
  211. save_c_source(VOID)
  212. {
  213.     struct TemplateList *tl = &template_list;
  214.     struct GadgetData *gd = &source_gadget_data[0];
  215.     APTR gl;
  216.     USHORT flags = tl->tl_Flags;
  217.     SHORT status;
  218.  
  219.     /* Init gadgets with current project data */
  220.     (gd + SOURCE_GADGET_ID)->gd_SpecialData.gd_InputData.gd_InputDefault = &tl->tl_ProjectID[0];
  221.     (gd + SOURCE_GADGET_STATIC)->gd_SpecialData.gd_CheckData.gd_CheckSelected = (flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ? 1 : 0);
  222.     (gd + SOURCE_GADGET_INNER)->gd_SpecialData.gd_CheckData.gd_CheckSelected = (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ? 1 : 0);
  223.     (gd + SOURCE_GADGET_WINDOW)->gd_SpecialData.gd_CheckData.gd_CheckSelected = (flags & TEMPLATE_LIST_FLAG_SOURCE_WINDOW ? 1 : 0);
  224.     (gd + SOURCE_GADGET_PROGRAM)->gd_SpecialData.gd_CheckData.gd_CheckSelected = (flags & TEMPLATE_LIST_FLAG_SOURCE_PROGRAM ? 1 : 0);
  225.  
  226.     /* Print title and display gadgets */
  227.     IClearWindow(eri, ewin, 0, 0, EDITOR_WINDOW_WIDTH, EDITOR_WINDOW_HEIGHT,
  228.                  0);
  229.     IPrintText(eri, ewin, SOURCE_TITLE_TEXT, SOURCE_TITLE_LEFT_EDGE,
  230.                SOURCE_TITLE_TOP_EDGE, SOURCE_TITLE_TYPE, SOURCE_TITLE_FLAGS,
  231.                SOURCE_TITLE_TEXT_ATTR);
  232.     if (!(gl = ICreateGadgets(eri, &source_gadget_data[0], 0, 0, NULL)))
  233.     {
  234.         status = EDITOR_ERROR_OUT_OF_MEM;
  235.     }
  236.     else
  237.     {
  238.         IDisplayGadgets(ewin, gl);
  239.         status = save_c_source_action(gl, tl);
  240.         IRemoveGadgets(gl);
  241.         IFreeGadgets(gl);
  242.  
  243.         /* Generate C source */
  244.         if (status == SOURCE_SELECTION_OK)
  245.         {
  246.             status = generate_c_source(tl);
  247.         }
  248.     }
  249.     return (status);
  250. }
  251.  
  252.  /* Perform action for source code generator */
  253.  
  254. STATIC SHORT
  255. save_c_source_action(APTR gl, struct TemplateList * tl)
  256. {
  257.     struct MsgPort *up = ewin->UserPort;
  258.     BYTE *id = NULL;
  259.     USHORT flags = tl->tl_Flags;
  260.     BOOL keepon = TRUE;
  261.     SHORT status = EDITOR_STATUS_NORMAL;
  262.  
  263.     do
  264.     {
  265.         struct IntuiMessage *msg;
  266.  
  267.         WaitPort(up);
  268.         while (msg = IGetMsg(up))
  269.         {
  270.             ULONG value;
  271.  
  272.             switch (msg->Class)
  273.             {
  274.             case CLOSEWINDOW:
  275.                 status = EDITOR_STATUS_QUIT;
  276.                 keepon = FALSE;
  277.                 break;
  278.  
  279.             case ISUP_ID:
  280.                 value = (ULONG) msg->IAddress;
  281.                 switch (msg->Code)
  282.                 {
  283.                 case SOURCE_GADGET_OK:
  284.  
  285.                     /* Change template list data */
  286.                     if (id)
  287.                     {
  288.                         strcpy(&tl->tl_ProjectID[0], id);
  289.                     }
  290.                     tl->tl_Flags = flags;
  291.  
  292.                     /* Set status to generate C source code */
  293.                     status = SOURCE_SELECTION_OK;
  294.                     keepon = FALSE;
  295.                     break;
  296.  
  297.                 case SOURCE_GADGET_CANCEL:
  298.                     keepon = FALSE;
  299.                     break;
  300.  
  301.                 case SOURCE_GADGET_ID:
  302.                     id = (BYTE *) value;
  303.                     flags |= TEMPLATE_LIST_FLAG_CHANGED;
  304.                     break;
  305.  
  306.                 case SOURCE_GADGET_STATIC:
  307.                     if (value)
  308.                     {
  309.                         flags |= TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA;
  310.                     }
  311.                     else
  312.                     {
  313.                         flags &= ~TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA;
  314.                     }
  315.                     flags |= TEMPLATE_LIST_FLAG_CHANGED;
  316.                     break;
  317.  
  318.                 case SOURCE_GADGET_INNER:
  319.                     if (value)
  320.                     {
  321.                         flags |= TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW;
  322.                     }
  323.                     else
  324.                     {
  325.                         flags &= ~TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW;
  326.                     }
  327.                     flags |= TEMPLATE_LIST_FLAG_CHANGED;
  328.                     break;
  329.  
  330.                 case SOURCE_GADGET_WINDOW:
  331.                     if (value)
  332.                     {
  333.                         flags |= TEMPLATE_LIST_FLAG_SOURCE_WINDOW;
  334.                     }
  335.                     else
  336.                     {
  337.                         flags &= ~TEMPLATE_LIST_FLAG_SOURCE_WINDOW;
  338.                     }
  339.                     flags |= TEMPLATE_LIST_FLAG_CHANGED;
  340.                     break;
  341.  
  342.                 case SOURCE_GADGET_PROGRAM:
  343.                     if (value)
  344.                     {
  345.                         flags |= TEMPLATE_LIST_FLAG_SOURCE_PROGRAM;
  346.                         if (!(flags & TEMPLATE_LIST_FLAG_SOURCE_WINDOW))
  347.                         {
  348.                             flags |= TEMPLATE_LIST_FLAG_SOURCE_WINDOW;
  349.                             ISetGadgetAttributes(gl, SOURCE_GADGET_WINDOW,
  350.                                                  0L, 0L, 1L, USE_CURRENT_VALUE,
  351.                                                  (VOID *) USE_CURRENT_VALUE);
  352.                         }
  353.                     }
  354.                     else
  355.                     {
  356.                         flags &= ~TEMPLATE_LIST_FLAG_SOURCE_PROGRAM;
  357.                     }
  358.                     flags |= TEMPLATE_LIST_FLAG_CHANGED;
  359.                     break;
  360.                 }
  361.                 break;
  362.             }
  363.             IReplyMsg(msg);
  364.         }
  365.     }
  366.     while (keepon == TRUE);
  367.     return (status);
  368. }
  369.  
  370.  /* C source code generator */
  371.  
  372. STATIC SHORT
  373. generate_c_source(struct TemplateList * tl)
  374. {
  375.     struct rtFileRequester *freq = csource_file_requester;
  376.     SHORT status = EDITOR_STATUS_NORMAL;
  377.     BYTE filename[256], buf[256];        /* <- should define a constant */
  378.  
  379.     /* Display ReqTools file requester and check if user selected cancel */
  380.     IChangeMousePointer(ewin, NULL, FALSE);
  381.  
  382.     if (rtFileRequest(freq, filename, CSOURCE_SAVE_HAIL_TEXT, TAG_END))
  383.     {
  384.         struct TemplateList *tl = &template_list;
  385.         FILE *fh;
  386.         SHORT len = strlen(filename) - 2;
  387.  
  388.         /* Prepare file name */
  389.         if (len < 1 || strcmp(filename + len, ".c"))
  390.         {
  391.             strcat(filename, ".c");
  392.             len += 2;
  393.         }
  394.  
  395.         /* filename = path + name */
  396.         if (strlen(freq->Dir) > 0)
  397.         {
  398.             strcpy(buf, filename);
  399.             if (strncmp(buf + strlen(buf) - 1, ":", (size_t) 1) == 0)
  400.                 sprintf(filename, "%s/%s", freq->Dir, buf);
  401.             else
  402.                 sprintf(filename, "%s%s", freq->Dir, buf);
  403.         }
  404.  
  405.         /* Check if file already exists and inform user */
  406.         if (fh = fopen(filename, "r"))
  407.             fclose(fh);
  408.  
  409.         if (!fh || ok_cancel_requester(" Save C source ", "File already"
  410.                                        " exists.\\n\\nDo you really want to overwrite?") == TRUE)
  411.         {
  412.  
  413.             /* Open file and write C source */
  414.             if (!(fh = fopen(filename, "w+")))
  415.             {
  416.                 status = EDITOR_ERROR_OPEN_FAILED;
  417.             }
  418.             else
  419.             {
  420.                 if ((status = write_project_window(fh, tl)) ==
  421.                     EDITOR_STATUS_NORMAL)
  422.                 {
  423.                     if ((status = write_project_borders(fh, tl)) ==
  424.                         EDITOR_STATUS_NORMAL)
  425.                     {
  426.                         if ((status = write_project_fonts(fh, tl)) ==
  427.                             EDITOR_STATUS_NORMAL)
  428.                         {
  429.                             if ((status = write_project_texts(fh, tl)) ==
  430.                                 EDITOR_STATUS_NORMAL)
  431.                             {
  432.                                 if ((status = write_project_gadgets(fh, tl)) ==
  433.                                     EDITOR_STATUS_NORMAL)
  434.                                 {
  435.                                     status = write_project_program(fh, tl);
  436.                                 }
  437.                             }
  438.                         }
  439.                     }
  440.                 }
  441.                 fclose(fh);
  442.  
  443.                 /* If any error then delete incomplete C source file */
  444.                 if (status != EDITOR_STATUS_NORMAL)
  445.                 {
  446.                     DeleteFile(filename);
  447.                 }
  448.             }
  449.         }
  450.     }
  451.     IRestoreMousePointer(ewin);
  452.     if (status != EDITOR_STATUS_NORMAL)
  453.     {
  454.         show_error(status);
  455.     }
  456.     return (status);
  457. }
  458.  
  459.  /* Write project window data to save file */
  460.  
  461. STATIC SHORT
  462. write_project_window(FILE * fh, struct TemplateList * tl)
  463. {
  464.     USHORT flags = tl->tl_Flags;
  465.     ULONG IDCMPflags = tl->tl_IDCMPFlags, WINflags = pwin->Flags;
  466.     SHORT status = EDITOR_STATUS_NORMAL;
  467.  
  468.     if (fprintf(fh, "\t\t/* Project: %s */\n\n", &tl->tl_ProjectName[0]) == -1L)
  469.     {
  470.         status = EDITOR_ERROR_WRITE_FAILED;
  471.     }
  472.  
  473.     if (status == EDITOR_STATUS_NORMAL && flags & TEMPLATE_LIST_FLAG_SOURCE_PROGRAM)
  474.     {
  475.         if (fprintf(fh,
  476.                     "\t/* Includes */\n\n"
  477.                     "#include <exec/types.h>\n"
  478.                     "#include <exec/lists.h>\n"
  479.                     "#include <intuition/intuition.h>\n"
  480.                     "#include <libraries/intuisup.h>\n"
  481.                     "#ifdef AZTEC_C\n"
  482.                     "#include <functions.h>\n"
  483.                     "#endif\n"
  484.                     "#ifdef LATTICE\n"
  485.                     "#include <proto/all.h>\n"
  486.                     "#endif\n\n"
  487.             )== -1L)
  488.         {
  489.             status = EDITOR_ERROR_WRITE_FAILED;
  490.         }
  491.     }
  492.  
  493.     if (status == EDITOR_STATUS_NORMAL && flags & TEMPLATE_LIST_FLAG_SOURCE_WINDOW)
  494.     {
  495.         struct Window *win = pwin;
  496.         BYTE id[MAX_PROJECT_ID_LEN];
  497.  
  498.         lower_string(&tl->tl_ProjectID[0], &id[0]);
  499.         if (fprintf(fh,
  500.                     "\t/* Defines and data for window */\n\n"
  501.                     "#define RENDER_INFO_FLAGS  %d\n"
  502.                     "#define OPEN_WINDOW_FLAGS  %d\n\n"
  503.                     "#define WINDOW_LEFT_EDGE   %d\n"
  504.                     "#define WINDOW_TOP_EDGE    %d\n"
  505.                     "#define WINDOW_WIDTH       %d\n"
  506.                     "#define WINDOW_HEIGHT      %d\n\n"
  507.                     "%sstruct NewWindow  %s_new_window = {\n"
  508.                     "    WINDOW_LEFT_EDGE, WINDOW_TOP_EDGE, WINDOW_WIDTH, WINDOW_HEIGHT,\n"
  509.                     "    %d, %d,\n"
  510.                     "%s"
  511.                     "%s"
  512.                     "%s"
  513.                     "%s"
  514.                     "%s"
  515.                     "%s"
  516.                     "%s"
  517.                     "%s"
  518.                     "%s"
  519.                     "%s"
  520.                     "%s"
  521.                     "%s"
  522.                     "%s"
  523.                     "%s"
  524.                     "%s"
  525.                     "%s"
  526.                     "%s"
  527.                     "%s"
  528.                     "%s"
  529.                     "%s"
  530.                     "%s"
  531.                     "%s"
  532.                     "%s"
  533.                     "%s,\n"
  534.  
  535.                     "%s"
  536.                     "%s"
  537.                     "%s"
  538.                     "%s"
  539.                     "%s"
  540.                     "%s"
  541.                     "%s"
  542.                     "%s"
  543.                     "%s"
  544.                     "%s"
  545.                     "%s"
  546.                     "%s"
  547.                     "%s"
  548.                     "%s,\n"
  549.  
  550.                     "    NULL, NULL,\n"
  551.                     "    (UBYTE *)\"%s\",\n"
  552.                     "    NULL, NULL,\n"
  553.                     "    %d, %d, %d, %d,\n"
  554.                     "    WBENCHSCREEN\n"
  555.                     "};\n",
  556.  
  557.                     ((flags & TEMPLATE_LIST_FLAG_SOURCE_INNER ? RENDER_INFO_FLAG_INNER_WINDOW : 0) | (flags & TEMPLATE_LIST_FLAG_BACK_FILL ? RENDER_INFO_FLAG_BACK_FILL : 0)),
  558.                     (flags & TEMPLATE_LIST_FLAG_RENDER_COLORS ? OPEN_WINDOW_FLAG_RENDER_PENS : 0),
  559.                     win->LeftEdge,
  560.                     win->TopEdge,
  561.                     (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ? win->Width - win->BorderLeft - win->BorderRight : win->Width),
  562.                     (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ? win->Height - win->BorderTop - win->BorderBottom : win->Height),
  563.                     (flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ? "STATIC " : ""),
  564.                     &id[0],
  565.                     (USHORT) win->DetailPen,
  566.                     (USHORT) win->BlockPen,
  567.  
  568.                     ((IDCMPflags & GADGETDOWN) && !GADGET_ALL(GADGETDOWN) ? " | GADGETDOWN" : ""),
  569.                     ((IDCMPflags & GADGETUP) && !GADGET_ALL(GADGETUP) ? " | GADGETUP" : ""),
  570.                     ((IDCMPflags & CLOSEWINDOW) && !GADGET_ALL(CLOSEWINDOW) ? " | CLOSEWINDOW" : ""),
  571.                     ((IDCMPflags & REQSET) && !GADGET_ALL(REQSET) ? " | REQSET" : ""),
  572.                     ((IDCMPflags & REQCLEAR) && !GADGET_ALL(REQCLEAR) ? " | REQCLEAR" : ""),
  573.                     ((IDCMPflags & REQVERIFY) && !GADGET_ALL(REQVERIFY) ? " | REQVERIFY" : ""),
  574.                     ((IDCMPflags & MENUPICK) && !GADGET_ALL(MENUPICK) ? " | MENUPICK" : ""),
  575.                     ((IDCMPflags & MENUVERIFY) && !GADGET_ALL(MENUVERIFY) ? " | MENUVERIFY" : ""),
  576.                     ((IDCMPflags & MOUSEBUTTONS) && !GADGET_ALL(MOUSEBUTTONS) ? " | MOUSEBUTTONS" : ""),
  577.                     ((IDCMPflags & MOUSEMOVE) && !GADGET_ALL(MOUSEMOVE) ? " | MOUSEMOVE" : ""),
  578.                     ((IDCMPflags & DELTAMOVE) && !GADGET_ALL(DELTAMOVE) ? " | DELTAMOVE" : ""),
  579.                     ((IDCMPflags & NEWSIZE) && !GADGET_ALL(NEWSIZE) ? " | NEWSIZE" : ""),
  580.                     ((IDCMPflags & SIZEVERIFY) && !GADGET_ALL(SIZEVERIFY) ? " | SIZEVERIFY" : ""),
  581.                     ((IDCMPflags & REFRESHWINDOW) && !GADGET_ALL(REFRESHWINDOW) ? " | REFRESHWINDOW" : ""),
  582.                     ((IDCMPflags & ACTIVEWINDOW) && !GADGET_ALL(ACTIVEWINDOW) ? " | ACTIVEWINDOW" : ""),
  583.                     ((IDCMPflags & INACTIVEWINDOW) && !GADGET_ALL(INACTIVEWINDOW) ? " | INACTIVEWINDOW" : ""),
  584.                     ((IDCMPflags & RAWKEY) && !GADGET_ALL(RAWKEY) ? " | RAWKEY" : ""),
  585.                     ((IDCMPflags & VANILLAKEY) && !GADGET_ALL(VANILLAKEY) ? " | VANILLAKEY" : ""),
  586.                     ((IDCMPflags & DISKINSERTED) && !GADGET_ALL(DISKINSERTED) ? " | DISKINSERTED" : ""),
  587.                     ((IDCMPflags & DISKREMOVED) && !GADGET_ALL(DISKREMOVED) ? " | DISKREMOVED" : ""),
  588.                     ((IDCMPflags & NEWPREFS) && !GADGET_ALL(NEWPREFS) ? " | NEWPREFS" : ""),
  589.                     ((IDCMPflags & INTUITICKS) && !GADGET_ALL(INTUITICKS) ? " | INTUITICKS" : ""),
  590.                     ((IDCMPflags & WBENCHMESSAGE) && !GADGET_ALL(WBENCHMESSAGE) ? " | WBENCHMESSAGE" : ""),
  591.                     (IDCMPflags & GADGET_IDCMP_FLAGS_ALL ? " | GADGET_IDCMP_FLAGS_ALL" : ""),
  592.  
  593.                     (WINflags & WINDOWCLOSE ? " | WINDOWCLOSE" : ""),
  594.                     (WINflags & WINDOWDRAG ? " | WINDOWDRAG" : ""),
  595.                     (WINflags & WINDOWDEPTH ? " | WINDOWDEPTH" : ""),
  596.                     (WINflags & WINDOWSIZING ? " | WINDOWSIZING" : ""),
  597.                     (WINflags & BACKDROP ? " | BACKDROP" : ""),
  598.                     (WINflags & BORDERLESS ? " | BORDERLESS" : ""),
  599.                     (WINflags & GIMMEZEROZERO ? " | GIMMEZEROZERO" : ""),
  600.                     (WINflags & SUPER_BITMAP ? " | SUPER_BITMAP" : ""),
  601.                     (WINflags & SIMPLE_REFRESH ? " | SIMPLE_REFRESH" : ""),
  602.                     (WINflags & SMART_REFRESH ? " | SMART_REFRESH" : ""),
  603.                     (flags & TEMPLATE_LIST_FLAG_REPORTMOUSE ? " | REPORTMOUSE" : ""),
  604.                     (WINflags & NOCAREREFRESH ? " | NOCAREREFRESH" : ""),
  605.                     (WINflags & RMBTRAP ? " | RMBTRAP" : ""),
  606.                     (WINflags & ACTIVATE ? " | ACTIVATE" : ""),
  607.  
  608.                     &tl->tl_ProjectWinName[0],
  609.  
  610.                     win->MinWidth,
  611.                     win->MinHeight,
  612.                     win->MaxWidth,
  613.                     win->MaxHeight)
  614.             == -1L)
  615.         {
  616.             status = EDITOR_ERROR_WRITE_FAILED;
  617.         }
  618.     }
  619.  
  620.     return (status);
  621. }
  622.  
  623.  /* Write project border defines and data to save file */
  624.  
  625. STATIC SHORT
  626. write_project_borders(FILE * fh, struct TemplateList * tl)
  627. {
  628.     SHORT status = EDITOR_STATUS_NORMAL;
  629.  
  630.     if (tl->tl_BorderTemplates)
  631.     {
  632.         if (fprintf(fh, "\t/* Defines and data for borders */\n\n") == -1L)
  633.         {
  634.             status = EDITOR_ERROR_WRITE_FAILED;
  635.         }
  636.         if (status == EDITOR_STATUS_NORMAL)
  637.         {
  638.             struct Template *tp;
  639.             BYTE id[MAX_PROJECT_ID_LEN + 1];
  640.             USHORT count;
  641.  
  642.             /* Write defines */
  643.             upper_string(&tl->tl_ProjectID[0], &id[0]);
  644.             for (count = 0, tp = get_head((struct List *) & tl->tl_Templates);
  645.                  tp && status == EDITOR_STATUS_NORMAL;
  646.                  count++, tp = get_succ(&tp->tp_Node))
  647.             {
  648.                 if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_BORDER)
  649.                 {
  650.                     BYTE name[MAX_TEMPLATE_NAME_LEN + 1];
  651.  
  652.                     upper_string(&tp->tp_TemplateName[0], &name[0]);
  653.                     if (fprintf(fh, "#define %s_BORDER_%s   %d\n",
  654.                                 &id[0], &name[0], count) == -1L)
  655.                     {
  656.                         status = EDITOR_ERROR_WRITE_FAILED;
  657.                     }
  658.                 }
  659.             }
  660.             if (status == EDITOR_STATUS_NORMAL)
  661.             {
  662.                 USHORT flags = tl->tl_Flags;
  663.  
  664.                 /* Write border data */
  665.                 lower_string(&tl->tl_ProjectID[0], &id[0]);
  666.                 if (fprintf(fh, "\n%sstruct BorderData  %s_border_data[] = {\n"
  667.                             "   {\n",
  668.                             (flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  669.                              "STATIC " : ""), &id[0]) == -1L)
  670.                 {
  671.                     status = EDITOR_ERROR_WRITE_FAILED;
  672.                 }
  673.                 else
  674.                 {
  675.                     struct Window *win = pwin;
  676.  
  677.                     for (tp = get_head((struct List *) & tl->tl_Templates);
  678.                          tp && status == EDITOR_STATUS_NORMAL;
  679.                          tp = get_succ(&tp->tp_Node))
  680.                     {
  681.                         if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_BORDER)
  682.                         {
  683.                             struct BorderData *bd = &tp->tp_Data.tp_BorderData;
  684.  
  685.                             if (fprintf(fh, "      %d, %d, %d, %d, %d\n"
  686.                                         "   }, {\n", bd->bd_Type,
  687.                                         (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  688.                                          bd->bd_LeftEdge - win->BorderLeft :
  689.                                          bd->bd_LeftEdge),
  690.                                         (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  691.                                          bd->bd_TopEdge - win->BorderTop :
  692.                                          bd->bd_TopEdge),
  693.                                         bd->bd_Width, bd->bd_Height) == -1L)
  694.                             {
  695.                                 status = EDITOR_ERROR_WRITE_FAILED;
  696.                             }
  697.                         }
  698.                     }
  699.                     if (status == EDITOR_STATUS_NORMAL)
  700.                     {
  701.                         if (fprintf(fh, "      INTUISUP_DATA_END\n"
  702.                                     "   }\n"
  703.                                     "};\n") == -1L)
  704.                         {
  705.                             status = EDITOR_ERROR_WRITE_FAILED;
  706.                         }
  707.                     }
  708.                 }
  709.             }
  710.         }
  711.     }
  712.     return (status);
  713. }
  714.  
  715.  /* Write project font data to save file */
  716.  
  717. STATIC SHORT
  718. write_project_fonts(FILE * fh, struct TemplateList * tl)
  719. {
  720.     SHORT status = EDITOR_STATUS_NORMAL;
  721.  
  722.     if (tl->tl_TextTemplates || tl->tl_GadgetTemplates)
  723.     {
  724.         BYTE id[MAX_PROJECT_ID_LEN + 1];
  725.  
  726.         lower_string(&tl->tl_ProjectID[0], &id[0]);
  727.         if (fprintf(fh, "\t/* Data for fonts */\n\n"
  728.                     "%sstruct TextAttr  %s_text_attr[] = {\n"
  729.                     "   {\n",
  730.                     (tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  731.                      "STATIC " : ""), &id[0]) == -1L)
  732.         {
  733.             status = EDITOR_ERROR_WRITE_FAILED;
  734.         }
  735.         else
  736.         {
  737.             struct TemplateFont *tf = get_head((struct List *) & tl->tl_Fonts);
  738.  
  739.             while (tf && status == EDITOR_STATUS_NORMAL)
  740.             {
  741.                 struct TextAttr *ta = &tf->tf_TextAttr;
  742.  
  743.                 tf = get_succ((struct Node *) & tf->tf_MinNode);
  744.                 if (fprintf(fh, "      (STRPTR)\"%s\", %d, FS_NORMAL, FPF_ROMFONT\n"
  745.                             "   }%s", ta->ta_Name, ta->ta_YSize,
  746.                             (tf ? ", {\n" : "\n};\n")) == -1L)
  747.                 {
  748.                     status = EDITOR_ERROR_WRITE_FAILED;
  749.                 }
  750.             }
  751.         }
  752.     }
  753.     return (status);
  754. }
  755.  
  756.  /* Write project text defines and data to save file */
  757.  
  758. STATIC SHORT
  759. write_project_texts(FILE * fh, struct TemplateList * tl)
  760. {
  761.     SHORT status = EDITOR_STATUS_NORMAL;
  762.  
  763.     if (tl->tl_TextTemplates)
  764.     {
  765.         if (fprintf(fh, "\t/* Defines and data for texts */\n\n") == -1L)
  766.         {
  767.             status = EDITOR_ERROR_WRITE_FAILED;
  768.         }
  769.         if (status == EDITOR_STATUS_NORMAL)
  770.         {
  771.             struct Template *tp;
  772.             BYTE id[MAX_PROJECT_ID_LEN + 1];
  773.             USHORT count;
  774.  
  775.             /* Write defines */
  776.             upper_string(&tl->tl_ProjectID[0], &id[0]);
  777.             for (count = 0, tp = get_head((struct List *) & tl->tl_Templates);
  778.                  tp && status == EDITOR_STATUS_NORMAL;
  779.                  tp = get_succ(&tp->tp_Node))
  780.             {
  781.                 if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_TEXT)
  782.                 {
  783.                     BYTE name[MAX_TEMPLATE_NAME_LEN + 1];
  784.  
  785.                     upper_string(&tp->tp_TemplateName[0], &name[0]);
  786.                     if (fprintf(fh, "#define %s_TEXT_%s   %d\n",
  787.                                 &id[0], &name[0], count) == -1L)
  788.                     {
  789.                         status = EDITOR_ERROR_WRITE_FAILED;
  790.                     }
  791.                     else
  792.                     {
  793.                         count++;
  794.                     }
  795.                 }
  796.             }
  797.             if (status == EDITOR_STATUS_NORMAL)
  798.             {
  799.                 USHORT flags = tl->tl_Flags;
  800.  
  801.                 /* Write text data */
  802.                 lower_string(&tl->tl_ProjectID[0], &id[0]);
  803.                 if (fprintf(fh, "\n%sstruct TextData  %s_text_data[] = {\n"
  804.                             "   {\n",
  805.                             (flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  806.                              "STATIC " : ""), &id[0]) == -1L)
  807.                 {
  808.                     status = EDITOR_ERROR_WRITE_FAILED;
  809.                 }
  810.                 else
  811.                 {
  812.                     struct Window *win = pwin;
  813.  
  814.                     for (tp = get_head((struct List *) & tl->tl_Templates);
  815.                          tp && status == EDITOR_STATUS_NORMAL;
  816.                          tp = get_succ(&tp->tp_Node))
  817.                     {
  818.                         if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_TEXT)
  819.                         {
  820.                             struct TextData *td = &tp->tp_Data.tp_TextData;
  821.  
  822.                             if (fprintf(fh, "      %d, %d, %d, %d,\n"
  823.                                         "      \"%s\", &%s_text_attr[%d]\n"
  824.                                         "   }, {\n", td->td_Type, td->td_Flags,
  825.                                         (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  826.                                          td->td_LeftEdge - win->BorderLeft :
  827.                                          td->td_LeftEdge),
  828.                                         (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  829.                                          td->td_TopEdge - win->BorderTop :
  830.                                          td->td_TopEdge),
  831.                                         td->td_Text, &id[0], get_template_font_num(tl,
  832.                                                                                    td->td_TextAttr)) == -1L)
  833.                             {
  834.                                 status = EDITOR_ERROR_WRITE_FAILED;
  835.                             }
  836.                         }
  837.                     }
  838.                     if (status == EDITOR_STATUS_NORMAL)
  839.                     {
  840.                         if (fprintf(fh, "      INTUISUP_DATA_END\n"
  841.                                     "   }\n"
  842.                                     "};\n") == -1L)
  843.                         {
  844.                             status = EDITOR_ERROR_WRITE_FAILED;
  845.                         }
  846.                     }
  847.                 }
  848.             }
  849.         }
  850.     }
  851.     return (status);
  852. }
  853.  
  854.  /* Write project gadget defines and data to save file */
  855.  
  856. STATIC SHORT
  857. write_project_gadgets(FILE * fh, struct TemplateList * tl)
  858. {
  859.     SHORT status = EDITOR_STATUS_NORMAL;
  860.  
  861.     if (tl->tl_GadgetTemplates)
  862.     {
  863.         if (fprintf(fh, "\t/* Defines and data for gadgets */\n\n") == -1L)
  864.         {
  865.             status = EDITOR_ERROR_WRITE_FAILED;
  866.         }
  867.         if (status == EDITOR_STATUS_NORMAL)
  868.         {
  869.             struct Template *tp;
  870.             BYTE id[MAX_PROJECT_ID_LEN + 1];
  871.             USHORT count;
  872.  
  873.             /* Write defines */
  874.             upper_string(&tl->tl_ProjectID[0], &id[0]);
  875.             for (count = 0, tp = get_head((struct List *) & tl->tl_Templates);
  876.                  tp && status == EDITOR_STATUS_NORMAL;
  877.                  tp = get_succ(&tp->tp_Node))
  878.             {
  879.                 if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET)
  880.                 {
  881.                     BYTE name[MAX_TEMPLATE_NAME_LEN + 1];
  882.  
  883.                     upper_string(&tp->tp_TemplateName[0], &name[0]);
  884.                     if (fprintf(fh, "#define %s_GADGET_%s   %d\n",
  885.                                 &id[0], &name[0], count) == -1L)
  886.                     {
  887.                         status = EDITOR_ERROR_WRITE_FAILED;
  888.                     }
  889.                     else
  890.                     {
  891.                         count++;
  892.                     }
  893.                 }
  894.             }
  895.             if (status == EDITOR_STATUS_NORMAL)
  896.             {
  897.                 if (fprintf(fh, "\n") == -1L)
  898.                 {
  899.                     status = EDITOR_ERROR_WRITE_FAILED;
  900.                 }
  901.                 else
  902.                 {
  903.  
  904.                     /* Write text arrays and lists */
  905.                     lower_string(&tl->tl_ProjectID[0], &id[0]);
  906.                     for (count = 1, tp = get_head((struct List *) & tl->tl_Templates);
  907.                          tp && status == EDITOR_STATUS_NORMAL;
  908.                          tp = get_succ(&tp->tp_Node))
  909.                     {
  910.                         if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET)
  911.                         {
  912.                             struct GadgetData *gd = &tp->tp_Data.tp_GadgetData;
  913.  
  914.                             switch (gd->gd_Type)
  915.                             {
  916.                             case GADGET_DATA_TYPE_MX:
  917.                                 status = write_gadget_text_array(fh, tl, &id[0], count,
  918.                                                                  gd->gd_SpecialData.gd_MXData.gd_MXTextArray);
  919.                                 break;
  920.  
  921.                             case GADGET_DATA_TYPE_CYCLE:
  922.                                 status = write_gadget_text_array(fh, tl, &id[0], count,
  923.                                                                  gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray);
  924.                                 break;
  925.  
  926.                             case GADGET_DATA_TYPE_LISTVIEW:
  927.                                 status = write_gadget_list(fh, tl, &id[0], count,
  928.                                                            gd->gd_SpecialData.gd_ListViewData.gd_ListViewList);
  929.                                 break;
  930.                             }
  931.                             count++;
  932.                         }
  933.                     }
  934.                     if (status == EDITOR_STATUS_NORMAL)
  935.                     {
  936.                         USHORT flags = tl->tl_Flags;
  937.  
  938.                         /* Write gadget data */
  939.                         if (fprintf(fh, "%sstruct GadgetData  %s_gadget_data[] = {\n"
  940.                                     "   {\n",
  941.                                     (flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  942.                                      "STATIC " : ""), &id[0]) == -1L)
  943.                         {
  944.                             status = EDITOR_ERROR_WRITE_FAILED;
  945.                         }
  946.                         else
  947.                         {
  948.                             struct Window *win = pwin;
  949.  
  950.                             for (count = 1, tp = get_head((struct List *)
  951.                                                           & tl->tl_Templates);
  952.                                  tp && status == EDITOR_STATUS_NORMAL;
  953.                                  tp = get_succ(&tp->tp_Node))
  954.                             {
  955.                                 if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET)
  956.                                 {
  957.                                     struct GadgetData *gd = &tp->tp_Data.tp_GadgetData;
  958.  
  959.                                     if (fprintf(fh, "      %ld, %ld, %d, %d, %d, %d,\n"
  960.                                                 "      \"%s\", &%s_text_attr[%d],\n",
  961.                                                 gd->gd_Type, gd->gd_Flags,
  962.                                                 (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  963.                                                  gd->gd_LeftEdge - win->BorderLeft :
  964.                                                  gd->gd_LeftEdge),
  965.                                                 (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  966.                                                  gd->gd_TopEdge - win->BorderTop :
  967.                                                  gd->gd_TopEdge),
  968.                                                 gd->gd_Width, gd->gd_Height, gd->gd_Text,
  969.                                                 &id[0], get_template_font_num(tl,
  970.                                                                               gd->gd_TextAttr)) == -1L)
  971.                                     {
  972.                                         status = EDITOR_ERROR_WRITE_FAILED;
  973.                                     }
  974.                                     else
  975.                                     {
  976.                                         if ((status = write_gadget_special_data(fh, &id[0],
  977.                                                                                 count, gd)) == EDITOR_STATUS_NORMAL)
  978.                                         {
  979.                                             count++;
  980.                                         }
  981.                                     }
  982.                                 }
  983.                             }
  984.                             if (status == EDITOR_STATUS_NORMAL)
  985.                             {
  986.                                 if (fprintf(fh, "      INTUISUP_DATA_END\n"
  987.                                             "   }\n"
  988.                                             "};\n") == -1L)
  989.                                 {
  990.                                     status = EDITOR_ERROR_WRITE_FAILED;
  991.                                 }
  992.                             }
  993.                         }
  994.                     }
  995.                 }
  996.             }
  997.         }
  998.     }
  999.     return (status);
  1000. }
  1001.  
  1002.  /* Write gadget text array to save file*/
  1003.  
  1004. STATIC SHORT
  1005. write_gadget_text_array(FILE * fh, struct TemplateList * tl, BYTE * id, USHORT count, BYTE ** array)
  1006. {
  1007.     SHORT status = EDITOR_STATUS_NORMAL;
  1008.  
  1009.     if (fprintf(fh, "%sBYTE *%s_gadget%d_text_array[] = {\n",
  1010.                 (tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  1011.                  "STATIC " : ""), id, count) == -1L)
  1012.     {
  1013.         status = EDITOR_ERROR_WRITE_FAILED;
  1014.     }
  1015.     else
  1016.     {
  1017.         BYTE *text;
  1018.  
  1019.         while ((text = *array++) && status == EDITOR_STATUS_NORMAL)
  1020.         {
  1021.             if (fprintf(fh, "   \"%s\",\n", text) == -1L)
  1022.             {
  1023.                 status = EDITOR_ERROR_WRITE_FAILED;
  1024.             }
  1025.         }
  1026.         if (status == EDITOR_STATUS_NORMAL)
  1027.         {
  1028.             if (fprintf(fh, "   NULL\n"
  1029.                         "};\n") == -1L)
  1030.             {
  1031.                 status = EDITOR_ERROR_WRITE_FAILED;
  1032.             }
  1033.         }
  1034.     }
  1035.     return (status);
  1036. }
  1037.  
  1038.  /* Write gadget list to save file*/
  1039.  
  1040. STATIC SHORT
  1041. write_gadget_list(FILE * fh, struct TemplateList * tl, BYTE * id, USHORT count, struct List * list)
  1042. {
  1043.     USHORT num = 0;
  1044.     SHORT status = EDITOR_STATUS_NORMAL;
  1045.  
  1046.     if (list->lh_Head->ln_Succ)
  1047.     {
  1048.         if (fprintf(fh, "IMPORT struct List  %s_gadget%d_list;\n"
  1049.                     "%sstruct Node  %s_gadget%d_node[] = {\n"
  1050.                     "   {\n", id, count,
  1051.                     (tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  1052.                      "STATIC " : ""), id, count) == -1L)
  1053.         {
  1054.             status = EDITOR_ERROR_WRITE_FAILED;
  1055.         }
  1056.         else
  1057.         {
  1058.             struct Node *node = get_head(list);
  1059.  
  1060.             /* Write node array */
  1061.             while (node && status == EDITOR_STATUS_NORMAL)
  1062.             {
  1063.                 BYTE *text = node->ln_Name;
  1064.  
  1065.                 /* Write node pred */
  1066.                 node = get_succ(node);
  1067.                 if (node)
  1068.                 {
  1069.                     if (fprintf(fh, "      &%s_gadget%d_node[%d], ",
  1070.                                 &id[0], count, num + 1) == -1L)
  1071.                     {
  1072.                         status = EDITOR_ERROR_WRITE_FAILED;
  1073.                     }
  1074.                 }
  1075.                 else
  1076.                 {
  1077.                     if (fprintf(fh, "      (struct Node *)"
  1078.                                 "&%s_gadget%d_list.lh_Tail, ", &id[0], count) == -1L)
  1079.                     {
  1080.                         status = EDITOR_ERROR_WRITE_FAILED;
  1081.                     }
  1082.                 }
  1083.                 if (status == EDITOR_STATUS_NORMAL)
  1084.                 {
  1085.  
  1086.                     /* Write node succ */
  1087.                     if (num)
  1088.                     {
  1089.                         if (fprintf(fh, "&%s_gadget%d_node[%d]",
  1090.                                     &id[0], count, num - 1) == -1L)
  1091.                         {
  1092.                             status = EDITOR_ERROR_WRITE_FAILED;
  1093.                         }
  1094.                     }
  1095.                     else
  1096.                     {
  1097.                         if (fprintf(fh, "(struct Node *)&%s_gadget%d_list.lh_Head",
  1098.                                     &id[0], count) == -1L)
  1099.                         {
  1100.                             status = EDITOR_ERROR_WRITE_FAILED;
  1101.                         }
  1102.                     }
  1103.                     if (status == EDITOR_STATUS_NORMAL)
  1104.                     {
  1105.  
  1106.                         /* Write node text */
  1107.                         if (fprintf(fh, ", 0, 0,\n"
  1108.                                     "      \"%s\"\n"
  1109.                                     "   }%s", text,
  1110.                                     (node ? ", {\n" : "\n};\n")) == -1L)
  1111.                         {
  1112.                             status = EDITOR_ERROR_WRITE_FAILED;
  1113.                         }
  1114.                         else
  1115.                         {
  1116.                             num++;
  1117.                         }
  1118.                     }
  1119.                 }
  1120.             }
  1121.         }
  1122.     }
  1123.     if (status == EDITOR_STATUS_NORMAL)
  1124.     {
  1125.  
  1126.         /* Write list */
  1127.         if (fprintf(fh, "%sstruct List  %s_gadget%d_list = {\n",
  1128.                     (tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  1129.                      "/* STATIC */ " : ""), id, count) == -1L)
  1130.         {
  1131.             status = EDITOR_ERROR_WRITE_FAILED;
  1132.         }
  1133.         else
  1134.         {
  1135.  
  1136.             /* Write list head */
  1137.             if (num)
  1138.             {
  1139.                 if (fprintf(fh, "   &%s_gadget%d_node[0], NULL,\n",
  1140.                             id, count) == -1L)
  1141.                 {
  1142.                     status = EDITOR_ERROR_WRITE_FAILED;
  1143.                 }
  1144.             }
  1145.             else
  1146.             {
  1147.                 if (fprintf(fh, "   (struct Node *)&%s_gadget%d_list.lh_Tail,"
  1148.                             " NULL,\n", id, count) == -1L)
  1149.                 {
  1150.                     status = EDITOR_ERROR_WRITE_FAILED;
  1151.                 }
  1152.             }
  1153.             if (status == EDITOR_STATUS_NORMAL)
  1154.             {
  1155.  
  1156.                 /* Write list tail */
  1157.                 if (num)
  1158.                 {
  1159.                     if (fprintf(fh, "   &%s_gadget%d_node[%d]",
  1160.                                 id, count, num - 1) == -1L)
  1161.                     {
  1162.                         status = EDITOR_ERROR_WRITE_FAILED;
  1163.                     }
  1164.                 }
  1165.                 else
  1166.                 {
  1167.                     if (fprintf(fh, "   (struct Node *)&%s_gadget%d_list.lh_Head",
  1168.                                 id, count) == -1L)
  1169.                     {
  1170.                         status = EDITOR_ERROR_WRITE_FAILED;
  1171.                     }
  1172.                 }
  1173.                 if (status == EDITOR_STATUS_NORMAL)
  1174.                 {
  1175.  
  1176.                     /* Write list type */
  1177.                     if (fprintf(fh, ", 0, 0\n"
  1178.                                 "};\n") == -1L)
  1179.                     {
  1180.                         status = EDITOR_ERROR_WRITE_FAILED;
  1181.                     }
  1182.                 }
  1183.             }
  1184.         }
  1185.     }
  1186.     return (status);
  1187. }
  1188.  
  1189.  /* Write special gadget data */
  1190.  
  1191. STATIC SHORT
  1192. write_gadget_special_data(FILE * fh, BYTE * id, USHORT count, struct GadgetData * gd)
  1193. {
  1194.     SHORT status = EDITOR_STATUS_NORMAL;
  1195.  
  1196.     if (fprintf(fh, "      { ") == -1L)
  1197.     {
  1198.         status = EDITOR_ERROR_WRITE_FAILED;
  1199.     }
  1200.     else
  1201.     {
  1202.         switch (gd->gd_Type)
  1203.         {
  1204.         case GADGET_DATA_TYPE_MX:
  1205.         case GADGET_DATA_TYPE_CYCLE:
  1206.             if (fprintf(fh, "%ld, %ld, &%s_gadget%d_text_array[0]",
  1207.                         gd->gd_SpecialData.gd_Data.gd_Data1,
  1208.                         gd->gd_SpecialData.gd_Data.gd_Data2, id, count) == -1L)
  1209.             {
  1210.                 status = EDITOR_ERROR_WRITE_FAILED;
  1211.             }
  1212.             break;
  1213.  
  1214.         case GADGET_DATA_TYPE_STRING:
  1215.             if (fprintf(fh, "%ld, %ld, \"%s\"",
  1216.                         gd->gd_SpecialData.gd_Data.gd_Data1,
  1217.                         gd->gd_SpecialData.gd_Data.gd_Data2,
  1218.                         gd->gd_SpecialData.gd_Data.gd_Data3) == -1L)
  1219.             {
  1220.                 status = EDITOR_ERROR_WRITE_FAILED;
  1221.             }
  1222.             break;
  1223.  
  1224.         case GADGET_DATA_TYPE_LISTVIEW:
  1225.             if (fprintf(fh, "%ld, %ld, &%s_gadget%d_list",
  1226.                         gd->gd_SpecialData.gd_Data.gd_Data1,
  1227.                         gd->gd_SpecialData.gd_Data.gd_Data2, id, count) == -1L)
  1228.             {
  1229.                 status = EDITOR_ERROR_WRITE_FAILED;
  1230.             }
  1231.             break;
  1232.  
  1233.         default:
  1234.             if (fprintf(fh, "%ld, %ld, (VOID *)%ld",
  1235.                         gd->gd_SpecialData.gd_Data.gd_Data1,
  1236.                         gd->gd_SpecialData.gd_Data.gd_Data2,
  1237.                         gd->gd_SpecialData.gd_Data.gd_Data3) == -1L)
  1238.             {
  1239.                 status = EDITOR_ERROR_WRITE_FAILED;
  1240.             }
  1241.             break;
  1242.         }
  1243.         if (status == EDITOR_STATUS_NORMAL)
  1244.         {
  1245.             if (fprintf(fh, " }\n"
  1246.                         "   }, {\n") == -1L)
  1247.             {
  1248.                 status = EDITOR_ERROR_WRITE_FAILED;
  1249.             }
  1250.         }
  1251.     }
  1252.     return (status);
  1253. }
  1254.  
  1255.  /* Write project test program */
  1256.  
  1257. STATIC SHORT
  1258. write_project_program(FILE * fh, struct TemplateList * tl)
  1259. {
  1260.     SHORT status = EDITOR_STATUS_NORMAL;
  1261.  
  1262.     if (tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_PROGRAM)
  1263.     {
  1264.         BYTE id[MAX_PROJECT_ID_LEN + 1];
  1265.         USHORT gads = tl->tl_GadgetTemplates;
  1266.         struct Template *tp;
  1267.         USHORT count;
  1268.  
  1269.  
  1270.         lower_string(&tl->tl_ProjectID[0], &id[0]);
  1271.         if (fprintf(fh,
  1272.                     "\n    /* Global var. */\n"
  1273.                     "struct Library  *IntuiSupBase = NULL;\n"
  1274.                     "APTR ri = NULL;\n"
  1275.                     "struct Window* win = NULL;\n"
  1276.                     "%s%c\n"
  1277.                     "\t/* Protos */\n"
  1278.                     "BOOL %s_init(VOID);\n"
  1279.                     "VOID %s_close(VOID);\n"
  1280.                     "VOID %s_action(VOID);\n"
  1281.                     "%s%s%s\n"
  1282.                     "\t/* Test program */\n\n"
  1283.                     "    LONG\n"
  1284.                     "main(VOID)\n"
  1285.                     "{\n"
  1286.                     "\n"
  1287.                     "    if(! %s_init(VOID))\n"
  1288.                     "    {\n"
  1289.                     "        %s_close(VOID);\n"
  1290.                     "        return(1L);\n"
  1291.                     "    }\n\n",
  1292.                     (gads ? "APTR gl = NULL;" : ""),
  1293.                     (gads ? 10 : 32),
  1294.                     &id[0],
  1295.                     &id[0],
  1296.                     &id[0],
  1297.                     (pwin->Flags & SUPER_BITMAP ? "VOID " : ""),
  1298.                     (pwin->Flags & SUPER_BITMAP ? &id[0] : ""),
  1299.                     (pwin->Flags & SUPER_BITMAP ? "_init_bitmap(struct BitMap*);" : ""),
  1300.                     &id[0],
  1301.                     &id[0]) == -1L)
  1302.         {
  1303.             return EDITOR_ERROR_WRITE_FAILED;
  1304.         }
  1305.  
  1306.  
  1307.         if (tl->tl_BorderTemplates && fprintf(fh,
  1308.                                               "    IDisplayBorders(ri, win, &%s_border_data[0], 0, 0);\n",
  1309.                                               &id[0]) == -1L)
  1310.         {
  1311.             return EDITOR_ERROR_WRITE_FAILED;
  1312.         }
  1313.  
  1314.         if (tl->tl_TextTemplates && fprintf(fh,
  1315.                                             "    IDisplayTexts(ri, win,&%s_text_data[0], 0, 0, NULL);\n",
  1316.                                             &id[0]) == -1L)
  1317.         {
  1318.             return EDITOR_ERROR_WRITE_FAILED;
  1319.         }
  1320.  
  1321.         if (gads && fprintf(fh,
  1322.                             "    IDisplayGadgets(win,gl);\n"
  1323.             )== -1L)
  1324.         {
  1325.             return EDITOR_ERROR_WRITE_FAILED;
  1326.         }
  1327.  
  1328.         if (fprintf(fh,
  1329.                     "\n"
  1330.                     "    %s_action(VOID);\n\n"
  1331.                     "    %s_close(VOID);\n\n"
  1332.                     "    return(0L);\n"
  1333.                     "}\n\n",
  1334.                     &id[0],
  1335.                     &id[0]) == -1L)
  1336.         {
  1337.             return EDITOR_ERROR_WRITE_FAILED;
  1338.         }
  1339.  
  1340.         if (fprintf(fh,
  1341.                     "BOOL %s_init(VOID)\n"
  1342.                     "{\n"
  1343.                     "    if (!(IntuiSupBase = (struct Library*)OpenLibrary(IntuiSupName,IntuiSupVersion)) )\n"
  1344.                     "        return FALSE;\n"
  1345.                     "\n"
  1346.                     "    if (!(ri = IGetRenderInfo(NULL, RENDER_INFO_FLAGS)) )\n"
  1347.                     "        return FALSE;\n"
  1348.                     "\n"
  1349.                     "%s%s%c%c"
  1350.                     "    if (!(win = IOpenWindow(ri, &%s_new_window,OPEN_WINDOW_FLAGS)) )\n"
  1351.                     "        return FALSE;\n"
  1352.                     "\n",
  1353.                     &id[0],
  1354.                     (pwin->Flags & SUPER_BITMAP ? &id[0] : ""),
  1355.                     (pwin->Flags & SUPER_BITMAP ? "_init_bitmap(&bitmap);" : ""),
  1356.                     (pwin->Flags & SUPER_BITMAP ? 10 : 32),
  1357.                     (pwin->Flags & SUPER_BITMAP ? 10 : 32),
  1358.                     &id[0]) == -1L)
  1359.         {
  1360.             return EDITOR_ERROR_WRITE_FAILED;
  1361.         }
  1362.  
  1363.  
  1364.         if (gads && fprintf(fh,
  1365.                             "    if (!(gl = ICreateGadgets(ri,&%s_gadget_data[0], 0, 0, NULL)) )\n"
  1366.                             "        return FALSE;\n"
  1367.                             "\n",
  1368.                             &id[0]) == -1L)
  1369.         {
  1370.             return EDITOR_ERROR_WRITE_FAILED;
  1371.         }
  1372.  
  1373.  
  1374.         if (fprintf(fh,
  1375.                     "    return TRUE;\n"
  1376.                     "}\n"
  1377.                     "\n"
  1378.                     "    VOID\n"
  1379.                     "%s_close(VOID)\n"
  1380.                     "{\n"
  1381.                     "    if(gl) IRemoveGadgets(gl);\n"
  1382.                     "    if(gl) IFreeGadgets(gl);\n"
  1383.                     "    if(win) ICloseWindow(win, FALSE);\n"
  1384.                     "    if(ri) IFreeRenderInfo(ri);\n"
  1385.                     "    if(IntuiSupBase) CloseLibrary(IntuiSupBase);\n"
  1386.                     "}\n",
  1387.                     &id[0],
  1388.                     &id[0],
  1389.                     &id[0]) == -1L)
  1390.         {
  1391.             return EDITOR_ERROR_WRITE_FAILED;
  1392.         }
  1393.  
  1394.         if (fprintf(fh,
  1395.                     "\n    VOID\n"
  1396.                     "%s_action(VOID)\n"
  1397.                     "{\n"
  1398.                     "    BOOL keepon = TRUE;\n\n"
  1399.                     "    do {\n"
  1400.                     "        struct IntuiMessage  *msg;\n\n"
  1401.                     "        WaitPort(win->UserPort);\n"
  1402.                     "        while (msg = IGetMsg(win->UserPort)) {\n"
  1403.                     "            ULONG        Class=msg->Class;\n"
  1404.                     "            USHORT    Code=msg->Code;\n"
  1405.                     "            LONG        IAddress=(LONG)msg->IAddress;\n\n"
  1406.                     "            IReplyMsg(msg);\n\n"
  1407.                     "            switch(Class)\n"
  1408.                     "            {\n"
  1409.                     "                case CLOSEWINDOW:\n"
  1410.                     "                    keepon = FALSE;\n"
  1411.                     "                    break;\n\n"
  1412.                     "%s",
  1413.                     &id[0],
  1414.                     (pwin->Flags & RMBTRAP ? "" :
  1415.                      "                case MENUPICK:\n"
  1416.                      "                    printf(\"MENUPICK: \");\n"
  1417.                      "                    break;\n\n")
  1418.             )== -1L)
  1419.         {
  1420.             return EDITOR_ERROR_WRITE_FAILED;
  1421.         }
  1422.  
  1423.         if (gads)
  1424.         {
  1425.             if (fprintf(fh,
  1426.                         "                case ISUP_ID:\n"
  1427.                         "                    switch(Code)\n"
  1428.                         "                    {\n"
  1429.                 )== -1L)
  1430.             {
  1431.                 return EDITOR_ERROR_WRITE_FAILED;
  1432.             }
  1433.  
  1434.             upper_string(&tl->tl_ProjectID[0], &id[0]);
  1435.             for (count = 0, tp = get_head((struct List *) & tl->tl_Templates); tp && status == EDITOR_STATUS_NORMAL; tp = get_succ(&tp->tp_Node))
  1436.             {
  1437.                 if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET)
  1438.                 {
  1439.                     BYTE name[MAX_TEMPLATE_NAME_LEN + 1];
  1440.                     struct GadgetData *gd = &tp->tp_Data.tp_GadgetData;
  1441.  
  1442.                     upper_string(&tp->tp_TemplateName[0], &name[0]);
  1443.  
  1444.                     switch (gd->gd_Type)
  1445.                     {
  1446.                     case GADGET_DATA_TYPE_STRING:
  1447.                         if (fprintf(fh,
  1448.                                     "                        case    %s_GADGET_%s:\n"
  1449.                                     "                            printf(\"%s_GADGET_%s: %s\\n\",IAddress);\n"
  1450.                                     "                            break;\n\n",
  1451.                                     &id[0],
  1452.                                     &name[0],
  1453.                                     &id[0],
  1454.                                     &name[0],
  1455.                                     "%s") == -1L)
  1456.                         {
  1457.                             return EDITOR_ERROR_WRITE_FAILED;
  1458.                         }
  1459.                         break;
  1460.  
  1461.                     default:
  1462.                         if (fprintf(fh,
  1463.                                     "                        case    %s_GADGET_%s:\n"
  1464.                                     "                            printf(\"%s_GADGET_%s: %s\\n\",IAddress);\n"
  1465.                                     "                            break;\n\n",
  1466.                                     &id[0],
  1467.                                     &name[0],
  1468.                                     &id[0],
  1469.                                     &name[0],
  1470.                                     "%ld") == -1L)
  1471.                         {
  1472.                             return EDITOR_ERROR_WRITE_FAILED;
  1473.                         }
  1474.                     }
  1475.  
  1476.                     count++;
  1477.                 }
  1478.             }
  1479.  
  1480.             if (fprintf(fh,
  1481.                         "                    }\n"
  1482.                 )== -1L)
  1483.             {
  1484.                 return EDITOR_ERROR_WRITE_FAILED;
  1485.             }
  1486.  
  1487.             lower_string(&tl->tl_ProjectID[0], &id[0]);
  1488.         }
  1489.  
  1490.         if (fprintf(fh,
  1491.                     "            }\n"
  1492.                     "        }\n"
  1493.                     "    } while (keepon == TRUE);\n"
  1494.                     "}\n"
  1495.             )== -1L)
  1496.         {
  1497.             return EDITOR_ERROR_WRITE_FAILED;
  1498.         }
  1499.     }
  1500.  
  1501.     return (status);
  1502. }
  1503.