;/* Execute me to compile with DICE V3.0
dcc bguidemo.c -proto -mi -ms -mRR -lbgui
quit
*/
/*
**         $RCSfile: bguidemo.c,v $
**      Description: A small demonstration.
**        Copyright: (C) Copyright 1994 Jaba Development.
**                   (C) Copyright 1994 Jan van den Baard.
**                   All Rights Reserved.
**
**          $Author: jaba $
**        $Revision: 1.12 $
**            $Date: 1994/10/02 14:57:30 $
**/

#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/gadtools.h>
#include <dos/dos.h>
#include <workbench/workbench.h>
#include <workbench/startup.h>
#include <libraries/bgui.h>
#include <libraries/bgui_macros.h>

#include <clib/alib_protos.h>

#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/dos.h>
#include <proto/bgui.h>

#include <stdio.h>

/*
**      Online-Help texts.
**/
UBYTE           *MainHelp               = ISEQ_C "BGUI is a shared library which offers a set of\n"
                                          "BOOPSI classes to allow for easy and flexible GUI creation.\n\n"
                                          "The main window is also an AppWindow. Drop some icons\n"
                                          "on it and see what happens.\n\n"
                                          "All other windows in this demo also have online-help. To access\n"
                                          "this help press the " ISEQ_B "HELP" ISEQ_N " key while the window is active.";

UBYTE           *GroupsHelp             = ISEQ_C "The BGUI layout engine is encapsulated in the groupclass.\n"
                                          "The groupclass will layout all of it's members into a specific area.\n"
                                          "You can pass layout specific attributes to all group members\n"
                                          "which allows for flexible and powerful layout capabilities.";

UBYTE           *NotifHelp              = ISEQ_C "Notification can be used to let an object keep one or\n"
                                          "more other objects informed about it's status. BGUI offers several\n"
                                          "kinds of notification of which two (conditional and map-list) are\n"
                                          "shown in this demonstration.";

UBYTE           *InfoHelp               = ISEQ_C "Not much more can be said about the BGUI infoclass than\n"
                                          "is said in this window. Except maybe that this text is shown in an\n"
                                          "infoclass object as are all body texts from a BGUI requester.";

UBYTE           *ImageHelp              = ISEQ_C "This window shows you the built-in images that BGUI has\n"
                                          "to offer. Ofcourse these images are all scalable and it is possible\n"
                                          "to create your own, scalable, imagery with the BGUI vectorclass.";

UBYTE           *BackfillHelp           = ISEQ_C "Here you see the built-in backfill patterns BGUI supports.\n"
                                          "These backfill patterns can all be used in groups and frames. The frameclass\n"
                                          "also offers you the possibility to add hooks for custom backfills and\n"
                                          "frame rendering.";

UBYTE           *PagesHelp              = ISEQ_C "The pageclass allows you to setup a set of pages containing\n"
                                          "BGUI gadgets or groups. This will give you the oppertunity to\n"
                                          "have several set's of gadgets in a single window.";


/*
**      Window objects.
**/
Object          *WA_Main  = NULL, *WA_Groups = NULL, *WA_Notif = NULL;
Object          *WA_Info  = NULL, *WA_Image  = NULL, *WA_BFill = NULL;
Object          *WA_Pages = NULL;

/*
**      Gadget objects from the main window.
**/
Object          *BT_Groups,   *BT_Notif,    *BT_Quit;
Object          *BT_Info,     *BT_Images,   *BT_BFill;
Object          *BT_Pages,    *BT_IconDone, *BT_IconQuit;
Object          *LV_IconList, *PG_Pager;

/*
**      Menus & gadget ID's.
**/
#define ID_ABOUT                1L
#define ID_QUIT                 2L

/*
**      A small menu strip.
**/
struct NewMenu MainMenus[] = {
        Title( "Project" ),
                Item( "About...", "?", ID_ABOUT ),
                ItemBar,
                Item( "Quit",     "Q", ID_QUIT  ),
        End
};

/*
**      Put up a simple requester.
**/
ULONG Req( struct Window *win, UBYTE *gadgets, UBYTE *body, ... )
{
        struct bguiRequest      req = { NULL };

        req.br_GadgetFormat     = gadgets;
        req.br_TextFormat       = body;
        req.br_Flags            = BREQF_CENTERWINDOW|BREQF_XEN_BUTTONS;

        return( BGUI_RequestA( win, &req, ( ULONG * )( &body + 1 )));
}

/*
**      Main window button ID's.
**/
#define ID_MAIN_GROUPS          3L
#define ID_MAIN_NOTIF           4L
#define ID_MAIN_INFO            5L
#define ID_MAIN_IMAGE           6L
#define ID_MAIN_BFILL           7L
#define ID_MAIN_PAGES           8L
#define ID_MAIN_ICON_CONT       9L

/*
**      Open main window.
**/
struct Window *OpenMainWindow( ULONG *sigmask, ULONG *appmask )
{
        struct Window           *window = NULL;

        WA_Main = WindowObject,
                WINDOW_Title,           "BGUIDemo - (C) Jaba Development.",
                WINDOW_ScreenTitle,     "BGUIDemo - (C) Copyright 1993-1994 Jaba Development.",
                WINDOW_MenuStrip,       MainMenus,
                WINDOW_SmartRefresh,    TRUE,
                WINDOW_AppWindow,       TRUE,
                WINDOW_SizeGadget,      FALSE,
                WINDOW_HelpText,        MainHelp,
                WINDOW_MasterGroup,
                        VGroupObject, HOffset( 4 ), VOffset( 4 ), Spacing( 4 ), GROUP_BackFill, SHINE_RASTER,
                                StartMember,
                                        PG_Pager = PageObject,
                                                /*
                                                **      Main page.
                                                **/
                                                PageMember,
                                                        VGroupObject, Spacing( 4 ), GROUP_BackFill, SHINE_RASTER,
                                                                StartMember,
                                                                        InfoObject,
                                                                                INFO_TextFormat,        ISEQ_C
                                                                                                        "BGUIDemo\n"
                                                                                                        ISEQ_HIGHLIGHT
                                                                                                        ISEQ_B
                                                                                                        "(C) Copyright 1993-1994 Jaba Development"
                                                                                                        ISEQ_TEXT
                                                                                                        ISEQ_N
                                                                                                        "\n\n"
                                                                                                        "Press the HELP key for more info.",
                                                                                INFO_FixTextWidth,      TRUE,
                                                                                INFO_MinLines,          4,
                                                                                INFO_HorizOffset,       13,
                                                                                FRM_Type,               FRTYPE_NEXT,
                                                                        EndObject,
                                                                EndMember,
                                                                StartMember,
                                                                        HGroupObject, Spacing( 4 ),
                                                                                StartMember,
                                                                                        VGroupObject, Spacing( 4 ),
                                                                                                StartMember, BT_Groups = XenKeyButton( "_Groups",       ID_MAIN_GROUPS ), EndMember,
                                                                                                StartMember, BT_Notif  = XenKeyButton( "_Notification", ID_MAIN_NOTIF  ), EndMember,
                                                                                                VarSpace( DEFAULT_WEIGHT ),
                                                                                        EndObject,
                                                                                EndMember,
                                                                                StartMember,
                                                                                        VGroupObject, Spacing( 4 ),
                                                                                                StartMember, BT_Images = XenKeyButton( "_Images",       ID_MAIN_IMAGE  ), EndMember,
                                                                                                StartMember, BT_BFill  = XenKeyButton( "_BackFill",     ID_MAIN_BFILL  ), EndMember,
                                                                                                StartMember, BT_Quit   = XenKeyButton( "_Quit",         ID_QUIT        ), EndMember,
                                                                                        EndObject,
                                                                                EndMember,
                                                                                StartMember,
                                                                                        VGroupObject, Spacing( 4 ),
                                                                                                StartMember, BT_Pages  = XenKeyButton( "_Pages",        ID_MAIN_PAGES  ), EndMember,
                                                                                                StartMember, BT_Info   = XenKeyButton( "Info_Class",    ID_MAIN_INFO   ), EndMember,
                                                                                                VarSpace( DEFAULT_WEIGHT ),
                                                                                        EndObject,
                                                                                EndMember,
                                                                        EndObject, FixMinHeight,
                                                                EndMember,
                                                        EndObject,
                                                /*
                                                **      Icon-drop list page.
                                                **/
                                                PageMember,
                                                        VGroupObject, Spacing( 4 ), GROUP_BackFill, SHINE_RASTER,
                                                                StartMember,
                                                                        InfoObject,
                                                                                INFO_TextFormat,        ISEQ_C
                                                                                                        "The following icons where dropped\n"
                                                                                                        "in the window.",
                                                                                INFO_FixTextWidth,      TRUE,
                                                                                INFO_MinLines,          2,
                                                                                INFO_HorizOffset,       13,
                                                                                FRM_Type,               FRTYPE_BUTTON,
                                                                                FRM_Recessed,           TRUE,
                                                                        EndObject, FixMinHeight,
                                                                EndMember,
                                                                StartMember,
                                                                        LV_IconList = ListviewObject,
                                                                                LISTV_ReadOnly,         TRUE,
                                                                        EndObject,
                                                                EndMember,
                                                                StartMember,
                                                                        HGroupObject,
                                                                                StartMember, BT_IconDone = XenKeyButton( "_Continue", ID_MAIN_ICON_CONT ), EndMember,
                                                                                VarSpace( DEFAULT_WEIGHT ),
                                                                                StartMember, BT_IconQuit = XenKeyButton( "_Quit",     ID_QUIT ), EndMember,
                                                                        EndObject, FixMinHeight,
                                                                EndMember,
                                                        EndObject,
                                        EndObject,
                                EndMember,
                        EndObject,
        EndObject;

        /*
        **      Object created OK?
        **/
        if ( WA_Main ) {
                /*
                **      Add keys to the buttons.
                **/
                GadgetKey( WA_Main, BT_Groups,   "g" );
                GadgetKey( WA_Main, BT_Notif,    "n" );
                GadgetKey( WA_Main, BT_Info,     "c" );
                GadgetKey( WA_Main, BT_Images,   "i" );
                GadgetKey( WA_Main, BT_BFill,    "b" );
                GadgetKey( WA_Main, BT_Pages,    "p" );
                GadgetKey( WA_Main, BT_Quit,     "q" );
                GadgetKey( WA_Main, BT_IconDone, "c" );
                GadgetKey( WA_Main, BT_IconQuit, "q" );
                /*
                **      Open the window.
                **/
                if ( window = WindowOpen( WA_Main )) {
                        /*
                        **      Obtain signal masks.
                        **/
                        GetAttr( WINDOW_SigMask, WA_Main, sigmask );
                        GetAttr( WINDOW_AppMask, WA_Main, appmask );
                }
        }

        return( window );
}

/*
**      Macros for the group objects. GObj() creates
**      a simple infoclass object with some text in
**      it. TObj() creates a simple groupclass object
**      with a button frame.
**/
#define GObj(t)\
        InfoObject,\
                INFO_TextFormat,        t,\
                INFO_FixTextWidth,      TRUE,\
                INFO_HorizOffset,       4,\
                INFO_VertOffset,        3,\
                ButtonFrame,\
                FRM_Flags,              FRF_RECESSED,\
        EndObject

#define TObj\
        HGroupObject, HOffset( 3 ), VOffset( 2 ),\
                ButtonFrame,\
                FRM_Flags,              FRF_RECESSED,\
        EndObject

/*
**      Open up the groups window.
**/
struct Window *OpenGroupsWindow( ULONG *sigmask )
{
        struct Window                   *window = NULL;

        /*
        **      If the object has not been created
        **      already we build it.
        **/
        if ( ! WA_Groups ) {
                WA_Groups = WindowObject,
                        WINDOW_Title,           "BGUI Groups",
                        WINDOW_RMBTrap,         TRUE,
                        WINDOW_SmartRefresh,    TRUE,
                        WINDOW_HelpText,        GroupsHelp,
                        WINDOW_MasterGroup,
                                VGroupObject, HOffset( 4 ), VOffset( 4 ), Spacing( 4 ),
                                        StartMember,
                                                HGroupObject, Spacing( 4 ),
                                                        StartMember,
                                                                HGroupObject, NeXTFrame, FrameTitle( "Horizontal" ), HOffset( 8 ), TOffset( 4 ), BOffset( 6 ), Spacing( 4 ),
                                                                        StartMember, TObj, EndMember,
                                                                        StartMember, TObj, EndMember,
                                                                        StartMember, TObj, EndMember,
                                                                EndObject,
                                                        EndMember,
                                                        StartMember,
                                                                VGroupObject, NeXTFrame, FrameTitle( "Vertical" ), HOffset( 8 ), TOffset( 4 ), BOffset( 6 ), Spacing( 4 ),
                                                                        StartMember, TObj, EndMember,
                                                                        StartMember, TObj, EndMember,
                                                                        StartMember, TObj, EndMember,
                                                                EndObject,
                                                        EndMember,
                                                        StartMember,
                                                                VGroupObject, NeXTFrame, FrameTitle( "Grid" ), HOffset( 8 ), TOffset( 4 ), BOffset( 6 ), Spacing( 4 ),
                                                                        StartMember,
                                                                                HGroupObject, Spacing( 4 ),
                                                                                        StartMember, TObj, EndMember,
                                                                                        StartMember, TObj, EndMember,
                                                                                        StartMember, TObj, EndMember,
                                                                                EndObject,
                                                                        EndMember,
                                                                        StartMember,
                                                                                HGroupObject, Spacing( 4 ),
                                                                                        StartMember, TObj, EndMember,
                                                                                        StartMember, TObj, EndMember,
                                                                                        StartMember, TObj, EndMember,
                                                                                EndObject,
                                                                        EndMember,
                                                                        StartMember,
                                                                                HGroupObject, Spacing( 4 ),
                                                                                        StartMember, TObj, EndMember,
                                                                                        StartMember, TObj, EndMember,
                                                                                        StartMember, TObj, EndMember,
                                                                                EndObject,
                                                                        EndMember,
                                                                EndObject,
                                                        EndMember,
                                                EndObject,
                                        EndMember,
                                        StartMember,
                                                VGroupObject, Spacing( 4 ),
                                                        StartMember, TitleSeperator( "Free, Fixed and Weight sizes." ), EndMember,
                                                        StartMember,
                                                                HGroupObject, Spacing( 4 ),
                                                                        StartMember, GObj( ISEQ_C "25Kg"  ), Weight( 25  ), EndMember,
                                                                        StartMember, GObj( ISEQ_C "50Kg"  ), Weight( 50  ), EndMember,
                                                                        StartMember, GObj( ISEQ_C "75Kg"  ), Weight( 75  ), EndMember,
                                                                        StartMember, GObj( ISEQ_C "100Kg" ), Weight( 100 ), EndMember,
                                                                EndObject,
                                                        EndMember,
                                                        StartMember,
                                                                HGroupObject, Spacing( 4 ),
                                                                        StartMember, GObj( ISEQ_C "Free"  ), EndMember,
                                                                        StartMember, GObj( "Fixed"        ), FixMinWidth, EndMember,
                                                                        StartMember, GObj( ISEQ_C "Free"  ), EndMember,
                                                                        StartMember, GObj( "Fixed"        ), FixMinWidth, EndMember,
                                                                EndObject,
                                                        EndMember,
                                                EndObject, FixMinHeight,
                                        EndMember,
                                EndObject,
                EndObject;
        }

        /*
        **      Object OK?
        **/
        if ( WA_Groups ) {
                /*
                **      Open the window.
                **/
                if ( window = WindowOpen( WA_Groups ))
                        /*
                        **      Obtain signal mask.
                        **/
                        GetAttr( WINDOW_SigMask, WA_Groups, sigmask );
        }

        return( window );
}

/*
**      Cycle gadget labels.
**/
UBYTE   *NotifLabels[] = { "Enabled-->", "Disabled-->", "Still Disabled-->", NULL };

/*
**      Notification map-lists.
**/
ULONG   pga2sl[] = { PGA_Top,       SLIDER_Level,  TAG_END };
ULONG   sl2prg[] = { SLIDER_Level,  PROGRESS_Done, TAG_END };
ULONG   prg2in[] = { PROGRESS_Done, INDIC_Level,   TAG_END };

/*
**      Open the notification window.
**/
struct Window *OpenNotifWindow( ULONG *sigmask )
{
        struct Window                   *window = NULL;
        Object                          *c, *b, *p1, *p2, *s1, *s2, *p, *i1, *i2;

        /*
        **      Not created yet? Create it now!
        **/
        if ( ! WA_Notif ) {
                WA_Notif = WindowObject,
                        WINDOW_Title,           "BGUI notification",
                        WINDOW_RMBTrap,         TRUE,
                        WINDOW_SmartRefresh,    TRUE,
                        WINDOW_HelpText,        NotifHelp,
                        WINDOW_MasterGroup,
                                VGroupObject, HOffset( 4 ), VOffset( 4 ), Spacing( 4 ),
                                        StartMember, TitleSeperator( "Conditional" ), EndMember,
                                        StartMember,
                                                HGroupObject, Spacing( 4 ),
                                                        StartMember, c = XenCycle( NULL, NotifLabels, 0, 0 ), EndMember,
                                                        StartMember, b = XenButton( "Target", 0 ), EndMember,
                                                EndObject, FixMinHeight,
                                        EndMember,
                                        StartMember, TitleSeperator( "Map-List" ), EndMember,
                                        StartMember,
                                                HGroupObject, Spacing( 4 ),
                                                        StartMember,
                                                                VGroupObject, Spacing( 4 ),
                                                                        StartMember, i1 = IndicatorFormat( 0, 100, 0, IDJ_CENTER, "%ld%%" ), FixMinHeight, EndMember,
                                                                        StartMember, p1 = HorizProgress( NULL, 0, 100, 0 ), EndMember,
                                                                EndObject,
                                                        EndMember,
                                                        StartMember, s1 = VertSlider(   NULL, 0, 100, 0, 0 ), FixWidth( 16 ), EndMember,
                                                        StartMember, p  = VertScroller( NULL, 0, 101, 1, 0 ), FixWidth( 16 ), EndMember,
                                                        StartMember, s2 = VertSlider(   NULL, 0, 100, 0, 0 ), FixWidth( 16 ), EndMember,
                                                        StartMember,
                                                                VGroupObject, Spacing( 4 ),
                                                                        StartMember, i2 = IndicatorFormat( 0, 100, 0, IDJ_CENTER, "%ld%%" ), FixMinHeight, EndMember,
                                                                        StartMember, p2 = VertProgress( NULL, 0, 100, 0 ), EndMember,
                                                                EndObject,
                                                        EndMember,
                                                EndObject,
                                        EndMember,
                                EndObject,
                EndObject;

                if ( WA_Notif ) {
                        /*
                        **      Connect the cycle object with the button.
                        **/
                        AddCondit( c, b, CYC_Active, 0, GA_Disabled, FALSE, GA_Disabled, TRUE );
                        /*
                        **      Connect sliders, prop, progression and indicators.
                        **/
                        AddMap( s1, p1, sl2prg );
                        AddMap( s2, p2, sl2prg );
                        AddMap( p,  s1, pga2sl );
                        AddMap( p,  s2, pga2sl );
                        AddMap( p1, i1, prg2in );
                        AddMap( p2, i2, prg2in );
                }
        }

        /*
        **      Object OK?
        **/
        if ( WA_Notif ) {
                        /*
                        **      Open window.
                        **/
                        if ( window = WindowOpen( WA_Notif ))
                                /*
                                **      Obtain signal mask.
                                **/
                                GetAttr( WINDOW_SigMask, WA_Notif, sigmask );
        }

        return( window );
}

/*
**      Open infoclass window.
**/
struct Window *OpenInfoWindow( ULONG *sigmask )
{
        struct Window                   *window = NULL;
        ULONG                            args[2];

        /*
        **      Setup arguments for the
        **      infoclass object.
        **/
        args[0] = AvailMem( MEMF_CHIP );
        args[1] = AvailMem( MEMF_FAST );

        /*
        **      Not created already?
        **/
        if ( ! WA_Info ) {
                WA_Info = WindowObject,
                        WINDOW_Title,           "BGUI information class",
                        WINDOW_RMBTrap,         TRUE,
                        WINDOW_SmartRefresh,    TRUE,
                        WINDOW_HelpText,        InfoHelp,
                        WINDOW_MasterGroup,
                                VGroupObject, HOffset( 4 ), VOffset( 4 ),
                                        StartMember,
                                                InfoFixed( NULL,
                                                           ISEQ_C "BGUI offers the InfoClass.\n"
                                                           "This class is a text display class which\n"
                                                           "allows things like:\n\n"
                                                           ISEQ_SHINE     "C"
                                                           ISEQ_SHADOW    "o"
                                                           ISEQ_FILL      "l"
                                                           ISEQ_FILLTEXT  "o"
                                                           ISEQ_HIGHLIGHT "r"
                                                           ISEQ_TEXT      "s\n\n"
                                                           ISEQ_L "Left Aligned...\n"
                                                           ISEQ_R "Right Aligned...\n"
                                                           ISEQ_C "Centered...\n\n"
                                                           ISEQ_B "Bold...\n"   ISEQ_N
                                                           ISEQ_I "Italic...\n" ISEQ_N
                                                           ISEQ_U "Underlined...\n\n"
                                                           ISEQ_B ISEQ_I "And combinations!\n\n"
                                                           ISEQ_N "Free CHIP:" ISEQ_SHINE " %ld" ISEQ_TEXT", Free FAST:" ISEQ_SHINE " %ld\n",
                                                           &args[ 0 ],
                                                           17 ),
                                        EndMember,
                                EndObject,
                EndObject;
        }

        /*
        **      Object OK?
        **/
        if ( WA_Info ) {
                /*
                **      Open window.
                **/
                if ( window = WindowOpen( WA_Info ))
                        /*
                        **      Obtain signal mask.
                        **/
                        GetAttr( WINDOW_SigMask, WA_Info, sigmask );
        }

        return( window );
}

/*
**      Open images window.
**/
struct Window *OpenImageWindow( ULONG *sigmask )
{
        struct Window                   *window = NULL;

        /*
        **      Not yet created?
        **/
        if ( ! WA_Image ) {
                WA_Image = WindowObject,
                        WINDOW_Title,           "BGUI images",
                        WINDOW_RMBTrap,         TRUE,
                        WINDOW_SmartRefresh,    TRUE,
                        WINDOW_HelpText,        ImageHelp,
                        WINDOW_MasterGroup,
                                VGroupObject, HOffset( 4 ), VOffset( 4 ),
                                        StartMember,
                                                HGroupObject, NeXTFrame, FrameTitle( "Fixed size" ), HOffset( 8 ), TOffset( 4 ), BOffset( 6 ), Spacing( 4 ),
                                                        VarSpace( DEFAULT_WEIGHT ),
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_GETPATH,     ButtonFrame, EndObject, FixWidth( GETPATH_WIDTH     ), FixHeight( GETPATH_HEIGHT     ), EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_GETFILE,     ButtonFrame, EndObject, FixWidth( GETFILE_WIDTH     ), FixHeight( GETFILE_HEIGHT     ), EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_CHECKMARK,   ButtonFrame, EndObject, FixWidth( CHECKMARK_WIDTH   ), FixHeight( CHECKMARK_HEIGHT   ), EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_POPUP,       ButtonFrame, EndObject, FixWidth( POPUP_WIDTH       ), FixHeight( POPUP_HEIGHT       ), EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_ARROW_UP,    ButtonFrame, EndObject, FixWidth( ARROW_UP_WIDTH    ), FixHeight( ARROW_UP_HEIGHT    ), EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_ARROW_DOWN,  ButtonFrame, EndObject, FixWidth( ARROW_DOWN_WIDTH  ), FixHeight( ARROW_DOWN_HEIGHT  ), EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_ARROW_LEFT,  ButtonFrame, EndObject, FixWidth( ARROW_LEFT_WIDTH  ), FixHeight( ARROW_LEFT_HEIGHT  ), EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_ARROW_RIGHT, ButtonFrame, EndObject, FixWidth( ARROW_RIGHT_WIDTH ), FixHeight( ARROW_RIGHT_HEIGHT ), EndMember,
                                                        VarSpace( DEFAULT_WEIGHT ),
                                                EndObject, FixMinHeight,
                                        EndMember,
                                        StartMember,
                                                HGroupObject, NeXTFrame, FrameTitle( "Free size" ), HOffset( 8 ), TOffset( 4 ), BOffset( 6 ), Spacing( 4 ),
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_GETPATH,     ButtonFrame, EndObject, EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_GETFILE,     ButtonFrame, EndObject, EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_CHECKMARK,   ButtonFrame, EndObject, EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_POPUP,       ButtonFrame, EndObject, EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_ARROW_UP,    ButtonFrame, EndObject, EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_ARROW_DOWN,  ButtonFrame, EndObject, EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_ARROW_LEFT,  ButtonFrame, EndObject, EndMember,
                                                        StartMember, ButtonObject, VIT_BuiltIn, BUILTIN_ARROW_RIGHT, ButtonFrame, EndObject, EndMember,
                                                EndObject,
                                        EndMember,
                                EndObject,
                EndObject;
        }

        /*
        **      Object OK?
        **/
        if ( WA_Image ) {
                /*
                **      Open the window.
                **/
                if ( window = WindowOpen( WA_Image ))
                        /*
                        **      Obtain signal mask.
                        **/
                        GetAttr( WINDOW_SigMask, WA_Image, sigmask );
        }

        return( window );
}

/*
**      Open back-fill window.
**/
struct Window *OpenFillWindow( ULONG *sigmask )
{
        struct Window                   *window = NULL;

        /*
        **      Not yet created?
        **/
        if ( ! WA_BFill ) {
                WA_BFill = WindowObject,
                        WINDOW_Title,           "BGUI back fill patterns",
                        WINDOW_RMBTrap,         TRUE,
                        WINDOW_SmartRefresh,    TRUE,
                        WINDOW_HelpText,        BackfillHelp,
                        WINDOW_MasterGroup,
                                VGroupObject, HOffset( 4 ), VOffset( 4 ), Spacing( 4 ),
                                        StartMember,
                                                HGroupObject, Spacing( 4 ),
                                                        StartMember, InfoObject, ButtonFrame, ShineRaster,  EndObject, EndMember,
                                                        StartMember, InfoObject, ButtonFrame, ShadowRaster, EndObject, EndMember,
                                                EndObject,
                                        EndMember,
                                        StartMember,
                                                HGroupObject, Spacing( 4 ),
                                                        StartMember, InfoObject, ButtonFrame, ShineShadowRaster, EndObject, EndMember,
                                                        StartMember, InfoObject, ButtonFrame, FillRaster,        EndObject, EndMember,
                                                EndObject,
                                        EndMember,
                                        StartMember,
                                                HGroupObject, Spacing( 4 ),
                                                        StartMember, InfoObject, ButtonFrame, ShineFillRaster,  EndObject, EndMember,
                                                        StartMember, InfoObject, ButtonFrame, ShadowFillRaster, EndObject, EndMember,
                                                EndObject,
                                        EndMember,
                                        StartMember,
                                                HGroupObject, Spacing( 4 ),
                                                        StartMember, InfoObject, ButtonFrame, ShineBlock,  EndObject, EndMember,
                                                        StartMember, InfoObject, ButtonFrame, ShadowBlock, EndObject, EndMember,
                                                EndObject,
                                        EndMember,
                                EndObject,
                EndObject;
        }

        /*
        **      Object OK?
        **/
        if ( WA_BFill ) {
                /*
                **      Open window.
                **/
                if ( window = WindowOpen( WA_BFill ))
                        /*
                        **      Obtain signal mask.
                        **/
                        GetAttr( WINDOW_SigMask, WA_BFill, sigmask );
        }

        return( window );
}

/*
**      Cycle and Mx labels.
**/
UBYTE *PageLab[] = { "Buttons", "Strings", "CheckBoxes", "Radio-Buttons", NULL };
UBYTE *MxLab[]   = { "MX #1",   "MX #2",   "MX #3",      "MX #4",         NULL };

/*
**      Cycle to Page map-list.
**/
ULONG Cyc2Page[] = { CYC_Active, PAGE_Active, TAG_END };

/*
**      Open pages window.
**/
struct Window *OpenPagesWindow( ULONG *sigmask )
{
        Object                          *c, *p, *m, *s1, *s2, *s3;
        struct Window                   *window = NULL;

        /*
        **      Not yet created?
        **/
        if ( ! WA_Pages ) {
                WA_Pages = WindowObject,
                        WINDOW_Title,           "BGUI pages",
                        WINDOW_RMBTrap,         TRUE,
                        WINDOW_SmartRefresh,    TRUE,
                        WINDOW_HelpText,        PagesHelp,
                        WINDOW_MasterGroup,
                                VGroupObject, HOffset( 4 ), VOffset( 4 ), Spacing( 4 ),
                                        StartMember, c = XenKeyPopCycle( "_Page:", PageLab, 0, 0 ), FixMinHeight, EndMember,
                                        StartMember,
                                                p = PageObject,
                                                        /*
                                                        **      Button page.
                                                        **/
                                                        PageMember,
                                                                VGroupObject, Spacing(4),
                                                                        StartMember, TitleSeperator( "Buttons" ), EndMember,
                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                        StartMember, XenButton( "Button #1", 0 ), FixMinHeight, EndMember,
                                                                        StartMember, XenButton( "Button #2", 0 ), FixMinHeight, EndMember,
                                                                        StartMember, XenButton( "Button #3", 0 ), FixMinHeight, EndMember,
                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                EndObject,
                                                        /*
                                                        **      String page.
                                                        **/
                                                        PageMember,
                                                                VGroupObject, Spacing(4),
                                                                        StartMember, TitleSeperator( "Strings" ), EndMember,
                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                        StartMember, s1 = String( "String #1", "", 256, 0 ), FixMinHeight, EndMember,
                                                                        StartMember, s2 = String( "String #2", "", 256, 0 ), FixMinHeight, EndMember,
                                                                        StartMember, s3 = String( "String #3", "", 256, 0 ), FixMinHeight, EndMember,
                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                EndObject,
                                                        /*
                                                        **      CheckBox page.
                                                        **/
                                                        PageMember,
                                                                VGroupObject, Spacing(4),
                                                                        StartMember, TitleSeperator( "CheckBoxes" ), EndMember,
                                                                        StartMember,
                                                                                HGroupObject, Spacing( 4 ),
                                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                                        StartMember,
                                                                                                VGroupObject, Spacing( 4 ),
                                                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                                                        StartMember, CheckBox( "CheckBox #1", FALSE, 0 ), EndMember,
                                                                                                        StartMember, CheckBox( "CheckBox #2", FALSE, 0 ), EndMember,
                                                                                                        StartMember, CheckBox( "CheckBox #3", FALSE, 0 ), EndMember,
                                                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                                                EndObject, FixMinWidth,
                                                                                        EndMember,
                                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                                EndObject,
                                                                        EndMember,
                                                                EndObject,
                                                        /*
                                                        **      Mx page.
                                                        **/
                                                        PageMember,
                                                                VGroupObject, Spacing(4),
                                                                        StartMember, TitleSeperator( "Radio-Buttons" ), EndMember,
                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                        StartMember,
                                                                                HGroupObject,
                                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                                        StartMember, m = LeftMxKey( NULL, MxLab, 0, 0 ), EndMember,
                                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                                EndObject, FixMinHeight,
                                                                        EndMember,
                                                                        VarSpace( DEFAULT_WEIGHT ),
                                                                EndObject,
                                                EndObject,
                                        EndMember,
                                EndObject,
                EndObject;

                /*
                **      Object OK?
                **/
                if ( WA_Pages ) {
                        /*
                        **      Connect the cycle to the page.
                        **/
                        AddMap( c, p, Cyc2Page );
                        /*
                        **      Set tab-cycling order.
                        **/
                        DoMethod( WA_Pages, WM_TABCYCLE_ORDER, s1, s2, s3, NULL );
                        /*
                        **      Add a key to the cycle object.
                        **/
                        GadgetKey( WA_Pages, c, "p" );
                }
        }

        /*
        **      Object OK?
        **/
        if ( WA_Pages ) {
                /*
                **      Open the window.
                **/
                if ( window = WindowOpen( WA_Pages ))
                        /*
                        **      Obtain signal mask.
                        **/
                        GetAttr( WINDOW_SigMask, WA_Pages, sigmask );
        }

        return( window );
}

/*
**      Main entry.
**/
void main( int argc, char *argv[] )
{
        struct Window          *main = NULL, *groups = NULL, *notif = NULL, *info = NULL, *image = NULL, *bfill = NULL, *pages = NULL;
        struct AppMessage      *apm;
        struct WBArg           *ap;
        ULONG                   mainsig = 0L, groupssig = 0L, notifsig = 0L, infosig = 0L, imagesig = 0L, bfillsig = 0L, pagessig = 0L, appsig = 0L;
        ULONG                   sigmask = 0L, sigrec, rc, i;
        BOOL                    running = TRUE;
        UBYTE                   name[ 256 ];

        /*
        **      Open the main window.
        **/
        if ( main = OpenMainWindow( &mainsig, &appsig )) {
                /*
                **      OR signal masks.
                **/
                sigmask |= mainsig | appsig;
                /*
                **      Loop...
                **/
                do {
                        /*
                        **      Wait for the signals to come.
                        **/
                        sigrec = Wait( sigmask );
                        /*
                        **      AppWindow signal?
                        **/
                        if ( sigrec & appsig ) {
                                /*
                                **      Obtain AppWindow messages.
                                **/
                                while ( apm = GetAppMsg( WA_Main )) {
                                        /*
                                        **      Get all dropped icons.
                                        **/
                                        for ( ap = apm->am_ArgList, i = 0; i < apm->am_NumArgs; i++, ap++ ) {
                                                /*
                                                **      Build fully qualified name.
                                                **/
                                                NameFromLock( ap->wa_Lock, name, 256 );
                                                AddPart( name, ap->wa_Name, 256 );
                                                /*
                                                **      Add it to the listview.
                                                **/
                                                AddEntry( main, LV_IconList, (APTR)name, LVAP_SORTED );
                                        }
                                        /*
                                        **      Important! We must reply the message!
                                        **/
                                        ReplyMsg(( struct Message * )apm );
                                }
                                /*
                                **      Switch to the Icon page.
                                **/
                                SetGadgetAttrs(( struct Gadget * )PG_Pager, main, NULL, PAGE_Active, 1, TAG_END );
                        }

                        /*
                        **      Main window signal?
                        **/
                        if ( sigrec & mainsig ) {
                                /*
                                **      Call the main-window event handler.
                                **/
                                while (( rc = HandleEvent( WA_Main )) != WMHI_NOMORE ) {
                                        switch ( rc ) {

                                                case    WMHI_CLOSEWINDOW:
                                                case    ID_QUIT:
                                                        running = FALSE;
                                                        break;

                                                case    ID_ABOUT:
                                                        Req( main, "OK", "\33c\33b\33d8BGUIDemo\33n\33d2\n(C) Copyright 1993-1994 Jaba Development" );
                                                        break;

                                                case    ID_MAIN_GROUPS:
                                                        /*
                                                        **      Open groups window.
                                                        **/
                                                        if ( ! groups ) {
                                                                if ( groups = OpenGroupsWindow( &groupssig ))
                                                                        sigmask |= groupssig;
                                                        }
                                                        break;

                                                case    ID_MAIN_NOTIF:
                                                        /*
                                                        **      Open notification window.
                                                        **/
                                                        if ( ! notif ) {
                                                                if ( notif = OpenNotifWindow( &notifsig ))
                                                                        sigmask |= notifsig;
                                                        }
                                                        break;

                                                case    ID_MAIN_INFO:
                                                        /*
                                                        **      Open infoclass window.
                                                        **/
                                                        if ( ! info ) {
                                                                if ( info = OpenInfoWindow( &infosig ))
                                                                        sigmask |= infosig;
                                                        }
                                                        break;

                                                case    ID_MAIN_IMAGE:
                                                        /*
                                                        **      Open images window.
                                                        **/
                                                        if ( ! image ) {
                                                                if ( image = OpenImageWindow( &imagesig ))
                                                                        sigmask |= imagesig;
                                                        }
                                                        break;

                                                case    ID_MAIN_BFILL:
                                                        /*
                                                        **      Open backfill window.
                                                        **/
                                                        if ( ! bfill ) {
                                                                if ( bfill = OpenFillWindow( &bfillsig ))
                                                                        sigmask |= bfillsig;
                                                        }
                                                        break;

                                                case    ID_MAIN_PAGES:
                                                        /*
                                                        **      Open pages window.
                                                        **/
                                                        if ( ! pages ) {
                                                                if ( pages = OpenPagesWindow( &pagessig ))
                                                                        sigmask |= pagessig;
                                                        }
                                                        break;

                                                case    ID_MAIN_ICON_CONT:
                                                        /*
                                                        **      Switch back to the main page.
                                                        **/
                                                        SetGadgetAttrs(( struct Gadget * )PG_Pager, main, NULL, PAGE_Active, 0, TAG_END );
                                                        /*
                                                        **      Clear all entries from the listview.
                                                        **/
                                                        ClearList( main, LV_IconList );
                                                        break;
                                        }
                                }
                        }

                        /*
                        **      The code below will close the
                        **      specific window.
                        **/
                        if ( sigrec & groupssig ) {
                                while (( rc = HandleEvent( WA_Groups )) != WMHI_NOMORE ) {
                                        switch ( rc ) {
                                                case    WMHI_CLOSEWINDOW:
                                                        WindowClose( WA_Groups );
                                                        sigmask &= ~groupssig;
                                                        groupssig = 0L;
                                                        groups = NULL;
                                                        break;
                                        }
                                }
                        }

                        if ( sigrec & notifsig ) {
                                while (( rc = HandleEvent( WA_Notif )) != WMHI_NOMORE ) {
                                        switch ( rc ) {
                                                case    WMHI_CLOSEWINDOW:
                                                        WindowClose( WA_Notif );
                                                        sigmask &= ~notifsig;
                                                        notifsig = 0L;
                                                        notif = NULL;
                                                        break;
                                        }
                                }
                        }

                        if ( sigrec & infosig ) {
                                while (( rc = HandleEvent( WA_Info )) != WMHI_NOMORE ) {
                                        switch ( rc ) {
                                                case    WMHI_CLOSEWINDOW:
                                                        WindowClose( WA_Info );
                                                        sigmask &= ~infosig;
                                                        infosig = 0L;
                                                        info = NULL;
                                                        break;
                                        }
                                }
                        }

                        if ( sigrec & imagesig ) {
                                while (( rc = HandleEvent( WA_Image )) != WMHI_NOMORE ) {
                                        switch ( rc ) {
                                                case    WMHI_CLOSEWINDOW:
                                                        WindowClose( WA_Image );
                                                        sigmask &= ~imagesig;
                                                        imagesig = 0L;
                                                        image = NULL;
                                                        break;
                                        }
                                }
                        }

                        if ( sigrec & bfillsig ) {
                                while (( rc = HandleEvent( WA_BFill )) != WMHI_NOMORE ) {
                                        switch ( rc ) {
                                                case    WMHI_CLOSEWINDOW:
                                                        WindowClose( WA_BFill );
                                                        sigmask &= ~bfillsig;
                                                        bfillsig = 0L;
                                                        bfill = NULL;
                                                        break;
                                        }
                                }
                        }

                        if ( sigrec & pagessig ) {
                                while (( rc = HandleEvent( WA_Pages )) != WMHI_NOMORE ) {
                                        switch ( rc ) {
                                                case    WMHI_CLOSEWINDOW:
                                                        WindowClose( WA_Pages );
                                                        sigmask &= ~pagessig;
                                                        pagessig = 0L;
                                                        pages = NULL;
                                                        break;
                                        }
                                }
                        }
                } while ( running );
        }
        /*
        **      Dispose of all window objects.
        **/
        if ( WA_Pages )         DisposeObject( WA_Pages );
        if ( WA_BFill )         DisposeObject( WA_BFill );
        if ( WA_Image )         DisposeObject( WA_Image );
        if ( WA_Info )          DisposeObject( WA_Info );
        if ( WA_Notif )         DisposeObject( WA_Notif );
        if ( WA_Groups )        DisposeObject( WA_Groups );
        if ( WA_Main )          DisposeObject( WA_Main );
}

/*
**      DICE stuff.
**/
#ifdef _DCC
int wbmain( struct WBStartup *wbs )
{
        return( main( 0, NULL ));
}
#endif

/*
 *      $Log: bguidemo.c,v $
 * Revision 1.12  1994/10/02  14:57:30  jaba
 * Added online-help to all windows.
 *
 * Revision 1.11  1994/09/29  20:14:37  jaba
 * Cleaned it up a little.
 *
 * Revision 1.10  1994/09/29  18:35:54  jaba
 * Enhanced the icon-drop thinggy.
 *
 * Revision 1.9  1994/08/03  11:16:20  jaba
 * Switch to proto/ instead of clib/.
 *
 * Revision 1.8  1994/07/25  20:08:47  jaba
 * Added some group seperators.
 *
 * Revision 1.7  1994/07/19  19:52:25  jaba
 * Fixed a positioning bug in the pages window.
 *
 * Revision 1.6  1994/07/18  17:44:16  jaba
 * Removed the sizing gadget from the main window.
 *
 * Revision 1.5  1994/07/16  18:21:04  jaba
 * Added the BREQF_XEN_BUTTONS flag to the BGUI_RequestA() routine.
 *
 * Revision 1.4  1994/07/16  18:04:39  jaba
 * Added a backfill pattern in the main-window.
 *
 * Revision 1.3  1994/07/16  13:16:37  jaba
 * Added a Free chip&fast display to the InfoClass window
 * to show the possibility of C-style formatting codes in
 * an InfoClass object.
 *
 * Revision 1.2  1994/07/16  12:17:38  jaba
 * Added some more XEN stuff.
 *
 * Revision 1.1  1994/07/16  11:09:12  jaba
 * Initial revision
 *
 */
