/*
 * @(#) $Header: /cvsroot/bgui/gadgets/Bar/BarDemo.c,v 41.11 2000/05/09 20:34:22 mlemos Exp $
 *
 * BGUI library
 *
 * (C) Copyright 2000 BGUI Developers Team.
 * (C) Copyright 1998 Manuel Lemos.
 * All Rights Reserved.
 *
 * $Log: BarDemo.c,v $
 * Revision 41.11  2000/05/09 20:34:22  mlemos
 * Bumped to revision 41.11
 *
 * Revision 1.2  2000/05/09 19:59:27  mlemos
 * Merged with the branch Manuel_Lemos_fixes.
 *
 * Revision 1.1.2.1  2000/05/04 05:08:02  mlemos
 * Initial revision.
 *
 *
 */

#include <libraries/bgui.h>
#include <libraries/bgui_macros.h>

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

#include <bgui/bgui_bar.h>

/*
 * Output file handle and BGUI
 * library base.
 */
BPTR     StdOut;
struct Library *BGUIBase;

/*
** Notification map-lists.
**/
ULONG pga2slh[] = { BAR_HorizontalPosition, BAR_HorizontalPosition, TAG_END };
ULONG pga2slv[] = { BAR_VerticalPosition,   BAR_VerticalPosition,   TAG_END };
ULONG sl2prg1[] = { BAR_HorizontalPosition, BAR_HorizontalSize,     TAG_END };
ULONG prg12in[] = { BAR_HorizontalSize,     INDIC_Level,            TAG_END };
ULONG sl2prg2[] = { BAR_VerticalPosition,   BAR_VerticalSize,       TAG_END };
ULONG prg22in[] = { BAR_VerticalSize,       INDIC_Level,            TAG_END };

VOID Tell( UBYTE *fstr, ... )
{
   if ( StdOut ) VFPrintf( StdOut, fstr, ( ULONG * )&fstr + 1 );
}

static Object *OpenMainWindow(struct MsgPort *SharedPort,struct Window **main)
{
   Object            *object=NULL, *p1, *p2, *s1, *s2, *p, *i1, *i2;

   /*
   ** Not created yet? Create it now!
   **/
   if ( ! object ) {
      object = WindowObject,
         WINDOW_Title,     "BGUI Bar demo",
         WINDOW_RMBTrap,         TRUE,
         WINDOW_SmartRefresh, TRUE,
         WINDOW_AutoAspect,   TRUE,
         WINDOW_SharedPort,   SharedPort,
         WINDOW_MasterGroup,
            VGroupObject, NormalOffset, NormalSpacing,
               StartMember,
                  HGroupObject, NormalSpacing,
                     StartMember,
                        VGroupObject, NormalSpacing,
                           StartMember, i1 = IndicatorFormat( 0, 100, 0, IDJ_CENTER, "%ld%%" ), FixMinHeight, EndMember,
                           StartMember,
                             p1=BGUI_NewObject(BGUI_BAR_GADGET,
                             	BAR_Horizontal,FALSE,
                             	BAR_Vertical,FALSE,
                             	BAR_HorizontalPosition,0,
                             	BAR_HorizontalSize,0,
                             	BAR_HorizontalTotal,100,
                             	TAG_END),
                           EndMember,
                           StartMember,
                              s1=BGUI_NewObject(BGUI_BAR_GADGET,
                              	BAR_Horizontal,TRUE,
                              	BAR_Vertical,FALSE,
                              	BAR_HorizontalPosition,0,
                              	BAR_HorizontalSize,1,
                              	BAR_HorizontalTotal,101,
                              	TAG_END),
                              FixHeight( 16 ),
                           EndMember,
                        EndObject,
                     EndMember,
                     StartMember,
                        p=BGUI_NewObject(BGUI_BAR_GADGET,
                        	BAR_Horizontal,TRUE,
                        	BAR_Vertical,TRUE,
                        	BAR_HorizontalPosition,0,
                        	BAR_HorizontalSize,1,
                        	BAR_HorizontalTotal,101,
                        	BAR_VerticalPosition,0,
                        	BAR_VerticalSize,1,
                        	BAR_VerticalTotal,101,
                        	TAG_END),
                     EndMember,
                     StartMember,
                        s2=BGUI_NewObject(BGUI_BAR_GADGET,
                        	BAR_Horizontal,FALSE,
                        	BAR_Vertical,TRUE,
                        	BAR_VerticalPosition,0,
                        	BAR_VerticalSize,1,
                        	BAR_VerticalTotal,101,
                        	TAG_END),
                        FixWidth( 16 ),
                     EndMember,
                     StartMember,
                        VGroupObject, NormalSpacing,
                           StartMember, i2 = IndicatorFormat( 0, 100, 0, IDJ_CENTER, "%ld%%" ), FixMinHeight, EndMember,
                           StartMember,
                             p2=BGUI_NewObject(BGUI_BAR_GADGET,
                             	BAR_Horizontal,FALSE,
                             	BAR_Vertical,FALSE,
                             	BAR_VerticalPosition,0,
                             	BAR_VerticalSize,0,
                             	BAR_VerticalTotal,100,
                             	TAG_END),
                           EndMember,
                        EndObject,
                     EndMember,
                  EndObject,
               EndMember,
            EndObject,
      EndObject;

      if ( object ) {
         /*
         ** Connect sliders, prop, progression and indicators.
         **/
         AddMap( s1, p1, sl2prg1 );
         AddMap( s2, p2, sl2prg2 );
         AddMap( p,  s1, pga2slh );
         AddMap( p,  s2, pga2slv );
         AddMap( p1, i1, prg12in );
         AddMap( p2, i2, prg22in );
      }
   }

   /*
   ** Object OK?
   **/
   if ( object ) {
      /*
      ** Open window.
      **/
      if((*main=WindowOpen( object ))==NULL)
      {
      	DisposeObject(object);
      	object=NULL;
      }
   }

   return( object );
}

static VOID StartDemo(void)
{
   Object         *WA_Main;
   struct MsgPort *SharedPort;
   ULONG       sigmask = 0L, sigrec,rc;
   struct Window         *main=NULL, *sigwin;
   BOOL        running = TRUE;

   /*
   ** Create the shared message port.
   **/
   if ( SharedPort = CreateMsgPort()) {
      /*
      ** Open the main window.
      **/
      if ( WA_Main = OpenMainWindow(SharedPort,&main)) {
         /*
         ** OR signal masks.
         **/
         sigmask |= ( 1L << SharedPort->mp_SigBit );
         /*
         ** Loop...
         **/
         do {
            /*
            ** Wait for the signals to come.
            **/
            sigrec = Wait( sigmask );

            /*
            ** Find out the which window signalled us.
            **/
            if ( sigrec & ( 1 << SharedPort->mp_SigBit )) {
               while ( sigwin = GetSignalWindow( WA_Main )) {

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

                           case  WMHI_CLOSEWINDOW:
                              running = FALSE;
                              break;

                        }
                     }
                  }
               }
            }
         } while ( running );
      }
      /*
      ** Dispose of all window objects.
      **/
      if (WA_Main)   DisposeObject(WA_Main);
      /*
      ** Delete the shared message port.
      **/
      DeleteMsgPort( SharedPort );
   } else
      Tell( "Unable to create a message port.\n" );
}

/*
 * Main entry point.
 */
int main( int argc, char **argv )
{
   struct Process       *this_task = ( struct Process * )FindTask( NULL );
   BOOL            is_wb = FALSE;

   if ( this_task->pr_CLI )
      /*
       * Started from the CLI. Simply pickup
       * the CLI output handle.
       */
      StdOut = Output();
   else {
      /*
       * Workbench startup. Open a console
       * for output.
       */
      StdOut = Open( "CON:10/10/500/100/BGUI Demo Output/WAIT/AUTO", MODE_NEWFILE );
      is_wb = TRUE;
   }

   /*
    * Open BGUI.
    */
   if ( BGUIBase = OpenLibrary( BGUINAME, BGUIVERSION )) {
      /*
       * Run the demo.
       */
      StartDemo();
      CloseLibrary( BGUIBase );
   } else
      Tell( "Unable to open %s version %ld\n", BGUINAME, BGUIVERSION );

   /*
    * Close console if ran from
    * the workbench.
    */
   if ( is_wb ) {
      if ( StdOut ) Close( StdOut );
   }

   return( 0 );
}

