| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- /*
- ** Command & Conquer Generals Zero Hour(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- // FILE: DirectorySelect.cpp //////////////////////////////////////////////////
- //-----------------------------------------------------------------------------
- //
- // Westwood Studios Pacific.
- //
- // Confidential Information
- // Copyright (C) 2001 - All Rights Reserved
- //
- //-----------------------------------------------------------------------------
- //
- // Project: ImagePacker
- //
- // File name: DirectorySelect.cpp
- //
- // Created: Colin Day, August 2001
- //
- // Desc: Directory selection dialog
- //
- //-----------------------------------------------------------------------------
- ///////////////////////////////////////////////////////////////////////////////
- // SYSTEM INCLUDES ////////////////////////////////////////////////////////////
- #include <windows.h>
- #include <stdio.h>
- // USER INCLUDES //////////////////////////////////////////////////////////////
- #include "ImagePacker.h"
- #include "Resource.h"
- // DEFINES ////////////////////////////////////////////////////////////////////
- // PRIVATE TYPES //////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- // PRIVATE DATA ///////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- static char startDir[ _MAX_PATH ];
- // PUBLIC DATA ////////////////////////////////////////////////////////////////
- // PRIVATE PROTOTYPES /////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- // PRIVATE FUNCTIONS //////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- // selectDrive ================================================================
- /** Based on the drive of the current working directory, select the
- * drive item in the COMBO_DRIVE combo box matching the current
- * drive letter */
- //=============================================================================
- static void selectDrive( HWND dialog )
- {
- char currDir[ _MAX_PATH ];
- char drive;
- // get current directory
- GetCurrentDirectory( _MAX_PATH, currDir );
- // drive letter is the first character
- drive = currDir[ 0 ];
- // construct string to match in the combo
- char string[ 32 ];
- sprintf( string, "[-%c-]", drive );
- // select the string in the combo
- Int index;
- index = SendDlgItemMessage( dialog, COMBO_DRIVE,
- CB_FINDSTRINGEXACT, -1, (LPARAM)string );
- if( index != CB_ERR )
- SendDlgItemMessage( dialog, COMBO_DRIVE, CB_SETCURSEL, index, 0 );
- } // end selectDrive
- ///////////////////////////////////////////////////////////////////////////////
- // PUBLIC FUNCTIONS ///////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- // DirectorySelectProc ========================================================
- /** Directory selection dialog */
- //=============================================================================
- BOOL CALLBACK DirectorySelectProc( HWND hWndDialog, UINT message,
- WPARAM wParam, LPARAM lParam )
- {
- static char buffer[ _MAX_PATH ];
- switch( message )
- {
- // ------------------------------------------------------------------------
- case WM_INITDIALOG:
- {
- // save our current directory as we start up
- GetCurrentDirectory( _MAX_PATH, startDir );
- // set the extents for the horizontal scroll bar in the listbox
- SendDlgItemMessage( hWndDialog, LIST_DIR,
- LB_SETHORIZONTALEXTENT, 1280, 0 );
- // load the listbox with directory items
- SendDlgItemMessage( hWndDialog, LIST_DIR,
- LB_DIR,
- DDL_DIRECTORY | DDL_EXCLUSIVE,
- (LPARAM)"*.*" );
- // set the current directory in the top label
- GetCurrentDirectory( _MAX_PATH, buffer );
- if( buffer[ strlen( buffer ) - 1 ] != '\\' )
- strcat( buffer, "\\" );
- SetDlgItemText( hWndDialog, STATIC_CURRENT_DIR, buffer );
- // load the drive box
- SendDlgItemMessage( hWndDialog, COMBO_DRIVE,
- CB_DIR,
- DDL_DRIVES | DDL_EXCLUSIVE,
- (LPARAM)"*.*" );
- // select the right drive in the drive combo box
- selectDrive( hWndDialog );
- return TRUE;
- } // end init
- // ------------------------------------------------------------------------
- case WM_COMMAND:
- {
- Int notifyCode = HIWORD( wParam );
- Int controlID = LOWORD( wParam );
- // HWND hWndControl = (HWND)lParam;
- switch( controlID )
- {
- // --------------------------------------------------------------------
- case BUTTON_ADD:
- {
- Int count;
- char text[ _MAX_PATH ];
- char toAdd[ _MAX_PATH ];
- // get number of items in listbox
- count = SendDlgItemMessage( hWndDialog, LIST_DIR, LB_GETCOUNT, 0, 0 );
- // for each selected item add that directory
- for( Int i = 0; i < count; i++ )
- {
- // is this item selected
- if( SendDlgItemMessage( hWndDialog, LIST_DIR, LB_GETSEL, i, 0 ) > 0 )
- {
- // get the text
- SendDlgItemMessage( hWndDialog, LIST_DIR, LB_GETTEXT,
- i, (LPARAM)text );
- // remove the brackets on the text
- Int j, len = strlen( text );
- for( j = 0; j < len - 1; j++ )
- text[ j ] = text[ j + 1 ];
- text[ len - 2 ] = '\0';
- // ignore the ".." directory
- if( strcmp( text, ".." ) == 0 )
- continue;
- //
- // construct directory to add, make sure we have a '\' on the
- // end cause we assume that in the image file name code
- //
- sprintf( toAdd, "%s%s\\", buffer, text );
- // do not add directory if it's already in the listbox
- if( SendDlgItemMessage( TheImagePacker->getWindowHandle(),
- LIST_FOLDERS,
- LB_FINDSTRINGEXACT, -1, (LPARAM)toAdd ) != LB_ERR )
- {
- char message[ _MAX_PATH + 32 ];
- sprintf( message, "Ignoring folder '%s', already in list.", toAdd );
- MessageBox( NULL, message, "Folder Already In List",
- MB_OK | MB_ICONINFORMATION );
- continue;
- } // end if
- // add path to the listbox
- SendDlgItemMessage( TheImagePacker->getWindowHandle(),
- LIST_FOLDERS,
- LB_INSERTSTRING, -1, (LPARAM)toAdd );
- } // end if
- } // end if
- SetCurrentDirectory( startDir );
- EndDialog( hWndDialog, TRUE );
- break;
- } // end proceed
- // --------------------------------------------------------------------
- case BUTTON_CANCEL:
- {
- SetCurrentDirectory( startDir );
- EndDialog( hWndDialog, FALSE );
- break;
- } // end cancel
- // --------------------------------------------------------------------
- case COMBO_DRIVE:
- {
- if( notifyCode == CBN_SELCHANGE )
- {
- Int selected;
- // get selected index
- selected = SendDlgItemMessage( hWndDialog, COMBO_DRIVE,
- CB_GETCURSEL, 0, 0 );
- if( selected != CB_ERR )
- {
- char string[ 32 ];
- SendDlgItemMessage( hWndDialog, COMBO_DRIVE,
- CB_GETLBTEXT, selected, (LPARAM)string );
- //
- // construct a drive letter and colon from the combo
- // box strign [-x-]
- //
- string[ 0 ] = string[ 2 ]; // the drive letter in the form of "[-x-]"
- string[ 1 ] = ':';
- string[ 2 ] = '\0';
- // switch to that drive
- SetCurrentDirectory( string );
- // construct new direcotry name and update status text
- GetCurrentDirectory( _MAX_PATH, buffer );
- if( buffer[ strlen( buffer ) - 1 ] != '\\' )
- strcat( buffer, "\\" );
- SetDlgItemText( hWndDialog, STATIC_CURRENT_DIR, buffer );
- EnableWindow( GetDlgItem( hWndDialog, BUTTON_ADD ), FALSE );
- // reset the content of the listbox and reload
- SendDlgItemMessage( hWndDialog, LIST_DIR,
- LB_RESETCONTENT, 0, 0 );
- SendDlgItemMessage( hWndDialog, LIST_DIR,
- LB_DIR,
- DDL_DIRECTORY | DDL_EXCLUSIVE,
- (LPARAM)"*.*" );
- } // end if
- } // end if
- break;
- } // end drive
- // --------------------------------------------------------------------
- case LIST_DIR:
- {
- if( notifyCode == LBN_SELCHANGE )
- {
- Int selCount;
- Bool enable;
- // get selected count
- selCount = SendDlgItemMessage( hWndDialog, LIST_DIR,
- LB_GETSELCOUNT, 0, 0 );
-
- // if we have selected items, enable the add button
- if( selCount > 0 )
- {
- //
- // if the selected item is only the ".." directory we won't
- // enable it, we know that _IF_ ".." is present it is at the
- // top zero index position
- //
- enable = TRUE;
- Int index = 0;
- if( selCount == 1 &&
- SendDlgItemMessage( hWndDialog, LIST_DIR,
- LB_GETSEL, index, 0 ) > 0 )
- {
- char text[ _MAX_PATH ];
- SendDlgItemMessage( hWndDialog, LIST_DIR, LB_GETTEXT,
- index, (LPARAM)text );
- if( strcmp( text, "[..]" ) == 0 )
- enable = FALSE;
- } // end if
- } // end if
- else
- enable = FALSE;
- // do the enable
- EnableWindow( GetDlgItem( hWndDialog, BUTTON_ADD ), enable );
- } // end if
- if( notifyCode == LBN_DBLCLK )
- {
- Int selected;
- char text[ _MAX_PATH ];
-
- // get currently selected item
- selected = SendDlgItemMessage( hWndDialog, LIST_DIR,
- LB_GETCURSEL, 0, 0 );
- // get text of selected item
- SendDlgItemMessage( hWndDialog, LIST_DIR, LB_GETTEXT,
- selected, (LPARAM)text );
- // strip the backets off the directory listing
- Int len = strlen( text );
- for( Int i = 0; i < len - 1; i++ )
- text[ i ] = text[ i + 1 ];
- text[ len - 2 ] = '\0';
- // go into that directory
- SetCurrentDirectory( text );
- // construct new direcotry name and update status text
- GetCurrentDirectory( _MAX_PATH, buffer );
- if( buffer[ strlen( buffer ) - 1 ] != '\\' )
- strcat( buffer, "\\" );
- SetDlgItemText( hWndDialog, STATIC_CURRENT_DIR, buffer );
- EnableWindow( GetDlgItem( hWndDialog, BUTTON_ADD ), FALSE );
- // reset the content of the listbox and reload
- SendDlgItemMessage( hWndDialog, LIST_DIR,
- LB_RESETCONTENT, 0, 0 );
- SendDlgItemMessage( hWndDialog, LIST_DIR,
- LB_DIR,
- DDL_DIRECTORY | DDL_EXCLUSIVE,
- (LPARAM)"*.*" );
-
- } // end if
- break;
- } // end list command
- } // end switch
- break;
- } // end command
- } // end switch message
- return 0;
- } // end DirectorySelectProc
|