/*
 *      MULTISELECT.E
 *
 *      (C) Copyright 1995 Jaba Development.
 *      (C) Copyright 1995 Jan van den Baard.
 *          All Rights Reserved.
 */

OPT OSVERSION=37
OPT PREPROCESS

MODULE 'libraries/bgui',
       'libraries/bgui_macros',
       'libraries/gadtools',
       'bgui',
       'tools/boopsi',
       'utility/tagitem',
	'intuition/intuition',
	'intuition/screens',
       'intuition/classes',
       'intuition/classusr',
       'intuition/gadgetclass'
/*
**      Object ID's.
**/
#define ID_SHOW                 1
#define ID_QUIT                 2
#define ID_ALL                  3
#define ID_NONE                 4

PROC main()

DEF	wo_window, window:PTR TO window,go_quit, go_show, go_list, go_shift, go_all, go_none,
        signal, rc, tmp = 0,str,
        running = FALSE

   /*
   **      Open the library.
   **/
   IF bguibase := OpenLibrary( 'bgui.library', 37 )
        /*
         *      Create the window object.
         */
        wo_window := WindowObject,
                WINDOW_TITLE,           'Multi-Selection Demo',
                WINDOW_AUTOASPECT,      TRUE,
                WINDOW_SMARTREFRESH,    TRUE,
                WINDOW_RMBTRAP,         TRUE,
                WINDOW_SCALEWIDTH,      30,
                WINDOW_SCALEHEIGHT,     30,
                WINDOW_MASTERGROUP,
                        VGroupObject, HOffset( 4 ), VOffset( 4 ), Spacing( 4 ), GROUP_BACKFILL, SHINE_RASTER,
                                StartMember,
                                        VGroupObject, HOffset( 4 ), VOffset( 4 ),
                                                FRM_TYPE,               FRTYPE_BUTTON,
                                                FRM_RECESSED,           TRUE,
                                                StartMember,
                                                        go_list := ListviewObject,
                                                                LISTV_ENTRYARRAY,               ['\ecThis listview object has multi-',
										        	'\ecselection turned on. You can',
										        	'\ecmulti-select the items by holding',
										        	'\ec down the SHIFT-key while clicking',
										        	'\econ the different items or by clicking',
										        	'\econ an entry and dragging the mouse',
										        	'\ecup or down.',
										        	'\ec',
										        	'\ecIf you check the No SHIFT checbox',
										        	'\ecyou can multi-select the items without',
										        	'\ecusing the SHIFT key',NIL],
                                                                LISTV_MULTISELECT,              TRUE,
                                                        EndObject,
                                                EndMember,
                                                StartMember,
                                                        HGroupObject,
                                                                StartMember, go_all  := KeyButton( '_All',  ID_ALL  ), EndMember,
                                                                StartMember, go_none := KeyButton( 'N_one', ID_NONE ), EndMember,
                                                        EndObject, FixMinHeight,
                                                EndMember,
                                        EndObject,
                                EndMember,
                                StartMember,
                                        HGroupObject, HOffset( 4 ), VOffset( 4 ),
                                                FRM_TYPE,               FRTYPE_BUTTON,
                                                FRM_RECESSED,           TRUE,
                                                VarSpace( DEFAULT_WEIGHT ),
                                                StartMember, go_shift := KeyCheckBox( '_No SHIFT:', FALSE, 0 ), EndMember,
                                                VarSpace( DEFAULT_WEIGHT ),
                                        EndObject, FixMinHeight,
                                EndMember,
                                StartMember,
                                        HGroupObject, Spacing( 4 ),
                                                StartMember, go_show := KeyButton( '_Show', ID_SHOW ), EndMember,
                                                VarSpace( DEFAULT_WEIGHT ),
                                                StartMember, go_quit := KeyButton( '_Quit', ID_QUIT ), EndMember,
                                        EndObject, FixMinHeight,
                                EndMember,
                        EndObject,
        EndObject

        /*
        **      Object created OK?
        **/
        IF wo_window
                /*
                **      Assign the keys to the buttons.
                **/
                tmp :=tmp + GadgetKey( wo_window, go_quit,  'q' )
                tmp :=tmp + GadgetKey( wo_window, go_show,  's' )
                tmp :=tmp + GadgetKey( wo_window, go_shift, 'n' )
                tmp :=tmp + GadgetKey( wo_window, go_all,   'a' )
                tmp :=tmp + GadgetKey( wo_window, go_none,  'o' )
                /*
                **      OK?
                **/
                IF tmp = 5
                        /*
                        **      Add notification.
                        **/
                        IF AddMap( go_shift, go_list, [ GA_SELECTED, LISTV_MULTISELECTNOSHIFT, TAG_END ]:tagitem )
                                /*
                                **      try to open the window.
                                **/
                                IF window := WindowOpen( wo_window )
                                        /*
                                        **      Obtain it's wait mask.
                                        **/
                                        GetAttr( WINDOW_SIGMASK, wo_window, {signal} )
                                        /*
                                        **      Event loop...
                                        **/
                                        REPEAT
                                                Wait( signal )
                                                /*
                                                **      Handle events.
                                                **/
                                                WHILE ( rc := HandleEvent( wo_window )) <> WMHI_NOMORE
                                                        /*
                                                        **      Evaluate return code.
                                                        **/
                                                        SELECT rc

                                                                CASE    WMHI_CLOSEWINDOW
                                                                        running := TRUE
                                                                CASE    ID_QUIT
                                                                        running := TRUE
                                                                CASE    ID_ALL
                                                                        SetGadgetAttrsA(go_list, window, NIL, [LISTV_SELECTMULTI, LISTV_SELECT_ALL, TAG_END] )

                                                                CASE    ID_NONE
                                                                        SetGadgetAttrsA(go_list, window, NIL, [LISTV_DESELECT, -1, TAG_END] )

                                                                CASE    ID_SHOW

                                                                        /*
                                                                        **      Simply dump all selected entries
                                                                        **      to the console.
                                                                        **/
                                                                        IF str := FirstSelected( go_list )
                                                                                REPEAT
                                                                                        WriteF( '\s\n', str + 2 )
                                                                                        str := NextSelected( go_list, str )
                                                                                UNTIL str
                                                                        ELSE
                                                                                /*
                                                                                **      Oops. There are no selected
                                                                                **      entries.
                                                                                **/
                                                                                WriteF( 'No selections made!\n' )
                                                                        ENDIF
                                                        ENDSELECT
                                                ENDWHILE
                                        UNTIL running
                                ELSE
                                        WriteF( 'Could not open the window\n' )
				ENDIF
                        ELSE
                                WriteF( 'Unable to add notification\n' )
			ENDIF
                ELSE
                        WriteF( 'Could not assign gadget keys\n' )
		ENDIF
                /*
                **      Disposing of the window object will
                **      also close the window if it is
                **      already opened and it will dispose of
                **      all objects attached to it.
                **/
                DisposeObject( wo_window )
        ELSE
                WriteF( 'Could not create the window object\n' )
	ENDIF
	CloseLibrary(bguibase)
   ELSE
      WriteF( 'Could not open the bgui.library\n' )
   ENDIF
ENDPROC
