// // LISTWIN.CPP // // Source file for ArchiveLib 2.0 // // Copyright (c) Greenleaf Software, Inc. 1994-1996 // All Rights Reserved // // CONTENTS // // ALEntryList::FillListBox() // ALEntryListFillListBox() // ALEntryList::SetMarksFromListBox() // ALEntryListSetMarksFromListBox() // ALEntryList::MakeEntriesFromListBox() // ALEntryListMakeEntriesFromListBox() // // DESCRIPTION // // A batch of functions that perform UI stuff for ALEntryList under // the Windows GUI. // // REVISION HISTORY // // February 14, 1996 2.0A : New release #include "arclib.h" #if !defined( AL_IBM ) #pragma hdrstop #endif // // NAME // // ALEntryList::FillListBox() // // PLATFORMS/ENVIRONMENTS // // Windows // C++ C PM VB // // SHORT DESCRIPTION // // Fill a list box with the object names from an ALEntryList. // // C++ SYNOPSIS // // #include "arclib.h" // // int ALEntryList::FillListBox( HWND hDlg, // int list_box_id = -1 ); // // C SYNOPSIS // // #include "arclib.h" // // int ALEntryListFillListBox( hALEntryList this_object, // HWND hDlg, // int list_box_id ); // // VB SYNOPSIS // // Declare Function ALEntryListFillListBox Lib "AL20LW" // (ByVal this_object&, ByVal hDlg%, ByVal list_box_id% ) as Integer // // DELPHI SYNOPSIS // // function ALEntryListFillListBox( this_object : hALEntryList; // hDlg : HDlg; // list_box_id : Integer ) : Integer; // // ARGUMENTS // // this_object : A reference or pointer to the ALEntryList object that // is going to supply all the entry names that are going // to be displayed in the list box. // // hDlg : This argument is a window handle. If the next parameter, // list_box_id, is set to -1, it means this is the handle of // the list box. If list_box_id is not -1, it means this // argument is the window handle of a dialog box that // contains the list box. // // list_box_id : The id of the list box. If set to -1, it means the list // box is not in a dialog box, and the hDlg parameter is the // actual handle of the list box. // // DESCRIPTION // // This function is a handy helper when writing Windows plications. It goes // through an ALEntryList, and finds all the marked entries. For every // marked entry, it stuffs the name of the storage object into the list box. // This means that if you are planning on letting the user select a list // of storage objects, you can initialize the list with just one // function call. // // RETURNS // // The number of entries that were stuffed in the list box. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New release // int AL_PROTO ALEntryList::FillListBox( HWND hDlg, /* Tag public function */ int list_box_id /* = -1 */ ) { HWND window; if ( list_box_id != -1 ) window = GetDlgItem( hDlg, (short int) list_box_id ); else window = hDlg; SendMessage( window, LB_RESETCONTENT, 0, 0 ); ALEntry *job = GetFirstEntry(); int count = 0; while ( job ) { if ( job->GetMark() ) { count++; SendMessage( window, LB_ADDSTRING, 0, (LPARAM)( (LPSTR) job->mpStorageObject->mName ) ); } job = job->GetNextEntry(); } if ( count == 0 ) SendMessage( window, LB_ADDSTRING, 0, (LPARAM)( (LPSTR) "" ) ); return count; } #if !defined( AL_NO_C ) extern "C" AL_LINKAGE int AL_FUNCTION ALEntryListFillListBox( hALEntryList this_object, /* Tag public function */ HWND hDlg, int list_box_id ) { AL_ASSERT_OBJECT( this_object, ALEntryList, "ALEntryListFillListBox" ); return ( (ALEntryList *) this_object )->FillListBox( hDlg, list_box_id ); } #endif // // NAME // // ALEntryList::SetMarksFromListBox() // // PLATFORMS/ENVIRONMENTS // // Windows // C++ C VB Delphi // // SHORT DESCRIPTION // // Set marks in an ALEntryList based on selections in a list box. // // C++ SYNOPSIS // // #include "arclib.h" // // int ALEntryList::SetMarksFromListBox( HWND hDlg, // int list_box_id = -1 ); // // C SYNOPSIS // // #include "arclib.h" // // int ALEntryListSetMarksFromListBox( hALEntryList this_object, // HWND hDlg, // int list_box_id ); // // VB SYNOPSIS // // Declare Function ALEntryListSetMarksFromListBox Lib "AL20LW" // (ByVal this_object&, ByVal hDlg%, ByVal list_box_id%) As Integer // // DELPHI SYNOPSIS // // function ALEntryListSetMarksFromListBox( this_object : hALEntryList; // hDlg : HWnd; // list_box_id : Integer ) : Integer; // // ARGUMENTS // // this_object : A reference or pointer to the ALEntryList object that // is have some marks set. Note that the C++ member function // version of this call doesn't have an explicit argument // here, since it has access to 'this' implicitly. // // hDlg : This argument is a window handle. If the next parameter, // list_box_id, is set to -1, it means this is the handle of // the list box. If list_box_id is not -1, it means this // argument is the window handle of a dialog box that // contains the list box. // // list_box_id : The id of the list box. If set to -1, it means the list // box is not in a dialog box, and the hDlg parameter is the // actual handle of the list box. // // DESCRIPTION // // This function is called after you have given a user the opportunity // to set and clear items in a multiselection list box. Once the user // has done so, you can call this function, which will go through the // list and set all the marks that have been set in the list box by the // user. Note that it will not clear the marks on any of the ALEntry // objects in the list, you might want to do that first. // // RETURNS // // A count of the items that have had their marks set. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New release // int AL_PROTO ALEntryList::SetMarksFromListBox( HWND hDlg, /* Tag public function */ int list_box /* = -1 */ ) { HWND window; if ( list_box != -1 ) window = GetDlgItem( hDlg, (short int) list_box ); else window = hDlg; WORD count = (WORD) SendMessage( window, LB_GETSELCOUNT, 0, 0L ); int *items = new int[ count ]; if ( items == 0 ) return mStatus.SetError( AL_CANT_ALLOCATE_MEMORY, "Memory allocation failure in SetMarksFromListBox()" ); #ifdef AL_FLAT_MODEL if ( count != (WORD) SendMessage( window, LB_GETSELITEMS, count, (LPARAM) ( items ) ) ) { #else if ( count != (WORD) SendMessage( window, LB_GETSELITEMS, count, (LPARAM) ( (int _far * ) items ) ) ) { #endif mStatus.SetError( AL_LOGIC_ERROR, "Logic error in SetMarksFromListBox()." "Mismatch in select count from list box." ); delete[] items; return AL_LOGIC_ERROR; } for ( WORD i = 0 ; i < count ; i++ ) { WORD length = (WORD) SendMessage( window, LB_GETTEXTLEN, (short int) items[ i ], 0L ); AL_ASSERT( length != (WORD) LB_ERR, "SetMarksFromListBox: LB_ERR returned from list box" ); if ( length > 0 ) { char *name = new char[ length + 1 ]; if ( name ) { if ( SendMessage( window, LB_GETTEXT, (short int) items[ i ], (LPARAM)( (LPSTR) name ) ) >= 0 ) SetMarks( name ); delete[] name; } } } delete[] items; return count; } #if !defined( AL_NO_C ) extern "C" AL_LINKAGE int AL_FUNCTION ALEntryListSetMarksFromListBox( hALEntryList this_object, /* Tag public function */ HWND hDlg, int list_box_id ) { AL_ASSERT_OBJECT( this_object, ALEntryList, "ALEntryListSetMarksFromListBox" ); return ( (ALEntryList *) this_object)->SetMarksFromListBox( hDlg, list_box_id ); } #endif // // NAME // // ALEntryList::MakeEntriesFromListBox() // // PLATFORMS/ENVIRONMENTS // // Windows // C++ C VB Delphi // // SHORT DESCRIPTION // // Create new entries in a list based on selected items in a list box. // // C++ SYNOPSIS // // #include "arclib.h" // // int ALEntryList::MakeEntriesFromListBox( HWND hDlg, // int list_box_id = -1 ); // // C SYNOPSIS // // #include "arclib.h" // // int ALEntryListMakeEntriesFromListBox( hALEntryList this_object, // HWND hDlg, // int list_box_id ); // // VB SYNOPSIS // // Declare Function ALEntryListMakeEntriesFromlistBox Lib "AL20LW" // (ByVal this_object&, ByVal hDlg%, ByVal list_box_id% ) As Integer // // DELPHI SYNOPSIS // // function ALEntryListMakeEntriesFromlistBox( this_object : hALEntryList; // hDlg : HWnd; // list_box_id : Integer ); // // ARGUMENTS // // this_object : A reference or pointer to the ALEntryList object that // is going to have new entries added. Note that the C++ // member function version of this call doesn't have an // an explicit argument here, since it has access to 'this' // implicitly. // // hDlg : This argument is a window handle. If the next parameter, // list_box_id, is set to -1, it means this is the handle of // the list box. If list_box_id is not -1, it means this // argument is the window handle of a dialog box that // contains the list box. // // list_box_id : The id of the list box. If set to -1, it means the list // box is not in a dialog box, and the hDlg parameter is the // actual handle of the list box. // // DESCRIPTION // // This function goes through a list box, and picks out all the // highlighted entries. It creates a new ALEntry object for each // of the marked entires, using the storage objects and engines that // are present in the toolkit owned by this ALEntryList. // // RETURNS // // The number of new entries created from the list box. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // November 13, 1995 2.00A : First release. // int AL_PROTO ALEntryList::MakeEntriesFromListBox( HWND hDlg, /* Tag public function */ int list_box_id /* = -1 */ ) { HWND window; if ( list_box_id != -1 ) window = GetDlgItem( hDlg, (short int) list_box_id ); else window = hDlg; int count = (WORD) SendMessage( window, LB_GETSELCOUNT, 0, 0L ); if ( count == LB_ERR ) return AL_GETSEL_ERROR; int *items = new int[ count ]; if ( items == 0 ) return AL_CANT_ALLOCATE_MEMORY; #ifdef AL_FLAT_MODEL if ( count != SendMessage( window, LB_GETSELITEMS, (short int) count, (LPARAM) items ) ) { #else if ( count != SendMessage( window, LB_GETSELITEMS, (short int) count, (LPARAM)(int _far *) items ) ) { #endif delete items; return AL_GETSEL_ERROR; } for ( WORD i = 0 ; i < (WORD) count ; i++ ) { WORD length = (WORD) SendMessage( window, LB_GETTEXTLEN, (short int) items[ i ], 0L ); if ( length > 0 ) { char *name = new char[ length + 1 ]; if ( name ) { if ( SendMessage( window, LB_GETTEXT, (short int) items[ i ], (LPARAM)( (LPSTR) name ) ) >= 0 ) { new ALEntry( *this, mToolKit.CreateStorageObject( name, AL_STORAGE_DEFAULT ), mToolKit.CreateCompressor( AL_COMPRESSION_DEFAULT ), mToolKit.CreateDecompressor( AL_COMPRESSION_DEFAULT ) ); } delete name; SendMessage( window, LB_SETSEL, 0, items[ i ] ); } } } delete items; return count; } #if !defined( AL_NO_C ) extern "C" AL_LINKAGE int AL_FUNCTION ALEntryListMakeEntriesFromListBox( hALEntryList this_object, /* Tag public function */ HWND hDlg, int list_box_id ) { AL_ASSERT_OBJECT( this_object, ALEntryList, "ALEntryListMakeEntriesFromListBox" ); return ( (ALEntryList *) this_object )->MakeEntriesFromListBox( hDlg, list_box_id ); } #endif