/*
** 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 .
*/
////////////////////////////////////////////////////////////////////////////////
// //
// (c) 2001-2003 Electronic Arts Inc. //
// //
////////////////////////////////////////////////////////////////////////////////
// FILE: GUIEdit.cpp //////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
//
// Westwood Studios Pacific.
//
// Confidential Information
// Copyright (C) 2001 - All Rights Reserved
//
//-----------------------------------------------------------------------------
//
// Project: RTS3
//
// File name: GUIEdit.cpp
//
// Created: Colin Day, July 2001
//
// Desc: GUI Edit and window layout entry point
//
//-----------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////
// SYSTEM INCLUDES ////////////////////////////////////////////////////////////
#include
#include
#include
// USER INCLUDES //////////////////////////////////////////////////////////////
#include "Common/Debug.h"
#include "Common/NameKeyGenerator.h"
#include "Common/GameEngine.h"
#include "Common/GlobalData.h"
#include "GameClient/GlobalLanguage.h"
#include "Common/PlayerList.h"
#include "GameLogic/RankInfo.h"
#include "Common/FileSystem.h"
#include "Common/LocalFileSystem.h"
#include "Common/ArchiveFileSystem.h"
#include "GameClient/GadgetTextEntry.h"
#include "GameClient/GadgetPushButton.h"
#include "GameClient/GadgetProgressBar.h"
#include "GameClient/GadgetRadioButton.h"
#include "GameClient/GadgetStaticText.h"
#include "GameClient/GadgetListBox.h"
#include "GameClient/GadgetComboBox.h"
#include "GameClient/GadgetSlider.h"
#include "GameClient/GadgetCheckBox.h"
#include "GameClient/GameText.h"
#include "GameClient/GadgetTabControl.h"
#include "GameClient/IMEManager.h"
#include "GameClient/InGameUI.h"
#include "GameClient/WindowXlat.h"
#include "GameClient/HeaderTemplate.h"
#include "W3DDevice/Common/W3DFunctionLexicon.h"
#include "W3DDevice/GameClient/W3DGameWindowManager.h"
#include "W3DDevice/GameClient/W3DDisplay.h"
#include "W3DDevice/GameClient/W3DGameWindowManager.h"
#include "W3DDevice/GameClient/W3DGameFont.h"
#include "W3DDevice/GameClient/W3DDisplayStringManager.h"
#include "GameClient/Keyboard.h"
#include "Win32Device/GameClient/Win32Mouse.h"
#include "Win32Device/GameClient/Win32DIKeyboard.h"
#include "Win32Device/Common/Win32LocalFileSystem.h"
#include "Win32Device/Common/Win32BIGFileSystem.h"
#include "Resource.h"
#include "WinMain.h"
#include "GUIEdit.h"
#include "HierarchyView.h"
#include "EditWindow.h"
#include "GUIEditWindowManager.h"
#include "GUIEditDisplay.H"
#include "DialogProc.h"
#include "LayoutScheme.h"
///////////////////////////////////////////////////////////////////////////////
// DEFINES ////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#define GUIEDIT_CONFIG_VERSION 4
// PRIVATE TYPES //////////////////////////////////////////////////////////////
// PRIVATE DATA ///////////////////////////////////////////////////////////////
// PUBLIC DATA ////////////////////////////////////////////////////////////////
GUIEdit *TheEditor = NULL;
// PRIVATE PROTOTYPES /////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// PRIVATE FUNCTIONS //////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// GUIEdit::saveAsDialog ======================================================
/** Bring up the standard windows browser save as dialog and return
* filename selected */
//=============================================================================
char *GUIEdit::saveAsDialog( void )
{
static char filename[ _MAX_PATH ];
OPENFILENAME ofn;
Bool returnCode;
char filter[] = "Window Files (*.wnd)\0*.wnd\0" \
"All Files (*.*)\0*.*\0\0" ;
ofn.lStructSize = sizeof( OPENFILENAME );
ofn.hwndOwner = m_appHWnd;
ofn.hInstance = NULL;
ofn.lpstrFilter = filter;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = filename;
ofn.nMaxFile = _MAX_PATH;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = OFN_NOREADONLYRETURN | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = "wnd";
ofn.lCustData = 0L ;
ofn.lpfnHook = NULL ;
ofn.lpTemplateName = NULL ;
returnCode = GetSaveFileName( &ofn );
if( returnCode )
return filename;
else
return NULL;
} // end saveAsDialog
// GUIEdit::openDialog ========================================================
/** Bring up the standard windows browser open dialog and return
* filename selected */
//=============================================================================
char *GUIEdit::openDialog( void )
{
static char filename[ _MAX_PATH ];
OPENFILENAME ofn;
Bool returnCode;
char filter[] = "Window Files (*.wnd)\0*.wnd\0" \
"All Files (*.*)\0*.*\0\0" ;
ofn.lStructSize = sizeof( OPENFILENAME );
ofn.hwndOwner = m_appHWnd;
ofn.hInstance = NULL;
ofn.lpstrFilter = filter;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = filename;
ofn.nMaxFile = _MAX_PATH;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = OFN_NOREADONLYRETURN | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = "wnd";
ofn.lCustData = 0L ;
ofn.lpfnHook = NULL ;
ofn.lpTemplateName = NULL ;
returnCode = GetOpenFileName( &ofn );
if( returnCode )
return filename;
else
return NULL;
} // end openDialog
// GUIEdit::setUnsaved ========================================================
/** Set the current contents of the editor as either saved or unsaved,
* when we're entering an unsaved state we will put a marker in the title
* bar of the app, when leaving an unsaved state we will remove
* that marker */
//=============================================================================
void GUIEdit::setUnsaved( Bool unsaved )
{
// char *saveStatus = " *";
char *unsavedFilename = "New File";
char *filename;
// which filename to use in title bar
if( strlen( m_saveFilename ) == 0 )
filename = unsavedFilename;
else
filename = m_saveFilename;
// if( m_unsaved == FALSE && unsaved == TRUE )
if( unsaved == TRUE )
{
char title[ 256 ];
// entering unsaved state, place '*' in title bar
sprintf( title, "GUIEdit: %s *", filename );
SetWindowText( m_appHWnd, title );
} // end if
//else if( m_unsaved == TRUE && unsaved == FALSE )
else
{
char title[ 256 ];
// leaving unsaved state, place '*' in title bar
sprintf( title, "GUIEdit: %s", filename );
SetWindowText( m_appHWnd, title );
} // end else
// save the new state we're in
m_unsaved = unsaved;
} // end setUnsaved
// GUIEdit::setSaveFile =======================================================
/** Set our member variables for the full path and filename passed in
* to this method. We will also extract the filename only from the
* full path and save that separately */
//=============================================================================
void GUIEdit::setSaveFile( char *fullPathAndFilename )
{
char *ptr;
// copy over the full path and filename
strcpy( m_savePathAndFilename, fullPathAndFilename );
//
// copy everything after the last '\' from the full path, this will
// be just the filename with extension
//
ptr = strrchr( fullPathAndFilename, '\\' ) + 1;
strcpy( m_saveFilename, ptr );
} // end setSaveFile
// GUIEdit::validateParentForCreate ===========================================
/** This method is used when creating new windows and gadgets, if a
* parent is present, that parent cannot be a GUI gadget because those
* gadgets are atomic units, they can not contain user defined children */
//=============================================================================
Bool GUIEdit::validateParentForCreate( GameWindow *parent )
{
//
// if there is a parent, that parent cannot be a gadget control,
// gadgets are units themselves and should have no user defined
// children
//
if( parent && TheEditor->windowIsGadget( parent ) )
{
MessageBox( TheEditor->getWindowHandle(),
"You cannot make a new window as a child to a GUI Gadget Control",
"Illegal Parent", MB_OK );
return FALSE;
} // end if
return TRUE; // ok
} // end validateParentForCreate
// GUIEdit::findSelectionEntry ================================================
/** Find selection entry for this window */
//=============================================================================
WindowSelectionEntry *GUIEdit::findSelectionEntry( GameWindow *window )
{
WindowSelectionEntry *entry;
// sanity
if( window == NULL )
return NULL;
// search the list
entry = m_selectList;
while( entry )
{
if( entry->window == window )
return entry;
// next entry
entry = entry->next;
} // end while
return NULL; // not found
} // end findSelectionEntry
// GUIEdit::normalizeRegion ===================================================
/** Normalize the region so that lo and hi are actually lo and hi */
//=============================================================================
void GUIEdit::normalizeRegion( IRegion2D *region )
{
ICoord2D temp;
if( region->hi.x < region->lo.x )
{
if( region->hi.y < region->lo.y )
{
temp = region->hi;
region->hi = region->lo;
region->lo = temp;
} // end if
else
{
temp = region->hi;
region->hi.x = region->lo.x;
region->lo.x = temp.x;
} // end else
} // end if
else if( region->hi.y < region->lo.y )
{
temp = region->hi;
region->hi.y = region->lo.y;
region->lo.y = temp.y;
} // end if
} // end normalizeRegion
// GUIEdit::selectWindowsInRegion =============================================
/** Select all the windows that are fully in the region */
//=============================================================================
void GUIEdit::selectWindowsInRegion( IRegion2D *region )
{
GameWindow *window;
ICoord2D origin, size;
// sanity
if( region == NULL )
return;
// unselect everything selected
clearSelections();
// normalize the region if needed
normalizeRegion( region );
// get the window list
window = TheWindowManager->winGetWindowList();
while( window )
{
// get the screen position and size of window
window->winGetScreenPosition( &origin.x, &origin.y );
window->winGetSize( &size.x, &size.y );
// compare window extents to selection region
if( origin.x >= region->lo.x &&
origin.y >= region->lo.y &&
origin.x + size.x <= region->hi.x &&
origin.y + size.y <= region->hi.y )
{
// add to selection list
selectWindow( window );
} // end if
// go to next window
window = window->winGetNext();
} // end while
} // end selectWindowsInRegion
///////////////////////////////////////////////////////////////////////////////
// PUBLIC FUNCTIONS ///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// GUIEdit::GUIEdit ===========================================================
/** */
//=============================================================================
GUIEdit::GUIEdit( void )
{
m_appInst = 0;
m_appHWnd = NULL;
m_statusBarHWnd = NULL;
m_toolbarHWnd = NULL;
m_unsaved = FALSE;
m_mode = MODE_UNDEFINED;
strcpy( m_savePathAndFilename, "" );
strcpy( m_saveFilename, "" );
m_selectList = NULL;
m_propertyTarget = NULL;
m_gridVisible = TRUE;
m_snapToGrid = TRUE;
m_gridResolution = 8;
m_gridColor.red = 112;
m_gridColor.green = 112;
m_gridColor.blue = 112;
m_gridColor.alpha = 64;
m_showHiddenOutlines = TRUE;
m_showSeeThruOutlines = TRUE;
m_layoutInitString = GUIEDIT_NONE_STRING;
m_layoutUpdateString = GUIEDIT_NONE_STRING;
m_layoutShutdownString = GUIEDIT_NONE_STRING;
} // end GUIEdit
// GUIEdit::~GUIEdit ==========================================================
/** */
//=============================================================================
GUIEdit::~GUIEdit( void )
{
if (TheHeaderTemplateManager)
{
delete TheHeaderTemplateManager;
TheHeaderTemplateManager = NULL;
}
if (TheGameText)
{
delete TheGameText;
TheGameText = NULL;
}
// delete the IME Manager
// if ( TheIMEManager )
// {
// delete TheIMEManager;
// TheIMEManager = NULL;
// }
// all the shutdown routine
shutdown();
} // end ~GUIEdit
// GUIEdit::init ==============================================================
/** Initialize all the GUI edit data */
//=============================================================================
void GUIEdit::init( void )
{
//
// save the couple of globals for our app main window as locals for
// convenient access
//
m_appInst = ApplicationHInstance;
m_appHWnd = ApplicationHWnd;
// add status bar to the bottom
createStatusBar();
// create the name key generator
TheNameKeyGenerator = new NameKeyGenerator;
TheNameKeyGenerator->init();
// create file system
TheFileSystem = new FileSystem;
TheLocalFileSystem = new Win32LocalFileSystem;
TheArchiveFileSystem = new Win32BIGFileSystem;
TheFileSystem->init();
TheGlobalLanguageData = new GlobalLanguage;
TheGlobalLanguageData->init();
//---------------------------------------------------------------------------
// GUI tool specific initializations ----------------------------------------
//---------------------------------------------------------------------------
//
// create the window for the rendered GUI interaction, the GUIEdit
// program MUST run in the same resolution that the window files are
// created in, we have chosen 800x600 for all our GUI creation (CDay)
//
TheEditWindow = new EditWindow;
// TheEditWindow->init( 640, 480 );
TheEditWindow->init( 800, 600 );
// TheEditWindow->init( 1024, 768 );
// create hierarchy view
TheHierarchyView = new HierarchyView;
TheHierarchyView->init();
//---------------------------------------------------------------------------
// Game engine specific initializations -------------------------------------
//---------------------------------------------------------------------------
// create the name key generator
TheWritableGlobalData = new GlobalData;
TheWritableGlobalData->init();
// create the message stream
TheMessageStream = new MessageStream;
TheMessageStream->init();
TheMessageStream->attachTranslator( new WindowTranslator, 10 );
// create the command list
TheCommandList = new CommandList;
// create the function lexicon
TheFunctionLexicon = new W3DFunctionLexicon;
TheFunctionLexicon->init();
TheFunctionLexicon->validate();
// create the font library
TheFontLibrary = new W3DFontLibrary;
TheFontLibrary->init();
// load the set of GUIEdit default fonts for controls
loadGUIEditFontLibrary( TheFontLibrary );
// create GUI image collection
TheMappedImageCollection = new ImageCollection;
TheMappedImageCollection->init();
TheMappedImageCollection->load( 512 );
// create display string manager
TheDisplayStringManager = new W3DDisplayStringManager;
TheDisplayStringManager->init();
// create the window manager
TheWindowManager = new GUIEditWindowManager;
TheWindowManager->init();
TheRankInfoStore = new RankInfoStore;
TheRankInfoStore->init();
ThePlayerList = new PlayerList;
ThePlayerList->init();
TheKeyboard = new DirectInputKeyboard;
//
// in order to easily expose the new methods for our own internal editor
// use we will keep a pointer to what we KNOW to be a gui edit window man.
//
TheGUIEditWindowManager = static_cast(TheWindowManager);
// create the display
TheDisplay = new GUIEditDisplay;
TheDisplay->init();
ICoord2D size;
TheEditWindow->getSize( &size );
TheDisplay->setWidth( size.x );
TheDisplay->setHeight( size.y );
// set our initial mode
setMode( MODE_EDIT );
// create the default scheme, this must be done after image collections are loaded
TheDefaultScheme = new LayoutScheme;
TheDefaultScheme->init();
// read our configuration file
readConfigFile( GUIEDIT_CONFIG_FILENAME );
// read the available font definitions
readFontFile( GUIEDIT_FONT_FILENAME );
// create the mouse
TheWin32Mouse = new Win32Mouse;
TheMouse = TheWin32Mouse;
TheMouse->init();
// lastly just for testing
TheWindowManager->initTestGUI();
// load the layout scheme now read in from the cofig file
TheDefaultScheme->loadScheme( TheDefaultScheme->getSchemeFilename() );
// create the localized game text interface
TheGameText = CreateGameTextInterface();
if ( TheGameText )
{
TheGameText->init();
}
TheHeaderTemplateManager = new HeaderTemplateManager;
if(TheHeaderTemplateManager)
TheHeaderTemplateManager->init();
// create the IME manager
// TheIMEManager = CreateIMEManagerInterface();
// if ( TheIMEManager )
// {
// TheIMEManager->init();
// }
} // end init
// GUIEdit::shutdown ==========================================================
/** Shutdown our GUI edit application */
//=============================================================================
void GUIEdit::shutdown( void )
{
// write our configuration file
writeConfigFile( GUIEDIT_CONFIG_FILENAME );
// write our loaded fonts into the font file if we can
writeFontFile( GUIEDIT_FONT_FILENAME );
// delete all the selection entries
clearSelections();
// delete the display
delete TheDisplay;
TheDisplay = NULL;
// delete all windows properly in the editor
deleteAllWindows();
// delete the mouse
delete TheMouse;
TheMouse = NULL;
TheWin32Mouse = NULL;
delete ThePlayerList;
ThePlayerList = NULL;
delete TheRankInfoStore;
TheRankInfoStore = NULL;
// delete the window manager
delete TheWindowManager;
TheWindowManager = NULL;
TheGUIEditWindowManager = NULL;
// delete display string manager
delete TheDisplayStringManager;
TheDisplayStringManager = NULL;
// delete image collection
delete TheMappedImageCollection;
TheMappedImageCollection = NULL;
// delete the font library
delete TheFontLibrary;
TheFontLibrary = NULL;
delete TheCommandList;
TheCommandList = NULL;
delete TheMessageStream;
TheMessageStream = NULL;
// delete the function lexicon
delete TheFunctionLexicon;
TheFunctionLexicon = NULL;
// delete name key generator
delete TheNameKeyGenerator;
TheNameKeyGenerator = NULL;
delete TheGlobalLanguageData;
TheGlobalLanguageData = NULL;
// delete file system
delete TheFileSystem;
TheFileSystem = NULL;
delete TheLocalFileSystem;
TheLocalFileSystem = NULL;
delete TheArchiveFileSystem;
TheArchiveFileSystem = NULL;
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// delete the hierarchy view
delete TheHierarchyView;
TheHierarchyView = NULL;
// destroy the edit window
delete TheEditWindow;
TheEditWindow = NULL;
delete TheKeyboard;
TheKeyboard = NULL;
} // end shutdown
// GUIEdit::update ============================================================
/** Update method for our GUI edit application */
//=============================================================================
void GUIEdit::update( void )
{
// update mouse info
TheMouse->update();
// process the mouse if we're in test mode
if( TheEditor->getMode() == MODE_TEST_RUN )
{
// send input through the window system and clear all messages after
TheMouse->createStreamMessages();
TheMessageStream->propagateMessages();
TheCommandList->reset();
} // end if
// update the window manager itself
TheWindowManager->update();
// draw the edit window
TheEditWindow->draw();
} // end update
// GUIEdit::writeConfigFile ===================================================
/** Write the guiedit config file */
//=============================================================================
Bool GUIEdit::writeConfigFile( char *filename )
{
FILE *fp;
// open the file
fp = fopen( filename, "w" );
if( fp == NULL )
{
DEBUG_LOG(( "writeConfigFile: Unable to open file '%s'\n", filename ));
assert( 0 );
return FALSE;
} // end if
// version
fprintf( fp, "GUIEdit Config file version '%d'\n", GUIEDIT_CONFIG_VERSION );
// edit window background color
RGBColorReal backColor = TheEditWindow->getBackgroundColor();
fprintf( fp, "BACKGROUNDCOLOR = %f %f %f %f\n",
backColor.red, backColor.green, backColor.blue, backColor.alpha );
// grid settings
fprintf( fp, "GRIDRESOLUTION = %d\n", TheEditor->getGridResolution() );
RGBColorInt *gridColor = TheEditor->getGridColor();
fprintf( fp, "GRIDCOLOR = %d %d %d %d\n",
gridColor->red, gridColor->green, gridColor->blue, gridColor->alpha );
fprintf( fp, "SNAPTOGRID = %d\n", TheEditor->isGridSnapOn() );
fprintf( fp, "GRIDVISIBLE = %d\n", TheEditor->isGridVisible() );
// write hierarchy position and size
ICoord2D pos, size;
TheHierarchyView->getDialogPos( &pos );
TheHierarchyView->getDialogSize( &size );
fprintf( fp, "HIERARCHYPOSITION = %d %d\n", pos.x, pos.y );
fprintf( fp, "HIERARCHYSIZE = %d %d\n", size.x, size.y );
// hidden and see thru options
fprintf( fp, "SHOWSEETHRUOUTLINES = %d\n", getShowSeeThruOutlines() );
fprintf( fp, "SHOWHIDDENOUTLINES = %d\n", getShowHiddenOutlines() );
// scheme file
fprintf( fp, "SCHEMEFILE = %s\n", TheDefaultScheme->getSchemeFilename() );
// close the file
fclose( fp );
return TRUE;
} // end writeConfigFile
// GUIEdit::readConfigFile ====================================================
/** Read the guiedit config file */
//=============================================================================
Bool GUIEdit::readConfigFile( char *filename )
{
FILE *fp;
// open the file
fp = fopen( filename, "r" );
if( fp == NULL )
return TRUE;
// version
Int version;
fscanf( fp, "GUIEdit Config file version '%d'\n", &version );
if( version != GUIEDIT_CONFIG_VERSION )
return FALSE; // version has changed, use defaults again
// edit window background color
RGBColorReal backColor;
fscanf( fp, "BACKGROUNDCOLOR = %f %f %f %f\n",
&backColor.red, &backColor.green, &backColor.blue, &backColor.alpha );
TheEditWindow->setBackgroundColor( backColor );
// grid settings
Int intData;
fscanf( fp, "GRIDRESOLUTION = %d\n", &intData );
TheEditor->setGridResolution( intData );
RGBColorInt gridColor;
fscanf( fp, "GRIDCOLOR = %d %d %d %d\n",
&gridColor.red, &gridColor.green, &gridColor.blue, &gridColor.alpha );
TheEditor->setGridColor( &gridColor );
fscanf( fp, "SNAPTOGRID = %d\n", &intData );
TheEditor->setGridSnap( intData );
fscanf( fp, "GRIDVISIBLE = %d\n", &intData );
TheEditor->setGridVisible( intData );
// hierarchy view
ICoord2D pos, size;
fscanf( fp, "HIERARCHYPOSITION = %d %d\n", &pos.x, &pos.y );
fscanf( fp, "HIERARCHYSIZE = %d %d\n", &size.x, &size.y );
TheHierarchyView->setDialogPos( &pos );
TheHierarchyView->setDialogSize( &size );
// hidden and see thru options
Int show;
fscanf( fp, "SHOWSEETHRUOUTLINES = %d\n", &show );
setShowSeeThruOutlines( show );
fscanf( fp, "SHOWHIDDENOUTLINES = %d\n", &show );
setShowHiddenOutlines( show );
// scheme file
char file[ _MAX_PATH ];
if (fscanf( fp, "SCHEMEFILE = %s\n", file ) == 1)
{
TheDefaultScheme->setSchemeFilename( file );
}
// close the file
fclose( fp );
return TRUE;
} // end readConfigFile
// GUIEdit::readFontFile ======================================================
/** Read the font file defintitions and load them */
//=============================================================================
void GUIEdit::readFontFile( char *filename )
{
FILE *fp;
// sanity
if( filename == NULL )
return;
// open the file
fp = fopen( filename, "r" );
if( fp == NULL )
return;
// read how many entries follow
Int fontCount;
fscanf( fp, "AVAILABLE_FONT_COUNT = %d\n", &fontCount );
for( Int i = 0; i < fontCount; i++ )
{
// read all the font defitions
char fontBuffer[ 512 ];
Int size, bold;
char c = fgetc( fp );
// skip past the first quote
while( c != '\"' )
c = fgetc( fp );
c = fgetc( fp ); // the quote itself
// copy the name till the next quote is read
Int index = 0;
while( c != '\"' )
{
fontBuffer[ index++ ] = c;
c = fgetc( fp );
} // end while
fontBuffer[ index ] = '\0';
c = fgetc( fp ); // the end quite itself
// read the size and bold data elements
fscanf( fp, " Size: %d Bold: %d\n", &size, &bold );
// set the font
GameFont *font = TheFontLibrary->getFont( AsciiString(fontBuffer), size, bold );
if( font == NULL )
{
char buffer[ 1024 ];
sprintf( buffer, "Warning: The font '%s' Size: '%d' Bold: '%d', specified in the config file could not be loaded. Does that font exist?",
fontBuffer, size, bold );
MessageBox( m_appHWnd, buffer, "Cannot Load Font", MB_OK );
} // end if
} // end for i
// close the file
fclose( fp );
} // end readFontFile
// GUIEdit::writeFontFile =====================================================
/** If we can, write a file containing a definition of all the fonts
* we have loaded */
//=============================================================================
void GUIEdit::writeFontFile( char *filename )
{
FILE *fp;
// sanity
if( filename == NULL )
return;
// open the file
fp = fopen( filename, "w" );
if( fp == NULL )
return; // dont bother making an error, it's likely to be read only a lot
// available fonts
Int count = TheFontLibrary->getCount();
fprintf( fp, "AVAILABLE_FONT_COUNT = %d\n", count );
GameFont *font;
for( font = TheFontLibrary->firstFont();
font;
font = TheFontLibrary->nextFont( font ) )
{
fprintf( fp, "AVAILABLEFONT = \"%s\" Size: %d Bold: %d\n",
font->nameString.str(), font->pointSize, font->bold );
} // end for
// close the file
fclose( fp );
} // end writeFontFile
// GUIEdit::setMode ===========================================================
/** Set a new mode for the editor */
//=============================================================================
void GUIEdit::setMode( EditMode mode )
{
static TranslatorID transID = 0;
// if same mode do nothing
if( m_mode == mode )
return;
// if leaving test mode, remove the translator for test input
if( m_mode == MODE_TEST_RUN )
{
TheMessageStream->removeTranslator( transID );
transID = 0;
} // end if
// assign new mode
m_mode = mode;
// uncheck menu item for test mode by default
unCheckMenuItem( MENU_TEST_MODE );
// update status message
switch( m_mode )
{
// ------------------------------------------------------------------------
case MODE_TEST_RUN:
statusMessage( STATUS_MODE, "Mode: Test Run" );
// check menu item for test mode
checkMenuItem( MENU_TEST_MODE );
// attach window translator to stream for testing
transID = TheMessageStream->attachTranslator( new WindowTranslator, 10 );
break;
// ------------------------------------------------------------------------
case MODE_EDIT:
setCursor( CURSOR_NORMAL );
statusMessage( STATUS_MODE, "Ready" );
break;
// ------------------------------------------------------------------------
case MODE_DRAG_MOVE:
setCursor( CURSOR_MOVE );
statusMessage( STATUS_MODE, "Drag window with mouse" );
break;
// ------------------------------------------------------------------------
case MODE_KEYBOARD_MOVE:
//setCursor( CURSOR_MOVE );
statusMessage( STATUS_MODE, "Hit enter to accept or Esc to cancel" );
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_TOP_LEFT:
setCursor( CURSOR_SIZE_NWSE );
statusMessage( STATUS_MODE, "Drag top left corner to resize" );
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_TOP_RIGHT:
setCursor( CURSOR_SIZE_NESW );
statusMessage( STATUS_MODE, "Drag top right corner to resize" );
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_BOTTOM_RIGHT:
setCursor( CURSOR_SIZE_NWSE );
statusMessage( STATUS_MODE, "Drag bottom right corner to resize" );
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_BOTTOM_LEFT:
setCursor( CURSOR_SIZE_NESW );
statusMessage( STATUS_MODE, "Drag bottom left corner to resize" );
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_TOP:
setCursor( CURSOR_SIZE_NS );
statusMessage( STATUS_MODE, "Drag top to resize" );
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_BOTTOM:
setCursor( CURSOR_SIZE_NS );
statusMessage( STATUS_MODE, "Drag bottom to resize" );
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_LEFT:
setCursor( CURSOR_SIZE_WE );
statusMessage( STATUS_MODE, "Drag left to resize" );
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_RIGHT:
setCursor( CURSOR_SIZE_WE );
statusMessage( STATUS_MODE, "Drag right to resize" );
break;
} // end switch
} // end setMode
// GUIEdit::setCursor =========================================================
/** Set the cursor to the specified type */
//=============================================================================
void GUIEdit::setCursor( CursorType type )
{
char *identifier;
switch( type )
{
// ------------------------------------------------------------------------
case CURSOR_NORMAL:
identifier = IDC_ARROW;
break;
// ------------------------------------------------------------------------
case CURSOR_MOVE:
identifier = IDC_SIZEALL;
break;
// ------------------------------------------------------------------------
case CURSOR_SIZE_NESW:
identifier = IDC_SIZENESW;
break;
// ------------------------------------------------------------------------
case CURSOR_SIZE_NS:
identifier = IDC_SIZENS;
break;
// ------------------------------------------------------------------------
case CURSOR_SIZE_NWSE:
identifier = IDC_SIZENWSE;
break;
// ------------------------------------------------------------------------
case CURSOR_SIZE_WE:
identifier = IDC_SIZEWE;
break;
// ------------------------------------------------------------------------
case CURSOR_WAIT:
identifier = IDC_WAIT;
break;
} // end switchType
// set the new cursor
SetCursor( LoadCursor( NULL, identifier ) );
} // end setCursor
// pointInChild ===============================================================
/** Given a mouse position, get the topmost window at that location. We needed
to pull this out into it's own special case function since the standard
winPointInAnyChild is used by the game and we needed a special case to
select a disabled control in GUIEdit */
//=============================================================================
static GameWindow *pointInChild( Int x, Int y , GameWindow *win)
{
GameWindow *parent;
GameWindow *child;
ICoord2D origin;
IRegion2D tempRegion;
Int tempX, tempY;
for( child = win->winGetChild(); child; child = child->winGetNext() )
{
child->winGetRegion(&tempRegion);
origin = tempRegion.lo;
parent = child->winGetParent();
while( parent )
{
parent->winGetRegion(&tempRegion);
origin.x += tempRegion.lo.x;
origin.y += tempRegion.lo.y;
parent = parent->winGetParent();
} // end while
child->winGetSize(&tempX,&tempY);
if( x >= origin.x && x <= origin.x + tempX &&
y >= origin.y && y <= origin.y + tempY &&
BitTest( child->winGetStatus(), WIN_STATUS_HIDDEN ) == FALSE)
return child->winPointInChild( x, y );
} // end for child
// not in any children, must be in parent
return win;
} // end pointInChild
// pointInAnyChild ============================================================
/** Given a mouse position, get the topmost window at that location. We needed
to pull this out into it's own special case function since the standard
winPointInAnyChild is used by the game and we needed a special case to
select a disabled control in GUIEdit */
//=============================================================================
static GameWindow *pointInAnyChild( Int x, Int y, Bool ignoreHidden, GameWindow *win )
{
GameWindow *parent;
GameWindow *child;
ICoord2D origin;
IRegion2D tempRegion;
Int tempX, tempY;
for( child = win->winGetChild(); child; child = child->winGetNext() )
{
child->winGetRegion(&tempRegion);
origin = tempRegion.lo;
parent = child->winGetParent();
while( parent )
{
parent->winGetRegion(&tempRegion);
origin.x += tempRegion.lo.x;
origin.y += tempRegion.lo.y;
parent = parent->winGetParent();
} // end while
child->winGetSize(&tempX,&tempY);
if( x >= origin.x && x <= origin.x + tempX &&
y >= origin.y && y <= origin.y + tempY )
{
if( !(ignoreHidden == TRUE && BitTest( child->winGetStatus(), WIN_STATUS_HIDDEN )) )
return pointInChild( x, y , child);
} // end if
} // end for child
// not in any children, must be in parent
return win;
} // end pointInAnyChild
// GUIEdit::getWindowAtPos ====================================================
/** Given a mouse position, get the topmost window at that location */
//=============================================================================
GameWindow *GUIEdit::getWindowAtPos( Int x, Int y )
{
GameWindow *window;
GameWindow *pick = NULL;
IRegion2D region;
for( window = TheWindowManager->winGetWindowList();
window;
window = window->winGetNext() )
{
// get window region
window->winGetRegion( ®ion );
if( x >= region.lo.x && x <= region.hi.x &&
y >= region.lo.y && y <= region.hi.y )
{
pick = pointInAnyChild( x, y, FALSE, window );
break; // exit for
} // end if
} // end for
//
// gadget controls are just composed of generic windows and buttons,
// we will not allow you to select these componenets themselves in a gadget
// because the gadget is the atomic "unit" as far as GUI editing goes.
// If we've picked a gadget component we will instead just return the gadget
// itself
//
if( pick )
{
GameWindow *parent = pick->winGetParent();
//
// all gadget components are children of their parent, therefore they
// all have a parent
//
if( parent )
{
if( BitTest( parent->winGetStyle(), GWS_VERT_SLIDER |
GWS_HORZ_SLIDER |
GWS_SCROLL_LISTBOX |
GWS_COMBO_BOX |
GWS_TAB_CONTROL
)
)
{
// the parent is what we care about
pick = parent;
//
// the parent is the thing we want to return here, unless we clicked
// on the thumb of a scroll list box, that element is implemented as
// a slider, therefore in that situation only we want to return the
// parent of the slider
//
if( BitTest( parent->winGetStyle(), GWS_HORZ_SLIDER |
GWS_VERT_SLIDER ) )
{
GameWindow *grandParent = parent->winGetParent();
if( grandParent && BitTest( grandParent->winGetStyle(),
GWS_SCROLL_LISTBOX ) )
pick = grandParent;
} // end if
//must check to see of the parent of a scroll box is a combo box
if(BitTest(pick->winGetStyle(), GWS_SCROLL_LISTBOX))
{
GameWindow *grandParent = pick->winGetParent();
if( grandParent && BitTest( grandParent->winGetStyle(), GWS_COMBO_BOX))
pick = grandParent;
}
} // end if
} // end if
} // end if
return pick;
} // end getWindowAtPos
// GUIEdit::clipCreationParamsToParent ========================================
/** when creating child windows we don't want them to exist outside the
* parent so we use this to clip them to the the parent size and
* locations */
//=============================================================================
void GUIEdit::clipCreationParamsToParent( GameWindow *parent,
Int *x, Int *y,
Int *width, Int *height )
{
IRegion2D parentScreenRegion;
ICoord2D parentSize;
ICoord2D parentPos;
Int newX, newY,
newWidth, newHeight;
// sanity
if( parent == NULL ||
x == NULL || y == NULL ||
width == NULL || height == NULL )
return;
// get parent screen region and size
parent->winGetScreenPosition( &parentPos.x, &parentPos.y );
parent->winGetSize( &parentSize.x, &parentSize.y );
//
// compute the screen region, note this is NOT the same as the region
// that comes back from winGetRegion, those regions are relative to their
// parents
//
parentScreenRegion.lo.x = parentPos.x;
parentScreenRegion.lo.y = parentPos.y;
parentScreenRegion.hi.x = parentPos.x + parentSize.x;
parentScreenRegion.hi.y = parentPos.y + parentSize.y;
//
// the new window position is really the difference between where
// we clicked and the parent location
//
newX = *x - parentScreenRegion.lo.x;
newY = *y - parentScreenRegion.lo.y;
// new child windows must stay contained within their parent
newWidth = *width;
if( *x + *width > parentScreenRegion.hi.x )
newWidth = parentSize.x - newX;
newHeight = *height;
if( *y + *height > parentScreenRegion.hi.y )
newHeight = parentSize.y - newY;
*x = newX;
*y = newY;
*width = newWidth;
*height= newHeight;
} // end clipcreationParamsToParent
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// GUIEdit::deleteAllWindows ==================================================
/** Delete all windows in the editor */
//=============================================================================
void GUIEdit::deleteAllWindows( void )
{
GameWindow *window, *next;
window = TheWindowManager->winGetWindowList();
while( window )
{
next = window->winGetNext();
deleteWindow( window );
window = next;
} // end while
} // end deleteAllWindows
// GUIEdit::removeWindowCleanup ===============================================
/** This is called on each window before it is deleted or removed from
* the active windows in the editor to allow the system to
* cleanup before the delete */
//=============================================================================
void GUIEdit::removeWindowCleanup( GameWindow *window )
{
// end of recursion
if( window == NULL )
return;
//
// unselect the window if selected, this should be done first as further
// operations like deleting the tree entry change selections
//
unSelectWindow( window );
// remove this window from the hierarchy
TheHierarchyView->removeWindow( window );
// take this out of the property target if present
if( m_propertyTarget == window )
m_propertyTarget = NULL;
// notify the edit window this is going away
TheEditWindow->notifyWindowDeleted( window );
//
// any children of this window will be destroyed as well, do cleanup
// for them as well
//
GameWindow *child;
for( child = window->winGetChild(); child; child = child->winGetNext() )
removeWindowCleanup( child );
} // end removeWindowCleanup
// GUIEdit::deleteWindow ======================================================
/** Delete the window from the editor */
//=============================================================================
void GUIEdit::deleteWindow( GameWindow *window )
{
// have the editor cleanup all references to this window
removeWindowCleanup( window );
// destroy the game winodow
TheWindowManager->winDestroy( window );
// we've changed contents
setUnsaved( TRUE );
} // end deleteWindow
// GUIEdit::newWindow =========================================================
/** Create a new window of the specified type. This is the single creation
* point for all windows created in the editor */
//=============================================================================
GameWindow *GUIEdit::newWindow( UnsignedInt windowStyle,
GameWindow *parent,
Int x, Int y,
Int width, Int height )
{
GameWindow *window = NULL;
// create the appropriate window based on style bit passed in
switch( windowStyle )
{
// ------------------------------------------------------------------------
case GWS_USER_WINDOW:
window = newUserWindow( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
case GWS_PUSH_BUTTON:
window = newPushButton( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
case GWS_CHECK_BOX:
window = newCheckBox( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
case GWS_RADIO_BUTTON:
window = newRadioButton( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
case GWS_TAB_CONTROL:
window = newTabControl( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
case GWS_HORZ_SLIDER:
window = newHorizontalSlider( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
case GWS_VERT_SLIDER:
window = newVerticalSlider( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
case GWS_SCROLL_LISTBOX:
window = newListbox( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
case GWS_COMBO_BOX:
window = newComboBox( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
case GWS_PROGRESS_BAR:
window = newProgressBar( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
case GWS_ENTRY_FIELD:
window = newTextEntry( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
case GWS_STATIC_TEXT:
window = newStaticText( parent, x, y, width, height );
break;
// ------------------------------------------------------------------------
default:
MessageBox( m_appHWnd, "Unknown window type to newWindow()", "ERROR",
MB_OK | MB_ICONERROR );
break;
} // end switch
return window;
} // end newWindow
// GUIEdit::newUserWindow =====================================================
/** Create a new window at the given location */
//=============================================================================
GameWindow *GUIEdit::newUserWindow( GameWindow *parent, Int x, Int y,
Int width, Int height )
{
UnsignedInt status = WIN_STATUS_ENABLED;
GameWindow *window;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
//
// if there is a parent present we need to translate the screen x and y
// location to coords that are local to the parent window
//
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// create the new window
window = TheWindowManager->winCreate( parent, status,
x, y,
width, height,
NULL, NULL );
// a window created in the editor here is a user window
WinInstanceData *instData = window->winGetInstanceData();
BitSet( instData->m_style, GWS_USER_WINDOW );
// set default colors based on the default scheme
ImageAndColorInfo *info;
info = TheDefaultScheme->getImageAndColor( GENERIC_ENABLED );
window->winSetEnabledImage( 0, info->image );
window->winSetEnabledColor( 0, info->color );
window->winSetEnabledBorderColor( 0, info->borderColor );
info = TheDefaultScheme->getImageAndColor( GENERIC_DISABLED );
window->winSetDisabledImage( 0, info->image );
window->winSetDisabledColor( 0, info->color );
window->winSetDisabledBorderColor( 0, info->borderColor );
info = TheDefaultScheme->getImageAndColor( GENERIC_HILITE );
window->winSetHiliteImage( 0, info->image );
window->winSetHiliteColor( 0, info->color );
window->winSetHiliteBorderColor( 0, info->borderColor );
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newUserWindow
// GUIEdit::newPushButton =====================================================
/** Create a new push button */
//=============================================================================
GameWindow *GUIEdit::newPushButton( GameWindow *parent,
Int x, Int y, Int width, Int height )
{
GameWindow *window;
WinInstanceData instData;
UnsignedInt status = WIN_STATUS_ENABLED | WIN_STATUS_IMAGE;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
// keep the button inside a parent if present
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// initialize inst data
instData.init();
instData.m_style = GWS_PUSH_BUTTON | GWS_MOUSE_TRACK;
instData.m_textLabelString = "Button";
window = TheWindowManager->gogoGadgetPushButton( parent,
status,
x, y,
width, height,
&instData,
NULL,
TRUE );
// set default colors based on the default scheme
if( window )
{
ImageAndColorInfo *info;
info = TheDefaultScheme->getImageAndColor( BUTTON_ENABLED );
GadgetButtonSetEnabledImage( window, info->image );
GadgetButtonSetEnabledColor( window, info->color );
GadgetButtonSetEnabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( BUTTON_ENABLED_PUSHED );
GadgetButtonSetEnabledSelectedImage( window, info->image );
GadgetButtonSetEnabledSelectedColor( window, info->color );
GadgetButtonSetEnabledSelectedBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( BUTTON_DISABLED );
GadgetButtonSetDisabledImage( window, info->image );
GadgetButtonSetDisabledColor( window, info->color );
GadgetButtonSetDisabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( BUTTON_DISABLED_PUSHED );
GadgetButtonSetDisabledSelectedImage( window, info->image );
GadgetButtonSetDisabledSelectedColor( window, info->color );
GadgetButtonSetDisabledSelectedBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( BUTTON_HILITE );
GadgetButtonSetHiliteImage( window, info->image );
GadgetButtonSetHiliteColor( window, info->color );
GadgetButtonSetHiliteBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( BUTTON_HILITE_PUSHED );
GadgetButtonSetHiliteSelectedImage( window, info->image );
GadgetButtonSetHiliteSelectedColor( window, info->color );
GadgetButtonSetHiliteSelectedBorderColor( window, info->borderColor );
Color color, border;
color = TheDefaultScheme->getEnabledTextColor();
border = TheDefaultScheme->getEnabledTextBorderColor();
window->winSetEnabledTextColors( color, border );
color = TheDefaultScheme->getDisabledTextColor();
border = TheDefaultScheme->getDisabledTextBorderColor();
window->winSetDisabledTextColors( color, border );
color = TheDefaultScheme->getHiliteTextColor();
border = TheDefaultScheme->getHiliteTextBorderColor();
window->winSetHiliteTextColors( color, border );
// set default font
window->winSetFont( TheDefaultScheme->getFont() );
} // end if
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newPushButton
// GUIEdit::newCheckBox =======================================================
/** Create a new check box */
//=============================================================================
GameWindow *GUIEdit::newCheckBox( GameWindow *parent,
Int x, Int y, Int width, Int height )
{
GameWindow *window;
WinInstanceData instData;
UnsignedInt status = WIN_STATUS_ENABLED | WIN_STATUS_IMAGE;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
// keep inside a parent if present
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// initialize inst data
instData.init();
instData.m_style = GWS_CHECK_BOX | GWS_MOUSE_TRACK;
instData.m_textLabelString = "Check";
// create gadget
window = TheWindowManager->gogoGadgetCheckbox( parent,
status,
x, y,
width, height,
&instData,
NULL,
TRUE );
// set default colors based on the default scheme
if( window )
{
ImageAndColorInfo *info;
info = TheDefaultScheme->getImageAndColor( CHECK_BOX_ENABLED );
GadgetCheckBoxSetEnabledImage( window, info->image );
GadgetCheckBoxSetEnabledColor( window, info->color );
GadgetCheckBoxSetEnabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( CHECK_BOX_ENABLED_UNCHECKED_BOX );
GadgetCheckBoxSetEnabledUncheckedBoxImage( window, info->image );
GadgetCheckBoxSetEnabledUncheckedBoxColor( window, info->color );
GadgetCheckBoxSetEnabledUncheckedBoxBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( CHECK_BOX_ENABLED_CHECKED_BOX );
GadgetCheckBoxSetEnabledCheckedBoxImage( window, info->image );
GadgetCheckBoxSetEnabledCheckedBoxColor( window, info->color );
GadgetCheckBoxSetEnabledCheckedBoxBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( CHECK_BOX_DISABLED );
GadgetCheckBoxSetDisabledImage( window, info->image );
GadgetCheckBoxSetDisabledColor( window, info->color );
GadgetCheckBoxSetDisabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( CHECK_BOX_DISABLED_UNCHECKED_BOX );
GadgetCheckBoxSetDisabledUncheckedBoxImage( window, info->image );
GadgetCheckBoxSetDisabledUncheckedBoxColor( window, info->color );
GadgetCheckBoxSetDisabledUncheckedBoxBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( CHECK_BOX_DISABLED_CHECKED_BOX );
GadgetCheckBoxSetDisabledCheckedBoxImage( window, info->image );
GadgetCheckBoxSetDisabledCheckedBoxColor( window, info->color );
GadgetCheckBoxSetDisabledCheckedBoxBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( CHECK_BOX_HILITE );
GadgetCheckBoxSetHiliteImage( window, info->image );
GadgetCheckBoxSetHiliteColor( window, info->color );
GadgetCheckBoxSetHiliteBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( CHECK_BOX_HILITE_UNCHECKED_BOX );
GadgetCheckBoxSetHiliteUncheckedBoxImage( window, info->image );
GadgetCheckBoxSetHiliteUncheckedBoxColor( window, info->color );
GadgetCheckBoxSetHiliteUncheckedBoxBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( CHECK_BOX_HILITE_CHECKED_BOX );
GadgetCheckBoxSetHiliteCheckedBoxImage( window, info->image );
GadgetCheckBoxSetHiliteCheckedBoxColor( window, info->color );
GadgetCheckBoxSetHiliteCheckedBoxBorderColor( window, info->borderColor );
Color color, border;
color = TheDefaultScheme->getEnabledTextColor();
border = TheDefaultScheme->getEnabledTextBorderColor();
window->winSetEnabledTextColors( color, border );
color = TheDefaultScheme->getDisabledTextColor();
border = TheDefaultScheme->getDisabledTextBorderColor();
window->winSetDisabledTextColors( color, border );
color = TheDefaultScheme->getHiliteTextColor();
border = TheDefaultScheme->getHiliteTextBorderColor();
window->winSetHiliteTextColors( color, border );
// set default font
window->winSetFont( TheDefaultScheme->getFont() );
} // end if
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newCheckBox
// GUIEdit::newRadioButton ====================================================
/** Create a new radio button */
//=============================================================================
GameWindow *GUIEdit::newRadioButton( GameWindow *parent,
Int x, Int y, Int width, Int height )
{
RadioButtonData radioData;
GameWindow *window;
WinInstanceData instData;
UnsignedInt status = WIN_STATUS_ENABLED | WIN_STATUS_IMAGE;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
// keep inside a parent if present
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// initialize inst data
instData.init();
instData.m_style = GWS_RADIO_BUTTON | GWS_MOUSE_TRACK;
memset( &radioData, 0, sizeof( radioData ) );
instData.m_textLabelString = "Radio";
// create gadget
window = TheWindowManager->gogoGadgetRadioButton( parent,
status,
x, y,
width, height,
&instData,
&radioData,
NULL,
TRUE );
// set default colors based on the default scheme
if( window )
{
ImageAndColorInfo *info;
info = TheDefaultScheme->getImageAndColor( RADIO_ENABLED );
GadgetRadioSetEnabledImage( window, info->image );
GadgetRadioSetEnabledColor( window, info->color );
GadgetRadioSetEnabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( RADIO_ENABLED_UNCHECKED_BOX );
GadgetRadioSetEnabledUncheckedBoxImage( window, info->image );
GadgetRadioSetEnabledUncheckedBoxColor( window, info->color );
GadgetRadioSetEnabledUncheckedBoxBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( RADIO_ENABLED_CHECKED_BOX );
GadgetRadioSetEnabledCheckedBoxImage( window, info->image );
GadgetRadioSetEnabledCheckedBoxColor( window, info->color );
GadgetRadioSetEnabledCheckedBoxBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( RADIO_DISABLED );
GadgetRadioSetDisabledImage( window, info->image );
GadgetRadioSetDisabledColor( window, info->color );
GadgetRadioSetDisabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( RADIO_DISABLED_UNCHECKED_BOX );
GadgetRadioSetDisabledUncheckedBoxImage( window, info->image );
GadgetRadioSetDisabledUncheckedBoxColor( window, info->color );
GadgetRadioSetDisabledUncheckedBoxBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( RADIO_DISABLED_CHECKED_BOX );
GadgetRadioSetDisabledCheckedBoxImage( window, info->image );
GadgetRadioSetDisabledCheckedBoxColor( window, info->color );
GadgetRadioSetDisabledCheckedBoxBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( RADIO_HILITE );
GadgetRadioSetHiliteImage( window, info->image );
GadgetRadioSetHiliteColor( window, info->color );
GadgetRadioSetHiliteBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( RADIO_HILITE_UNCHECKED_BOX );
GadgetRadioSetHiliteUncheckedBoxImage( window, info->image );
GadgetRadioSetHiliteUncheckedBoxColor( window, info->color );
GadgetRadioSetHiliteUncheckedBoxBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( RADIO_HILITE_CHECKED_BOX );
GadgetRadioSetHiliteCheckedBoxImage( window, info->image );
GadgetRadioSetHiliteCheckedBoxColor( window, info->color );
GadgetRadioSetHiliteCheckedBoxBorderColor( window, info->borderColor );
Color color, border;
color = TheDefaultScheme->getEnabledTextColor();
border = TheDefaultScheme->getEnabledTextBorderColor();
window->winSetEnabledTextColors( color, border );
color = TheDefaultScheme->getDisabledTextColor();
border = TheDefaultScheme->getDisabledTextBorderColor();
window->winSetDisabledTextColors( color, border );
color = TheDefaultScheme->getHiliteTextColor();
border = TheDefaultScheme->getHiliteTextBorderColor();
window->winSetHiliteTextColors( color, border );
// set default font
window->winSetFont( TheDefaultScheme->getFont() );
} // end if
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newRadioButton
// GUIEdit::newTabControl ====================================================
/** Create a tab control gadget */
//=============================================================================
GameWindow *GUIEdit::newTabControl( GameWindow *parent,
Int x, Int y, Int width, Int height )
{
TabControlData tabControlData;
GameWindow *window;
WinInstanceData instData;
UnsignedInt status = WIN_STATUS_ENABLED;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
// keep inside a parent if present
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// initialize inst data
instData.init();
instData.m_style = GWS_TAB_CONTROL | GWS_MOUSE_TRACK;
memset( &tabControlData, 0, sizeof( tabControlData ) );
tabControlData.tabOrientation = TP_TOPLEFT;
tabControlData.tabEdge = TP_TOP_SIDE;
tabControlData.tabWidth = 50;
tabControlData.tabHeight = 25;
tabControlData.tabCount = 2;
tabControlData.paneBorder = 5;
// create gadget
window = TheWindowManager->gogoGadgetTabControl( parent,
status,
x, y,
width, height,
&instData,
&tabControlData,
NULL,
TRUE );
// set default colors based on the default scheme
if( window )
{
ImageAndColorInfo *info;
info = TheDefaultScheme->getImageAndColor( TC_TAB_0_ENABLED );
GadgetTabControlSetEnabledImageTabZero( window, info->image );
GadgetTabControlSetEnabledColorTabZero( window, info->color );
GadgetTabControlSetEnabledBorderColorTabZero( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_1_ENABLED );
GadgetTabControlSetEnabledImageTabOne( window, info->image );
GadgetTabControlSetEnabledColorTabOne( window, info->color );
GadgetTabControlSetEnabledBorderColorTabOne( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_2_ENABLED );
GadgetTabControlSetEnabledImageTabTwo( window, info->image );
GadgetTabControlSetEnabledColorTabTwo( window, info->color );
GadgetTabControlSetEnabledBorderColorTabTwo( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_3_ENABLED );
GadgetTabControlSetEnabledImageTabThree( window, info->image );
GadgetTabControlSetEnabledColorTabThree( window, info->color );
GadgetTabControlSetEnabledBorderColorTabThree( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_4_ENABLED );
GadgetTabControlSetEnabledImageTabFour( window, info->image );
GadgetTabControlSetEnabledColorTabFour( window, info->color );
GadgetTabControlSetEnabledBorderColorTabFour( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_5_ENABLED );
GadgetTabControlSetEnabledImageTabFive( window, info->image );
GadgetTabControlSetEnabledColorTabFive( window, info->color );
GadgetTabControlSetEnabledBorderColorTabFive( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_6_ENABLED );
GadgetTabControlSetEnabledImageTabSix( window, info->image );
GadgetTabControlSetEnabledColorTabSix( window, info->color );
GadgetTabControlSetEnabledBorderColorTabSix( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_7_ENABLED );
GadgetTabControlSetEnabledImageTabSeven( window, info->image );
GadgetTabControlSetEnabledColorTabSeven( window, info->color );
GadgetTabControlSetEnabledBorderColorTabSeven( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TAB_CONTROL_ENABLED );
GadgetTabControlSetEnabledImageBackground( window, info->image );
GadgetTabControlSetEnabledColorBackground( window, info->color );
GadgetTabControlSetEnabledBorderColorBackground( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_0_DISABLED );
GadgetTabControlSetDisabledImageTabZero( window, info->image );
GadgetTabControlSetDisabledColorTabZero( window, info->color );
GadgetTabControlSetDisabledBorderColorTabZero( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_1_DISABLED );
GadgetTabControlSetDisabledImageTabOne( window, info->image );
GadgetTabControlSetDisabledColorTabOne( window, info->color );
GadgetTabControlSetDisabledBorderColorTabOne( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_2_DISABLED );
GadgetTabControlSetDisabledImageTabTwo( window, info->image );
GadgetTabControlSetDisabledColorTabTwo( window, info->color );
GadgetTabControlSetDisabledBorderColorTabTwo( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_3_DISABLED );
GadgetTabControlSetDisabledImageTabThree( window, info->image );
GadgetTabControlSetDisabledColorTabThree( window, info->color );
GadgetTabControlSetDisabledBorderColorTabThree( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_4_DISABLED );
GadgetTabControlSetDisabledImageTabFour( window, info->image );
GadgetTabControlSetDisabledColorTabFour( window, info->color );
GadgetTabControlSetDisabledBorderColorTabFour( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_5_DISABLED );
GadgetTabControlSetDisabledImageTabFive( window, info->image );
GadgetTabControlSetDisabledColorTabFive( window, info->color );
GadgetTabControlSetDisabledBorderColorTabFive( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_6_DISABLED );
GadgetTabControlSetDisabledImageTabSix( window, info->image );
GadgetTabControlSetDisabledColorTabSix( window, info->color );
GadgetTabControlSetDisabledBorderColorTabSix( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_7_DISABLED );
GadgetTabControlSetDisabledImageTabSeven( window, info->image );
GadgetTabControlSetDisabledColorTabSeven( window, info->color );
GadgetTabControlSetDisabledBorderColorTabSeven( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TAB_CONTROL_DISABLED );
GadgetTabControlSetDisabledImageBackground( window, info->image );
GadgetTabControlSetDisabledColorBackground( window, info->color );
GadgetTabControlSetDisabledBorderColorBackground( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_0_HILITE );
GadgetTabControlSetHiliteImageTabZero( window, info->image );
GadgetTabControlSetHiliteColorTabZero( window, info->color );
GadgetTabControlSetHiliteBorderColorTabZero( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_1_HILITE );
GadgetTabControlSetHiliteImageTabOne( window, info->image );
GadgetTabControlSetHiliteColorTabOne( window, info->color );
GadgetTabControlSetHiliteBorderColorTabOne( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_2_HILITE );
GadgetTabControlSetHiliteImageTabTwo( window, info->image );
GadgetTabControlSetHiliteColorTabTwo( window, info->color );
GadgetTabControlSetHiliteBorderColorTabTwo( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_3_HILITE );
GadgetTabControlSetHiliteImageTabThree( window, info->image );
GadgetTabControlSetHiliteColorTabThree( window, info->color );
GadgetTabControlSetHiliteBorderColorTabThree( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_4_HILITE );
GadgetTabControlSetHiliteImageTabFour( window, info->image );
GadgetTabControlSetHiliteColorTabFour( window, info->color );
GadgetTabControlSetHiliteBorderColorTabFour( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_5_HILITE );
GadgetTabControlSetHiliteImageTabFive( window, info->image );
GadgetTabControlSetHiliteColorTabFive( window, info->color );
GadgetTabControlSetHiliteBorderColorTabFive( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_6_HILITE );
GadgetTabControlSetHiliteImageTabSix( window, info->image );
GadgetTabControlSetHiliteColorTabSix( window, info->color );
GadgetTabControlSetHiliteBorderColorTabSix( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TC_TAB_7_HILITE );
GadgetTabControlSetHiliteImageTabSeven( window, info->image );
GadgetTabControlSetHiliteColorTabSeven( window, info->color );
GadgetTabControlSetHiliteBorderColorTabSeven( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TAB_CONTROL_HILITE );
GadgetTabControlSetHiliteImageBackground( window, info->image );
GadgetTabControlSetHiliteColorBackground( window, info->color );
GadgetTabControlSetHiliteBorderColorBackground( window, info->borderColor );
} // end if
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newTabControl
// GUIEdit::newHorizontalSlider ===============================================
/** Create a new horizontal slider*/
//=============================================================================
GameWindow *GUIEdit::newHorizontalSlider( GameWindow *parent,
Int x, Int y,
Int width, Int height )
{
GameWindow *window;
WinInstanceData instData;
UnsignedInt status = WIN_STATUS_ENABLED | WIN_STATUS_IMAGE;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
// keep inside a parent if present
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// initialize inst data
instData.init();
instData.m_style = GWS_HORZ_SLIDER | GWS_MOUSE_TRACK;
// initialize slider data
SliderData sliderData;
memset( &sliderData, 0, sizeof( sliderData ) );
sliderData.maxVal = 100;
sliderData.minVal = 0;
sliderData.numTicks = 100;
sliderData.position = 0;
// make control
window = TheWindowManager->gogoGadgetSlider( parent,
status,
x, y,
width, height,
&instData,
&sliderData,
NULL,
TRUE );
// set default colors based on the default scheme
if( window )
{
ImageAndColorInfo *info;
info = TheDefaultScheme->getImageAndColor( HSLIDER_ENABLED_LEFT );
GadgetSliderSetEnabledImageLeft( window, info->image );
GadgetSliderSetEnabledColor( window, info->color );
GadgetSliderSetEnabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( HSLIDER_ENABLED_RIGHT );
GadgetSliderSetEnabledImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( HSLIDER_ENABLED_CENTER );
GadgetSliderSetEnabledImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( HSLIDER_ENABLED_SMALL_CENTER );
GadgetSliderSetEnabledImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( HSLIDER_DISABLED_LEFT );
GadgetSliderSetDisabledImageLeft( window, info->image );
GadgetSliderSetDisabledColor( window, info->color );
GadgetSliderSetDisabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( HSLIDER_DISABLED_RIGHT );
GadgetSliderSetDisabledImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( HSLIDER_DISABLED_CENTER );
GadgetSliderSetDisabledImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( HSLIDER_DISABLED_SMALL_CENTER );
GadgetSliderSetDisabledImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( HSLIDER_HILITE_LEFT );
GadgetSliderSetHiliteImageLeft( window, info->image );
GadgetSliderSetHiliteColor( window, info->color );
GadgetSliderSetHiliteBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( HSLIDER_HILITE_RIGHT );
GadgetSliderSetHiliteImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( HSLIDER_HILITE_CENTER );
GadgetSliderSetHiliteImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( HSLIDER_HILITE_SMALL_CENTER );
GadgetSliderSetHiliteImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( HSLIDER_THUMB_ENABLED );
GadgetSliderSetEnabledThumbImage( window, info->image );
GadgetSliderSetEnabledThumbColor( window, info->color );
GadgetSliderSetEnabledThumbBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( HSLIDER_THUMB_ENABLED_PUSHED );
GadgetSliderSetEnabledSelectedThumbImage( window, info->image );
GadgetSliderSetEnabledSelectedThumbColor( window, info->color );
GadgetSliderSetEnabledSelectedThumbBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( HSLIDER_THUMB_DISABLED );
GadgetSliderSetDisabledThumbImage( window, info->image );
GadgetSliderSetDisabledThumbColor( window, info->color );
GadgetSliderSetDisabledThumbBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( HSLIDER_THUMB_DISABLED_PUSHED );
GadgetSliderSetDisabledSelectedThumbImage( window, info->image );
GadgetSliderSetDisabledSelectedThumbColor( window, info->color );
GadgetSliderSetDisabledSelectedThumbBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( HSLIDER_THUMB_HILITE );
GadgetSliderSetHiliteThumbImage( window, info->image );
GadgetSliderSetHiliteThumbColor( window, info->color );
GadgetSliderSetHiliteThumbBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( HSLIDER_THUMB_HILITE_PUSHED );
GadgetSliderSetHiliteSelectedThumbImage( window, info->image );
GadgetSliderSetHiliteSelectedThumbColor( window, info->color );
GadgetSliderSetHiliteSelectedThumbBorderColor( window, info->borderColor );
// set default font
window->winSetFont( TheDefaultScheme->getFont() );
} // end if
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newHorizontalSlider
// GUIEdit::newVerticlaSlider =================================================
/** Create a new vertical slider */
//=============================================================================
GameWindow *GUIEdit::newVerticalSlider( GameWindow *parent,
Int x, Int y,
Int width, Int height )
{
GameWindow *window;
WinInstanceData instData;
UnsignedInt status = WIN_STATUS_ENABLED | WIN_STATUS_IMAGE;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
// keep inside a parent if present
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// initialize inst data
instData.init();
instData.m_style = GWS_VERT_SLIDER | GWS_MOUSE_TRACK;
// initialize slider data
SliderData sliderData;
memset( &sliderData, 0, sizeof( sliderData ) );
sliderData.maxVal = 100;
sliderData.minVal = 0;
sliderData.numTicks = 100;
sliderData.position = 0;
// make control
window = TheWindowManager->gogoGadgetSlider( parent,
status,
x, y,
width, height,
&instData,
&sliderData,
NULL,
TRUE );
// set default colors based on the default scheme
if( window )
{
ImageAndColorInfo *info;
info = TheDefaultScheme->getImageAndColor( VSLIDER_ENABLED_TOP );
GadgetSliderSetEnabledImageLeft( window, info->image );
GadgetSliderSetEnabledColor( window, info->color );
GadgetSliderSetEnabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( VSLIDER_ENABLED_BOTTOM );
GadgetSliderSetEnabledImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( VSLIDER_ENABLED_CENTER );
GadgetSliderSetEnabledImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( VSLIDER_ENABLED_SMALL_CENTER );
GadgetSliderSetEnabledImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( VSLIDER_DISABLED_TOP );
GadgetSliderSetDisabledImageLeft( window, info->image );
GadgetSliderSetDisabledColor( window, info->color );
GadgetSliderSetDisabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( VSLIDER_DISABLED_BOTTOM );
GadgetSliderSetDisabledImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( VSLIDER_DISABLED_CENTER );
GadgetSliderSetDisabledImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( VSLIDER_DISABLED_SMALL_CENTER );
GadgetSliderSetDisabledImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( VSLIDER_HILITE_TOP );
GadgetSliderSetHiliteImageLeft( window, info->image );
GadgetSliderSetHiliteColor( window, info->color );
GadgetSliderSetHiliteBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( VSLIDER_HILITE_BOTTOM );
GadgetSliderSetHiliteImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( VSLIDER_HILITE_CENTER );
GadgetSliderSetHiliteImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( VSLIDER_HILITE_SMALL_CENTER );
GadgetSliderSetHiliteImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( VSLIDER_THUMB_ENABLED );
GadgetSliderSetEnabledThumbImage( window, info->image );
GadgetSliderSetEnabledThumbColor( window, info->color );
GadgetSliderSetEnabledThumbBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( VSLIDER_THUMB_ENABLED_PUSHED );
GadgetSliderSetEnabledSelectedThumbImage( window, info->image );
GadgetSliderSetEnabledSelectedThumbColor( window, info->color );
GadgetSliderSetEnabledSelectedThumbBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( VSLIDER_THUMB_DISABLED );
GadgetSliderSetDisabledThumbImage( window, info->image );
GadgetSliderSetDisabledThumbColor( window, info->color );
GadgetSliderSetDisabledThumbBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( VSLIDER_THUMB_DISABLED_PUSHED );
GadgetSliderSetDisabledSelectedThumbImage( window, info->image );
GadgetSliderSetDisabledSelectedThumbColor( window, info->color );
GadgetSliderSetDisabledSelectedThumbBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( VSLIDER_THUMB_HILITE );
GadgetSliderSetHiliteThumbImage( window, info->image );
GadgetSliderSetHiliteThumbColor( window, info->color );
GadgetSliderSetHiliteThumbBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( VSLIDER_THUMB_HILITE_PUSHED );
GadgetSliderSetHiliteSelectedThumbImage( window, info->image );
GadgetSliderSetHiliteSelectedThumbColor( window, info->color );
GadgetSliderSetHiliteSelectedThumbBorderColor( window, info->borderColor );
// set default font
window->winSetFont( TheDefaultScheme->getFont() );
} // end if
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newVerticalSlider
// GUIEdit::newProgressBar ====================================================
/** Create a new progress bar */
//=============================================================================
GameWindow *GUIEdit::newProgressBar( GameWindow *parent,
Int x, Int y,
Int width, Int height )
{
GameWindow *window;
WinInstanceData instData;
UnsignedInt status = WIN_STATUS_ENABLED | WIN_STATUS_IMAGE;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
// keep inside a parent if present
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// initialize inst data
instData.init();
instData.m_style = GWS_PROGRESS_BAR | GWS_MOUSE_TRACK;
// make control
window = TheWindowManager->gogoGadgetProgressBar( parent,
status,
x, y,
width, height,
&instData,
NULL,
TRUE );
// set default colors based on the default scheme
if( window )
{
ImageAndColorInfo *info;
//-------------------------------------------------------------------------
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_ENABLED_LEFT );
GadgetProgressBarSetEnabledImageLeft( window, info->image );
GadgetProgressBarSetEnabledColor( window, info->color );
GadgetProgressBarSetEnabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_ENABLED_RIGHT );
GadgetProgressBarSetEnabledImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_ENABLED_CENTER );
GadgetProgressBarSetEnabledImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_ENABLED_SMALL_CENTER );
GadgetProgressBarSetEnabledImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_ENABLED_BAR_LEFT );
GadgetProgressBarSetEnabledBarImageLeft( window, info->image );
GadgetProgressBarSetEnabledBarColor( window, info->color );
GadgetProgressBarSetEnabledBarBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_ENABLED_BAR_RIGHT );
GadgetProgressBarSetEnabledBarImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_ENABLED_BAR_CENTER );
GadgetProgressBarSetEnabledBarImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_ENABLED_BAR_SMALL_CENTER );
GadgetProgressBarSetEnabledBarImageSmallCenter( window, info->image );
//-------------------------------------------------------------------------
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_DISABLED_LEFT );
GadgetProgressBarSetDisabledImageLeft( window, info->image );
GadgetProgressBarSetDisabledColor( window, info->color );
GadgetProgressBarSetDisabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_DISABLED_RIGHT );
GadgetProgressBarSetDisabledImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_DISABLED_CENTER );
GadgetProgressBarSetDisabledImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_DISABLED_SMALL_CENTER );
GadgetProgressBarSetDisabledImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_DISABLED_BAR_LEFT );
GadgetProgressBarSetDisabledBarImageLeft( window, info->image );
GadgetProgressBarSetDisabledBarColor( window, info->color );
GadgetProgressBarSetDisabledBarBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_DISABLED_BAR_RIGHT );
GadgetProgressBarSetDisabledBarImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_DISABLED_BAR_CENTER );
GadgetProgressBarSetDisabledBarImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_DISABLED_BAR_SMALL_CENTER );
GadgetProgressBarSetDisabledBarImageSmallCenter( window, info->image );
//-------------------------------------------------------------------------
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_HILITE_LEFT );
GadgetProgressBarSetHiliteImageLeft( window, info->image );
GadgetProgressBarSetHiliteColor( window, info->color );
GadgetProgressBarSetHiliteBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_HILITE_RIGHT );
GadgetProgressBarSetHiliteImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_HILITE_CENTER );
GadgetProgressBarSetHiliteImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_HILITE_SMALL_CENTER );
GadgetProgressBarSetHiliteImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_HILITE_BAR_LEFT );
GadgetProgressBarSetHiliteBarImageLeft( window, info->image );
GadgetProgressBarSetHiliteBarColor( window, info->color );
GadgetProgressBarSetHiliteBarBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_HILITE_BAR_RIGHT );
GadgetProgressBarSetHiliteBarImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_HILITE_BAR_CENTER );
GadgetProgressBarSetHiliteBarImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( PROGRESS_BAR_HILITE_BAR_SMALL_CENTER );
GadgetProgressBarSetHiliteBarImageSmallCenter( window, info->image );
Color color, border;
color = TheDefaultScheme->getEnabledTextColor();
border = TheDefaultScheme->getEnabledTextBorderColor();
window->winSetEnabledTextColors( color, border );
color = TheDefaultScheme->getDisabledTextColor();
border = TheDefaultScheme->getDisabledTextBorderColor();
window->winSetDisabledTextColors( color, border );
color = TheDefaultScheme->getHiliteTextColor();
border = TheDefaultScheme->getHiliteTextBorderColor();
window->winSetHiliteTextColors( color, border );
// set default font
window->winSetFont( TheDefaultScheme->getFont() );
} // end if
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newProgressBar
// GUIEdit::newListbox ========================================================
/** Create a new list box */
//=============================================================================
GameWindow *GUIEdit::newComboBox( GameWindow *parent,
Int x, Int y,
Int width, Int height )
{
GameWindow *window;
WinInstanceData instData;
UnsignedInt status = WIN_STATUS_ENABLED | WIN_STATUS_IMAGE;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
// keep inside a parent if present
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// initialize inst data
instData.init();
instData.m_style = GWS_COMBO_BOX | GWS_MOUSE_TRACK;
//initialize combo box data
ComboBoxData *comboData = new ComboBoxData;
memset ( comboData, 0, sizeof(comboData));
comboData->entryData = new EntryData;
memset ( comboData->entryData, 0, sizeof(EntryData));
comboData->listboxData = new ListboxData;
memset ( comboData->listboxData, 0, sizeof(ListboxData));
//initialize combo box data
comboData->isEditable = TRUE;
comboData->maxChars = 16;
comboData->maxDisplay = 5;
comboData->entryCount = 0;
comboData->dontHide = FALSE;
comboData->asciiOnly = FALSE;
comboData->lettersAndNumbersOnly = FALSE;
//initialize entry data
comboData->entryData->maxTextLen = 16;
comboData->entryData->alphaNumericalOnly = FALSE;
comboData->entryData->aSCIIOnly = FALSE;
comboData->entryData->numericalOnly = FALSE;
//initialize listbox data
comboData->listboxData->listLength = 10;
comboData->listboxData->autoScroll = 0;
comboData->listboxData->scrollIfAtEnd = FALSE;
comboData->listboxData->autoPurge = 0;
comboData->listboxData->scrollBar = 1;
comboData->listboxData->multiSelect = 0;
comboData->listboxData->forceSelect = 1;
comboData->listboxData->columns = 1;
comboData->listboxData->columnWidth = NULL;
comboData->listboxData->columnWidthPercentage = NULL;
//create the control
window = TheWindowManager->gogoGadgetComboBox( parent,
status,
x, y,
width, height,
&instData,
comboData,
NULL,
TRUE );
// set default colors based on the default scheme
if( window )
{
ImageAndColorInfo *info;
info = TheDefaultScheme->getImageAndColor( COMBOBOX_ENABLED );
GadgetComboBoxSetEnabledImage( window, info->image );
GadgetComboBoxSetEnabledColor( window, info->color );
GadgetComboBoxSetEnabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_ENABLED_SELECTED_ITEM_LEFT );
GadgetComboBoxSetEnabledSelectedItemImageLeft( window, info->image );
GadgetComboBoxSetEnabledSelectedItemColor( window, info->color );
GadgetComboBoxSetEnabledSelectedItemBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_ENABLED_SELECTED_ITEM_RIGHT );
GadgetComboBoxSetEnabledSelectedItemImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_ENABLED_SELECTED_ITEM_CENTER );
GadgetComboBoxSetEnabledSelectedItemImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_ENABLED_SELECTED_ITEM_SMALL_CENTER );
GadgetComboBoxSetEnabledSelectedItemImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_DISABLED );
GadgetComboBoxSetDisabledImage( window, info->image );
GadgetComboBoxSetDisabledColor( window, info->color );
GadgetComboBoxSetDisabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_DISABLED_SELECTED_ITEM_LEFT );
GadgetComboBoxSetDisabledSelectedItemImageLeft( window, info->image );
GadgetComboBoxSetDisabledSelectedItemColor( window, info->color );
GadgetComboBoxSetDisabledSelectedItemBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_DISABLED_SELECTED_ITEM_RIGHT );
GadgetComboBoxSetDisabledSelectedItemImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_DISABLED_SELECTED_ITEM_CENTER );
GadgetComboBoxSetDisabledSelectedItemImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_DISABLED_SELECTED_ITEM_SMALL_CENTER );
GadgetComboBoxSetDisabledSelectedItemImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_HILITE );
GadgetComboBoxSetHiliteImage( window, info->image );
GadgetComboBoxSetHiliteColor( window, info->color );
GadgetComboBoxSetHiliteBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_HILITE_SELECTED_ITEM_LEFT );
GadgetComboBoxSetHiliteSelectedItemImageLeft( window, info->image );
GadgetComboBoxSetHiliteSelectedItemColor( window, info->color );
GadgetComboBoxSetHiliteSelectedItemBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_HILITE_SELECTED_ITEM_RIGHT );
GadgetComboBoxSetHiliteSelectedItemImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_HILITE_SELECTED_ITEM_CENTER );
GadgetComboBoxSetHiliteSelectedItemImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_HILITE_SELECTED_ITEM_SMALL_CENTER );
GadgetComboBoxSetHiliteSelectedItemImageSmallCenter( window, info->image );
GameWindow *editBox = GadgetComboBoxGetEditBox( window );
if(editBox)
{
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_ENABLED_LEFT );
GadgetTextEntrySetEnabledImageLeft( editBox, info->image );
GadgetTextEntrySetEnabledColor( editBox, info->color );
GadgetTextEntrySetEnabledBorderColor( editBox, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_ENABLED_RIGHT );
GadgetTextEntrySetEnabledImageRight( editBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_ENABLED_CENTER );
GadgetTextEntrySetEnabledImageCenter( editBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_ENABLED_SMALL_CENTER );
GadgetTextEntrySetEnabledImageSmallCenter( editBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_DISABLED_LEFT );
GadgetTextEntrySetDisabledImageLeft( editBox, info->image );
GadgetTextEntrySetDisabledColor( editBox, info->color );
GadgetTextEntrySetDisabledBorderColor( editBox, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_DISABLED_RIGHT );
GadgetTextEntrySetDisabledImageRight( editBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_DISABLED_CENTER );
GadgetTextEntrySetDisabledImageCenter( editBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_DISABLED_SMALL_CENTER );
GadgetTextEntrySetDisabledImageSmallCenter( editBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_HILITE_LEFT );
GadgetTextEntrySetHiliteImageLeft( editBox, info->image );
GadgetTextEntrySetHiliteColor( window, info->color );
GadgetTextEntrySetHiliteBorderColor( editBox, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_HILITE_RIGHT );
GadgetTextEntrySetHiliteImageRight( editBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_HILITE_CENTER );
GadgetTextEntrySetHiliteImageCenter( editBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_EDIT_BOX_HILITE_SMALL_CENTER );
GadgetTextEntrySetHiliteImageSmallCenter( editBox, info->image );
}
GameWindow *listBox = GadgetComboBoxGetListBox( window );
if(listBox)
{
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_ENABLED );
GadgetListBoxSetEnabledImage( listBox, info->image );
GadgetListBoxSetEnabledColor( listBox, info->color );
GadgetListBoxSetEnabledBorderColor( listBox, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_ENABLED_SELECTED_ITEM_LEFT );
GadgetListBoxSetEnabledSelectedItemImageLeft( listBox, info->image );
GadgetListBoxSetEnabledSelectedItemColor( listBox, info->color );
GadgetListBoxSetEnabledSelectedItemBorderColor( listBox, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_ENABLED_SELECTED_ITEM_RIGHT );
GadgetListBoxSetEnabledSelectedItemImageRight( listBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_ENABLED_SELECTED_ITEM_CENTER );
GadgetListBoxSetEnabledSelectedItemImageCenter( listBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_ENABLED_SELECTED_ITEM_SMALL_CENTER );
GadgetListBoxSetEnabledSelectedItemImageSmallCenter( listBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_DISABLED );
GadgetListBoxSetDisabledImage( listBox, info->image );
GadgetListBoxSetDisabledColor( listBox, info->color );
GadgetListBoxSetDisabledBorderColor( listBox, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_DISABLED_SELECTED_ITEM_LEFT );
GadgetListBoxSetDisabledSelectedItemImageLeft( listBox, info->image );
GadgetListBoxSetDisabledSelectedItemColor( listBox, info->color );
GadgetListBoxSetDisabledSelectedItemBorderColor( listBox, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_DISABLED_SELECTED_ITEM_RIGHT );
GadgetListBoxSetDisabledSelectedItemImageRight( listBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_DISABLED_SELECTED_ITEM_CENTER );
GadgetListBoxSetDisabledSelectedItemImageCenter( listBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_DISABLED_SELECTED_ITEM_SMALL_CENTER );
GadgetListBoxSetDisabledSelectedItemImageSmallCenter( listBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_HILITE );
GadgetListBoxSetHiliteImage( listBox, info->image );
GadgetListBoxSetHiliteColor( listBox, info->color );
GadgetListBoxSetHiliteBorderColor( listBox, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_HILITE_SELECTED_ITEM_LEFT );
GadgetListBoxSetHiliteSelectedItemImageLeft( listBox, info->image );
GadgetListBoxSetHiliteSelectedItemColor( listBox, info->color );
GadgetListBoxSetHiliteSelectedItemBorderColor( listBox, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_HILITE_SELECTED_ITEM_RIGHT );
GadgetListBoxSetHiliteSelectedItemImageRight( listBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_HILITE_SELECTED_ITEM_CENTER );
GadgetListBoxSetHiliteSelectedItemImageCenter( listBox, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_HILITE_SELECTED_ITEM_SMALL_CENTER );
GadgetListBoxSetHiliteSelectedItemImageSmallCenter( listBox, info->image );
GameWindow *upButton = GadgetListBoxGetUpButton( listBox );
if( upButton )
{
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_UP_BUTTON_ENABLED );
GadgetButtonSetEnabledImage( upButton, info->image );
GadgetButtonSetEnabledColor( upButton, info->color );
GadgetButtonSetEnabledBorderColor( upButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_UP_BUTTON_ENABLED_PUSHED );
GadgetButtonSetEnabledSelectedImage( upButton, info->image );
GadgetButtonSetEnabledSelectedColor( upButton, info->color );
GadgetButtonSetEnabledSelectedBorderColor( upButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_UP_BUTTON_DISABLED );
GadgetButtonSetDisabledImage( upButton, info->image );
GadgetButtonSetDisabledColor( upButton, info->color );
GadgetButtonSetDisabledBorderColor( upButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_UP_BUTTON_DISABLED_PUSHED );
GadgetButtonSetDisabledSelectedImage( upButton, info->image );
GadgetButtonSetDisabledSelectedColor( upButton, info->color );
GadgetButtonSetDisabledSelectedBorderColor( upButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_UP_BUTTON_HILITE );
GadgetButtonSetHiliteImage( upButton, info->image );
GadgetButtonSetHiliteColor( upButton, info->color );
GadgetButtonSetHiliteBorderColor( upButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_UP_BUTTON_HILITE_PUSHED );
GadgetButtonSetHiliteSelectedImage( upButton, info->image );
GadgetButtonSetHiliteSelectedColor( upButton, info->color );
GadgetButtonSetHiliteSelectedBorderColor( upButton, info->borderColor );
} // end if
GameWindow *downButton = GadgetListBoxGetDownButton( listBox );
if( downButton )
{
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_DOWN_BUTTON_ENABLED );
GadgetButtonSetEnabledImage( downButton, info->image );
GadgetButtonSetEnabledColor( downButton, info->color );
GadgetButtonSetEnabledBorderColor( downButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_DOWN_BUTTON_ENABLED_PUSHED );
GadgetButtonSetEnabledSelectedImage( downButton, info->image );
GadgetButtonSetEnabledSelectedColor( downButton, info->color );
GadgetButtonSetEnabledSelectedBorderColor( downButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_DOWN_BUTTON_DISABLED );
GadgetButtonSetDisabledImage( downButton, info->image );
GadgetButtonSetDisabledColor( downButton, info->color );
GadgetButtonSetDisabledBorderColor( downButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_DOWN_BUTTON_DISABLED_PUSHED );
GadgetButtonSetDisabledSelectedImage( downButton, info->image );
GadgetButtonSetDisabledSelectedColor( downButton, info->color );
GadgetButtonSetDisabledSelectedBorderColor( downButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_DOWN_BUTTON_HILITE );
GadgetButtonSetHiliteImage( downButton, info->image );
GadgetButtonSetHiliteColor( downButton, info->color );
GadgetButtonSetHiliteBorderColor( downButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_DOWN_BUTTON_HILITE_PUSHED );
GadgetButtonSetHiliteSelectedImage( downButton, info->image );
GadgetButtonSetHiliteSelectedColor( downButton, info->color );
GadgetButtonSetHiliteSelectedBorderColor( downButton, info->borderColor );
} // end if
GameWindow *slider = GadgetListBoxGetSlider( listBox );
if( slider )
{
// ----------------------------------------------------------------------
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_ENABLED_TOP );
GadgetSliderSetEnabledImageTop( slider, info->image );
GadgetSliderSetEnabledColor( slider, info->color );
GadgetSliderSetEnabledBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_ENABLED_BOTTOM );
GadgetSliderSetEnabledImageBottom( slider, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_ENABLED_CENTER );
GadgetSliderSetEnabledImageCenter( slider, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_ENABLED_SMALL_CENTER );
GadgetSliderSetEnabledImageSmallCenter( slider, info->image );
// ----------------------------------------------------------------------
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_DISABLED_TOP );
GadgetSliderSetDisabledImageTop( slider, info->image );
GadgetSliderSetDisabledColor( slider, info->color );
GadgetSliderSetDisabledBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_DISABLED_BOTTOM );
GadgetSliderSetDisabledImageBottom( slider, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_DISABLED_CENTER );
GadgetSliderSetDisabledImageCenter( slider, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_DISABLED_SMALL_CENTER );
GadgetSliderSetDisabledImageSmallCenter( slider, info->image );
// ----------------------------------------------------------------------
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_HILITE_TOP );
GadgetSliderSetHiliteImageTop( slider, info->image );
GadgetSliderSetHiliteColor( slider, info->color );
GadgetSliderSetHiliteBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_HILITE_BOTTOM );
GadgetSliderSetHiliteImageBottom( slider, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_HILITE_CENTER );
GadgetSliderSetHiliteImageCenter( slider, info->image );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_HILITE_SMALL_CENTER );
GadgetSliderSetHiliteImageSmallCenter( slider, info->image );
//-----------------------------------------------------------------------
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_THUMB_ENABLED );
GadgetSliderSetEnabledThumbImage( slider, info->image );
GadgetSliderSetEnabledThumbColor( slider, info->color );
GadgetSliderSetEnabledThumbBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_THUMB_ENABLED_PUSHED );
GadgetSliderSetEnabledSelectedThumbImage( slider, info->image );
GadgetSliderSetEnabledSelectedThumbColor( slider, info->color );
GadgetSliderSetEnabledSelectedThumbBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_THUMB_DISABLED );
GadgetSliderSetDisabledThumbImage( slider, info->image );
GadgetSliderSetDisabledThumbColor( slider, info->color );
GadgetSliderSetDisabledThumbBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_THUMB_DISABLED_PUSHED );
GadgetSliderSetDisabledSelectedThumbImage( slider, info->image );
GadgetSliderSetDisabledSelectedThumbColor( slider, info->color );
GadgetSliderSetDisabledSelectedThumbBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_THUMB_HILITE );
GadgetSliderSetHiliteThumbImage( slider, info->image );
GadgetSliderSetHiliteThumbColor( slider, info->color );
GadgetSliderSetHiliteThumbBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_LISTBOX_SLIDER_THUMB_HILITE_PUSHED );
GadgetSliderSetHiliteSelectedThumbImage( slider, info->image );
GadgetSliderSetHiliteSelectedThumbColor( slider, info->color );
GadgetSliderSetHiliteSelectedThumbBorderColor( slider, info->borderColor );
}
} //end listbox if
GameWindow *dropDownButton = GadgetComboBoxGetDropDownButton( window );
if( dropDownButton )
{
info = TheDefaultScheme->getImageAndColor( COMBOBOX_DROP_DOWN_BUTTON_ENABLED );
GadgetButtonSetEnabledImage( dropDownButton, info->image );
GadgetButtonSetEnabledColor( dropDownButton, info->color );
GadgetButtonSetEnabledBorderColor( dropDownButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_DROP_DOWN_BUTTON_ENABLED_PUSHED );
GadgetButtonSetEnabledSelectedImage( dropDownButton, info->image );
GadgetButtonSetEnabledSelectedColor( dropDownButton, info->color );
GadgetButtonSetEnabledSelectedBorderColor( dropDownButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_DROP_DOWN_BUTTON_DISABLED );
GadgetButtonSetDisabledImage( dropDownButton, info->image );
GadgetButtonSetDisabledColor( dropDownButton, info->color );
GadgetButtonSetDisabledBorderColor( dropDownButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_DROP_DOWN_BUTTON_DISABLED_PUSHED );
GadgetButtonSetDisabledSelectedImage( dropDownButton, info->image );
GadgetButtonSetDisabledSelectedColor( dropDownButton, info->color );
GadgetButtonSetDisabledSelectedBorderColor( dropDownButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_DROP_DOWN_BUTTON_HILITE );
GadgetButtonSetHiliteImage( dropDownButton, info->image );
GadgetButtonSetHiliteColor( dropDownButton, info->color );
GadgetButtonSetHiliteBorderColor( dropDownButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( COMBOBOX_DROP_DOWN_BUTTON_HILITE_PUSHED );
GadgetButtonSetHiliteSelectedImage( dropDownButton, info->image );
GadgetButtonSetHiliteSelectedColor( dropDownButton, info->color );
GadgetButtonSetHiliteSelectedBorderColor( dropDownButton, info->borderColor );
} // end if
Color color, border;
color = TheDefaultScheme->getEnabledTextColor();
border = TheDefaultScheme->getEnabledTextBorderColor();
window->winSetEnabledTextColors( color, border );
color = TheDefaultScheme->getDisabledTextColor();
border = TheDefaultScheme->getDisabledTextBorderColor();
window->winSetDisabledTextColors( color, border );
color = TheDefaultScheme->getHiliteTextColor();
border = TheDefaultScheme->getHiliteTextBorderColor();
window->winSetHiliteTextColors( color, border );
/// @TODO: We still need to set the IME Composite Text colors in TheDefaultScheme
window->winSetIMECompositeTextColors( color, border );
// set default font
window->winSetFont( TheDefaultScheme->getFont() );
}// end if
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newComboBox
// GUIEdit::newListbox ========================================================
/** Create a new list box */
//=============================================================================
GameWindow *GUIEdit::newListbox( GameWindow *parent,
Int x, Int y,
Int width, Int height )
{
GameWindow *window;
WinInstanceData instData;
UnsignedInt status = WIN_STATUS_ENABLED | WIN_STATUS_IMAGE;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
// keep inside a parent if present
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// initialize inst data
instData.init();
instData.m_style = GWS_SCROLL_LISTBOX | GWS_MOUSE_TRACK;
// initialize listbox data
ListboxData listData;
memset( &listData, 0, sizeof( listData ) );
listData.listLength = 10;
listData.autoScroll = 0;
listData.scrollIfAtEnd = FALSE;
listData.autoPurge = 0;
listData.scrollBar = 1;
listData.multiSelect = 0;
listData.forceSelect = 0;
listData.columns = 1;
listData.columnWidth = NULL;
listData.columnWidthPercentage = NULL;
// make control
window = TheWindowManager->gogoGadgetListBox( parent,
status,
x, y,
width, height,
&instData,
&listData,
NULL,
TRUE );
// set default colors based on the default scheme
if( window )
{
ImageAndColorInfo *info;
info = TheDefaultScheme->getImageAndColor( LISTBOX_ENABLED );
GadgetListBoxSetEnabledImage( window, info->image );
GadgetListBoxSetEnabledColor( window, info->color );
GadgetListBoxSetEnabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_ENABLED_SELECTED_ITEM_LEFT );
GadgetListBoxSetEnabledSelectedItemImageLeft( window, info->image );
GadgetListBoxSetEnabledSelectedItemColor( window, info->color );
GadgetListBoxSetEnabledSelectedItemBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_ENABLED_SELECTED_ITEM_RIGHT );
GadgetListBoxSetEnabledSelectedItemImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_ENABLED_SELECTED_ITEM_CENTER );
GadgetListBoxSetEnabledSelectedItemImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_ENABLED_SELECTED_ITEM_SMALL_CENTER );
GadgetListBoxSetEnabledSelectedItemImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_DISABLED );
GadgetListBoxSetDisabledImage( window, info->image );
GadgetListBoxSetDisabledColor( window, info->color );
GadgetListBoxSetDisabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_DISABLED_SELECTED_ITEM_LEFT );
GadgetListBoxSetDisabledSelectedItemImageLeft( window, info->image );
GadgetListBoxSetDisabledSelectedItemColor( window, info->color );
GadgetListBoxSetDisabledSelectedItemBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_DISABLED_SELECTED_ITEM_RIGHT );
GadgetListBoxSetDisabledSelectedItemImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_DISABLED_SELECTED_ITEM_CENTER );
GadgetListBoxSetDisabledSelectedItemImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_DISABLED_SELECTED_ITEM_SMALL_CENTER );
GadgetListBoxSetDisabledSelectedItemImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_HILITE );
GadgetListBoxSetHiliteImage( window, info->image );
GadgetListBoxSetHiliteColor( window, info->color );
GadgetListBoxSetHiliteBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_HILITE_SELECTED_ITEM_LEFT );
GadgetListBoxSetHiliteSelectedItemImageLeft( window, info->image );
GadgetListBoxSetHiliteSelectedItemColor( window, info->color );
GadgetListBoxSetHiliteSelectedItemBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_HILITE_SELECTED_ITEM_RIGHT );
GadgetListBoxSetHiliteSelectedItemImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_HILITE_SELECTED_ITEM_CENTER );
GadgetListBoxSetHiliteSelectedItemImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_HILITE_SELECTED_ITEM_SMALL_CENTER );
GadgetListBoxSetHiliteSelectedItemImageSmallCenter( window, info->image );
GameWindow *upButton = GadgetListBoxGetUpButton( window );
if( upButton )
{
info = TheDefaultScheme->getImageAndColor( LISTBOX_UP_BUTTON_ENABLED );
GadgetButtonSetEnabledImage( upButton, info->image );
GadgetButtonSetEnabledColor( upButton, info->color );
GadgetButtonSetEnabledBorderColor( upButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_UP_BUTTON_ENABLED_PUSHED );
GadgetButtonSetEnabledSelectedImage( upButton, info->image );
GadgetButtonSetEnabledSelectedColor( upButton, info->color );
GadgetButtonSetEnabledSelectedBorderColor( upButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_UP_BUTTON_DISABLED );
GadgetButtonSetDisabledImage( upButton, info->image );
GadgetButtonSetDisabledColor( upButton, info->color );
GadgetButtonSetDisabledBorderColor( upButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_UP_BUTTON_DISABLED_PUSHED );
GadgetButtonSetDisabledSelectedImage( upButton, info->image );
GadgetButtonSetDisabledSelectedColor( upButton, info->color );
GadgetButtonSetDisabledSelectedBorderColor( upButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_UP_BUTTON_HILITE );
GadgetButtonSetHiliteImage( upButton, info->image );
GadgetButtonSetHiliteColor( upButton, info->color );
GadgetButtonSetHiliteBorderColor( upButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_UP_BUTTON_HILITE_PUSHED );
GadgetButtonSetHiliteSelectedImage( upButton, info->image );
GadgetButtonSetHiliteSelectedColor( upButton, info->color );
GadgetButtonSetHiliteSelectedBorderColor( upButton, info->borderColor );
} // end if
GameWindow *downButton = GadgetListBoxGetDownButton( window );
if( downButton )
{
info = TheDefaultScheme->getImageAndColor( LISTBOX_DOWN_BUTTON_ENABLED );
GadgetButtonSetEnabledImage( downButton, info->image );
GadgetButtonSetEnabledColor( downButton, info->color );
GadgetButtonSetEnabledBorderColor( downButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_DOWN_BUTTON_ENABLED_PUSHED );
GadgetButtonSetEnabledSelectedImage( downButton, info->image );
GadgetButtonSetEnabledSelectedColor( downButton, info->color );
GadgetButtonSetEnabledSelectedBorderColor( downButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_DOWN_BUTTON_DISABLED );
GadgetButtonSetDisabledImage( downButton, info->image );
GadgetButtonSetDisabledColor( downButton, info->color );
GadgetButtonSetDisabledBorderColor( downButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_DOWN_BUTTON_DISABLED_PUSHED );
GadgetButtonSetDisabledSelectedImage( downButton, info->image );
GadgetButtonSetDisabledSelectedColor( downButton, info->color );
GadgetButtonSetDisabledSelectedBorderColor( downButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_DOWN_BUTTON_HILITE );
GadgetButtonSetHiliteImage( downButton, info->image );
GadgetButtonSetHiliteColor( downButton, info->color );
GadgetButtonSetHiliteBorderColor( downButton, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_DOWN_BUTTON_HILITE_PUSHED );
GadgetButtonSetHiliteSelectedImage( downButton, info->image );
GadgetButtonSetHiliteSelectedColor( downButton, info->color );
GadgetButtonSetHiliteSelectedBorderColor( downButton, info->borderColor );
} // end if
GameWindow *slider = GadgetListBoxGetSlider( window );
if( slider )
{
// ----------------------------------------------------------------------
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_ENABLED_TOP );
GadgetSliderSetEnabledImageTop( slider, info->image );
GadgetSliderSetEnabledColor( slider, info->color );
GadgetSliderSetEnabledBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_ENABLED_BOTTOM );
GadgetSliderSetEnabledImageBottom( slider, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_ENABLED_CENTER );
GadgetSliderSetEnabledImageCenter( slider, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_ENABLED_SMALL_CENTER );
GadgetSliderSetEnabledImageSmallCenter( slider, info->image );
// ----------------------------------------------------------------------
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_DISABLED_TOP );
GadgetSliderSetDisabledImageTop( slider, info->image );
GadgetSliderSetDisabledColor( slider, info->color );
GadgetSliderSetDisabledBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_DISABLED_BOTTOM );
GadgetSliderSetDisabledImageBottom( slider, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_DISABLED_CENTER );
GadgetSliderSetDisabledImageCenter( slider, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_DISABLED_SMALL_CENTER );
GadgetSliderSetDisabledImageSmallCenter( slider, info->image );
// ----------------------------------------------------------------------
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_HILITE_TOP );
GadgetSliderSetHiliteImageTop( slider, info->image );
GadgetSliderSetHiliteColor( slider, info->color );
GadgetSliderSetHiliteBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_HILITE_BOTTOM );
GadgetSliderSetHiliteImageBottom( slider, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_HILITE_CENTER );
GadgetSliderSetHiliteImageCenter( slider, info->image );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_HILITE_SMALL_CENTER );
GadgetSliderSetHiliteImageSmallCenter( slider, info->image );
//-----------------------------------------------------------------------
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_THUMB_ENABLED );
GadgetSliderSetEnabledThumbImage( slider, info->image );
GadgetSliderSetEnabledThumbColor( slider, info->color );
GadgetSliderSetEnabledThumbBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_THUMB_ENABLED_PUSHED );
GadgetSliderSetEnabledSelectedThumbImage( slider, info->image );
GadgetSliderSetEnabledSelectedThumbColor( slider, info->color );
GadgetSliderSetEnabledSelectedThumbBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_THUMB_DISABLED );
GadgetSliderSetDisabledThumbImage( slider, info->image );
GadgetSliderSetDisabledThumbColor( slider, info->color );
GadgetSliderSetDisabledThumbBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_THUMB_DISABLED_PUSHED );
GadgetSliderSetDisabledSelectedThumbImage( slider, info->image );
GadgetSliderSetDisabledSelectedThumbColor( slider, info->color );
GadgetSliderSetDisabledSelectedThumbBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_THUMB_HILITE );
GadgetSliderSetHiliteThumbImage( slider, info->image );
GadgetSliderSetHiliteThumbColor( slider, info->color );
GadgetSliderSetHiliteThumbBorderColor( slider, info->borderColor );
info = TheDefaultScheme->getImageAndColor( LISTBOX_SLIDER_THUMB_HILITE_PUSHED );
GadgetSliderSetHiliteSelectedThumbImage( slider, info->image );
GadgetSliderSetHiliteSelectedThumbColor( slider, info->color );
GadgetSliderSetHiliteSelectedThumbBorderColor( slider, info->borderColor );
} // end if, slider
Color color, border;
color = TheDefaultScheme->getEnabledTextColor();
border = TheDefaultScheme->getEnabledTextBorderColor();
window->winSetEnabledTextColors( color, border );
color = TheDefaultScheme->getDisabledTextColor();
border = TheDefaultScheme->getDisabledTextBorderColor();
window->winSetDisabledTextColors( color, border );
color = TheDefaultScheme->getHiliteTextColor();
border = TheDefaultScheme->getHiliteTextBorderColor();
window->winSetHiliteTextColors( color, border );
// set default font
window->winSetFont( TheDefaultScheme->getFont() );
} // end if
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newListbox
// GUIEdit::newTextEntry ======================================================
/** Create a new text entry */
//=============================================================================
GameWindow *GUIEdit::newTextEntry( GameWindow *parent,
Int x, Int y,
Int width, Int height )
{
GameWindow *window;
WinInstanceData instData;
UnsignedInt status = WIN_STATUS_ENABLED | WIN_STATUS_IMAGE;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
// keep inside a parent if present
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// initialize inst data
instData.init();
instData.m_style = GWS_ENTRY_FIELD | GWS_MOUSE_TRACK;
instData.m_textLabelString = "Entry";
// initialize listbox data
EntryData entryData;
memset( &entryData, 0, sizeof( entryData ) );
entryData.maxTextLen = 64;
// make control
window = TheWindowManager->gogoGadgetTextEntry( parent,
status,
x, y,
width, height,
&instData,
&entryData,
NULL,
TRUE );
// set default colors based on the default scheme
if( window )
{
ImageAndColorInfo *info;
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_ENABLED_LEFT );
GadgetTextEntrySetEnabledImageLeft( window, info->image );
GadgetTextEntrySetEnabledColor( window, info->color );
GadgetTextEntrySetEnabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_ENABLED_RIGHT );
GadgetTextEntrySetEnabledImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_ENABLED_CENTER );
GadgetTextEntrySetEnabledImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_ENABLED_SMALL_CENTER );
GadgetTextEntrySetEnabledImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_DISABLED_LEFT );
GadgetTextEntrySetDisabledImageLeft( window, info->image );
GadgetTextEntrySetDisabledColor( window, info->color );
GadgetTextEntrySetDisabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_DISABLED_RIGHT );
GadgetTextEntrySetDisabledImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_DISABLED_CENTER );
GadgetTextEntrySetDisabledImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_DISABLED_SMALL_CENTER );
GadgetTextEntrySetDisabledImageSmallCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_HILITE_LEFT );
GadgetTextEntrySetHiliteImageLeft( window, info->image );
GadgetTextEntrySetHiliteColor( window, info->color );
GadgetTextEntrySetHiliteBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_HILITE_RIGHT );
GadgetTextEntrySetHiliteImageRight( window, info->image );
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_HILITE_CENTER );
GadgetTextEntrySetHiliteImageCenter( window, info->image );
info = TheDefaultScheme->getImageAndColor( TEXT_ENTRY_HILITE_SMALL_CENTER );
GadgetTextEntrySetHiliteImageSmallCenter( window, info->image );
Color color, border;
color = TheDefaultScheme->getEnabledTextColor();
border = TheDefaultScheme->getEnabledTextBorderColor();
window->winSetEnabledTextColors( color, border );
color = TheDefaultScheme->getDisabledTextColor();
border = TheDefaultScheme->getDisabledTextBorderColor();
window->winSetDisabledTextColors( color, border );
color = TheDefaultScheme->getHiliteTextColor();
border = TheDefaultScheme->getHiliteTextBorderColor();
window->winSetHiliteTextColors( color, border );
// set default font
window->winSetFont( TheDefaultScheme->getFont() );
} // end if
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newTextEntry
// GUIEdit::newStaticText =====================================================
/** Create a new static text*/
//=============================================================================
GameWindow *GUIEdit::newStaticText( GameWindow *parent,
Int x, Int y,
Int width, Int height )
{
GameWindow *window;
WinInstanceData instData;
UnsignedInt status = WIN_STATUS_ENABLED | WIN_STATUS_IMAGE;
// validate the parent to disallow illegal relationships
if( validateParentForCreate( parent ) == FALSE )
return NULL;
// keep inside a parent if present
if( parent )
clipCreationParamsToParent( parent, &x, &y, &width, &height );
// initialize inst data
instData.init();
instData.m_style = GWS_STATIC_TEXT | GWS_MOUSE_TRACK;
instData.m_textLabelString = "Static Text";
// initialize listbox data
TextData textData;
memset( &textData, 0, sizeof( textData ) );
textData.centered = TRUE;
// make control
window = TheWindowManager->gogoGadgetStaticText( parent,
status,
x, y,
width, height,
&instData,
&textData,
NULL,
TRUE );
// set default colors based on the default scheme
if( window )
{
ImageAndColorInfo *info;
info = TheDefaultScheme->getImageAndColor( STATIC_TEXT_ENABLED );
GadgetStaticTextSetEnabledImage( window, info->image );
GadgetStaticTextSetEnabledColor( window, info->color );
GadgetStaticTextSetEnabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( STATIC_TEXT_DISABLED );
GadgetStaticTextSetDisabledImage( window, info->image );
GadgetStaticTextSetDisabledColor( window, info->color );
GadgetStaticTextSetDisabledBorderColor( window, info->borderColor );
info = TheDefaultScheme->getImageAndColor( STATIC_TEXT_DISABLED );
GadgetStaticTextSetDisabledImage( window, info->image );
GadgetStaticTextSetDisabledColor( window, info->color );
GadgetStaticTextSetDisabledBorderColor( window, info->borderColor );
Color color, border;
color = TheDefaultScheme->getEnabledTextColor();
border = TheDefaultScheme->getEnabledTextBorderColor();
window->winSetEnabledTextColors( color, border );
color = TheDefaultScheme->getDisabledTextColor();
border = TheDefaultScheme->getDisabledTextBorderColor();
window->winSetDisabledTextColors( color, border );
color = TheDefaultScheme->getHiliteTextColor();
border = TheDefaultScheme->getHiliteTextBorderColor();
window->winSetHiliteTextColors( color, border );
// set default font
window->winSetFont( TheDefaultScheme->getFont() );
} // end if
// contents have changed
setUnsaved( TRUE );
// notify the editor of the new window
notifyNewWindow( window );
return window;
} // end newStaticText
// GUIEdit::createStatusBar ===================================================
/** Create a status bar at the bottom of the editor */
//=============================================================================
void GUIEdit::createStatusBar( void )
{
RECT rect;
Int width;
Int sizes[ STATUS_NUM_PARTS ];
// create the bar
m_statusBarHWnd = CreateStatusWindow( WS_CHILD |
WS_VISIBLE |
WS_CLIPSIBLINGS |
CCS_BOTTOM |
SBARS_SIZEGRIP,
"Ready",
m_appHWnd,
STATUS_BAR_ID );
// get size of status bar
GetWindowRect( m_statusBarHWnd, &rect );
width = rect.right - rect.left;
//
// split the bar up into segments so we can put different text in
// each of them
//
for( Int i = 0; i < STATUS_NUM_PARTS - 1; i++ )
{
sizes[ i ] = (i + 1) * (width / STATUS_NUM_PARTS);
} // end for i
sizes[ STATUS_NUM_PARTS - 1 ] = -1; // right edge
SendMessage( m_statusBarHWnd, SB_SETPARTS, STATUS_NUM_PARTS, (LPARAM)sizes );
} // end createStatusBar
// GUIEdit::statusMessage =====================================================
/** Set a message in the status bar */
//=============================================================================
void GUIEdit::statusMessage( StatusPart part, char *message )
{
// check for out of bounds part
if( part < 0 || part >= STATUS_NUM_PARTS )
{
DEBUG_LOG(( "Status message part out of range '%d', '%s'\n", part, message ));
assert( 0 );
return;
} // end if
if( m_statusBarHWnd )
SendMessage( m_statusBarHWnd, SB_SETTEXT, part, (LPARAM)message );
} // end statusMessage
// GUIEdit::createToolbar =====================================================
/** Create the toolbar for the editor */
//=============================================================================
void GUIEdit::createToolbar( void )
{
} // end createToolbar
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// GUIEdit::newLayout =========================================================
/** Reset the editor for a new layout */
//=============================================================================
Bool GUIEdit::newLayout( void )
{
// delete all windows
deleteAllWindows();
// we are now fresh and new, like when everything was green and good
setUnsaved( FALSE );
// remove layout entries
m_layoutInitString = GUIEDIT_NONE_STRING;
m_layoutUpdateString = GUIEDIT_NONE_STRING;
m_layoutShutdownString = GUIEDIT_NONE_STRING;
return TRUE;
} // end newLayout
// GUIEdit::menuExit ==========================================================
/** The user clicked on exit in the menu and wishes to exit the editor */
//=============================================================================
Bool GUIEdit::menuExit( void )
{
Int result;
//
// if the contents of the editor are unsaved ask the user if they want
// to save before quitting
//
if( m_unsaved )
{
result = MessageBox( m_appHWnd, "Save file before quitting?",
"Save?", MB_YESNOCANCEL );
if( result == IDCANCEL )
return TRUE; // no error
else if( result == IDYES )
{
Bool success;
// save all our data
success = TheEditor->menuSave();
//
// if we were unable to save file ask them if it's still OK to
// quit and lose the data
//
if( success == FALSE )
MessageBox( m_appHWnd,
"File not saved. If you continue to exit all data will be LOST!",
"File Not Saved", MB_OK );
} // end if
} // end if
// ask them if they really want to quit
result = MessageBox( m_appHWnd, "Exit GUIEdit?", "Really Quit?", MB_YESNO );
if( result == IDYES )
DestroyWindow( m_appHWnd );
return TRUE;
} // end menuExit
// GUIEdit::menuNew ===========================================================
/** file->new menu option */
//=============================================================================
Bool GUIEdit::menuNew( void )
{
//
// if the current data is unsaved ask the user if they want to save
// before proceeding with a new layout
//
if( m_unsaved == TRUE )
{
Int result;
result = MessageBox( m_appHWnd,
"Current data is not saved. Save before proceeding?",
"Save?",
MB_YESNOCANCEL );
if( result == IDCANCEL )
return TRUE; // no error
else if( result == IDYES )
{
Bool success;
// do the save
success = menuSave();
// save failed, ask to proceed anyway with new layout
if( success == FALSE )
{
result = MessageBox( m_appHWnd,
"File not saved. Proceed with new layout anyway? Current layout will be LOST!",
"File Not Saved",
MB_YESNO );
if( result == IDNO )
return TRUE; // they chose to proceed anyway, no error
} // end if
} // end if
} // end if
// reset the layout in the editor
strcpy( m_savePathAndFilename, "" );
strcpy( m_saveFilename, "" );
newLayout();
return TRUE;
} // end menuNew
// GUIEdit::stripNameDecorations ==============================================
/** Strip name decorations of the entire tree of windows */
//=============================================================================
void GUIEdit::stripNameDecorations( GameWindow *root )
{
// end of recursion
if( root == NULL )
return;
// strip off this name if present
WinInstanceData *instData = root->winGetInstanceData();
if( !instData->m_decoratedNameString.isEmpty() )
{
char nameOnly[ MAX_WINDOW_NAME_LEN ];
char *c;
// skip past the "filename.wnd:" to the name only
c = strchr( instData->m_decoratedNameString.str(), ':' );
if( c )
{
// skip beyong the scope resolution colon
c++;
// copy the name
strcpy( nameOnly, c );
// put the name only in the decoration field
instData->m_decoratedNameString = nameOnly;
} // end if
} // end if
// strip from children
GameWindow *child;
for( child = root->winGetChild(); child; child = child->winGetChild() )
stripNameDecorations( child );
// onto the next
stripNameDecorations( root->winGetNext() );
} // end stripNameDecorations
//=============================================================================
/** After a load, we will restore default callbacks to all user windows
* loaded from the file */
//=============================================================================
void GUIEdit::revertDefaultCallbacks( GameWindow *root )
{
// end recursion
if( root == NULL )
return;
// if this is a user window, set the default callbacks
if( windowIsGadget( root ) == FALSE )
{
root->winSetSystemFunc( TheWindowManager->getDefaultSystem() );
root->winSetInputFunc( TheWindowManager->getDefaultInput() );
root->winSetTooltipFunc( TheWindowManager->getDefaultTooltip() );
root->winSetDrawFunc( TheWindowManager->getDefaultDraw() );
} // end if
// do the children
revertDefaultCallbacks( root->winGetChild() );
// do the next window
revertDefaultCallbacks( root->winGetNext() );
} // end revertDefaultCallbacks
// GUIEdit::menuOpen ==========================================================
/** User has clicked on file->open */
//=============================================================================
Bool GUIEdit::menuOpen( void )
{
char *filePath;
//
// if the current data is unsaved ask the user if they want to save
// before proceeding with a new layout
//
if( m_unsaved == TRUE )
{
Int result;
result = MessageBox( m_appHWnd,
"Current data is not saved. Save before proceeding?",
"Save?",
MB_YESNOCANCEL );
if( result == IDCANCEL )
return TRUE; // no error
else if( result == IDYES )
{
Bool success;
// do the save
success = menuSave();
// save failed, ask to proceed anyway with new layout
if( success == FALSE )
{
result = MessageBox( m_appHWnd,
"File not saved. Proceed with open layout anyway? Current layout will be LOST!",
"File Not Saved",
MB_YESNO );
if( result == IDNO )
return TRUE; // they chose to proceed anyway, no error
} // end if
} // end if
} // end if
// open the standard window file browser
filePath = openDialog();
// if no filename came back they cancelled this operation
if( filePath == NULL )
return FALSE; // file not opened
//
// OK, given the full path to the file, save that full path and
// just the filename in members of the editor
//
setSaveFile( filePath );
// clear the contents of the editor
newLayout();
// load the new layout file
WindowLayoutInfo info;
TheWindowManager->winCreateFromScript( AsciiString(filePath), &info );
// save the strings loaded for the layout callbacks
setLayoutInit( info.initNameString );
setLayoutUpdate( info.updateNameString );
setLayoutShutdown( info.shutdownNameString );
//
// strip off all the decorations on each window name, they are
// unnecessary complication in the editor
//
stripNameDecorations( TheWindowManager->winGetWindowList() );
//
// remove the user callbacks and set them to default draw, input, etc ...
// we COULD use the real ones, but then we'd have to be assured that
// every one we wrote would behave if in the editor or the game.
// It's just easier to not worry about that, and the defaults are
// good enough for general purpose in all situations
//
revertDefaultCallbacks( TheWindowManager->winGetWindowList() );
// reset the tree view and add all the windows loaded
TheHierarchyView->reset();
GameWindow *window;
for( window = TheWindowManager->winGetWindowList();
window;
window = window->winGetNext() )
TheHierarchyView->addWindow( window, HIERARCHY_ADD_AT_BOTTOM );
/** @todo should probably make the window manager interface for
this a little nicer to tell us success and whatnot */
return TRUE;
} // end menuOpen
// GUIEdit::menuSave ==========================================================
/** file->save menu option */
//=============================================================================
Bool GUIEdit::menuSave( void )
{
Bool success;
// if no filename is yet specified then go through the save as logic
if( strlen( m_savePathAndFilename ) == 0 )
return menuSaveAs();
// save all our data to the specified filename
success = saveData( m_savePathAndFilename, m_saveFilename );
if( success == TRUE )
{
// our contents are now considered "unchanged"
setUnsaved( FALSE );
} // end if
else
{
MessageBox( m_appHWnd, "Layout not saved!", "Error", MB_OK );
} // end else
return success;
} // end menuSave
// GUIEdit::menuSaveAs ========================================================
/** file->saveAs menu option */
//=============================================================================
Bool GUIEdit::menuSaveAs( void )
{
char *filePath;
Bool success;
// open the standard window file browser
filePath = saveAsDialog();
// if no filename came back they cancelled this operation
if( filePath == NULL )
return FALSE; // save not done
// OK, save the filename we're going to use
setSaveFile( filePath );
// save all our data to the specified filename
success = saveData( m_savePathAndFilename, m_saveFilename );
if( success == TRUE )
{
// our contents are now considered "unchanged"
setUnsaved( FALSE );
} // end if
else
{
MessageBox( m_appHWnd, "Layout not saved!", "Error", MB_OK );
} // end else
return success;
} // end menuSaveAs
// GUIEdit::menuCopy ==========================================================
/** Copy selected windows into clipboard */
//=============================================================================
Bool GUIEdit::menuCopy( void )
{
WindowSelectionEntry *select;
// trivial case, nothing selected
select = getSelectList();
if( select == NULL )
{
MessageBox( m_appHWnd, "You must have windows selected before you can copy them.",
"No Windows Selected", MB_OK );
return TRUE;
} // end if
//
// cut the selected windows out of the current window system, and
// into the clipboard
//
TheGUIEditWindowManager->copySelectedToClipboard();
return TRUE;
} // end menuCopy
// GUIEdit::menuPaste =========================================================
/** Paste contents of clipboard into current layout */
//=============================================================================
Bool GUIEdit::menuPaste( void )
{
TheGUIEditWindowManager->pasteClipboard();
return TRUE;
} // end menuPaste
// GUIEdit::menuCut ===========================================================
/** Cut selected windows into the clipboard */
//=============================================================================
Bool GUIEdit::menuCut( void )
{
WindowSelectionEntry *select;
// trivial case, nothing selected
select = getSelectList();
if( select == NULL )
{
MessageBox( m_appHWnd, "You must have windows selected before you can cut.",
"No Windows Selected", MB_OK );
return TRUE;
} // end if
//
// cut the selected windows out of the current window system, and
// into the clipboard
//
TheGUIEditWindowManager->cutSelectedToClipboard();
return TRUE;
} // end menuCut
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// GUIEdit::isWindowSelected ==================================================
/** Is the window selected */
//=============================================================================
Bool GUIEdit::isWindowSelected( GameWindow *window )
{
WindowSelectionEntry *entry;
// sanity
if( window == NULL )
return FALSE;
// find entry
entry = findSelectionEntry( window );
if( entry )
return TRUE;
else
return FALSE;
} // end isWindowSelected
// GUIEdit::selectWindow ======================================================
/** Add window to selection list */
//=============================================================================
void GUIEdit::selectWindow( GameWindow *window )
{
WindowSelectionEntry *entry;
// sanity
if( window == NULL )
return;
// do not add to list if already on it
if( isWindowSelected( window ) == TRUE )
return;
// allocate new entry and add to list
entry = new WindowSelectionEntry;
if( entry == NULL )
{
DEBUG_LOG(( "Unable to allocate selection entry for window\n" ));
assert( 0 );
return;
} // end if
// fill out information and tie to head of list
entry->window = window;
entry->prev = NULL;
entry->next = m_selectList;
if( m_selectList )
m_selectList->prev = entry;
m_selectList = entry;
// select this window in the hierarchy if there is only one selected
if( selectionCount() == 1 )
TheHierarchyView->selectWindow( window );
} // end selectWindow
// GUIEdit::unSelectWindow ====================================================
/** Remove window from the selection list */
//=============================================================================
void GUIEdit::unSelectWindow( GameWindow *window )
{
WindowSelectionEntry *entry;
// sanity
if( window == NULL )
return;
// find entry
entry = findSelectionEntry( window );
if( entry )
{
// remove from list
if( entry->next )
entry->next->prev = entry->prev;
if( entry->prev )
entry->prev->next = entry->next;
else
m_selectList = entry->next;
// delete the entry
delete entry;
} // end if
} // end unSelectWindow
// GUIEdit::clearSelections ===================================================
/** Clear the entire selection list */
//=============================================================================
void GUIEdit::clearSelections( void )
{
while( m_selectList )
unSelectWindow( m_selectList->window );
} // end clearSelections
// GUIEdit::selectionCount ====================================================
/** How many items are selected */
//=============================================================================
Int GUIEdit::selectionCount( void )
{
WindowSelectionEntry *select;
Int count = 0;
select = m_selectList;
while( select )
{
count++;
select = select->next;
} // end while
return count;
} // end selectionCount
// GUIEdit::notifyNewWindow ===================================================
/** The passed in window has just been added into the GUI layout. It
* It may also contain children which we will recursively call upon
* so that every window gets a chance to run through this method */
//=============================================================================
void GUIEdit::notifyNewWindow( GameWindow *window )
{
// end of recursion
if( window == NULL )
return;
//
// add this window to the hierarchy view at the top, we're adding it
// at the bottom because presumabely this method was called directly after
// the window was placed in the world, and it now resides on the top
// of the window chain, therefore at the bottom of the hierarchy, drawn last
//
TheHierarchyView->addWindow( window, HIERARCHY_ADD_AT_TOP );
//
// call this notification method for any children we might have, we
// do NOT notify for the children of gadget controls since those are
// an "atomic" unit, (except for the Tab Control, which has window children)
//
if( (windowIsGadget( window ) == FALSE) || (window->winGetStyle() & GWS_TAB_CONTROL) )
{
GameWindow *child;
for( child = window->winGetChild(); child; child = child->winGetNext() )
notifyNewWindow( child );
} // end if
} // end notifyNewWindow
// GUIEdit::deleteSelected ====================================================
/** Delete the windows in the selection list */
//=============================================================================
void GUIEdit::deleteSelected( void )
{
Int count = TheEditor->selectionCount();
Int i;
GameWindow **deleteList;
WindowSelectionEntry *select;
//
// the act of deleting things can actually change selections, like when
// removing a hierarchy item, the selection is moved ... to avoid any
// confusion we will build a list of windows to be deleted, independent
// of the select list and delete those
//
deleteList = new GameWindow *[ count ];
if( deleteList == NULL )
{
DEBUG_LOG(( "Cannot allocate delete list!\n" ));
assert( 0 );
return;
} // end if
// fill out the delete list
for( i = 0, select = m_selectList; i < count; i++, select = select->next )
deleteList[ i ] = select->window;
// delete them all
for( i = 0; i < count; i++ )
deleteWindow( deleteList[ i ] );
// free memory for the delete list
delete [] deleteList;
} // end deleteSelected
// GUIEdit::bringSelectedToTop ================================================
/** Bring the selected windows to the top so they draw on top of
* other windows. For window with no parents this brings them to
* the top of the window stack for all windows, for child windows it will
* bring them to the top of the child list for their parent */
//=============================================================================
void GUIEdit::bringSelectedToTop( void )
{
Int count = TheEditor->selectionCount();
// no-op
if( count == 0 )
return;
//
// build a list of selections to operate on, we need to do this
// because the process of changing the hierarchy view will change the
// select list on us
//
GameWindow **snapshot;
snapshot = new GameWindow *[ count ];
if( snapshot == NULL )
{
DEBUG_LOG(( "bringSelectedToTop: Unabled to allocate selectList\n" ));
assert( 0 );
return;
} // end if
// take the snapshot
Int i;
WindowSelectionEntry *select;
for( i = 0, select = m_selectList; i < count; i++, select = select->next )
snapshot[ i ] = select->window;
// bring all the selected windows to the top
for( i = 0; i < count; i++ )
{
// bring window to the top
snapshot[ i ]->winBringToTop();
// update the hierarchy to have the new window on the top
TheHierarchyView->bringWindowToTop( snapshot[ i ] );
} // end for i
// delete the snapshot list
delete [] snapshot;
} // end bringSelectedToTop
// GUIEdit::dragMoveSelectedWindows ===========================================
/** Move all the windows in the selection list from a drag move, note
* that we are keeping the positions within the screen and parent
* windows */
//=============================================================================
void GUIEdit::dragMoveSelectedWindows( ICoord2D *dragOrigin,
ICoord2D *dragDest )
{
WindowSelectionEntry *select;
GameWindow *window;
ICoord2D moveLoc, safeLoc;
ICoord2D origin;
// sanity
if( dragOrigin == NULL || dragDest == NULL )
return;
// traverse selection list
select = m_selectList;
while( select )
{
// get window info
window = select->window;
window->winGetScreenPosition( &origin.x, &origin.y );
// compute new location
moveLoc.x = origin.x + (dragDest->x - dragOrigin->x);
moveLoc.y = origin.y + (dragDest->y - dragOrigin->y);
// snap move location to grid if on
if( (TheEditor->getMode() == MODE_DRAG_MOVE) && TheEditor->isGridSnapOn() )
TheEditor->gridSnapLocation( &moveLoc, &moveLoc );
// kee the location legal
computeSafeLocation( window, moveLoc.x, moveLoc.y, &safeLoc.x, &safeLoc.y );
// move the window
moveWindowTo( window, safeLoc.x, safeLoc.y );
// goto next selected window
select = select->next;
} // end while
} // end dragMoveSelectedWindows
// GUIEdit::getSelectList =====================================================
/** Return the selection list */
//=============================================================================
WindowSelectionEntry *GUIEdit::getSelectList( void )
{
return m_selectList;
} // end getSelectList
// GUIEdit::getFirstSelected ==================================================
/** Get the first GameWindow * from the selection list */
//=============================================================================
GameWindow *GUIEdit::getFirstSelected( void )
{
if( m_selectList )
return m_selectList->window;
return NULL;
} // end getFirstSelected
// GUIEdit::computeSafeLocation ===============================================
/** If we attempt to move the window to the given (x,y) it may result
* in that location being either outside of the screen or outside of
* the parent. This method will compute a location as close to the
* desired (x,y) as possible but still remain within the parent
* and on the screen */
//=============================================================================
void GUIEdit::computeSafeLocation( GameWindow *window,
Int x, Int y, Int *safeX, Int *safeY )
{
Int dx, dy;
ICoord2D origin, size;
GameWindow *parent;
IRegion2D region;
// get window position and size
window->winGetScreenPosition( &origin.x, &origin.y );
window->winGetSize( &size.x, &size.y );
// get region of the window in question
window->winGetRegion( ®ion );
// how far from window current position to new one
dx = x - origin.x;
dy = y - origin.y;
// clip window to parent if there is one
parent = window->winGetParent();
if( parent )
{
ICoord2D parentSize;
// get parent size
parent->winGetSize( &parentSize.x, &parentSize.y );
if( region.lo.x + dx < 0 )
dx = 0 - region.lo.x;
else if( region.hi.x + dx > parentSize.x )
dx = parentSize.x - region.hi.x;
if( region.lo.y + dy < 0 )
dy = 0 - region.lo.y;
else if( region.hi.y + dy > parentSize.y )
dy = parentSize.y - region.hi.y;
} // end else if, parent
// Move the window, but keep it completely visible within screen boundaries
IRegion2D newRegion;
ICoord2D grabSize;
window->winGetPosition( &newRegion.lo.x, &newRegion.lo.y );
window->winGetSize( &grabSize.x, &grabSize.y );
newRegion.lo.x += dx;
newRegion.lo.y += dy;
if( newRegion.lo.x < 0 )
newRegion.lo.x = 0;
if( newRegion.lo.y < 0 )
newRegion.lo.y = 0;
newRegion.hi.x = newRegion.lo.x + grabSize.x;
newRegion.hi.y = newRegion.lo.y + grabSize.y;
if( newRegion.hi.x > (Int)TheDisplay->getWidth() )
newRegion.hi.x = (Int)TheDisplay->getWidth();
if( newRegion.hi.y > (Int)TheDisplay->getHeight() )
newRegion.hi.y = (Int)TheDisplay->getHeight();
// compute new position
newRegion.lo.x = newRegion.hi.x - grabSize.x;
newRegion.lo.y = newRegion.hi.y - grabSize.y;
// safe position is now all figured out
*safeX = newRegion.lo.x;
*safeY = newRegion.lo.y;
} // end computeSafeLocation
// GUIEdit::computeSafeSizeLocation ===========================================
/** Like the method computeSafeLocation, this method also takes into
* account the new position AND size, keeping them within the
* screen and within any parents
*
* NOTE: this assumes it is for the resizing code which assumes that
* the resize will not invert across the anchor point so we're
* only checking origin points and sizes compared to parents
* and the screen;
*
* Location returned is relative to parent window if present
*/
//=============================================================================
void GUIEdit::computeSafeSizeLocation( GameWindow *window,
Int newX, Int newY,
Int newWidth, Int newHeight,
Int *safeX, Int *safeY,
Int *safeWidth, Int *safeHeight )
{
GameWindow *parent;
ICoord2D parentLoc;
ICoord2D parentSize;
ICoord2D topLeftLimit;
ICoord2D bottomRightLimit;
// get parent window and data is present
parent = window->winGetParent();
if( parent )
{
parent->winGetScreenPosition( &parentLoc.x, &parentLoc.y );
parent->winGetSize( &parentSize.x, &parentSize.y );
} // end if
// upper left corner must be in screen or in parent
topLeftLimit.x = 0; // screen top left
topLeftLimit.y = 0; // screen top left
if( parent )
topLeftLimit = parentLoc;
if( newX < topLeftLimit.x )
{
newWidth = newWidth - (topLeftLimit.x - newX);
newX = topLeftLimit.x;
}
if( newY < topLeftLimit.y )
{
newHeight = newHeight - (topLeftLimit.y - newY);
newY = topLeftLimit.y;
}
// check size at new position compared to parent or screen
bottomRightLimit.x = TheDisplay->getWidth();
bottomRightLimit.y = TheDisplay->getHeight();
if( parent )
{
bottomRightLimit.x = parentLoc.x + parentSize.x;
bottomRightLimit.y = parentLoc.y + parentSize.y;
} // end if
if( newX + newWidth > bottomRightLimit.x )
newWidth = bottomRightLimit.x - newX;
if( newY + newHeight > bottomRightLimit.y )
newHeight = bottomRightLimit.y - newY;
// all done, return location and width relative to parent
*safeWidth = newWidth;
*safeHeight = newHeight;
*safeX = newX;
*safeY = newY;
if( parent )
{
*safeX = *safeX - parentLoc.x;
*safeY = *safeY - parentLoc.y;
}
} // end computeSafeSizeLocation
// GUIEdit::computeResizeLocation =============================================
/** Given the current resize drag mode, the selected window to resize,
* the start location of the drag, and the end location of the drag,
* figure out what the upper left corner location and the size of the
* window should be */
//=============================================================================
void GUIEdit::computeResizeLocation( EditMode resizeMode,
GameWindow *window,
ICoord2D *resizeOrigin,
ICoord2D *resizeDest,
ICoord2D *resultLoc,
ICoord2D *resultSize )
{
Int newX, newY, newSizeX, newSizeY;
Int sizeLimit = 5;
// sanity
if( window == NULL || resizeOrigin == NULL || resizeDest == NULL ||
resultLoc == NULL || resultSize == NULL )
return;
// get the current position and size of the window
ICoord2D origin, size, bottomRight;
window->winGetScreenPosition( &origin.x, &origin.y );
window->winGetSize( &size.x, &size.y );
bottomRight.x = origin.x + size.x;
bottomRight.y = origin.y + size.y;
//
// compute new size and width based on which resize mode we're
// using for the anchor point of the window
//
switch( resizeMode )
{
// ------------------------------------------------------------------------
case MODE_RESIZE_TOP_LEFT:
// bottom right is the anchor
newX = origin.x + (resizeDest->x - resizeOrigin->x);
newY = origin.y + (resizeDest->y - resizeOrigin->y);
// don't let it become too small or inverted
if( newX >= bottomRight.x - sizeLimit )
newX = bottomRight.x - sizeLimit;
if( newY >= bottomRight.y - sizeLimit )
newY = bottomRight.y - sizeLimit;
// compute new size
newSizeX = bottomRight.x - newX;
newSizeY = bottomRight.y - newY;
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_TOP_RIGHT:
// bottom left is the anchor
newX = origin.x;
newY = resizeDest->y;
// don't let it become too small or inverted
if( newY >= bottomRight.y - sizeLimit )
newY = bottomRight.y - sizeLimit;
// compute new size
newSizeX = resizeDest->x - origin.x;
newSizeY = (origin.y + size.y) - resizeDest->y;
// don't let it invert
if( newSizeX < sizeLimit )
newSizeX = sizeLimit;
if( newSizeY < sizeLimit )
newSizeY = sizeLimit;
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_BOTTOM_RIGHT:
// top left is anchor
newX = origin.x;
newY = origin.y;
newSizeX = resizeDest->x - origin.x;
newSizeY = resizeDest->y - origin.y;
// don't let it invert or get too small
if( newSizeX < sizeLimit )
newSizeX = sizeLimit;
if( newSizeY < sizeLimit )
newSizeY = sizeLimit;
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_BOTTOM_LEFT:
// top right is the anchor
newX = resizeDest->x;
newY = origin.y;
// don't let it get too small or inverted
if( newX >= bottomRight.x - sizeLimit )
newX = bottomRight.x - sizeLimit;
// compute new size
newSizeX = bottomRight.x - newX;
newSizeY = resizeDest->y - origin.y;
// don't let it go inverted
if( newSizeY < sizeLimit )
newSizeY = sizeLimit;
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_TOP:
// bottom SIDE is the anchor
newX = origin.x;
newY = resizeDest->y;
// don't let it invert
if( newY >= bottomRight.y - sizeLimit )
newY = bottomRight.y - sizeLimit;
// compute new size
newSizeX = size.x;
newSizeY = bottomRight.y - newY;
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_RIGHT:
// left SIDE is the anchor
newX = origin.x;
newY = origin.y;
// compute new size
newSizeX = resizeDest->x - origin.x;
newSizeY = size.y;
// don't let it invert or get too small
if( newSizeX < sizeLimit )
newSizeX = sizeLimit;
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_BOTTOM:
// top SIDE is the anchor
newX = origin.x;
newY = origin.y;
// compute new size
newSizeX = size.x;
newSizeY = resizeDest->y - origin.y;
// dont' let it invert or get too small
if( newSizeY < sizeLimit )
newSizeY = sizeLimit;
break;
// ------------------------------------------------------------------------
case MODE_RESIZE_LEFT:
// right SIDE is the anchor
newX = resizeDest->x;
newY = origin.y;
// don't let it invert or get to small
if( newX >= bottomRight.x - sizeLimit )
newX = bottomRight.x - sizeLimit;
// compute new size
newSizeX = bottomRight.x - newX;
newSizeY = size.y;
break;
} // end switch( resizeMode )
// to finalize the size we must now clip to any parent or the screen
computeSafeSizeLocation( window,
newX, newY,
newSizeX, newSizeY,
&resultLoc->x, &resultLoc->y,
&resultSize->x, &resultSize->y );
} // end computeResizeLocation
// GUIEdit::moveWindowTo ======================================================
/** Move the window passed into the the absolute position (x,y),
* note that there is NO SAFE checking done on that position */
//=============================================================================
void GUIEdit::moveWindowTo( GameWindow *window, Int x, Int y )
{
// set the position
window->winSetPosition( x, y );
// we've now made a change
TheEditor->setUnsaved( TRUE );
} // end moveWindowTo
// GUIEdit::windowIsGadget ====================================================
/** Return TRUE if this window is one of our predefined gadtet types */
//=============================================================================
Bool GUIEdit::windowIsGadget( GameWindow *window )
{
// sanity
if( window == NULL )
return FALSE;
return BitTest( window->winGetStyle(), GWS_GADGET_WINDOW );
} // end windowIsGadget
// GUIEdit::gridSnapLocation ==================================================
/** Given the source input point, return in 'snapped' the closest grid
* point */
//=============================================================================
void GUIEdit::gridSnapLocation( ICoord2D *source, ICoord2D *snapped )
{
// sanity
if( source == NULL || snapped == NULL )
return;
snapped->x = (source->x / m_gridResolution) * m_gridResolution;
snapped->y = (source->y / m_gridResolution) * m_gridResolution;
} // end gridSnapLocation
// GUIEdit::checkMenuItem =====================================================
/** Check the menu item from the guiedit main menu */
//=============================================================================
void GUIEdit::checkMenuItem( Int item )
{
HMENU menu = GetMenu( m_appHWnd );
// sanity
if( menu == NULL )
return;
// check it
CheckMenuItem( menu, item, MF_CHECKED );
} // end checkMenuItem
// GUIEdit::unCheckMenuItem ===================================================
/** Un-check the menu item from the guiedit main menu */
//=============================================================================
void GUIEdit::unCheckMenuItem( Int item )
{
HMENU menu = GetMenu( m_appHWnd );
// sanity
if( menu == NULL )
return;
// check it
CheckMenuItem( menu, item, MF_UNCHECKED );
} // end unCheckMenuItem
// GUIEdit::isNameDuplicate ===================================================
/** Is the name passed in found as the name of any window in in the
* tree starting at root ... but we will ignore the window 'ignore'
* if present */
//=============================================================================
Bool GUIEdit::isNameDuplicate( GameWindow *root, GameWindow *ignore, AsciiString name )
{
WinInstanceData *instData;
// end of recursion, sanity for name, and empty name ("") is always OK
if( root == NULL || name.isEmpty() )
return FALSE; // name is a-ok! :)
// get instance data
instData = root->winGetInstanceData();
// compare name
if( root != ignore )
if( instData->m_decoratedNameString == name )
return TRUE; // no need to search anymore
//You only call this on the first child since the call right after it will handle siblings (depth first)
GameWindow *child = root->winGetChild();
if( isNameDuplicate( child, ignore, name ) == TRUE )
return TRUE; //duplicate was found
// check the next window in the list
return isNameDuplicate( root->winGetNext(), ignore, name );
} // end isNameDuplicate
// GUIEdit::loadGUIEditFontLibrary ============================================
/** Load the set of fonts that we will make available to users in
* in the editor */
//=============================================================================
void GUIEdit::loadGUIEditFontLibrary( FontLibrary *library )
{
// sanity
if( library == NULL )
return;
AsciiString fixedSys("FixedSys");
AsciiString times("Times New Roman");
library->getFont( fixedSys, 12, FALSE );
library->getFont( times, 14, FALSE );
library->getFont( times, 14, TRUE );
library->getFont( times, 12, FALSE );
library->getFont( times, 12, TRUE );
library->getFont( times, 10, FALSE );
library->getFont( times, 10, TRUE );
} // end loadGUIEditFontLibrary
// GUIEdit::setShowHiddenOutlines =============================================
//=============================================================================
void GUIEdit::setShowHiddenOutlines( Bool show )
{
m_showHiddenOutlines = show;
if( m_showHiddenOutlines )
CheckMenuItem( GetMenu( m_appHWnd ), MENU_SHOW_HIDDEN_OUTLINES, MF_CHECKED );
else
CheckMenuItem( GetMenu( m_appHWnd ), MENU_SHOW_HIDDEN_OUTLINES, MF_UNCHECKED );
} // end setShowHiddenOutlines
// GUIEdit::setShowSeeThruOutlines ============================================
//=============================================================================
void GUIEdit::setShowSeeThruOutlines( Bool show )
{
m_showSeeThruOutlines = show;
if( m_showSeeThruOutlines )
CheckMenuItem( GetMenu( m_appHWnd ), MENU_SHOW_SEE_THRU_OUTLINES, MF_CHECKED );
else
CheckMenuItem( GetMenu( m_appHWnd ), MENU_SHOW_SEE_THRU_OUTLINES, MF_UNCHECKED );
} // end setShowSeeThruOutlines