/**************************************************************/
/* $VER: SynthLibInt.c Revison 1.0                            */
/* This file is part of Synth Librarian v1.0                  */
/* ©1993-1994 Jean-Alexis MONTIGNIES                          */
/* This file must not be distributed modified or separatly    */
/* without my written permission                              */
/* See Synth_Librarian.guide for more details                 */
/**************************************************************/

/* Synth librarian main window interface */
/*
 *  Source machine generated by GadToolsBox V1.4
 *  which is (c) Copyright 1991,92 Jaba Development
 */
/* Modified by hand : localized, keyboard shortcut handling */

#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <graphics/displayinfo.h>
#include <graphics/gfxbase.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <string.h>
#include <libraries/locale.h>

#include "SynthLibInt.h"
#define CATCOMP_NUMBERS
#include "SynthLibLoc.h"
STRPTR GetString(struct LocaleInfo *li, LONG stringNum,char *CatCompBlock);
extern struct LocaleInfo MLi;
extern char MainCatBlock[];

struct Screen         *Scr = NULL;
UBYTE                 *PubScreenName = "Workbench";
APTR                   VisualInfo = NULL;
struct Window         *LibWnd = NULL;
struct Gadget         *LibGList = NULL;
struct Menu           *LibMenus = NULL;
struct IntuiMessage    LibMsg;
struct Gadget         *LibGadgets[10];
UWORD                  LibLeft = 84;
UWORD                  LibTop = 18;
UWORD                  LibWidth = 469;
UWORD                  LibHeight = 156;
struct TextAttr       *Font, Attr;
UWORD                  FontX, FontY;
UWORD                  OffX, OffY;
STRPTR                 Shortcuts;

struct NewMenu LibNewMenu[] = {
        NM_TITLE, (STRPTR)MG_MENU_PROJECT, NULL, 0, NULL, NULL,
        NM_ITEM, (STRPTR)MG_MENU_P_NEW, NULL, 0, 0L, (APTR)LibNew,
        NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM, (STRPTR)MG_MENU_P_OPEN, NULL, 0, 0L, (APTR)OpenLib,
        NM_ITEM, (STRPTR)MG_MENU_P_SAVE, NULL, 0, 0L, (APTR)SaveLib,
        NM_ITEM, (STRPTR)MG_MENU_P_SAVE_AS, NULL, 0, 0L, (APTR)SaveAsLib,
        NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM, (STRPTR)MG_MENU_P_ABOUT, NULL, 0, 0L, (APTR)AboutLib,
        NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM, (STRPTR)MG_MENU_P_QUIT, NULL, 0, 0L, (APTR)LibCloseWindow,
        NM_TITLE, (STRPTR)MG_MENU_DATA, NULL, 0, NULL, NULL,
        NM_ITEM, (STRPTR)MG_MENU_D_REMOVE, NULL, 0, 0L, (APTR)RemoveLib,
        NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM, (STRPTR)MG_MENU_D_SAVE, NULL, 0, 0L, (APTR)SaveDumpLib,
        NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM, (STRPTR)MG_MENU_D_SEND, NULL, 0, 0L, (APTR)SENDClicked,
        NM_TITLE, (STRPTR)MG_MENU_DRIVER, NULL, 0, NULL, NULL,
        NM_ITEM, (STRPTR)MG_MENU_DR_NEW, NULL, 0, 0L, (APTR)NewDriver,
        NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM, (STRPTR)MG_MENU_DR_ABOUT, NULL, 0, 0L, (APTR)AboutDriver,
        NM_END, NULL, NULL, 0, 0L, NULL };

UWORD LibGTypes[] = {
        STRING_KIND,
        LISTVIEW_KIND,
        BUTTON_KIND,
        TEXT_KIND,
        CHECKBOX_KIND,
        TEXT_KIND,
        NUMBER_KIND,
        LISTVIEW_KIND,
        BUTTON_KIND,
        BUTTON_KIND
};

struct NewGadget LibNGad[] = {
        10, 102, 279, 14, NULL, NULL, GD_NodeName, 0, NULL, (APTR)NodeNameClicked,
        10, 13, 279, 72, (UBYTE *)MG_GAD_DATA, NULL, GD_DataNodes, PLACETEXT_ABOVE|NG_HIGHLABEL, NULL, (APTR)DataNodesClicked,
        181, 90, 107, 15, (UBYTE *)MG_GAD_SEND, NULL, GD_SEND, PLACETEXT_IN, NULL, (APTR)SENDClicked,
        9, 140, 448, 12, (UBYTE *)MG_GAD_INFO, NULL, GD_Info, PLACETEXT_ABOVE, NULL, NULL,
        24, 120, 26, 11, (UBYTE *)MG_GAD_SERIAL, NULL, GD_SERIAL, PLACETEXT_RIGHT, NULL, (APTR)SERIALClicked,
        79, 91, 100, 13, (UBYTE *)MG_GAD_TYPE, NULL, GD_DUMP_TYPE, PLACETEXT_LEFT, NULL, NULL,
        79, 103, 115, 13, (UBYTE *)MG_GAD_SIZE, NULL, GD_DUMP_LENGTH, PLACETEXT_LEFT, NULL, NULL,
        301, 14, 159, 72, (UBYTE *)MG_GAD_DATA_TYPES, NULL, GD_TypeList, PLACETEXT_ABOVE, NULL, (APTR)TypeListClicked,
        331, 90, 107, 15, (UBYTE *)MG_GAD_REQUEST, NULL, GD_Request, PLACETEXT_IN, NULL, (APTR)RequestClicked,
        181, 110, 107, 15, (UBYTE *)MG_GAD_ABORT, NULL, GD_Abort, PLACETEXT_IN, NULL, (APTR)AbortClicked
};

ULONG LibGTags[] = {
        (GA_TabCycle), FALSE, (GTST_String),0L, (GTST_MaxChars), 256, (TAG_DONE),
        (GTLV_ShowSelected), 1L, (TAG_DONE),
        (GT_Underscore), '_', (GA_Disabled), TRUE, (TAG_DONE),
        (GTTX_Border), TRUE, (TAG_DONE),
        (GT_Underscore), '_',(GA_Disabled), TRUE, (TAG_DONE),
        (GTTX_Text), NULL, (TAG_DONE),
        (TAG_DONE),
        (GTLV_ShowSelected), NULL, (TAG_DONE),
        (GT_Underscore), '_', (GA_Disabled), TRUE, (TAG_DONE),
        (GT_Underscore), '_', (TAG_DONE)
};

static UWORD ComputeX( UWORD value )
{
        return(( UWORD )((( FontX * value ) + 4 ) / 8 ));
}

static UWORD ComputeY( UWORD value )
{
        return(( UWORD )((( FontY * value ) + 4 ) / 8 ));
}

static void ComputeFont( UWORD width, UWORD height )
{
        Font = &Attr;
        Font->ta_Name = (STRPTR)GfxBase->DefaultFont->tf_Message.mn_Node.ln_Name;
        Font->ta_YSize = FontY = GfxBase->DefaultFont->tf_YSize;
        FontX = GfxBase->DefaultFont->tf_XSize;

        OffX = Scr->WBorLeft;
        OffY = Scr->RastPort.TxHeight + Scr->WBorTop + 1;

        if ( width && height ) {
                if (( ComputeX( width ) + OffX + Scr->WBorRight ) > Scr->Width )
                        goto UseTopaz;
                if (( ComputeY( height ) + OffY + Scr->WBorBottom ) > Scr->Height )
                        goto UseTopaz;
        }
        return;

UseTopaz:
        Font->ta_Name = (STRPTR)"topaz.font";
        FontX = FontY = Font->ta_YSize = 8;
}

int SetupScreen( void )
{
        if ( ! ( Scr = LockPubScreen( PubScreenName )))
                return( 1L );

        ComputeFont( 0, 0 );

        if ( ! ( VisualInfo = GetVisualInfo( Scr, TAG_DONE )))
                return( 2L );

        return( 0L );
}

void CloseDownScreen( void )
{
        if ( VisualInfo ) {
                FreeVisualInfo( VisualInfo );
                VisualInfo = NULL;
        }

        if ( Scr        ) {
                UnlockPubScreen( NULL, Scr );
                Scr = NULL;
        }
}

int HandleLibIDCMP( void )
{
        struct IntuiMessage     *m;
        struct MenuItem         *n;
        int                     (*func)();
        BOOL                    running = TRUE;

        while( m = GT_GetIMsg( LibWnd->UserPort )) {

                CopyMem(( char * )m, ( char * )&LibMsg, (long)sizeof( struct IntuiMessage ));

                GT_ReplyIMsg( m );

                switch ( LibMsg.Class ) {

                        case    IDCMP_MOUSEBUTTONS:
                                AknowledgeMessage();

                                break;

                        case    IDCMP_REFRESHWINDOW:
                                GT_BeginRefresh( LibWnd );
                                GT_EndRefresh( LibWnd, TRUE );
                                break;

                        case    IDCMP_CLOSEWINDOW:
                                running = LibCloseWindow();
                                break;

                        case    IDCMP_GADGETUP:
                        case    IDCMP_GADGETDOWN:
                                func = ( void * )(( struct Gadget * )LibMsg.IAddress )->UserData;
                                running = func();
                                break;

                        case    IDCMP_MENUPICK:
                                while( LibMsg.Code != MENUNULL ) {
                                        n = ItemAddress( LibMenus, LibMsg.Code );
                                        func = (void *)(GTMENUITEM_USERDATA( n ));
                                        running = func();
                                        LibMsg.Code = n->NextSelect;
                                }
                                break;

                        case    IDCMP_VANILLAKEY:
                                if ((LibMsg.Code!='-') && (LibMsg.Code))
                                 {char *p;
                                  int num;

                                  if (p=strchr(Shortcuts,LibMsg.Code))
                                   {num=p-Shortcuts;
                                    func=LibNGad[num].ng_UserData;
                                    running= func();
                                   }
                                 }
                                 break;
                }
        }
        return( running );
}

int OpenLibWindow( void )
{
        struct NewGadget        ng;
        struct Gadget   *g;
        struct TagItem  *tmp;
        UWORD           lc, tc;
        UWORD           wleft = LibLeft, wtop = LibTop, ww, wh;

        ComputeFont( LibWidth, LibHeight );

        ww = ComputeX( LibWidth );
        wh = ComputeY( LibHeight );

        if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
        if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;

        if ( ! ( g = CreateContext( &LibGList )))
                return( 1L );

        for( lc = 0, tc = 0; lc < Lib_CNT; lc++ ) {

                CopyMem((char * )&LibNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

                ng.ng_VisualInfo = VisualInfo;
                ng.ng_TextAttr   = Font;
                ng.ng_LeftEdge   = OffX + ComputeX( ng.ng_LeftEdge );
                ng.ng_TopEdge    = OffY + ComputeY( ng.ng_TopEdge );
                ng.ng_Width      = ComputeX( ng.ng_Width );
                ng.ng_Height     = ComputeY( ng.ng_Height);

                if (ng.ng_GadgetText)
                  ng.ng_GadgetText=GetString(&MLi,(ULONG)ng.ng_GadgetText,MainCatBlock);

                if ( LibGTypes[ lc ] == LISTVIEW_KIND ) {
                        if ( tmp = FindTagItem( GTLV_ShowSelected, ( struct TagItem * )&LibGTags[ tc ] )) {
                                if ( tmp->ti_Data ) tmp->ti_Data = (ULONG)g;
                        }
                }

                LibGadgets[ lc ] = g = CreateGadgetA((ULONG)LibGTypes[ lc ], g, &ng, ( struct TagItem * )&LibGTags[ tc ] );

                while( LibGTags[ tc ] ) tc += 2;
                tc++;

                if ( NOT g )
                        return( 2L );
        }

        {
           struct NewMenu *ANewMenu;
           char *ShortCut;

           ANewMenu=LibNewMenu;
           ShortCut=GetString(&MLi,MG_SHORTCUTS_MENUS,MainCatBlock);

           while (ANewMenu->nm_Type!=NM_END)
            {if (ANewMenu->nm_Label!=NM_BARLABEL)
              {
               ANewMenu->nm_Label=GetString(&MLi,(ULONG)ANewMenu->nm_Label,MainCatBlock);
               if (ANewMenu->nm_Type!=NM_TITLE)
                {if (*ShortCut)
                   ANewMenu->nm_CommKey=ShortCut;
                 ShortCut+=strlen(ShortCut)+1;
                }
              }
             ANewMenu++;
            }
        }

        if ( ! ( LibMenus = CreateMenus( LibNewMenu, GTMN_FrontPen,0L,TAG_DONE )))
                return( 3L );

        LayoutMenus( LibMenus, VisualInfo, GTMN_NewLookMenus, TRUE,TAG_DONE );

        if ( ! ( LibWnd = OpenWindowTags( NULL,
                                WA_Left,        wleft,
                                WA_Top,         wtop,
                                WA_Width,       ww + OffX + Scr->WBorRight,
                                WA_Height,      wh + OffY + Scr->WBorBottom,
                                WA_IDCMP,       STRINGIDCMP|LISTVIEWIDCMP|BUTTONIDCMP|TEXTIDCMP|CHECKBOXIDCMP|NUMBERIDCMP|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY,
                                WA_Flags,       WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH,
                                WA_Gadgets,     LibGList,
                                WA_Title,       GetString(&MLi,MG_WINDOW_TITLE,MainCatBlock),
                                WA_ScreenTitle, GetString(&MLi,MG_SCREEN_TITLE,MainCatBlock),
                                WA_AutoAdjust,  TRUE,
                                WA_NewLookMenus,TRUE,
                                TAG_DONE )))
        return( 4L );

        SetMenuStrip( LibWnd, LibMenus );
        GT_RefreshWindow( LibWnd, NULL );

        Shortcuts=GetString(&MLi,MG_SHORTCUTS_GADGETS,MainCatBlock);

        return( 0L );
}

void CloseLibWindow( void )
{
        if ( LibMenus      ) {
                ClearMenuStrip( LibWnd );
                FreeMenus( LibMenus );
                LibMenus = NULL;        }

        if ( LibWnd        ) {
                CloseWindow( LibWnd );
                LibWnd = NULL;
        }

        if ( LibGList      ) {
                FreeGadgets( LibGList );
                LibGList = NULL;
        }
}
