12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385 |
- /*
- ===========================================================================
- Doom 3 GPL Source Code
- Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
- This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
- Doom 3 Source Code 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.
- Doom 3 Source Code 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 Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
- In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
- If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
- ===========================================================================
- */
- #include "../../idlib/precompiled.h"
- #pragma hdrstop
- #include <io.h>
- #include "../../sys/win32/rc/guied_resource.h"
- #include "../../ui/DeviceContext.h"
- #include "GEApp.h"
- #include "GEOptionsDlg.h"
- #include "GEViewer.h"
- static const int IDM_WINDOWCHILD = 1000;
- static const int ID_GUIED_FILE_MRU1 = 10000;
- static INT_PTR CALLBACK AboutDlg_WndProc ( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
- {
- switch ( msg )
- {
- case WM_COMMAND:
- EndDialog ( hwnd, 1 );
- break;
- }
-
- return FALSE;
- }
- rvGEApp::rvGEApp ( )
- {
- mMDIFrame = NULL;
- mMDIClient = NULL;
- mRecentFileMenu = NULL;
- mViewer = NULL;
- mRecentFileInsertPos = 0;
- }
- rvGEApp::~rvGEApp ( )
- {
- DestroyAcceleratorTable ( mAccelerators );
- }
- /*
- ================
- rvGEApp::Initialize
- Initialize the gui editor application
- ================
- */
- bool rvGEApp::Initialize ( void )
- {
- mOptions.Init();
- // Mutually exclusive
- com_editors = EDITOR_GUI;
- Sys_GrabMouseCursor( false );
-
- // Load the options
- mOptions.Load ( );
- mInstance = win32.hInstance;
- // Create the accelerators
- mAccelerators = LoadAccelerators ( mInstance, MAKEINTRESOURCE(IDR_GUIED_ACCELERATORS) );
- // Register the window classes for the main frame and the mdi child window
- WNDCLASSEX wndClass;
- memset ( &wndClass, 0, sizeof(wndClass) );
- wndClass.cbSize = sizeof(WNDCLASSEX);
- wndClass.lpszClassName = "QUAKE4_GUIEDITOR_CLASS";
- wndClass.lpfnWndProc = FrameWndProc;
- wndClass.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
- wndClass.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
- wndClass.lpszMenuName = MAKEINTRESOURCE(IDR_GUIED_MAIN);
- wndClass.hInstance = mInstance;
- RegisterClassEx ( &wndClass );
- wndClass.lpszMenuName = NULL;
- wndClass.lpfnWndProc = MDIChildProc;
- wndClass.lpszClassName = "QUAKE4_GUIEDITOR_CHILD_CLASS";
- wndClass.style = CS_OWNDC|CS_DBLCLKS|CS_BYTEALIGNWINDOW|CS_VREDRAW|CS_HREDRAW;
- wndClass.hbrBackground = (HBRUSH)GetStockObject( LTGRAY_BRUSH );
- RegisterClassEx ( &wndClass );
-
- // Create the main window
- mMDIFrame = CreateWindow ( "QUAKE4_GUIEDITOR_CLASS",
- "Quake IV GUI Editor",
- WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS,
- CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
- NULL, NULL, mInstance, (LPVOID)this );
- if ( !mMDIFrame )
- {
- return false;
- }
- SetClassLong( mMDIFrame, GCL_HICON, ( LONG )LoadIcon( win32.hInstance, MAKEINTRESOURCE( IDI_GUIED ) ) );
-
- // Create the MDI window
- CLIENTCREATESTRUCT ccs;
- ccs.hWindowMenu = GetSubMenu ( GetMenu ( mMDIFrame ), 5 );
- ccs.idFirstChild = IDM_WINDOWCHILD;
- mMDIClient = CreateWindow ( "MDICLIENT", NULL,
- WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
- 0, 0, 1000, 1000,
- mMDIFrame, NULL,
- mInstance, &ccs );
- if ( !mMDIClient )
- {
- DestroyWindow ( mMDIFrame );
- return false;
- }
- // hide the doom window by default
- ::ShowWindow ( win32.hWnd, SW_HIDE );
-
- // Show both windows
- mOptions.GetWindowPlacement ( "mdiframe", mMDIFrame );
- ShowWindow ( mMDIFrame, SW_SHOW );
- UpdateWindow ( mMDIFrame );
- ShowWindow ( mMDIClient, SW_SHOW );
- UpdateWindow ( mMDIClient );
-
- return true;
- }
- /*
- ================
- rvGEApp::GetActiveWorkspace
- Retrieves the workspace pointer for the active workspace. If there is no active
- workspace then it will return NULL
- ================
- */
- rvGEWorkspace* rvGEApp::GetActiveWorkspace ( HWND* ret )
- {
- rvGEWorkspace* workspace;
- HWND active;
-
- workspace = NULL;
- active = (HWND)SendMessage ( mMDIClient, WM_MDIGETACTIVE, 0, NULL );
- // Return the window handle if requested
- if ( ret )
- {
- *ret = active;
- }
- if ( !active )
- {
- return NULL;
- }
-
- return rvGEWorkspace::GetWorkspace ( active );
- }
- /*
- ================
- rvGEApp::TranslateAccelerator
- Translate any accelerators destined for this window
- ================
- */
- bool rvGEApp::TranslateAccelerator ( LPMSG msg )
- {
- HWND focus;
- if ( msg->message == WM_SYSCHAR )
- {
- SetFocus ( GetMDIClient ( ) );
- msg->hwnd = GetMDIClient ( );
- }
- if ( mViewer )
- {
- return false;
- }
- focus = GetActiveWindow ( );
- // Only use accelerators when on the main window or navigator window
- if ( focus == mMDIClient || focus == mMDIFrame ||
- focus == GetNavigator().GetWindow ( ) )
- {
- if ( ::TranslateAccelerator ( mMDIFrame, mAccelerators, msg ) )
- {
- return true;
- }
- }
-
- if ( TranslateMDISysAccel ( mMDIClient, msg ) )
- {
- return true;
- }
-
- return false;
- }
- /*
- ================
- rvGEApp::RunFrame
- Runs the current frame which causes the active window to be redrawn
- ================
- */
- void rvGEApp::RunFrame ( void )
- {
- HWND wnd;
- rvGEWorkspace* workspace = GetActiveWorkspace ( &wnd );
- if ( workspace )
- {
- // Render the workspace using a temp DC
- HDC hDC = GetDC ( wnd );
- workspace->Render ( hDC );
- ReleaseDC ( wnd, hDC );
-
- if ( mViewer )
- {
- mViewer->RunFrame ( );
- }
- }
- }
- /*
- ================
- rvGEApp::FrameWndProc
- Main frame window procedure
- ================
- */
- LRESULT CALLBACK rvGEApp::FrameWndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
- {
- rvGEApp* app = (rvGEApp*) GetWindowLong ( hWnd, GWL_USERDATA );
- switch ( uMsg )
- {
- case WM_SIZE:
- {
- RECT rStatus;
- RECT rClient;
- // Tell the status bar to resize
- app->mStatusBar.Resize ( LOWORD(lParam), HIWORD(lParam) );
-
- // Calculate the new client window rectangle (minus the status bar)
- GetWindowRect ( app->mStatusBar.GetWindow ( ), &rStatus );
- GetClientRect ( hWnd, &rClient );
- if ( app->mOptions.GetStatusBarVisible ( ) )
- {
- rClient.bottom -= (rStatus.bottom-rStatus.top);
- }
- MoveWindow ( app->mMDIClient, 0, 0, rClient.right-rClient.left, rClient.bottom-rClient.top, FALSE );
-
- return 0;
- }
-
- case WM_ENABLE:
- {
- int i;
- // Synchronise all toolwindows to the same state.
- for(i = 0; i < app->mToolWindows.Num(); i++)
- {
- if(app->mToolWindows[i] != hWnd)
- {
- EnableWindow(app->mToolWindows[i], wParam);
- }
- }
- break;
- }
- case WM_NCACTIVATE:
- return app->ToolWindowActivate ( hWnd, uMsg, wParam, lParam );
- case WM_ACTIVATE:
- common->ActivateTool( LOWORD( wParam ) != WA_INACTIVE );
- break;
- case WM_INITMENUPOPUP:
- app->HandleInitMenu ( wParam, lParam );
- break;
- case WM_CLOSE:
- while ( app->mWorkspaces.Num ( ) )
- {
- SendMessage ( app->mWorkspaces[0]->GetWindow ( ), WM_CLOSE, 0, 0 );
- }
- break;
- case WM_DESTROY:
- app->mOptions.SetWindowPlacement ( "mdiframe", hWnd );
- app->mOptions.Save ( );
- ExitProcess(0);
- break;
- case WM_COMMAND:
- {
- int result;
- assert ( app );
- result = app->HandleCommand ( wParam, lParam );
- if ( -1 != result )
- {
- return result;
- }
- break;
- }
- case WM_CREATE:
- {
- LPCREATESTRUCT cs;
-
- cs = (LPCREATESTRUCT) lParam;
- app = (rvGEApp*)cs->lpCreateParams;
- assert ( app );
-
- SetWindowLong ( hWnd, GWL_USERDATA, (LONG)app );
- app->mMDIFrame = hWnd;
-
- app->InitRecentFiles ( );
- app->UpdateRecentFiles ( );
- app->mNavigator.Create ( hWnd, gApp.mOptions.GetNavigatorVisible ( ) );
- app->mTransformer.Create ( hWnd, gApp.mOptions.GetTransformerVisible ( ) );
- app->mStatusBar.Create ( hWnd, 9999, gApp.mOptions.GetStatusBarVisible ( ) );
- app->mProperties.Create ( hWnd, gApp.mOptions.GetPropertiesVisible ( ) );
- // add all the tool windows to the tool window array
- app->mToolWindows.Append ( app->mMDIFrame );
- app->mToolWindows.Append ( app->mNavigator.GetWindow ( ) );
- app->mToolWindows.Append ( app->mProperties.GetWindow ( ) );
- app->mToolWindows.Append ( app->mTransformer.GetWindow ( ) );
-
- SendMessage ( app->mNavigator.GetWindow ( ), WM_NCACTIVATE, true, (LONG)-1 );
- SendMessage ( app->mProperties.GetWindow ( ), WM_NCACTIVATE, true, (LONG)-1 );
- SendMessage ( app->mTransformer.GetWindow ( ), WM_NCACTIVATE, true, (LONG)-1 );
- break;
- }
- }
- return DefFrameProc ( hWnd, app?app->mMDIClient:NULL, uMsg, wParam, lParam );
- }
- /*
- ================
- rvGEApp::MDIChildProc
- MDI Child window procedure
- ================
- */
- LRESULT CALLBACK rvGEApp::MDIChildProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
- {
- rvGEWorkspace* workspace = (rvGEWorkspace*)GetWindowLong ( hWnd, GWL_USERDATA );
- // Give the active workspace a chance to play with it
- if ( workspace )
- {
- workspace->HandleMessage ( uMsg, wParam, lParam );
- }
- switch ( uMsg )
- {
- case WM_CLOSE:
- workspace->GetApplication ( )->mWorkspaces.Remove ( workspace );
- break;
- case WM_CREATE:
- {
- LPMDICREATESTRUCT mdics;
- LPCREATESTRUCT cs;
-
- // MDI windows have their creation params buried two levels deep, extract
- // that param since it is the workspace pointer
- cs = (LPCREATESTRUCT) lParam;
- mdics = (LPMDICREATESTRUCT) cs->lpCreateParams;
-
- // Attach the workspace to the window
- workspace = (rvGEWorkspace*) mdics->lParam;
- workspace->Attach ( hWnd );
- workspace->GetApplication ( )->mWorkspaces.Append ( workspace );
-
- break;
- }
- case WM_MDIACTIVATE:
- assert ( workspace );
- if ( (HWND)lParam == hWnd )
- {
- workspace->GetApplication ( )->GetNavigator().SetWorkspace(workspace);
- workspace->GetApplication ( )->GetTransformer().SetWorkspace(workspace);
- workspace->GetApplication ( )->GetProperties().SetWorkspace(workspace);
- gApp.GetStatusBar ( ).SetSimple ( false );
- }
- else if ( lParam == NULL )
- {
- gApp.GetStatusBar ( ).SetSimple ( true );
- }
- break;
- case WM_DESTROY:
- assert ( workspace );
- workspace->Detach ( );
- delete workspace;
- break;
- case WM_SETCURSOR:
- return 1;
- case WM_ERASEBKGND:
- return TRUE;
- case WM_PAINT:
- {
- HDC dc;
- PAINTSTRUCT ps;
-
- dc = BeginPaint(hWnd, &ps);
-
- if ( workspace )
- {
- workspace->Render ( dc );
- }
-
- EndPaint(hWnd, &ps);
-
- break;
- }
- }
-
- return DefMDIChildProc ( hWnd, uMsg, wParam, lParam );
- }
- /*
- ================
- rvGEApp::HandleCommandSave
- Handles the ID_GUIED_FILE_SAVE and ID_GUIED_FILE_SAVEAS commands
- ================
- */
- void rvGEApp::HandleCommandSave ( rvGEWorkspace* workspace, const char* filename )
- {
- idStr realFilename;
-
- // See if we need to browse for a filename
- if ( workspace->IsNew ( ) || filename == NULL )
- {
- OPENFILENAME ofn;
- char szFile[MAX_PATH];
- strcpy ( szFile, workspace->GetFilename ( ) );
- // Initialize OPENFILENAME
- ZeroMemory(&ofn, sizeof(OPENFILENAME));
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = mMDIFrame;
- ofn.lpstrFile = szFile;
- ofn.nMaxFile = sizeof(szFile);
- ofn.lpstrFilter = "GUI Files\0*.GUI\0All Files\0*.*\0";
- ofn.nFilterIndex = 1;
- ofn.Flags = OFN_PATHMUSTEXIST;
- // Display the save dialog box.
- if ( !GetSaveFileName(&ofn) )
- {
- return;
- }
- realFilename = ofn.lpstrFile;
- realFilename.StripFileExtension ( );
- realFilename.Append ( ".gui" );
- // If the file already exists then warn about overwriting it
- if ( _taccess ( realFilename, 0 ) == 0 )
- {
- if ( IDNO == MessageBox ( va("File '%s' already exists. Do you want to replace it?", realFilename.c_str()), MB_YESNO|MB_ICONQUESTION ) )
- {
- return;
- }
- }
- }
- else
- {
- realFilename = filename;
- }
- // Now performe the file save
- if ( workspace->SaveFile ( realFilename ) )
- {
- mOptions.AddRecentFile ( workspace->GetFilename ( ) );
- UpdateRecentFiles ( );
- }
- else
- {
- MessageBox ( va("Could not write file '%s'", workspace->GetFilename()), MB_OK|MB_ICONERROR );
- }
- }
- /*
- ================
- rvGEApp::HandleCommand
- Handles the WM_COMMAND message
- ================
- */
- int rvGEApp::HandleCommand ( WPARAM wParam, LPARAM lParam )
- {
- HWND active;
- rvGEWorkspace* workspace = GetActiveWorkspace ( &active );
- // The recent file list needs to be handled specially
- if ( LOWORD(wParam) >= ID_GUIED_FILE_MRU1 && LOWORD(wParam) < ID_GUIED_FILE_MRU1 + rvGEOptions::MAX_MRU_SIZE )
- {
- OpenFile ( mOptions.GetRecentFile ( mOptions.GetRecentFileCount() - (LOWORD(wParam)-ID_GUIED_FILE_MRU1) - 1 ) );
- return 0;
- }
-
- switch ( LOWORD ( wParam ) )
- {
- case ID_GUIED_SOURCECONTROL_CHECKIN:
- assert ( workspace );
- HandleCommandSave ( workspace, workspace->GetFilename ( ) );
- workspace->CheckIn ( );
- break;
-
- case ID_GUIED_SOURCECONTROL_CHECKOUT:
- assert ( workspace );
- workspace->CheckOut ( );
- break;
- case ID_GUIED_SOURCECONTROL_UNDOCHECKOUT:
- assert ( workspace );
- if ( IDYES == MessageBox ( va("Are you sure you want to undo the checkout of the file '%s'?",workspace->GetFilename()), MB_YESNO|MB_ICONQUESTION) )
- {
- workspace->UndoCheckout ( );
- }
- break;
-
- case ID_GUIED_TOOLS_RELOADMATERIALS:
- SetCursor ( LoadCursor ( NULL, MAKEINTRESOURCE(IDC_WAIT) ) );
- cmdSystem->BufferCommandText( CMD_EXEC_NOW, "reloadImages\n" );
- cmdSystem->BufferCommandText( CMD_EXEC_NOW, "reloadMaterials\n" );
- SetCursor ( LoadCursor ( NULL, MAKEINTRESOURCE(IDC_ARROW) ) );
- break;
-
- case ID_GUIED_EDIT_COPY:
- assert ( workspace );
- workspace->Copy ( );
- break;
- case ID_GUIED_EDIT_PASTE:
- assert ( workspace );
- workspace->Paste ( );
- break;
-
- case ID_GUIED_HELP_ABOUT:
- DialogBox ( GetInstance(), MAKEINTRESOURCE(IDD_GUIED_ABOUT), mMDIFrame, AboutDlg_WndProc );
- break;
-
- case ID_GUIED_TOOLS_VIEWER:
- {
- if ( mViewer )
- {
- break;
- }
-
- mViewer = new rvGEViewer;
- if ( !mViewer->Create ( mMDIFrame ) )
- {
- delete mViewer;
- mViewer = NULL;
- }
-
- if ( workspace )
- {
- if ( !workspace->IsModified () || HandleCommand ( MAKELONG(ID_GUIED_FILE_SAVE,0), 0 ) )
- {
- mViewer->OpenFile ( workspace->GetFilename ( ) );
- }
- }
-
- SetActiveWindow ( mViewer->GetWindow ( ) );
- break;
- }
-
- case ID_GUIED_ITEM_MAKESAMESIZEWIDTH:
- assert ( workspace );
- workspace->MakeSelectedSameSize ( true, false );
- break;
- case ID_GUIED_ITEM_MAKESAMESIZEBOTH:
- assert ( workspace );
- workspace->MakeSelectedSameSize ( true, true );
- break;
- case ID_GUIED_ITEM_MAKESAMESIZEHEIGHT:
- assert ( workspace );
- workspace->MakeSelectedSameSize ( false, true );
- break;
-
- case ID_GUIED_ITEM_ALIGNLEFTS:
- assert ( workspace );
- workspace->AlignSelected ( rvGEWorkspace::ALIGN_LEFTS );
- break;
- case ID_GUIED_ITEM_ALIGNCENTERS:
- assert ( workspace );
- workspace->AlignSelected ( rvGEWorkspace::ALIGN_CENTERS );
- break;
- case ID_GUIED_ITEM_ALIGNRIGHTS:
- assert ( workspace );
- workspace->AlignSelected ( rvGEWorkspace::ALIGN_RIGHTS );
- break;
- case ID_GUIED_ITEM_ALIGNTOPS:
- assert ( workspace );
- workspace->AlignSelected ( rvGEWorkspace::ALIGN_TOPS );
- break;
- case ID_GUIED_ITEM_ALIGNMIDDLES:
- assert ( workspace );
- workspace->AlignSelected ( rvGEWorkspace::ALIGN_MIDDLES );
- break;
- case ID_GUIED_ITEM_ALIGNBOTTOMS:
- assert ( workspace );
- workspace->AlignSelected ( rvGEWorkspace::ALIGN_BOTTOMS );
- break;
-
- case ID_GUIED_ITEM_ARRANGESENDBACKWARD:
- assert ( workspace );
- workspace->SendSelectedBackward ( );
- break;
- case ID_GUIED_ITEM_ARRANGESENDTOBACK:
- assert ( workspace );
- workspace->SendSelectedToBack( );
- break;
- case ID_GUIED_ITEM_ARRANGEBRINGFORWARD:
- assert ( workspace );
- workspace->BringSelectedForward ( );
- break;
- case ID_GUIED_ITEM_ARRANGEBRINGTOFRONT:
- assert ( workspace );
- workspace->BringSelectedToFront ( );
- break;
-
- case ID_GUIED_ITEM_ARRANGEMAKECHILD:
- assert ( workspace );
- workspace->MakeSelectedAChild ( );
- break;
-
- case ID_GUIED_ITEM_PROPERTIES:
- assert ( workspace );
- workspace->EditSelectedProperties ( );
- break;
- case ID_GUIED_ITEM_SCRIPTS:
- assert ( workspace );
- workspace->EditSelectedScripts ( );
- break;
-
- case ID_GUIED_ITEM_NEWWINDOWDEF:
- assert ( workspace );
- workspace->AddWindow ( rvGEWindowWrapper::WT_NORMAL );
- break;
- case ID_GUIED_ITEM_NEWEDITDEF:
- assert ( workspace );
- workspace->AddWindow ( rvGEWindowWrapper::WT_EDIT );
- break;
- case ID_GUIED_ITEM_NEWHTMLDEF:
- assert ( workspace );
- workspace->AddWindow ( rvGEWindowWrapper::WT_HTML );
- break;
- case ID_GUIED_ITEM_NEWCHOICEDEF:
- assert ( workspace );
- workspace->AddWindow ( rvGEWindowWrapper::WT_CHOICE );
- break;
- case ID_GUIED_ITEM_NEWSLIDERDEF:
- assert ( workspace );
- workspace->AddWindow ( rvGEWindowWrapper::WT_SLIDER );
- break;
- case ID_GUIED_ITEM_NEWLISTDEF:
- assert ( workspace );
- workspace->AddWindow ( rvGEWindowWrapper::WT_LIST );
- break;
- case ID_GUIED_ITEM_NEWBINDDEF:
- assert ( workspace );
- workspace->AddWindow ( rvGEWindowWrapper::WT_BIND );
- break;
- case ID_GUIED_ITEM_NEWRENDERDEF:
- assert ( workspace );
- workspace->AddWindow ( rvGEWindowWrapper::WT_RENDER );
- break;
-
- case ID_GUIED_WINDOW_TILE:
- SendMessage ( mMDIClient, WM_MDITILE, 0, 0 );
- break;
- case ID_GUIED_WINDOW_CASCADE:
- SendMessage ( mMDIClient, WM_MDICASCADE, 0, 0 );
- break;
- case ID_GUIED_VIEW_STATUSBAR:
- {
- RECT rWindow;
-
- mStatusBar.Show ( mOptions.GetStatusBarVisible()?false:true );
-
- GetWindowRect ( mMDIFrame, &rWindow );
- SendMessage ( mMDIFrame, WM_SIZE, 0, MAKELONG ( rWindow.right-rWindow.left, rWindow.bottom-rWindow.top ) );
- break;
- }
- case ID_GUIED_WINDOW_SHOWNAVIGATOR:
- mNavigator.Show ( mOptions.GetNavigatorVisible()?false:true );
- break;
-
- case ID_GUIED_WINDOW_SHOWPROPERTIES:
- mProperties.Show ( mOptions.GetPropertiesVisible()?false:true );
- break;
-
- case ID_GUIED_WINDOW_SHOWTRANSFORMER:
- mTransformer.Show ( mOptions.GetTransformerVisible()?false:true );
- break;
-
- case ID_GUIED_EDIT_DELETE:
- assert ( workspace );
- workspace->DeleteSelected ( );
- break;
- case ID_GUIED_VIEW_HIDESELECTED:
- assert ( workspace );
- workspace->HideSelected ( );
- break;
- case ID_GUIED_VIEW_UNHIDESELECTED:
- assert ( workspace );
- workspace->UnhideSelected ( );
- break;
-
- case ID_GUIED_VIEW_SHOWHIDDEN:
- assert ( workspace );
- workspace->ShowHidden ( );
- break;
-
- case ID_GUIED_EDIT_UNDO:
- assert ( workspace );
- workspace->GetModifierStack().Undo ( );
- mNavigator.Update ( );
- mTransformer.Update ( );
- break;
- case ID_GUIED_EDIT_REDO:
- assert ( workspace );
- workspace->GetModifierStack().Redo ( );
- mNavigator.Update ( );
- mTransformer.Update ( );
- break;
-
- case ID_GUIED_VIEW_OPTIONS:
- GEOptionsDlg_DoModal ( mMDIFrame );
- break;
-
- case ID_GUIED_VIEW_SHOWGRID:
- mOptions.SetGridVisible ( mOptions.GetGridVisible()?false:true );
- break;
- case ID_GUIED_VIEW_SNAPTOGRID:
- mOptions.SetGridSnap ( mOptions.GetGridSnap ()?false:true );
- break;
-
- case ID_GUIED_VIEW_ZOOMIN:
- assert ( workspace );
- workspace->ZoomIn ( );
- break;
-
- case ID_GUIED_VIEW_ZOOMOUT:
- assert ( workspace );
- workspace->ZoomOut ( );
- break;
-
- case ID_GUIED_FILE_EXIT:
- DestroyWindow ( mMDIFrame );
- break;
- case ID_GUIED_FILE_CLOSE:
- if ( active )
- {
- assert ( workspace );
- SendMessage ( active, WM_CLOSE, 0, 0 );
- }
- break;
-
- case ID_GUIED_FILE_NEW:
- NewFile ( );
- break;
- case ID_GUIED_FILE_SAVE:
- assert ( workspace );
- HandleCommandSave ( workspace, workspace->GetFilename ( ) );
- break;
- case ID_GUIED_FILE_SAVEAS:
- assert ( workspace );
- HandleCommandSave ( workspace, NULL );
- break;
-
- case ID_GUIED_FILE_OPEN:
- {
- OPENFILENAME ofn;
- char szFile[MAX_PATH] = "";
- // Initialize OPENFILENAME
- ZeroMemory(&ofn, sizeof(OPENFILENAME));
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = mMDIFrame;
- ofn.lpstrFile = szFile;
- ofn.nMaxFile = sizeof(szFile);
- ofn.lpstrFilter = "GUI Files\0*.GUI\0All Files\0*.*\0";
- ofn.nFilterIndex = 1;
- ofn.lpstrFileTitle = NULL;
- ofn.nMaxFileTitle = 0;
- ofn.lpstrInitialDir = NULL;
- ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
- // Display the Open dialog box.
- if (GetOpenFileName(&ofn)==TRUE)
- {
- OpenFile ( ofn.lpstrFile );
- }
- break;
- }
- }
-
- return -1;
- }
- /*
- ================
- rvGEApp::HandleInitMenu
- Handles the initialization of the main menu
- ================
- */
- int rvGEApp::HandleInitMenu ( WPARAM wParam, LPARAM lParam )
- {
- int cMenuItems = GetMenuItemCount((HMENU)wParam);
- int nPos;
- int id;
- UINT flags;
- rvGEWorkspace* workspace;
- HMENU hmenu;
-
- hmenu = (HMENU) wParam;
- workspace = GetActiveWorkspace ( );
- // Run through all the menu items in the menu and see if any of them need
- // modification in any way
- for (nPos = 0; nPos < cMenuItems; nPos++)
- {
- id = GetMenuItemID(hmenu, nPos);
- flags = 0;
-
- // Handle popup menus too
- if ( id < 0 )
- {
- HMENU sub = GetSubMenu ( hmenu, nPos );
- if ( sub )
- {
- HandleInitMenu ( (WPARAM) sub, 0 );
- continue;
- }
- }
-
- // Menu items that are completely unrelated to the workspace
- switch ( id )
- {
- case ID_GUIED_VIEW_STATUSBAR:
- flags = MF_BYCOMMAND | (mOptions.GetStatusBarVisible()?MF_CHECKED:MF_UNCHECKED);
- CheckMenuItem ( hmenu, id, flags );
- break;
- case ID_GUIED_WINDOW_SHOWNAVIGATOR:
- flags = MF_BYCOMMAND | (mOptions.GetNavigatorVisible()?MF_CHECKED:MF_UNCHECKED);
- CheckMenuItem ( hmenu, id, flags );
- break;
-
- case ID_GUIED_WINDOW_SHOWPROPERTIES:
- flags = MF_BYCOMMAND | (mOptions.GetPropertiesVisible()?MF_CHECKED:MF_UNCHECKED);
- CheckMenuItem ( hmenu, id, flags );
- break;
- case ID_GUIED_WINDOW_SHOWTRANSFORMER:
- flags = MF_BYCOMMAND | (mOptions.GetTransformerVisible()?MF_CHECKED:MF_UNCHECKED);
- CheckMenuItem ( hmenu, id, flags );
- break;
- }
-
- // Handle the basic case where an item is disabled because
- // there is no workspace available
- if ( !workspace )
- {
- switch ( id )
- {
- case ID_GUIED_EDIT_UNDO:
- case ID_GUIED_EDIT_REDO:
- case ID_GUIED_VIEW_SHOWGRID:
- case ID_GUIED_VIEW_SNAPTOGRID:
- case ID_GUIED_VIEW_HIDESELECTED:
- case ID_GUIED_VIEW_UNHIDESELECTED:
- case ID_GUIED_EDIT_DELETE:
- case ID_GUIED_WINDOW_TILE:
- case ID_GUIED_WINDOW_CASCADE:
- case ID_GUIED_ITEM_NEWWINDOWDEF:
- case ID_GUIED_ITEM_NEWEDITDEF:
- case ID_GUIED_ITEM_NEWHTMLDEF:
- case ID_GUIED_ITEM_ARRANGEBRINGTOFRONT:
- case ID_GUIED_ITEM_ARRANGEBRINGFORWARD:
- case ID_GUIED_ITEM_ARRANGESENDTOBACK:
- case ID_GUIED_ITEM_ARRANGESENDBACKWARD:
- case ID_GUIED_ITEM_PROPERTIES:
- case ID_GUIED_ITEM_SCRIPTS:
- case ID_GUIED_VIEW_ZOOMIN:
- case ID_GUIED_VIEW_ZOOMOUT:
- case ID_GUIED_ITEM_ALIGNLEFTS:
- case ID_GUIED_ITEM_ALIGNCENTERS:
- case ID_GUIED_ITEM_ALIGNRIGHTS:
- case ID_GUIED_ITEM_ALIGNBOTTOMS:
- case ID_GUIED_ITEM_ALIGNMIDDLES:
- case ID_GUIED_ITEM_ALIGNTOPS:
- case ID_GUIED_ITEM_MAKESAMESIZEHEIGHT:
- case ID_GUIED_ITEM_MAKESAMESIZEWIDTH:
- case ID_GUIED_ITEM_MAKESAMESIZEBOTH:
- case ID_GUIED_FILE_SAVE:
- case ID_GUIED_FILE_SAVEAS:
- case ID_GUIED_EDIT_COPY:
- case ID_GUIED_EDIT_PASTE:
- case ID_GUIED_ITEM_ARRANGEMAKECHILD:
- case ID_GUIED_SOURCECONTROL_GETLATESTVERSION:
- case ID_GUIED_SOURCECONTROL_CHECKIN:
- case ID_GUIED_SOURCECONTROL_CHECKOUT:
- case ID_GUIED_SOURCECONTROL_UNDOCHECKOUT:
- case ID_GUIED_FILE_CLOSE:
- EnableMenuItem ( hmenu, nPos, MF_GRAYED|MF_BYPOSITION );
- break;
- }
- continue;
- }
- switch (id)
- {
- // Undo is greyed out when there is noting to undo and the text is
- // modified to include the name of the modifier that will be undone
- case ID_GUIED_EDIT_UNDO:
- {
- MENUITEMINFO info;
- idStr undo;
- info.cbSize = sizeof(info);
- info.fMask = MIIM_STATE|MIIM_TYPE;
- info.fType = MFT_STRING;
-
- if ( !workspace->GetModifierStack().CanUndo ( ) )
- {
- undo = "Undo\tCtrl+Z";
- info.fState = MFS_GRAYED;
- }
- else
- {
- undo = "Undo ";
- undo.Append ( workspace->GetModifierStack().GetUndoModifier()->GetName ( ) );
- undo.Append ( "\tCtrl+Z" );
- info.fState = MFS_ENABLED;
- }
- info.dwTypeData = (LPSTR)undo.c_str();
- info.cch = undo.Length ( );
-
- SetMenuItemInfo ( hmenu, id, FALSE, &info );
- break;
- }
- case ID_GUIED_EDIT_REDO:
- {
- MENUITEMINFO info;
- idStr undo;
- info.cbSize = sizeof(info);
- info.fMask = MIIM_STATE|MIIM_TYPE;
- info.fType = MFT_STRING;
-
- if ( !workspace || !workspace->GetModifierStack().CanRedo ( ) )
- {
- undo = "Redo\tCtrl+Y";
- info.fState = MFS_GRAYED;
- }
- else
- {
- undo = "Redo ";
- undo.Append ( workspace->GetModifierStack().GetRedoModifier()->GetName ( ) );
- undo.Append ( "\tCtrl+Y" );
- info.fState = MFS_ENABLED;
- }
- info.dwTypeData = (LPSTR)undo.c_str();
- info.cch = undo.Length ( );
-
- SetMenuItemInfo ( hmenu, id, FALSE, &info );
- break;
- }
-
- case ID_GUIED_VIEW_SHOWGRID:
- flags = MF_BYCOMMAND | (mOptions.GetGridVisible()?MF_CHECKED:MF_UNCHECKED);
- CheckMenuItem ( hmenu, id, flags );
- break;
- case ID_GUIED_VIEW_SNAPTOGRID:
- flags = MF_BYCOMMAND | (mOptions.GetGridSnap()?MF_CHECKED:MF_UNCHECKED);
- CheckMenuItem ( hmenu, id, flags );
- break;
-
- // All menu items that are greyed out when there is no workspace
- case ID_GUIED_WINDOW_TILE:
- case ID_GUIED_WINDOW_CASCADE:
- case ID_GUIED_ITEM_NEWWINDOWDEF:
- case ID_GUIED_ITEM_NEWEDITDEF:
- case ID_GUIED_ITEM_NEWHTMLDEF:
- case ID_GUIED_VIEW_ZOOMIN:
- case ID_GUIED_VIEW_ZOOMOUT:
- case ID_GUIED_FILE_SAVE:
- case ID_GUIED_FILE_SAVEAS:
- case ID_GUIED_FILE_CLOSE:
- EnableMenuItem ( hmenu, nPos, MF_ENABLED|MF_BYPOSITION);
- break;
- // All menu items that are greyed out unless an item is selected
- case ID_GUIED_VIEW_HIDESELECTED:
- case ID_GUIED_VIEW_UNHIDESELECTED:
- case ID_GUIED_EDIT_DELETE:
- case ID_GUIED_EDIT_COPY:
- EnableMenuItem ( hmenu, nPos, MF_BYPOSITION|(workspace->GetSelectionMgr().Num()>0?MF_ENABLED:MF_GRAYED) );
- break;
- // Enable paste if the clipboard has something in it
- case ID_GUIED_EDIT_PASTE:
- EnableMenuItem ( hmenu, nPos, MF_BYPOSITION|(workspace->GetClipboard().Num()>0?MF_ENABLED:MF_GRAYED) );
- break;
-
- // All menu items that are greyed out unless a single item is selected
- case ID_GUIED_ITEM_ARRANGEBRINGTOFRONT:
- case ID_GUIED_ITEM_ARRANGEBRINGFORWARD:
- case ID_GUIED_ITEM_ARRANGESENDTOBACK:
- case ID_GUIED_ITEM_ARRANGESENDBACKWARD:
- case ID_GUIED_ITEM_PROPERTIES:
- case ID_GUIED_ITEM_SCRIPTS:
- EnableMenuItem ( hmenu, nPos, MF_BYPOSITION|(workspace->GetSelectionMgr().Num()==1?MF_ENABLED:MF_GRAYED) );
- break;
- // All menu items that are greyed out unless multiple itmes are selected
- case ID_GUIED_ITEM_ALIGNLEFTS:
- case ID_GUIED_ITEM_ALIGNCENTERS:
- case ID_GUIED_ITEM_ALIGNRIGHTS:
- case ID_GUIED_ITEM_ALIGNBOTTOMS:
- case ID_GUIED_ITEM_ALIGNMIDDLES:
- case ID_GUIED_ITEM_ALIGNTOPS:
- case ID_GUIED_ITEM_MAKESAMESIZEHEIGHT:
- case ID_GUIED_ITEM_MAKESAMESIZEBOTH:
- case ID_GUIED_ITEM_MAKESAMESIZEWIDTH:
- case ID_GUIED_ITEM_ARRANGEMAKECHILD:
- EnableMenuItem ( hmenu, nPos, MF_BYPOSITION|(workspace->GetSelectionMgr().Num()>1?MF_ENABLED:MF_GRAYED) );
- break;
- case ID_GUIED_SOURCECONTROL_CHECKIN:
- case ID_GUIED_SOURCECONTROL_UNDOCHECKOUT:
- EnableMenuItem ( hmenu, nPos, MF_BYPOSITION|((workspace->GetSourceControlState()==rvGEWorkspace::SCS_CHECKEDOUT)?MF_ENABLED:MF_GRAYED) );
- break;
- case ID_GUIED_SOURCECONTROL_CHECKOUT:
- EnableMenuItem ( hmenu, nPos, MF_BYPOSITION|((workspace->GetSourceControlState()==rvGEWorkspace::SCS_CHECKEDIN)?MF_ENABLED:MF_GRAYED) );
- break;
-
- default:
- continue;
- }
- }
-
- return 0;
- }
- /*
- ================
- rvGEApp::NewFile
- Creates a new file and opens a window for it
- ================
- */
- bool rvGEApp::NewFile ( void )
- {
- rvGEWorkspace* workspace = new rvGEWorkspace ( this );
- if ( workspace->NewFile ( ) )
- {
- HWND child;
-
- child = CreateMDIWindow("QUAKE4_GUIEDITOR_CHILD_CLASS",
- "Untitled.gui",
- WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_HSCROLL|WS_VSCROLL|WS_MAXIMIZE,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- 640,
- 480,
- mMDIClient,
- mInstance,
- (LONG)workspace );
-
- ShowWindow ( child, SW_SHOW );
- }
- return true;
- }
- /*
- ================
- rvGEApp::OpenFile
- Opens the given file and will fail if its already open or could not
- be opened for some reason
- ================
- */
- bool rvGEApp::OpenFile ( const char* filename )
- {
- int i;
- bool result = false;
- idStr error;
- // See if the file is already open and if so just make it active
- for ( i = 0; i < mWorkspaces.Num(); i ++ )
- {
- if ( !idStr::Icmp ( mWorkspaces[i]->GetFilename(), filename ) )
- {
- SendMessage ( mMDIClient, WM_MDIACTIVATE, (WPARAM)mWorkspaces[i]->GetWindow ( ), 0 );
- return false;
- }
- }
- SetCursor ( LoadCursor ( NULL, MAKEINTRESOURCE(IDC_WAIT ) ) );
- // Setup the default error.
- error = va("Failed to parse '%s'", filename );
- rvGEWorkspace* workspace = new rvGEWorkspace ( this );
- if ( workspace->LoadFile ( filename, &error ) )
- {
- HWND child;
-
- child = CreateMDIWindow("QUAKE4_GUIEDITOR_CHILD_CLASS",
- "Unamed.gui",
- WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_HSCROLL|WS_VSCROLL|WS_MAXIMIZE,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- 640,
- 480,
- mMDIClient,
- mInstance,
- (LONG)workspace );
-
- ShowWindow ( child, SW_SHOW );
-
- mOptions.AddRecentFile ( filename );
- UpdateRecentFiles ( );
- result = true;
- }
- else
- {
- MessageBox ( error, MB_OK|MB_ICONERROR );
- }
- SetCursor ( LoadCursor ( NULL, MAKEINTRESOURCE(IDC_ARROW ) ) );
-
- return result;;
- }
- /*
- ================
- rvGEApp::InitRecentFiles
- Finds the file menu and the location within it where the MRU should
- be added.
- ================
- */
- bool rvGEApp::InitRecentFiles ( void )
- {
- int i;
- int count;
- mRecentFileMenu = GetSubMenu ( GetMenu(mMDIFrame), 0 );
- count = GetMenuItemCount ( mRecentFileMenu );
-
- for ( i = 0; i < count; i ++ )
- {
- if ( GetMenuItemID ( mRecentFileMenu, i ) == ID_GUIED_FILE_MRU )
- {
- mRecentFileInsertPos = i;
- DeleteMenu ( mRecentFileMenu, mRecentFileInsertPos, MF_BYPOSITION );
- return true;
- }
- }
-
- return false;
- }
- /*
- ================
- rvGEApp::UpdateRecentFiles
- Updates the mru in the menu
- ================
- */
- void rvGEApp::UpdateRecentFiles ( void )
- {
- int i;
- int j;
- // Make sure everything is initialized
- if ( !mRecentFileMenu )
- {
- InitRecentFiles ( );
- }
- // Delete all the old recent files from the menu's
- for ( i = 0; i < rvGEOptions::MAX_MRU_SIZE; i ++ )
- {
- DeleteMenu ( mRecentFileMenu, ID_GUIED_FILE_MRU1 + i, MF_BYCOMMAND );
- }
- // Make sure there is a separator after the recent files
- if ( mOptions.GetRecentFileCount() )
- {
- MENUITEMINFO info;
- ZeroMemory ( &info, sizeof(info) );
- info.cbSize = sizeof(info);
- info.fMask = MIIM_FTYPE;
- GetMenuItemInfo ( mRecentFileMenu, mRecentFileInsertPos+1,TRUE, &info );
- if ( !(info.fType & MFT_SEPARATOR ) )
- {
- InsertMenu ( mRecentFileMenu, mRecentFileInsertPos, MF_BYPOSITION|MF_SEPARATOR|MF_ENABLED, 0, NULL );
- }
- }
- // Add the recent files to the menu now
- for ( j = 0, i = mOptions.GetRecentFileCount ( ) - 1; i >= 0; i --, j++ )
- {
- UINT id = ID_GUIED_FILE_MRU1 + j;
- idStr str = va("&%d ", j+1);
- str.Append ( mOptions.GetRecentFile ( i ) );
- InsertMenu ( mRecentFileMenu, mRecentFileInsertPos+j+1, MF_BYPOSITION|MF_STRING|MF_ENABLED, id, str );
- }
- }
- /*
- ================
- rvGEApp::CloseViewer
- Closes the gui viewer
- ================
- */
- void rvGEApp::CloseViewer ( void )
- {
- if ( !mViewer )
- {
- return;
- }
-
- mViewer->Destroy ( );
- delete mViewer;
- mViewer = NULL;
- }
- /*
- ================
- rvGEApp::ToolWindowActivate
- Handles the nc activate message for all tool windows
- ================
- */
- int rvGEApp::ToolWindowActivate ( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
- {
- bool keepActive;
- bool syncOthers;
- int i;
-
- keepActive = ( wParam != 0 );
- syncOthers = true;
-
- for ( i = 0; i < mToolWindows.Num (); i ++ )
- {
- if ( (HWND)lParam == mToolWindows[i] )
- {
- keepActive = true;
- syncOthers = false;
- break;
- }
- }
-
- if ( lParam == -1 )
- {
- return DefWindowProc ( hwnd, WM_NCACTIVATE, keepActive, 0 );
- }
- if ( syncOthers )
- {
- for ( i = 0; i < mToolWindows.Num(); i ++ )
- {
- if ( mToolWindows[i] != hwnd && mToolWindows[i] != (HWND) lParam )
- {
- SendMessage ( mToolWindows[i], WM_NCACTIVATE, keepActive, (LONG)-1 );
- }
- }
- }
-
- return DefWindowProc ( hwnd, WM_NCACTIVATE, keepActive, lParam );
- }
- /*
- ================
- rvGEApp::MessageBox
- Displays a modal message box
- ================
- */
- int rvGEApp::MessageBox ( const char* text, int flags )
- {
- return ::MessageBox ( mMDIFrame, text, "Quake 4 GUI Editor", flags );
- }
|