/*
 * AppTempBuilder Common Headers   (C) 1995 John M Haubrich Jr
 *                            All Rights Under Copyright Reserved
 *
 * Version 1.0
 *
 * Written using SAS/C 6.56
 * Using Magic User Interface (MUI) by Stefan Stuntz
 *
 * By John M. Haubrich, Jr.
 *
 *
 * Version~ Date~~~~~~~ Comments~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * -------  ----        --------
 *             ;
 */

#include <exec/libraries.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/nodes.h>
#include <exec/lists.h>

#include <devices/keymap.h>

#include <graphics/gfxbase.h>
#include <graphics/displayinfo.h>

#include <intuition/intuitionbase.h>
#include <intuition/intuition.h>

#include <dos/dos.h>
#include <dos/datetime.h>
#include <dos/rdargs.h>
#include <dos/dostags.h>

#include <graphics/displayinfo.h>
#include <graphics/gfxbase.h>

#include <libraries/asl.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <libraries/gadtools.h>
#include <libraries/mui.h>

#include <rexx/storage.h>

#include <workbench/startup.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>

#include <clib/alib_protos.h>

#include <proto/asl.h>
#include <proto/diskfont.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/gadtools.h>
#include <proto/graphics.h>
#include <proto/icon.h>
#include <proto/intuition.h>
#include <proto/muimaster.h>
#include <proto/utility.h>
#include <proto/wb.h>

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <dos.h>
#include <math.h>


/*
 * GENERAL DEFINES ----------------------------------
 */
#define MAX( a,b )   ( ( (a) > (b) ) ? (a) : (b) )
#define MIN( a,b )   ( ( (a) < (b) ) ? (a) : (b) )
#define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))


#define LINEIN_BUFSIZE  512
#define FILEID_HEADER   "APPTEMPBUILDER_V1.00"

#define REG(x) register __ ## x
#define ASM    __asm
#define SAVEDS __saveds

#define SimpleHelpButton(name,helpnode)\
   TextObject,\
      ButtonFrame,\
      MUIA_Text_Contents, name,\
      MUIA_Text_PreParse, "\33c",\
      MUIA_InputMode    , MUIV_InputMode_RelVerify,\
      MUIA_Background   , MUII_ButtonBack,\
      MUIA_HelpNode     , helpnode,\
      End

#define KeyHelpButton(name,key,helpnode)\
   TextObject,\
      ButtonFrame,\
      MUIA_Text_Contents, name,\
      MUIA_Text_PreParse, "\33c",\
      MUIA_Text_HiChar  , key,\
      MUIA_ControlChar  , key,\
      MUIA_InputMode    , MUIV_InputMode_RelVerify,\
      MUIA_Background   , MUII_ButtonBack,\
      MUIA_HelpNode     , helpnode,\
      End


/*
 * OBJECT IDs ------------------------------
 */
/***** MENUS *****/
#define ID_MENU_MAIN_NEW                 1001
#define ID_MENU_MAIN_OPEN                1002
#define ID_MENU_MAIN_SAVE                1003
#define ID_MENU_MAIN_SAVEAS              1004
#define ID_MENU_MAIN_MAKESOURCE          1005
#define ID_MENU_MAIN_ABOUT               1006
#define ID_MENU_MAIN_QUIT                1007
#define ID_MENU_MAIN_APPLICATION         1101
#define ID_MENU_MAIN_WINDOWS             1102


/*
 * MESSAGE IDs -----------------------------
 */
/***** WINDOW: MAIN *****/
#define ID_STR_MAIN_APPOWNER        11001
#define ID_STR_MAIN_COMPILER        11002
#define ID_STR_MAIN_VERSNUM         11003
#define ID_STR_MAIN_YEAR            11004
#define ID_STR_MAIN_APPNAME         11005
#define ID_STR_MAIN_APPBASE         11006
#define ID_STR_MAIN_APPTITLE        11007
#define ID_STR_MAIN_APPVERS         11008
#define ID_STR_MAIN_APPCOPYR        11009
#define ID_STR_MAIN_APPAUTH         11010
#define ID_STR_MAIN_APPDESC         11011
#define ID_STR_MAIN_HELPFILE        11012
#define ID_BUT_MAIN_TOGGLE          11013
#define ID_STR_MAIN_TEMPLEFILE      11014
#define ID_BUT_MAIN_OK              11998
#define ID_BUT_MAIN_CANCEL          11999

/***** WINDOW: WINDOWS *****/
#define ID_BUT_WINDOWS_NEW          12001
#define ID_BUT_WINDOWS_DEL          12002
#define ID_STR_WINDOWS_NAME         12003
#define ID_STR_WINDOWS_IDENT        12004
#define ID_BUT_WINDOWS_LISTCHANGE   12005
#define ID_BUT_WINDOWS_OK           12998
#define ID_BUT_WINDOWS_CANCEL       12999


/*
 * JMH-APP-TEMPLATE FUNCTION PROTOTYPES ----
 */
void  JMH_About( void );
LONG  JMH_Error( UBYTE *, APTR, BOOL, UBYTE *, UBYTE *, LONG );
BOOL  JMH_FileReq( APTR, UBYTE *, BOOL, BOOL, UBYTE *, UWORD );
void  JMH_InitVars( void );
ULONG JMH_LaunchProgram( BOOL, UBYTE *, BOOL );
void  JMH_Startup( int, UBYTE ** );
void  JMH_Quit( char * );


/*
 * STRUCTURE DEFINITIONS -------------------
 */
struct MyGlobals {
   APTR  App;
   APTR  WIN_MAIN,
         WIN_WINDOWS;

   UBYTE  szAPPOWNER  [  81 ];
   UBYTE  szCOMPILER  [  81 ];
   UBYTE  szVERSNUM   [  11 ];
   UBYTE  szYEAR      [   5 ];
   UBYTE  szAPPNAME   [  31 ];
   UBYTE  szAPPBASE   [  16 ];
   UBYTE  szAPPTITLE  [  81 ];
   UBYTE  szAPPVERS   [  81 ];
   UBYTE  szAPPCOPYR  [  81 ];
   UBYTE  szAPPAUTH   [  81 ];
   UBYTE  szAPPDESC   [ 255 ];
   UBYTE  szHELPFILE  [ 255 ];
   UBYTE  szTEMPLEFILE[ 255 ];

   struct List  WindowList;

   struct DiskObject *dobj_App, *dobj_Proj;
   UBYTE  szProjectSpec[ FMSIZE+1 ];

   BOOL   running;
};

struct WindowData
{
   struct Node  node;

   UBYTE  szName [ 31 ];
   UBYTE  szIdent[ 16 ];
   UBYTE  szID   [  5 ];
   UBYTE  szTitle[ 81 ];
   UBYTE  szMenu [ 81 ];
   UBYTE  szWHelp[ 81 ];
   UBYTE  szMHelp[ 81 ];
   UBYTE  szClose[ 81 ];
   BOOL    fAppW;
};

struct MainWindow {
   APTR  REG_Page         ,
         STR_APPOWNER     ,
         STR_COMPILER     ,
         STR_VERSNUM      ,
         STR_YEAR         ,
         STR_APPNAME      ,
         STR_APPBASE      ,
         STR_APPTITLE     ,
         STR_APPVERS      ,
         STR_APPCOPYR     ,
         STR_APPAUTH      ,
         STR_APPDESC      ,
         STR_HELPFILE     ,
         STR_TEMPLEFILE   ,
         CHE_REXX         ,
         CHE_AslBase      ,
         INT_AslBase      ,
         CHE_DataTypesBase,
         INT_DataTypesBase,
         CHE_DiskfontBase ,
         INT_DiskfontBase ,
         INT_DosBase      ,
         CHE_GadToolsBase ,
         INT_GadToolsBase ,
         INT_GfxBase      ,
         INT_IconBase     ,
         CHE_IFFParseBase ,
         INT_IFFParseBase ,
         INT_IntuitionBase,
         CHE_LocaleBase   ,
         INT_LocaleBase   ,
         INT_MUIMasterBase,
         CHE_RealTimeBase ,
         INT_RealTimeBase ,
         INT_UtilityBase  ,
         CHE_WorkbenchBase,
         INT_WorkbenchBase,
         LIS_List         ,
         BUT_Toggle       ,
         BUT_OK           ,
         BUT_Cancel;
};

struct WindowsWindow {
   APTR  BUT_New  ,
         BUT_Del  ,
         LIS_List ,
         STR_Name ,
         STR_Ident,
         STR_ID   ,
         STR_Title,
         STR_Menu ,
         STR_WHelp,
         STR_MHelp,
         STR_Close,
         CHE_AppW ,
         BUT_Apply;
};


/*
 * SUBROUTINE FUNCTION PROTOTYPES -------------------
 */
UBYTE *fnFindEndif( BPTR fhi, UBYTE *pszMatch );
BOOL   fnOpen( UBYTE * );
BOOL   fnSave( UBYTE * );


/*
 * APPLICATION FUNCTION PROTOTYPES ------------------
 */
BOOL fnConstructMainWindow( void );
BOOL fnInitMainWindow( void );
BOOL fnDestructMainWindow( BOOL );
void fnClearMainWindow( void );
BOOL fnConstructWindowsWindow( void );
BOOL fnInitWindowsWindow( void );
BOOL fnDestructWindowsWindow( BOOL );
void fnSetWindowData( void );
struct WindowData *fnSetupMAINWindowNode( void );
struct WindowData *fnSetupNewWindowNode( void );
void fnStoreWindowNode( void );
void fnClearWindowsWindow( void );
void fnCopyTempleUntilEndMarker( BPTR, BPTR );
