/****************************************************************************
***  Ein Beispiel-AutoPOINT Setup-File                                    ***
*****************************************************************************
***                                                                       ***
***  Dieses File wird vom ZC-Editor aufgerufen, sobald der Sysop im       ***
***  AutoPOINT-Editor SETUP betätigt. Als Argument wird der AutoPOINTNAME ***
***  übergeben.                                                           ***
***  Dieses BSP-Setup benutzt MUI.                                        ***
***                                                                       ***
***  Zum Ansehen des Source TABSIZE auf 2 stellen                         ***
****************************************************************************/

/* Include-dateien */

#include <libraries/mui.h>
#include <clib/muimaster_protos.h>
#include <pragmas/muimaster_pragmas.h>
/* Prototypes */
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/icon_protos.h>
#include <clib/graphics_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/utility_protos.h>
#include <clib/asl_protos.h>


#include <graphics/gfxmacros.h>
#include <workbench/workbench.h>

#define REG(x) register __ ## x

#define ASM    __asm
#define SAVEDS __saveds

#include <pragmas/dos_pragmas.h>
#include <pragmas/icon_pragmas.h>
#include <pragmas/graphics_pragmas.h>
#include <pragmas/intuition_pragmas.h>
#include <pragmas/gadtools_pragmas.h>
#include <pragmas/utility_pragmas.h>
#include <pragmas/asl_pragmas.h>

#include <pragmas/locale_pragmas.h>
#include <libraries/locale.h>
#include <clib/locale_protos.h>

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <clib/exec_protos.h>
#include <proto/exec.h>
#include <exec/exec.h>
#include <dos/dos.h>
#include <exec/memory.h>
#include "proto/exec.h"
#include "proto/dos.h"
#include "proto/intuition.h"

#include <libraries/autopoint_library.h>
#include <pragmas/AutoPOINT_pragmas.h>
#include <utility/tagitem.h>


/* DEFINES */

#define ID_ABBRECHEN	1
#define ID_SPEICHERN	2


/* Global */

struct Library *LocaleBase = NULL;
struct Catalog *catalog = NULL;

/* für Locale-Library / Build-In-Language */
char* LOCALE_STRINGS[] =
{
	"Beispiel-AutoPOINT-Setup",
	"AutoPOINT-Setup",
	"AutoPoint-Name:",
	"_Speichern",
	"_Abbrechen",
	"_Datum",
	"_Zeit",
	"_User",
	"Konfig für Reply"
};


ULONG filelange(char* name)
{
	/* liefert die Länge eines Files */

	ULONG back=0;
	BPTR filelock=Lock(name,ACCESS_READ);
	if(filelock)
	{
		APTR memoryFAST=AllocVec(sizeof(struct FileInfoBlock),MEMF_CLEAR);
		if(memoryFAST)
		{
			if(Examine(filelock,(struct FileInfoBlock*)memoryFAST))
			{
				struct FileInfoBlock * zeiger=(struct FileInfoBlock*)memoryFAST;
				back=zeiger->fib_Size;
			}
			FreeVec(memoryFAST);
		}
		UnLock(filelock);
	}
	return back;
}
char* GetLocaleString(int id)
{
	/* liefert den id.ten String aus dem (geladenen) Catalog */

	if (LocaleBase)
	{
		return(char*)(GetCatalogStr(catalog,id,LOCALE_STRINGS[id]));
	}
	return(LOCALE_STRINGS[id]);
}
char GetLocaleKey(int id)
{
	/* liefert den Shortcut von dem id.ten String aus dem (geladenen) Catalog */

	char zeichen = 1;
	char* string = GetLocaleString(id);
	if (string)
	{
		while(*string)
		{
			if (*string++ == '_')
			{
				zeichen = *string;
				if ((zeichen >= 'A' && zeichen <= 'Z') || zeichen == 'Ü' || zeichen == 'Ö' || zeichen == 'Ä')
				{
					zeichen -= 'A'-'a';
				}
				break;
			}
		}
	}
	return zeichen;
}
int main(int argc,char* argv[])
{
	/* Setup wird mit Argument `AUTOPOINTNAME` aufgerufen */

	if (argc == 2)
	{
		struct Library *MUIMasterBase;
		APTR app,window,Gad[6];


		/* MUI und Locale-Library öffnen */

		MUIMasterBase = OpenLibrary((unsigned char*)MUIMASTER_NAME,(unsigned long)MUIMASTER_VMIN);
		if(!MUIMasterBase)
		{
			return ERROR_CANT_OPEN_MUI;
		}
		LocaleBase = OpenLibrary("locale.library",0);
		if (LocaleBase)
		{
			catalog = OpenCatalog(NULL,"ZConnect_Editor.catalog",OC_BuiltInLanguage,"deutsch",TAG_DONE);
		}


		/* Setup-Fenster erstellen */

		app = ApplicationObject,
			MUIA_Application_Title      , "Beispiel-AutoPOINT-Setup",
			MUIA_Application_Version    , "$VER: 0.1 ("__DATE__")",
			MUIA_Application_Copyright  , "Public Domain",
			MUIA_Application_Author     , "Uwe Rosenkranz",
			MUIA_Application_Base       , "BSPAUTOPOINT",
			SubWindow, window = WindowObject,
				MUIA_Window_Title , GetLocaleString(0),
				MUIA_Window_ID    , 66,
				MUIA_Window_Width , MUIV_Window_Width_Screen(50),
				MUIA_Window_Height, MUIV_Window_Height_Screen(50),
				WindowContents, VGroup,
					Child,VGroup,
						Child,VGroup,GroupFrameT(GetLocaleString(1)),MUIA_Background, MUII_GroupBack,
							Child,ColGroup(2),
								Child,LLabel1(GetLocaleString(2)),
								Child,Gad[0]=TextObject,TextFrame,
									MUIA_Background, MUII_TextBack,
									MUIA_Text_Contents,"     ",
								End,
							End,
						End,
						Child,VGroup,GroupFrameT(GetLocaleString(8)),MUIA_Background, MUII_GroupBack,
							Child,ColGroup(4),
								Child,HSpace(0),
								Child, Label2(GetLocaleString(5)),
								Child,Gad[3]=KeyCheckMark(FALSE,GetLocaleKey(5)),
								Child,HSpace(0),
								Child,HSpace(0),
								Child, Label2(GetLocaleString(6)),
								Child,Gad[4]=KeyCheckMark(FALSE,GetLocaleKey(6)),
								Child,HSpace(0),
								Child,HSpace(0),
								Child, Label2(GetLocaleString(7)),
								Child,Gad[5]=KeyCheckMark(FALSE,GetLocaleKey(7)),
								Child,HSpace(0),
							End,
						End,
						Child,HGroup,GroupFrame,MUIA_Background, MUII_GroupBack,
   						Child,Gad[1]=SimpleButton(GetLocaleString(3)),
   						Child,Gad[2]=SimpleButton(GetLocaleString(4)),
						End,
					End,
				End,
			End,
		End;


		if(app)
		{
			int running=1;
			ULONG signal = 0;
			char konfigname[128];
			BPTR konfigfile;
			int konfiglen;


			/* Notify zwischen den Gadgets/Window herstellen */

			DoMethod(window,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,app,2,MUIM_Application_ReturnID,ID_ABBRECHEN);
			DoMethod(Gad[1],MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,ID_SPEICHERN);
			DoMethod(Gad[2],MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,ID_ABBRECHEN);


			/* Konfigfilename erstellen ("PROGDIR:"+AUTOPOINTNAME+".conf") */

			strcpy(konfigname,"ProgDir:");
			strcat(konfigname,argv[1]);
			strcat(konfigname,".conf");


			/* Existiert ein Konfigfile -> Laden */

			konfiglen=filelange(konfigname);
			if (konfiglen > 0)
			{
				char* memory=AllocVec(konfiglen+1,MEMF_CLEAR);
				if(memory)
				{
					konfigfile=Open(konfigname,MODE_OLDFILE);
					if(konfigfile)
					{
						int geladen=Read(konfigfile,memory,konfiglen);

						Close(konfigfile);

						if (geladen == konfiglen)
						{
							/* Konfigfile auswerten und Gadgets setzen */

							char *konfigs[]={"<SHOWDATE>","<SHOWTIME>","<SHOWUSER>"};
							char* pointer=memory;
							memory[konfiglen]=0;

							while(pointer < memory+konfiglen)
							{
								if(*pointer)
								{
									int loop=0;
									while(loop < 3)
									{
										if(!strnicmp(konfigs[loop],pointer,strlen(konfigs[loop++])))
											nnset(Gad[2+loop],MUIA_Selected,TRUE);
									}
								}
								

								/* Anfang der nächsten Zeile suchen */

								pointer++;
								while(*pointer && *pointer!= '\n' && *pointer!= '\r')
									pointer++;
								if(*pointer)
									pointer++;
							}
						}
					}
					FreeVec(memory);
				}
			}

			set(Gad[0],MUIA_Text_Contents,argv[1]);
			set(window,MUIA_Window_Open,TRUE);

			while(running)
			{
				int button_id=DoMethod(app,MUIM_Application_Input,&signal);
				switch (button_id)
				{
					case ID_ABBRECHEN:
					{
						running=FALSE;
						break;
					}
					case ID_SPEICHERN:
					{
						/* Konfigfile speichern */

						konfigfile=Open(konfigname,MODE_NEWFILE);
						if(konfigfile)
						{
							int loop=0;
							char *konfigs[]={"<SHOWDATE>","<SHOWTIME>","<SHOWUSER>"};

							while(loop < 3)
							{
								int checkmark;
								get(Gad[3+loop],MUIA_Selected,&checkmark);

								if(checkmark)
								{
									Write(konfigfile,konfigs[loop],strlen(konfigs[loop]));
									Write(konfigfile,"\n",1);
								}
								loop++;
							}
							Write(konfigfile,"\n",1);
							Close(konfigfile);
						}

						running=FALSE;
						break;
					}
				}
				if (running && signal)
					Wait(signal);
			}
			MUI_DisposeObject(app);
		}
		CloseLibrary(MUIMasterBase);
		if(LocaleBase)
			CloseLibrary(LocaleBase);
	}
	return 0;
}