/* Main-Header File inserted by GenCodeC */
/* Libraries */
#include <libraries/mui.h>
#include <libraries/gadtools.h> /* for BARLABEL in MenuItem */

/* Prototypes */
#ifdef __SASC
#include <clib/muimaster_protos.h>
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <clib/dos_protos.h>
#else
#include <proto/muimaster.h>
#include <proto/exec.h>
#include <proto/alib.h>
#include <proto/dos.h>
#endif

/*  Pragmas  */
#include <pragmas/muimaster_pragmas.h>

/*  Ansi  */
#include <stdlib.h>
#include <stdio.h>

/* Increase stack size */
LONG __stack=8192;
/* GenCodeC header end */

/* Include generated by GenCodeC */

#include "GenCodeCGUI.h"

#include <exec/memory.h>
#include <string.h>

#include "TextField.h"
#include "Tools.h"
#include "GenCodeC.h"
#include "MB_pragmas.h"
#include "MB_protos.h"
#include "MB.h"

/* defines for header file */
#define  HHEADER     1
#define  CHEADER     2
#define  MAINHEADER  3

#define  LOCALSAVE   1
#define  GLOBALSAVE  2

/* Global variables */
BOOL	TextFieldLocked = FALSE;
BOOL	NormalEnd = FALSE;

struct ObjTextField	*TF_H_Header = NULL;
struct ObjTextField	*TF_C_Header =  NULL;
struct ObjTextField	*TF_Main_Header = NULL;

char 	*H_Header_Text;
char 	*C_Header_Text;
char 	*Main_Header_Text;

/* Declarations for libraries (inserted by GenCodeC) */
struct Library * MUIMasterBase;

struct Library * IntuitionBase = NULL;
struct Library * MUIBBase      = NULL;
struct Library * TextFieldBase = NULL;

/* Init() function */
void init( void )
{
	if (!(IntuitionBase = OpenLibrary("intuition.library",36)))
	{
		exit(20);
	}

	if (!(MUIMasterBase = OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)))
	{
		DisplayMsg("Can't Open MUIMaster Library\n");
		CloseLibrary(IntuitionBase);
		exit(20);
	}

	if (!(MUIBBase = OpenLibrary("muibuilder.library", 0)))
	{
		DisplayMsg("Can't Open MUIBuilder Library\n");
		CloseLibrary(MUIMasterBase);
		CloseLibrary(IntuitionBase);
		exit(20);
	}

	/* exit if we cant init the Library */
	if (!MB_Open())
	{
		DisplayMsg("Unable to Get Temporary files !\n");
		CloseLibrary(MUIBBase);
		CloseLibrary(MUIMasterBase);
		CloseLibrary(IntuitionBase);
		exit(20);
	}

	if (!(TextFieldBase = OpenLibrary("gadgets/textfield.gadget", 0)))
	{
		DisplayMsg("Can't Open Textfield gadget\n");
		MB_Close();
		CloseLibrary(MUIBBase);
		CloseLibrary(MUIMasterBase);
		CloseLibrary(IntuitionBase);
		exit(20);
	}
}
/* GenCodeC init() end */

void UnlockTextFieldTexts(struct ObjTextField *,char *,struct ObjTextField *,char *,struct ObjTextField *,char *);

/* End() function */
void end(void *ptr_void)
{
	struct ObjApp *app=(struct ObjApp *)ptr_void;

	MB_Close();    /* Free Memory and Close Temporary Files */

	if (app)
	{
		set(app->WI_C_Generation,
			MUIA_Window_Open, FALSE);

		if (TextFieldLocked)
			UnlockTextFieldTexts(TF_H_Header,H_Header_Text,
							 TF_C_Header,C_Header_Text,
							 TF_Main_Header,Main_Header_Text);

		if (TF_H_Header && TF_H_Header->textfield)
			DoMethod(app->GR_H_Header, OM_REMOVE, TF_H_Header->textfield);

		if (TF_C_Header && TF_C_Header->textfield)
			DoMethod(app->GR_C_Header, OM_REMOVE, TF_C_Header->textfield);

		if (TF_Main_Header && TF_Main_Header->textfield)
			DoMethod(app->GR_Main_Header, OM_REMOVE, TF_Main_Header->textfield);

		DisposeTextField(TF_H_Header);
		DisposeTextField(TF_C_Header);
		DisposeTextField(TF_Main_Header);

		DisposeApp(app);
	}

	CloseAllFiles(!NormalEnd);
	ClearMemory(!NormalEnd);

	CloseLibrary(TextFieldBase);
	CloseLibrary(MUIBBase);
	CloseLibrary(MUIMasterBase);
	CloseLibrary(IntuitionBase);
	exit(20);
}
/* GenCodeC end() end */

/* Read a header file and load it in memory */
char *LoadHeaderFile(int HeaderFile)
{
	char  *TMPFile;
	char  *HF;
	int   size;
	char  *MBDir=NULL;
	char  *FileName;
	
	MB_Get(MUIB_FileName,&FileName,TAG_END);
	
	/* Get Current Directory Name */
	MBDir = GetCurrentDirectory();
	  
	size = strlen(MBDir)+1+9+1+strlen(FilePart(FileName))+12+1;
	TMPFile = AllocMemory(size,TRUE);

	/* Try to read local header and if there is no local header, try to read global header */
	strcpy(TMPFile,MBDir);
	AddPart(TMPFile,"C_Headers",size);
	AddPart(TMPFile,FilePart(FileName),size);
	remove_extend(TMPFile);
	switch(HeaderFile)
	{
		case HHEADER:
			add_extend(TMPFile,".H-Header");
			break;
			
		case CHEADER:
			add_extend(TMPFile,".C-Header");
			break;
			
		case MAINHEADER:
			add_extend(TMPFile,".Main-Header");
			break;
	}
	if (!(HF = LoadFileInRAM(TMPFile,FALSE)))
	{
		FreeMemory(TMPFile);
		size = strlen(MBDir)+1+9+1+12+1;
		TMPFile = AllocMemory(size,FALSE);

		strcpy(TMPFile,MBDir);
		AddPart(TMPFile,"C_Headers",size);
		switch(HeaderFile)
		{
			case HHEADER:
				AddPart(TMPFile,"H-Header",size);
				break;
					
			case CHEADER:
				AddPart(TMPFile,"C-Header",size);
				break;
					
			case MAINHEADER:
				AddPart(TMPFile,"Main-Header",size);
				break;
		}
		if (!(HF = LoadFileInRAM(TMPFile,FALSE)))
		{
			DisplayMsg("Can't open Header file !!!");
		}
		FreeMemory(MBDir);
		FreeMemory(TMPFile);
		return HF;
	}
	else
	{
		FreeMemory(MBDir);
		FreeMemory(TMPFile);
		return HF;
	}
}

/* Save a header file */
void SaveHeaderFile(int HeaderFile,char *HeaderText,int PrefsSave)
{
	char  *TMPFile;
	int   size;
	char  *MBDir = NULL;
	char  *FileName;
	BOOL  Prefs = (PrefsSave==LOCALSAVE);
	BPTR  file;
	
	MB_Get(MUIB_FileName,&FileName,TAG_END);
	
	/* Get Current Directory Name */
	MBDir = GetCurrentDirectory();
	  
	size = strlen(MBDir)+1+9+((Prefs) ? (1+strlen(FilePart(FileName))):1)+12+1;
	if (!(TMPFile = AllocMemory(size,FALSE)))
	{
		FreeMemory(MBDir);
		DisplayMsg("Can't save Header file !!! \n");
		return;
	}
	else
	{
		strcpy(TMPFile,MBDir);
		AddPart(TMPFile,"C_Headers",size);
		if (Prefs)
		{
			AddPart(TMPFile,FilePart(FileName),size);
			remove_extend(TMPFile);
		}
		switch(HeaderFile)
		{
			case HHEADER:
				(Prefs) ? add_extend(TMPFile,".H-Header") : AddPart(TMPFile,"H-Header",size);
				break;
			
			case CHEADER:
				(Prefs) ? add_extend(TMPFile,".C-Header") : AddPart(TMPFile,"C-Header",size);
				break;
			
			case MAINHEADER:
				(Prefs) ? add_extend(TMPFile,".Main-Header") : AddPart(TMPFile,"Main-Header",size);
				break;
		}
		if (file = OpenFile(TMPFile, MODE_NEWFILE, FALSE))
		{
			FreeMemory(MBDir);
			FreeMemory(TMPFile);
			FWrite(file,HeaderText,strlen(HeaderText),1);
			CloseFile(file);
		}
		else
		{
			DisplayMsg("Can't save Header file !!! \n");
		}
	}
}

void CreateTextFieldObjects(struct ObjApp *App,
							struct ObjTextField **TF_H_Header,
							struct ObjTextField **TF_C_Header,
							struct ObjTextField **TF_Main_Header)
{
	char  *HeaderText;
	
	if (!(*TF_H_Header = CreateTextField()))
	{
		DisplayMsg("Can't Create Textfield object\n");
		end((void *)App);
	}
	DoMethod(App->GR_H_Header, OM_ADDMEMBER, (*TF_H_Header)->textfield);
	HeaderText = LoadHeaderFile(HHEADER);
	if (HeaderText)
	{
		set((*TF_H_Header)->text,TEXTFIELD_Text,HeaderText);
		FreeMemory(HeaderText);
	}
	
	if (!(*TF_C_Header = CreateTextField()))
	{
		DisplayMsg("Can't Create Textfield object\n");
		end((void *)App);
	}
	DoMethod(App->GR_C_Header, OM_ADDMEMBER, (*TF_C_Header)->textfield);
	HeaderText = LoadHeaderFile(CHEADER);
	if (HeaderText)
	{
		set((*TF_C_Header)->text,TEXTFIELD_Text,HeaderText);
		FreeMemory(HeaderText);
	}
	
	if (!(*TF_Main_Header = CreateTextField()))
	{
		DisplayMsg("Can't Create Textfield object\n");
		end((void *)App);
	}
	DoMethod(App->GR_Main_Header, OM_ADDMEMBER, (*TF_Main_Header)->textfield);
	HeaderText = LoadHeaderFile(MAINHEADER);
	if (HeaderText)
	{
		set((*TF_Main_Header)->text,TEXTFIELD_Text,HeaderText);
		FreeMemory(HeaderText);
	}
}

void LockTextFieldTexts(struct ObjApp *App,
						struct ObjTextField *TF_H_Header,char **H_Header_Text,
						struct ObjTextField *TF_C_Header,char **C_Header_Text,
						struct ObjTextField *TF_Main_Header,char **Main_Header_Text)
{
	char	*text;
	ULONG	size;
	
	set(TF_H_Header->text,TEXTFIELD_ReadOnly,TRUE);
	set(TF_C_Header->text,TEXTFIELD_ReadOnly,TRUE);
	set(TF_Main_Header->text,TEXTFIELD_ReadOnly,TRUE);
	
	get(TF_H_Header->text,TEXTFIELD_Size,&size);
	get(TF_H_Header->text,TEXTFIELD_Text,&text);
	*H_Header_Text = AllocMemory(size+1,TRUE);
	strncpy(*H_Header_Text,text,size);
	(*H_Header_Text)[size]='\0';

	get(TF_C_Header->text,TEXTFIELD_Size,&size);
	get(TF_C_Header->text,TEXTFIELD_Text,&text);
	*C_Header_Text = AllocMemory(size+1,TRUE);
	strncpy(*C_Header_Text,text,size);
	(*C_Header_Text)[size]='\0';
	
	get(TF_Main_Header->text,TEXTFIELD_Size,&size);
	get(TF_Main_Header->text,TEXTFIELD_Text,&text);
	*Main_Header_Text = AllocMemory(size+1,TRUE);
	strncpy(*Main_Header_Text,text,size);
	(*Main_Header_Text)[size]='\0';

	TextFieldLocked = TRUE;
}

void UnlockTextFieldTexts(struct ObjTextField *TF_H_Header,char *H_Header_Text,
							struct ObjTextField *TF_C_Header,char *C_Header_Text,
							struct ObjTextField *TF_Main_Header,char *Main_Header_Text)
{
	set(TF_H_Header->text,TEXTFIELD_ReadOnly,FALSE);
	set(TF_C_Header->text,TEXTFIELD_ReadOnly,FALSE);
	set(TF_Main_Header->text,TEXTFIELD_ReadOnly,FALSE);

	FreeMemory(H_Header_Text);
	FreeMemory(C_Header_Text);
	FreeMemory(Main_Header_Text);

	TextFieldLocked = FALSE;
}

/* Main Function inserted by GenCodeC */
int main(int argc,char **argv)
{
	struct ObjApp	*App = NULL; /* Object */
	BOOL			running = TRUE;
	ULONG			signal;
	BOOL			Locale;

	/* Program initialisation : generated by GenCodeC */
	init();
	
	/* Create Object : generated by GenCodeC */
	if (!(App = CreateApp()))
	{
		DisplayMsg("Can't Create App\n");
		end((void *)App);
	}

	SetDataQuit((void *)App);
	SetFunctionQuit(end);	

	CreateTextFieldObjects(App,&TF_H_Header,&TF_C_Header,&TF_Main_Header);
	
	MB_Get(MUIB_Locale,&Locale,TAG_DONE);
	if (!Locale)
		set(App->GR_Catalog,MUIA_ShowMe,FALSE);
	
	set(App->WI_C_Generation,
		MUIA_Window_Open, TRUE
		);
	
	while (running)
	{
		switch (DoMethod(App->App,MUIM_Application_Input,&signal))
		{
			case MUIV_Application_ReturnID_Quit:
			running = FALSE;
			break;
			
			/* Insert your code between the "case" statement and comment "end of case ..." */
			case ID_BT_SAVE_LOCAL:
			{
				LockTextFieldTexts(App,TF_H_Header,&H_Header_Text,
									   TF_C_Header,&C_Header_Text,
									   TF_Main_Header,&Main_Header_Text);
					
				SaveHeaderFile(HHEADER,H_Header_Text,LOCALSAVE);
				SaveHeaderFile(CHEADER,C_Header_Text,LOCALSAVE);
				SaveHeaderFile(MAINHEADER,Main_Header_Text,LOCALSAVE);
					
				UnlockTextFieldTexts(TF_H_Header,H_Header_Text,
									 TF_C_Header,C_Header_Text,
									 TF_Main_Header,Main_Header_Text);
			}
			break;
			/* end of case ID_BT_SAVE_LOCAL */

			case ID_BT_SAVE_GLOBAL:
			{
				LockTextFieldTexts(App,TF_H_Header,&H_Header_Text,
									   TF_C_Header,&C_Header_Text,
									   TF_Main_Header,&Main_Header_Text);
					
				SaveHeaderFile(HHEADER,H_Header_Text,GLOBALSAVE);
				SaveHeaderFile(CHEADER,C_Header_Text,GLOBALSAVE);
				SaveHeaderFile(MAINHEADER,Main_Header_Text,GLOBALSAVE);

				UnlockTextFieldTexts(TF_H_Header,H_Header_Text,
									 TF_C_Header,C_Header_Text,
									 TF_Main_Header,Main_Header_Text);
			}
			break;
			/* end of case ID_BT_SAVE_GLOBAL */

			case ID_BT_GENERATE:
			{
				LockTextFieldTexts(App,TF_H_Header,&H_Header_Text,
									   TF_C_Header,&C_Header_Text,
									   TF_Main_Header,&Main_Header_Text);

				GenerateCode(App,H_Header_Text,C_Header_Text,Main_Header_Text);

				UnlockTextFieldTexts(TF_H_Header,H_Header_Text,
									 TF_C_Header,C_Header_Text,
									 TF_Main_Header,Main_Header_Text);
			}
			break;
			/* end of case ID_BT_GENERATE */

			/* End computing of IDCMP */
		}
		if (running && signal) Wait(signal);
	}
	NormalEnd = TRUE;
	end((void *)App);
}
