/*                                                                             */
/*   ___ _            _    _            ___       __ _                         */
/*  | _ ) |_  _ ___  | |  (_)___ _ _   / __| ___ / _| |___ __ ____ _ _ _ ___   */
/*  | _ \ | || / -_) | |__| / _ \ ' \  \__ \/ _ \  _|  _\ V  V / _` | '_/ -_)  */
/*  |___/_|\_,_\___| |____|_\___/_||_| |___/\___/_|  \__|\_/\_/\__,_|_| \___|  */
/*                                                                             */
/*             Copyright 2002, Miklós Németh (Blue Lion Software)              */
/*                        email: desco@freemail.hu                             */
/*                   WWW: http://amigos.amiga.hu/bluelion                      */
/*                                                                             */
#define NEED_INLINES

#include "dichandle.h"
#include "locale.h"

extern struct Hook QuitHook,DClickHook,AboutmuiHook,ParentHook,MakedirHook,DeleteHook,
    LSDConvHook,Much2OneHook,MakeIndexHook,ColWordsHook,MakeSpellHook, EditHook,
    AbortHook;

enum { MENU, MENU_ABOUT, MENU_ABOUTMUI, MENU_QUIT, MENU_SETMUI };

/* --- Library bases --- */
extern struct Library *SysBase;
struct Library *MUIMasterBase,*IntuitionBase,*DosBase,*LocaleBase;

/* --- Global variables --- */
APTR app,mainmenu,
        wi_main,bt_volumes,bt_parent,bt_reread,bt_makedir,bt_delete,te_dir, gr_dirtools,
        gr_dir,lv_vol,lv_dir,bt_lsdconv,bt_much2one,bt_makeindex,bt_colwords,bt_makespell,bt_edit,
        te_status,gau_status,bt_abort,gr_handle,
        wi_about,
        wi_aboutmui=NULL,
        wi_makedir, st_makedir,bt_mdok,
        wi_lsdconv, st_dictype,st_dicdir,bt_convok,
        wi_spell,st_language,st_spellpath,bt_spellstart,
        wi_edit, bt_add, te_editfile, st_editword,tx_edit, scrb_edit;

BOOL aborted;

struct Catalog *catalog;

/* --- Failure handler --- */
void fail(APTR app, char *str)
{
    
    if (str)
    {
        puts(str);
        exit(20);
    }

    if (app)
        MUI_DisposeObject(app);

    if (MUIMasterBase)
        CloseLibrary(MUIMasterBase);

    if (IntuitionBase)
        CloseLibrary(IntuitionBase);

    if (DosBase)
        CloseLibrary(DosBase);

    if (catalog)
        CloseCatalog(catalog);

    if (LocaleBase)
        CloseLibrary(LocaleBase);

    exit(0);
}

int main(int argc, char **argv)
{

    if (!(LocaleBase = (struct Library *) OpenLibrary("locale.library",38)))
        fail(app,Gcs(1,MSG_1));

    catalog = OpenCatalog(NULL,"dichandle.catalog",OC_BuiltInLanguage,(ULONG)"english",OC_Version,2,TAG_DONE);

    if (!(IntuitionBase =(struct Library *) OpenLibrary("intuition.library",39)))
        fail(app,Gcs(2,MSG_2));

    if (!(MUIMasterBase =(struct Library *) OpenLibrary("muimaster.library",19)))
        fail(app,Gcs(3,MSG_3));

    if (!(DosBase = (struct Library *) OpenLibrary("dos.library",39)))
        fail(app,Gcs(4,MSG_4));

    app = ApplicationObject,
        MUIA_Application_Author,        "Miklós Németh",
        MUIA_Application_Base,          "DicHandle",
        MUIA_Application_Copyright,     "(c) 1999-2002 Miklós Németh (Blue Lion Software)",
        MUIA_Application_Description,   Gcs(5,MSG_5),
        MUIA_Application_Title,         "DicHandle",
        MUIA_Application_Version,       "$VER: DicHandle 2.2 (21.07.2002.)",
        MUIA_Application_HelpFile,      "PROGDIR:DicHandle.guide",
        SubWindow, wi_main = WindowObject,
            MUIA_Window_Title, "DicHandle v2.2",
            MUIA_Window_ID, MAKE_ID('W','I','M','A'),
            MUIA_Window_Menustrip, mainmenu = MenustripObject,
                MUI_Menu(Gcs(6,MSG_6)),
                    MUI_Menuitem(Gcs(7,MSG_7),"?",MENU_ABOUT),
                    MUI_Menuitem(Gcs(8,MSG_8),NULL,MENU_ABOUTMUI),
                    MUI_Bar,
                    MUI_Menuitem(Gcs(9,MSG_9),"Q",MENU_QUIT),
                End,
                MUI_Menu(Gcs(10,MSG_10)),
                    MUI_Menuitem("MUI...",NULL,MENU_SETMUI),
                End,
            End,
            WindowContents, VGroup,
                Child, gr_handle = HGroup,
                    Child, VGroup, GroupFrame,
                        Child, gr_dirtools = HGroup, MUIA_Disabled, TRUE,
                            Child, bt_volumes = SimpleButton(Gcs(11,MSG_11)),
                            Child, bt_parent = SimpleButton(Gcs(12,MSG_12)),
                            Child, bt_reread = SimpleButton(Gcs(13,MSG_13)),
                            Child, bt_makedir = SimpleButton(Gcs(14,MSG_14)),
                            Child, bt_delete = SimpleButton(Gcs(15,MSG_15)),
                        End,
                        Child, te_dir= TextObject,TextFrame, MUIA_Text_Contents, Gcs(16,MSG_16), End,
                        Child, gr_dir = GroupObject,
                            MUIA_Group_PageMode, TRUE,
                            Child, lv_vol = ListviewObject,
                                MUIA_Listview_List, VolumelistObject,
                                    InputListFrame,
                                End,
                            End,
                            Child, lv_dir = ListviewObject,
                                MUIA_Listview_Input, TRUE,
                                MUIA_Listview_MultiSelect, MUIV_Listview_MultiSelect_Default,
                                MUIA_Listview_List, DirlistObject,
                                    InputListFrame,
                                    MUIA_Dirlist_Directory, "SYS:",
                                    MUIA_Dirlist_RejectIcons, TRUE,
                                End,
                            End,
                        End,
                    End,
                    Child, VGroup, GroupFrame,
                        Child, bt_lsdconv = WButton("LSDConv"),
                        Child, bt_much2one = WButton("Much2One"),
                        Child, bt_makeindex = WButton("MakeIndex"),
                        Child, bt_colwords = WButton("ColWords"),
                        Child, bt_makespell = WButton("MakeSpell"),
                        Child, RectangleObject, MUIA_Rectangle_HBar, TRUE, MUIA_FixHeight, 4, End,
                        Child, bt_edit = WButton(Gcs(17,MSG_17)),
                        Child, RectangleObject, End,
                    End,
                End,
                Child, VGroup,
                    Child, HGroup,
                        Child, te_status = TextObject, TextFrame, MUIA_Text_PreParse, "\033c", End,
                        Child, bt_abort = WButton(Gcs(18,MSG_18)),
                    End,
                    Child, gau_status = GaugeObject, GaugeFrame, MUIA_Gauge_InfoText, "%ld%%", MUIA_Gauge_Horiz, TRUE, MUIA_FixHeight, 12, End,
                End,
            End,
        End,
        SubWindow, wi_about = WindowObject,
            MUIA_Window_Title, Gcs(19,MSG_19),
            MUIA_Window_ID, MAKE_ID('W','I','A','B'),
            WindowContents, VGroup,
                Child, TextObject, TextFrame, MUIA_Text_PreParse,"\033b\033c", MUIA_Text_Contents, "DicHandle v2.2", End,
                Child, TextObject, MUIA_Text_PreParse, "\033c", MUIA_Text_Contents, Gcs(5,MSG_5), End,
                Child, TextObject, MUIA_Text_PreParse, "\033c\033i", MUIA_Text_Contents, "© 1999-2002 Miklós Németh (Blue Lion Software)", End,
            End,
        End,
        SubWindow, wi_makedir = WindowObject,
            MUIA_Window_Title, Gcs(20,MSG_20),
            MUIA_Window_ID, MAKE_ID('W','I','M','D'),
            WindowContents, VGroup,
                Child, VGroup, GroupFrame, MUIA_FrameTitle, Gcs(21,MSG_21),
                    Child, st_makedir = StringObject, StringFrame, End,
                End,
                Child, RectangleObject, MUIA_Rectangle_HBar, TRUE, MUIA_FixHeight, 4, End,
                Child, HGroup,
                    Child, RectangleObject, End,
                    Child, bt_mdok = SimpleButton(Gcs(22,MSG_22)),
                    Child, RectangleObject, End,
                End,
            End,
        End,
        SubWindow, wi_lsdconv = WindowObject,
            MUIA_Window_Title, "LSDConv",
            MUIA_Window_ID, MAKE_ID('W','I','L','C'),
            WindowContents, VGroup,
                Child, VGroup,
                    Child, ColGroup(2),
                        Child, Label(Gcs(23,MSG_23)),
                        Child, st_dictype = StringObject,
                            StringFrame,
                            MUIA_String_Accept, "abcdefghijklmnopqrstuvwxyz",
                            MUIA_String_MaxLen,7,
                        End,
                        Child, Label(Gcs(24,MSG_24)),
                        Child, PopaslObject,
                            MUIA_Popstring_String,  st_dicdir = StringObject, StringFrame, End,
                            MUIA_Popstring_Button, PopButton(MUII_PopDrawer),
                            ASLFR_TitleText,Gcs(25,MSG_25),
                            ASLFR_DrawersOnly, TRUE,
                        End,
                    End,
                    Child, RectangleObject, MUIA_Rectangle_HBar, TRUE, MUIA_FixHeight, 4, End,
                    Child, HGroup,
                        Child, RectangleObject, End,
                        Child, bt_convok = SimpleButton(Gcs(26,MSG_26)),
                        Child, RectangleObject, End,
                    End,
                End,
            End,
        End,
        SubWindow, wi_spell = WindowObject,
            MUIA_Window_Title, "MakeSpell",
            MUIA_Window_ID, MAKE_ID('W','I','S','P'),
            WindowContents, VGroup,
                Child, ColGroup(2),
                    Child, Label(Gcs(27,MSG_27)),
                    Child, st_language = StringObject, StringFrame, MUIA_String_Accept, "abcdefghijklmnopqrstuvwxyz", End,
                    Child, Label(Gcs(24,MSG_24)),
                    Child, PopaslObject,
                        MUIA_Popstring_String, st_spellpath = StringObject, StringFrame, End,
                        MUIA_Popstring_Button, PopButton(MUII_PopDrawer),
                        ASLFR_TitleText,Gcs(25,MSG_25),
                        ASLFR_DrawersOnly, TRUE,
                    End,
                End,
                Child, HGroup,
                    Child, RectangleObject, End,
                    Child, bt_spellstart = SimpleButton(Gcs(28,MSG_28)),
                    Child, RectangleObject, End,
                End,
            End,
        End,
        SubWindow, wi_edit = WindowObject,
            MUIA_Window_Title, Gcs(17,MSG_17),
            MUIA_Window_ID, MAKE_ID('W','I','E','D'),
            WindowContents, VGroup,
                Child, ColGroup(2),
                    Child, Label(Gcs(29,MSG_29)),
                    Child, te_editfile = TextObject, TextFrame, MUIA_Text_PreParse, "\033c",End,
                    Child, Label(Gcs(30,MSG_30)),
                    Child, HGroup,
                        Child, st_editword = StringObject, StringFrame, End,
                        Child, bt_add = WButton(Gcs(31,MSG_31)),
                    End,
                End,
                Child, HGroup,
                    Child, tx_edit = TextEditorObject, MUIA_TextEditor_Slider, scrb_edit, End,
                    Child, scrb_edit = ScrollbarObject, End,
                End,
            End,
        End,
    End;

    if (!app)
        fail(app,Gcs(32,MSG_32));

    DoMethod(app, MUIM_Notify, MUIA_Application_MenuAction, MENU_ABOUT,
             wi_about, 3, MUIM_Set, MUIA_Window_Open, TRUE);

    DoMethod(app, MUIM_Notify, MUIA_Application_MenuAction, MENU_ABOUTMUI,
             app, 2, MUIM_CallHook, &AboutmuiHook);

    DoMethod(app, MUIM_Notify, MUIA_Application_MenuAction, MENU_QUIT,
             app, 2, MUIM_CallHook, &QuitHook);

    DoMethod(app, MUIM_Notify, MUIA_Application_MenuAction, MENU_SETMUI,
             app, 2, MUIM_Application_OpenConfigWindow, 0);

    DoMethod(wi_main, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
             app, 2, MUIM_CallHook, &QuitHook);

    DoMethod(wi_main, MUIM_Notify, MUIA_Window_InputEvent, "f1",
             gr_dir, 3, MUIM_Set, MUIA_Group_ActivePage, 0);

    DoMethod(wi_main, MUIM_Notify, MUIA_Window_InputEvent, "f2",
             app, 2, MUIM_CallHook, &ParentHook);

    DoMethod(wi_main, MUIM_Notify, MUIA_Window_InputEvent, "f3",
             lv_dir, 1, MUIM_Dirlist_ReRead);

    DoMethod(wi_main, MUIM_Notify, MUIA_Window_InputEvent, "f4",
             app, 3, MUIM_CallHook, &MakedirHook, 0);

    DoMethod(wi_main, MUIM_Notify, MUIA_Window_InputEvent, "f5",
             app, 2, MUIM_CallHook, &DeleteHook);

    DoMethod(gr_dir, MUIM_Notify, MUIA_Group_ActivePage, 0,
             gr_dirtools, 3, MUIM_Set, MUIA_Disabled, TRUE);

    DoMethod(gr_dir, MUIM_Notify, MUIA_Group_ActivePage, 1,
             gr_dirtools, 3, MUIM_Set, MUIA_Disabled, FALSE);

    DoMethod(lv_vol, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE,
             app, 3, MUIM_CallHook, &DClickHook, 0);

    DoMethod(lv_dir, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE,
             app, 3, MUIM_CallHook, &DClickHook, 1);

    DoMethod(bt_volumes, MUIM_Notify, MUIA_Pressed, FALSE,
             gr_dir, 3, MUIM_Set, MUIA_Group_ActivePage, 0);

    DoMethod(bt_parent, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 2, MUIM_CallHook, &ParentHook);

    DoMethod(bt_reread, MUIM_Notify, MUIA_Pressed, FALSE,
             lv_dir, 1, MUIM_Dirlist_ReRead);

    DoMethod(bt_makedir, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 3, MUIM_CallHook, &MakedirHook, 0);

    DoMethod(bt_delete, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 2, MUIM_CallHook, &DeleteHook);

    DoMethod(bt_lsdconv, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 3, MUIM_CallHook, &LSDConvHook, 0);

    DoMethod(bt_much2one, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 2, MUIM_CallHook, &Much2OneHook);

    DoMethod(bt_makeindex, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 2, MUIM_CallHook, &MakeIndexHook);

    DoMethod(bt_colwords, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 2, MUIM_CallHook, &ColWordsHook);

    DoMethod(bt_makespell, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 3, MUIM_CallHook, &MakeSpellHook, 0);

    DoMethod(bt_edit, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 3, MUIM_CallHook, &EditHook, 0);

    DoMethod(bt_abort, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 2, MUIM_CallHook, &AbortHook);

    DoMethod(wi_about, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
             wi_about, 3, MUIM_Set, MUIA_Window_Open, FALSE);

    /* --- Makedir window --- */
    DoMethod(wi_makedir, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
             wi_makedir, 3, MUIM_Set, MUIA_Window_Open, FALSE);

    DoMethod(st_makedir, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
             wi_makedir, 3, MUIM_Set, MUIA_Window_ActiveObject, bt_mdok);

    DoMethod(bt_mdok, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 3, MUIM_CallHook, &MakedirHook, 1);

    /* --- LSDConv window --- */
    DoMethod(wi_lsdconv, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
             wi_lsdconv, 3, MUIM_Set, MUIA_Window_Open, FALSE);

    DoMethod(st_dictype, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
             wi_lsdconv, 3, MUIM_Set, MUIA_Window_ActiveObject, st_dicdir);

    DoMethod(st_dicdir, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
             wi_lsdconv, 3, MUIM_Set, MUIA_Window_ActiveObject, bt_convok);

    DoMethod(bt_convok, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 3, MUIM_CallHook, &LSDConvHook, 1);

    DoMethod(wi_spell, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
             wi_spell, 3, MUIM_Set, MUIA_Window_Open, FALSE);

    DoMethod(st_language, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
             wi_spell, 3, MUIM_Set, MUIA_Window_ActiveObject, st_spellpath);

    DoMethod(st_spellpath, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
             wi_spell, 3, MUIM_Set, MUIA_Window_ActiveObject, bt_spellstart);

    DoMethod(bt_spellstart, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 3, MUIM_CallHook, &MakeSpellHook, 1);

    DoMethod(wi_edit, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
             wi_edit, 3, MUIM_Set, MUIA_Window_Open, FALSE);

    DoMethod(st_editword, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
             app, 3, MUIM_CallHook, &EditHook, 1);

    DoMethod(bt_add, MUIM_Notify, MUIA_Pressed, FALSE,
             app, 3, MUIM_CallHook, &EditHook, 2);

    DoMethod(wi_edit, MUIM_Notify, MUIA_Window_InputEvent, "f10",
             app, 3, MUIM_CallHook, &EditHook, 2);

    set(bt_abort, MUIA_Disabled, TRUE);

    set(wi_main, MUIA_Window_Open, TRUE);

    /* --- Event handling --- */
    {
        ULONG sigs = 0;

        while(DoMethod(app, MUIM_Application_NewInput, &sigs) != MUIV_Application_ReturnID_Quit)
        {
            if (sigs)
                sigs = Wait(sigs);
        }
    }
    /* --- Exit --- */
    fail(app, NULL);
}
