/* RCS:
** $Id$
**
** PatchGUI.c © Aris Basic
**
**
*/

/*FOLDER Global Vars,Includes,Declarations,Macros
*/
#include <custom/mui_standard.h>
#include <string.h>
//#include "patchGUI_cat.h"

struct LocaleBase *LocaleBase;
struct Library *IconBase;
struct Catalog *mycatalog;

#define setmnlabel(number,label,comm) mn_data[number].nm_Label=getstring(label);\
                                      mn_data[number].nm_CommKey=((comm)?getstring(comm):0)
#define sepBAR RectangleObject,\
               MUIA_Rectangle_HBar,TRUE,\
               MUIA_FixHeight,15,\
               End
#define textGAD(txt,prep) TextObject,\
                          MUIA_Background,MUII_TextBack,\
                          MUIA_Frame,MUIV_Frame_Text,\
                          MUIA_Text_Contents,(char *)txt,\
                          MUIA_Text_PreParse,(prep?prep:""),\
                          MUIA_Text_SetMin,TRUE,\
                          End
#define ENVPATH "ENV:PATCHGUI"
#define ENVARCPATH "ENVARC:PATCHGUI"
#define ARGPAT "PRGNAME/K/A,FORMAT/K/A"
#define NAVODNIK '"'

enum { ID_DELETE=1,ID_EDIT,ID_CONFIG,ID_CONFIGC,ID_CONFIGOK,ID_DO,};

APTR App,win,configroup;
APTR bt_quit,bt_do,info;
APTR dlist,bt_delete,bt_edit;
APTR confwin,str_prg,pop_prg,str_name,str_format;
APTR str_info,bt_c_cancel,bt_c_ok;
APTR str_fnew,str_fold,str_fpatch,pop_fnew,pop_fold,pop_fpatch;
APTR bt_c_help,bt_about;

struct mydata {
    char name[35];
    char prgname[35];
    char format[60];
    char info[256];
    };

struct myarg {
    char *prgname;
    char *format;
    };

struct mydata data;
int error;
struct FileInfoBlock *cname;
char help[256];
/*END*/
/*
** Procedure cpyfileENV (Copy Config To Env)
**
** void cpyfileEMV(char *name)
**
** INPUT:
** char *name <- Filename without Path
**
** OUTPUT:
** none
**
*/
/*FOLDER cpyfileENV
*/
void cpyfileENV(char *name)
{
    char *envname=(char *)malloc(sizeof(char)*256);
    char *envarcname=(char *)malloc(sizeof(char)*256);
    char *buffer=(char *)malloc(sizeof(char)*256);

    sprintf(envname,"%s/%s",ENVPATH,name);
    sprintf(envarcname,"%s/%s",ENVARCPATH,name);
    sprintf(buffer,"copy %s TO %s QUIET",envarcname,envname);
    System(buffer,TAG_DONE);
    }
/*END*/
/*
** Function rconfig (ReadConfig)
**
** struct mydata config=rconfig(char *name)
**
** INPUT:
** char *name <- Name of Config File
**               (ENV:PATCHGUI/ will be added to name)
**
** OUTPUT:
** struct mydata *config <- Readed Configuration
** config.name == NULL if somthings wrong in Configuration
** config.info == Error Text
**
*/
/*FOLDER ReadConfig
*/
struct mydata rconfig(char *name)
{
    BPTR conf;
    struct mydata rconf;
    char *rname=(char *)malloc(sizeof(char)*256),*cinfo=(char *)malloc(sizeof(char)*256);
    char *confline=(char *)malloc(sizeof(char)*256);
    struct myarg args;
    struct RDArgs *rdargs;

    sprintf(rname,"%s/%s",ENVPATH,name);
    if (conf=Open(rname,MODE_OLDFILE)) {
        FGets(conf,confline,256);
        FGets(conf,cinfo,256);
        Close(conf);
        strcpy(rconf.info,cinfo);
        strcpy(rconf.name,name);
        if ((rdargs=AllocDosObject(DOS_RDARGS,NULL))!=NULL) {
            rdargs->RDA_Source.CS_Buffer=confline;
            rdargs->RDA_Source.CS_Length=strlen(confline);
            rdargs->RDA_Source.CS_CurChr=0;
            rdargs->RDA_DAList=NULL;
            rdargs->RDA_Buffer=NULL;
            rdargs->RDA_Flags=RDAF_NOPROMPT;
            if ((rdargs=ReadArgs(ARGPAT,(long *)&args,rdargs))!=NULL) {
                strcpy(rconf.prgname,args.prgname);
                strcpy(rconf.format,args.format);
                FreeArgs(rdargs);
                }
            else {
                strcpy(rconf.info,"Somthing is Wrong With This Config!\nCheck it !!!");
                strcpy(rconf.prgname,"ERROR");
                }
            FreeDosObject(DOS_RDARGS,rdargs);
            }
        else {
            strcpy(rconf.info,"Could Not Allocate Memory !");
            strcpy(rconf.prgname,"ERROR");
            }

        return(rconf);
    }
    strcpy(rconf.info,"Error With  File!");
    strcpy(rconf.prgname,"ERROR");
    return(rconf);
    }
/*END*/
/*
** Procedure wconfig (WriteConfig)
**
** void wconfig(struct mydata data)
**
** INPUT:
** struct mydata *data <- Ptr To Structure With Configuration Datas
**
** OUTPUT:
** none
**
*/
/*FOLDER WriteConfig
*/
BOOL wconfig(struct mydata data)
{
    BPTR file,lock;
    char *fullinfo=(char *)malloc(sizeof(char)*256);
    char *fullconfig=(char *)malloc(sizeof(char)*256);
    char *filename=(char *)malloc(sizeof(char)*256);

    if (strlen(data.format)<=0) {
        MUI_Request(App,win,NULL,0,"*_OK","There Is No FORMAT In Configuration\n And You must have them !!",TAG_DONE);
        return(FALSE);
        }
    if (data.name!=NULL) {
        sprintf(filename,"%s/%s",ENVARCPATH,data.name);
        if ((file=Open(filename,MODE_NEWFILE))==NULL) {
            if ((lock=CreateDir(ENVARCPATH))==NULL) {
                puts("Cold Not Save Config");
                return(FALSE);
                }
                UnLock(lock);
            }
        sprintf(fullconfig,"PRGNAME=%s FORMAT=%c%s%c",data.prgname,NAVODNIK,data.format,NAVODNIK);
        sprintf(fullconfig,"%s\n",fullconfig);
        sprintf(fullinfo,"%s\n",data.info);
        FPuts(file,fullconfig);
        FPuts(file,fullinfo);
        Close(file);
        cpyfileENV(data.name);
        return(TRUE);
        }
    }
/*END*/
/*
** Procedure setconfwin (Set Config Window)
**
** void setconfwin(struct mydata data)
**
** INPUT:
** struct mydata data <- Configuration Structure Reded from File
**
** OUTPUT:
** none
**
*/
/*FOLDER Set Config Window
*/
void setconfwin(struct mydata data)
{
    setstring(str_info,data.info);
    setstring(str_name,data.name);
    setstring(str_prg,data.prgname);
    setstring(str_format,data.format);
    }
/*END*/
/*
** Procedure getconfwin (Get Config Window)
**
** struct mydata data=getconfwin(void)
**
** INPUT:
** none
**
** OUTPUT:
** mydata structure of configuration
**
*/
/*FOLDER Get Config Window
*/
struct mydata getconfwin(void)
{
    struct mydata data;
    char *help;

    getstring(str_info,&help);
    strcpy(data.info,help);
    getstring(str_name,&help);
    strcpy(data.name,help);
    getstring(str_prg,&help);
    strcpy(data.prgname,help);
    getstring(str_format,&help);
    strcpy(data.format,help);
    return(data);
    }
/*END*/
/*
** Function Parse CommandLine
**
** char *parsecmdline(struct mydata data)
**
*/
/*FOLDER ParseCMDLine
*/
char *parsecmdline(struct mydata data,char *filenew,char *fileold,char *filepatch)
{
    char *cmdline=(char *)malloc(sizeof(char)*256);
    char *format=(char *)malloc(sizeof(char)*256);
    char help;
    int a=0;

    if ((strlen(data.format)<=0)) return("ERROR");

    strcpy(format,data.format);
    sprintf(cmdline,"%s ",data.prgname);

    help=format[a++];

    while(a<=strlen(format)) {
    switch(help) {
         case '%':
             switch(format[a++]) {
                 case '%':
                     sprintf(cmdline,"%s%c",cmdline,'%');
                     break;
                 case 'f':
                     switch(format[a++]) {
                         case 'n':
                             sprintf(cmdline,"%s%s",cmdline,filenew);
                             break;
                         case 'p':
                             sprintf(cmdline,"%s%s",cmdline,filepatch);
                             break;
                         case 'o':
                             sprintf(cmdline,"%s%s",cmdline,fileold);
                             break;
                         }
                     break;
                 }
             break;
         default:
             sprintf(cmdline,"%s%c",cmdline,help);
             break;
         }
     help=format[a++];
     }
 return(cmdline);
 }

/*END*/
/*
** Hook Function ABout
*/
/*FOLDER About HOOK
*/
_HOOK_FUNC (void,mabout,struct Hook *hook,APTR obj,APTR dummy)
{
    MUI_Request(App,win,0,NULL,"*_OK","\033c\033bPatchGUI 00.10"
                                      "\033n\n© Aris Basic 1995\n\n"
                                      "Contact me on:\naris@pwe.augusta.de"
                                      "\n\n\033bThis is MUI Application\n"
                                      "MUI © Stefan Stuntz",TAG_DONE);
    }
struct Hook mabout_hook={
       {NULL,NULL},
       (void *)mabout,
       NULL,NULL
       };
/*END*/
/*
** Hook Function Help
*/
/*FOLDER Config Help HOOK
*/
_HOOK_FUNC (void,chelp,struct Hook *hook,APTR obj,APTR dummy)
{
    MUI_Request(App,confwin,0,NULL,"*_OK","\033c\033bHELP\n\033nfor Format"
                                      " field:\n\n\033l"
                                      "%%%%  - puts char %% on this place\n"
                                      "%%fo - puts Filename from OldFilename gadget\n"
                                      "%%fn - puts Filename from NewFilename gadget\n"
                                      "%%fp - puts Filename from PatchFilename gadget\n"
                                      "\n\n\033b\033rPatchGUI © Aris Basic",TAG_DONE);
    }
struct Hook chelp_hook={
       {NULL,NULL},
       (void *)chelp,
       NULL,NULL
       };
/*END*/
/*
** Hook Function Do
*/
/*FOLDER Do HOOK
*/
_HOOK_FUNC (void,do_that,struct Hook *hook,APTR obj,APTR dummy)
{
    char *fnew,*fold,*fpatch,*cmdline,*infoline=(char *)malloc(sizeof(char)*256);


    DoMethod(dlist,MUIM_List_GetEntry,MUIV_List_GetEntry_Active,&cname);

    if (cname==NULL)
        {

            MUI_Request(App,win,0,NULL,"*_OK","\033cYou Haven`t Double Click On Configuration!!",TAG_DONE);
            set(info,MUIA_Text_Contents,"\033bERROR !!!\033n\nYou Haven`t Chose Configuartion!");
            return;
        }

    stccpy(help,cname->fib_FileName,strlen(cname->fib_FileName));
    error=Stricmp(data.name,help);

    if (!error)
        {
             data=rconfig(cname->fib_FileName);
        }

    if (!Stricmp(data.prgname,"ERROR"))
        {
            MUI_Request(App,win,0,NULL,"*_OK","\033cSomthings Wrong With Configuration !\nMaybe it isn`t Loaded ?!\nDouble Click on Configuration for Your Program !!",TAG_END);
            set(info,MUIA_Text_Contents,"Error With Configuration");
            return;
        }

    getstring(str_fnew,&fnew);
    getstring(str_fold,&fold);
    getstring(str_fpatch,&fpatch);
    cmdline=parsecmdline(data,fnew,fold,fpatch);
    sprintf(infoline,"\033bNow Doing:\033n\n %s",cmdline);
    set(info,MUIA_Text_Contents,infoline);
    set(win,MUIA_Window_Sleep,TRUE);
    error=System(cmdline,TAG_DONE);
    set(win,MUIA_Window_Sleep,FALSE);

    if (error)
        {
        sprintf(infoline,"\033bThere Was Error : %d !!\033n\nProbably Error in Format or Arguments",error);
        set(info,MUIA_Text_Contents,infoline);
        }
    else
        {
            set(info,MUIA_Text_Contents,"\033bDone\n\033nEverything is OK !!");
        }
}

struct Hook do_hook = {
    {NULL,NULL},
    (void *)do_that,
    NULL,NULL
    };
/*END*/

/*Main*/
/*FOLDER Main
*/
void main(void)
{
    BOOL running=TRUE;
    long signals,id;
   

    init();
/*FOLDER Configuration Window
*/
    confwin=WindowObject,
            MUIA_Window_ID,MAKE_ID('C','O','N','F'),
            MUIA_Window_Title,"PatchGUI Configuration",
            WindowContents,VGroup,
                  Child,textGAD("Configuration Editor","\033c"),
                  Child,sepBAR,
                  Child,ColGroup(2),
                        Child,Label("Config Name"),
                        Child,str_name=StringObject,
                              StringFrame,
                              MUIA_String_MaxLen,35,
                              End,
                        Child,Label("Program Name"),
                        Child,pop_prg=PopaslObject,
                              MUIA_Popstring_String,str_prg=StringObject,
                                                    StringFrame,
                                                    MUIA_String_MaxLen,75,
                                                    End,
                              MUIA_Popstring_Button,PopButton(MUII_PopFile),
                              ASLFR_SleepWindow,TRUE,
                              End,
                        Child,Label("Format"),
                        Child,str_format=StringObject,
                              StringFrame,
                              MUIA_String_MaxLen,50,
                              End,
                        Child,Label("Configuration Info"),
                        Child,str_info=StringObject,
                              StringFrame,
                              MUIA_String_MaxLen,255,
                              End,
                        End,
                  Child,sepBAR,
                  Child,bt_c_help=SimpleButton("Help"),
                  Child,HGroup,
                        Child,bt_c_ok=SimpleButton("Ok"),
                        Child,bt_c_cancel=SimpleButton("Cancel"),
                        End,
                  End,
            End;
/*END*/
/*FOLDER Configuration Group (MaIn Window)
*/
    configroup=VGroup,
                      GroupFrameT("Chose Config"),
                          Child,dlist=ListviewObject,
                                MUIA_Listview_Input,TRUE,
                                MUIA_Listview_List,DirlistObject,
                                     MUIA_Background,MUII_ListBack,
                                     InputListFrame,
                                     MUIA_Dirlist_Directory,"ENV:PATCHGUI/",
                                     MUIA_Dirlist_FilesOnly,TRUE,
                                     MUIA_List_Format," ",
                                     End,
                                End,
                          Child,HGroup,
                                Child,bt_delete=SimpleButton("Delete"),
                                Child,bt_edit=SimpleButton("Edit"),
                                End,
                          End;
/*END*/
    App=ApplicationObject,
        MUIA_Application_Title,"PatchGUI",
        MUIA_Application_Version,"$VER: PatchGUI 00.10 (27.10.95)",
        MUIA_Application_Copyright,"© 1995 Aris Basic",
        MUIA_Application_Author,"Aris Basic",
        MUIA_Application_Description,"GUI for spatch and more",
        MUIA_Application_Base,"PATCHGUI",
        MUIA_Application_Window,win=WindowObject,
                                MUIA_Window_ID,MAKE_ID('M','A','I','N'),
                                MUIA_Window_Title,"PatchGUI",
                                WindowContents,VGroup,
                                      Child,textGAD("\0338PatchGUI 00.10 © Aris Basic","\033c"),
                                      Child,info=textGAD("\033bWelcome To PatchGUI\033n\n(Double Click On Configuration  to Use,Edit or Delete it)","\033c"),
                                      Child,HGroup,
                                            Child,ColGroup(2),
                                                  Child,VSpace(8),
                                                  Child,VSpace(8),
                                                  Child,Label("New FileName"),
                                                  Child,pop_fnew=PopaslObject,
                                                        MUIA_Popstring_String,str_fnew=StringObject,
                                                             StringFrame,
                                                             MUIA_String_MaxLen,256,
                                                             End,
                                                        MUIA_Popstring_Button,PopButton(MUII_PopFile),
                                                        ASLFR_SleepWindow,TRUE,
                                                        End,
                                                  Child,Label("Old FileName"),
                                                  Child,pop_fold=PopaslObject,
                                                        MUIA_Popstring_String,str_fold=StringObject,
                                                             StringFrame,
                                                             MUIA_String_MaxLen,256,
                                                             End,
                                                        MUIA_Popstring_Button,PopButton(MUII_PopFile),
                                                        ASLFR_SleepWindow,TRUE,
                                                        End,
                                                  Child,Label("Patch FileName"),
                                                  Child,pop_fpatch=PopaslObject,
                                                        MUIA_Popstring_String,str_fpatch=StringObject,
                                                             StringFrame,
                                                             MUIA_String_MaxLen,256,
                                                             End,
                                                        MUIA_Popstring_Button,PopButton(MUII_PopFile),
                                                        ASLFR_SleepWindow,TRUE,
                                                        End,
                                                  Child,VSpace(4),
                                                  Child,VSpace(4),
                                                  End,
                                             Child,configroup,
                                             End,
                                       Child,sepBAR,
                                       Child,bt_about=SimpleButton("About"),
                                       Child,HGroup,
                                             Child,bt_do=SimpleButton("Do"),
                                             Child,bt_quit=SimpleButton("Quit"),
                                             End,
                                      End,
                                End,
                                SubWindow,confwin,
        End;

 DoMethod(win,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,App,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
 DoMethod(dlist,MUIM_Notify,MUIA_Listview_DoubleClick,TRUE,App,2,MUIM_Application_ReturnID,ID_CONFIG);
 DoMethod(bt_edit,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_Application_ReturnID,ID_EDIT);
 DoMethod(confwin,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,App,2,MUIM_Application_ReturnID,ID_CONFIGC);
 DoMethod(bt_c_cancel,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_Application_ReturnID,ID_CONFIGC);
 DoMethod(bt_c_ok,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_Application_ReturnID,ID_CONFIGOK);
 DoMethod(bt_delete,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_Application_ReturnID,ID_DELETE);
 DoMethod(bt_do,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_CallHook,&do_hook);
 DoMethod(bt_quit,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
 DoMethod(bt_about,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_CallHook,&mabout_hook);
 DoMethod(bt_c_help,MUIM_Notify,MUIA_Pressed,FALSE,App,2,MUIM_CallHook,&chelp_hook);

 set(win,MUIA_Window_Open,TRUE);

 while (running) {
     switch (id=DoMethod(App,MUIM_Application_Input,&signals))
         {
             case MUIV_Application_ReturnID_Quit:
                 running=FALSE;
                 break;
             case ID_CONFIG:
                 DoMethod(dlist,MUIM_List_GetEntry,MUIV_List_GetEntry_Active,&cname);
                 data=rconfig(cname->fib_FileName);
                 set(info,MUIA_Text_Contents,data.info);
                 break;
             case ID_EDIT:
                 DoMethod(dlist,MUIM_List_GetEntry,MUIV_List_GetEntry_Active,&cname);
                 if (cname==NULL) {
                     stccpy(data.prgname,"Unknown",8);
                     stccpy(data.name,"Unnamed",8);
                     stccpy(data.format," ",1);
                     stccpy(data.info,"Unnamed Configuartion",22);
                     }
                 else if (!stricmp(data.name,cname->fib_FileName))
                     data=rconfig(cname->fib_FileName);
                 setconfwin(data);
                 set(confwin,MUIA_Window_Open,TRUE);
                 set(win,MUIA_Window_Sleep,TRUE);
                 break;
             case ID_CONFIGOK:
                 set(confwin,MUIA_Window_Open,FALSE);
                 set(win,MUIA_Window_Sleep,FALSE);
                 data=getconfwin();
                 wconfig(data);
                 DoMethod(dlist,MUIM_Dirlist_ReRead);
                 data=rconfig(data.name);
                 break;
             case ID_CONFIGC:
                 set(confwin,MUIA_Window_Open,FALSE);
                 set(win,MUIA_Window_Sleep,FALSE);
                 setconfwin(data);
                 data=rconfig(cname->fib_FileName);
                 break;
             case ID_DELETE:
                 {
                 char *fname=(char *)malloc(sizeof(char)*256);

                 sprintf(fname,"%s%s",ENVARCPATH,data.name);
                 DeleteFile(fname);
                 sprintf(fname,"%s%s",ENVPATH,data.name);
                 DeleteFile(fname);
                 DoMethod(dlist,MUIM_Dirlist_ReRead);
                 }
                 break;
             }
     if (running && signals) Wait(signals);
     }
 set(win,MUIA_Window_Open,FALSE);
 fail(App,NULL);
 }
/*END*/
