jedioutcast/utils/Radiant/win_main.cpp

933 lines
25 KiB
C++
Raw Normal View History

2013-04-04 18:02:27 +00:00
#include "stdafx.h"
#include "qe3.h"
#include <process.h>
#include "mru.h"
#include "entityw.h"
#include "PrefsDlg.h"
#include "oddbits.h"
static HWND s_hwndToolbar;
BOOL SaveRegistryInfo(const char *pszName, void *pvBuf, long lSize);
BOOL LoadRegistryInfo(const char *pszName, void *pvBuf, long *plSize);
static HWND CreateMyStatusWindow(HINSTANCE hInst);
static HWND CreateToolBar(HINSTANCE hinst);
extern void WXY_Print( void );
/*
==============================================================================
MENU
==============================================================================
*/
void OpenDialog (void);
void SaveAsDialog (bool bRegion);
qboolean ConfirmModified (void);
void Select_Ungroup (void);
void QE_ExpandBspString (char *bspaction, char *out, char *mapname)
{
char *in;
char src[1024];
char rsh[1024];
char base[256];
strcpy(src, mapname);
strlwr(src);
in = strstr(src, "maps/");
if (!in)
{
in = strstr(src, "maps\\");
}
if (in)
{
in += 5;
strcpy(base, in);
in = base;
while (*in)
{
if (*in == '\\')
{
*in = '/';
}
in++;
}
}
else
{
ExtractFileName (mapname, base);
}
sprintf (src, "%s/maps/%s", ValueForKey(g_qeglobals.d_project_entity, "remotebasepath"), base);
strcpy (rsh, ValueForKey(g_qeglobals.d_project_entity, "rshcmd"));
in = ValueForKey( g_qeglobals.d_project_entity, bspaction );
while (*in)
{
if (in[0] == '!')
{
strcpy (out, rsh);
out += strlen(rsh);
in++;
continue;
}
if (in[0] == '$')
{
strcpy (out, src);
out += strlen(src);
in++;
continue;
}
if (in[0] == '@')
{
*out++ = '"';
in++;
continue;
}
*out++ = *in++;
}
*out = 0;
}
void FindReplace(CString& strContents, const char* pTag, const char* pValue)
{
if (strcmp(pTag, pValue) == 0)
return;
for (int nPos = strContents.Find(pTag); nPos >= 0; nPos = strContents.Find(pTag))
{
int nRightLen = strContents.GetLength() - strlen(pTag) - nPos;
CString strLeft = strContents.Left(nPos);
CString strRight = strContents.Right(nRightLen);
strLeft += pValue;
strLeft += strRight;
strContents = strLeft;
}
}
HWND g_hWnd = NULL;
HANDLE g_hToolThread = NULL;
CString g_strParams;
UINT ToolThread(LPVOID pParam)
{
char* p = reinterpret_cast<char*>(pParam);
if (g_PrefsDlg.m_bPAK)
RunTools(p, g_hWnd, g_PrefsDlg.m_strPAKFile);
else
RunTools(p, g_hWnd, "");
g_hToolThread = NULL;
delete []p;
return 0;
}
void ThreadTools(char* p)
{
CWinThread* pThread = AfxBeginThread(ToolThread, reinterpret_cast<LPVOID>(p));
g_hToolThread = pThread->m_hThread;
}
CTime g_tBegin;
void RunBsp (char *command)
{
char sys[1024];
char batpath[1024];
char outputpath[1024];
char temppath[512];
char name[1024];
FILE *hFile;
BOOL ret;
PROCESS_INFORMATION ProcessInformation;
STARTUPINFO startupinfo;
g_hWnd = g_pParentWnd->GetSafeHwnd();
SetInspectorMode(W_CONSOLE);
g_tBegin = CTime::GetCurrentTime();
DWORD dwExitcode;
ret = GetExitCodeProcess (g_hToolThread, &dwExitcode);
if (dwExitcode != STILL_ACTIVE)
g_hToolThread = NULL;
if (bsp_process || g_hToolThread)
{
Sys_Printf ("BSP is still going...\n");
return;
}
GetTempPath(512, temppath);
sprintf (outputpath, "%sjunk.txt", temppath);
strcpy (name, currentmap);
if (region_active)
{
Map_SaveFile (name, false);
StripExtension (name);
strcat (name, ".reg");
}
if (Map_SaveFile (name, region_active))
{
QE_ExpandBspString (command, sys, name);
CString strSys = sys;
FindReplace(strSys, "&&", "\r\n");
strcpy(sys, strSys);
if (g_PrefsDlg.m_bInternalBSP)
{
g_tBegin = CTime::GetCurrentTime();
strSys.MakeLower();
char* p = new char[strSys.GetLength()+1];
strcpy(p, strSys.GetBuffer(0));
ThreadTools(p);
}
else
{
Sys_ClearPrintf ();
Sys_Printf ("==================\nRunning bsp command...\n");
Sys_Printf ("\n%s\n", sys);
//
// write qe3bsp.bat
//
sprintf (batpath, "%sqe3bsp.bat", temppath);
hFile = fopen(batpath, "w");
if (!hFile)
Error ("Can't write to %s", batpath);
fprintf (hFile, sys);
fclose (hFile);
//
// write qe3bsp2.bat
//
sprintf (batpath, "%sqe3bsp2.bat", temppath);
hFile = fopen(batpath, "w");
if (!hFile)
Error ("Can't write to %s", batpath);
fprintf (hFile, "%sqe3bsp.bat > %s", temppath, outputpath);
fclose (hFile);
LPCSTR psDeleteError = Pointfile_Delete ();
if (psDeleteError)
{
if (!GetYesNo(va("%s\n\nContinue with BSP process anyway?",psDeleteError)))
return;
}
GetStartupInfo (&startupinfo);
ret = CreateProcess(
batpath, // pointer to name of executable module
NULL, // pointer to command line string
NULL, // pointer to process security attributes
NULL, // pointer to thread security attributes
FALSE, // handle inheritance flag
0 /*DETACHED_PROCESS*/, // creation flags
NULL, // pointer to new environment block
NULL, // pointer to current directory name
&startupinfo, // pointer to STARTUPINFO
&ProcessInformation // pointer to PROCESS_INFORMATION
);
if (!ret)
Error ("CreateProcess failed");
bsp_process = ProcessInformation.hProcess;
Sleep (100); // give the new process a chance to open it's window
BringWindowToTop( g_qeglobals.d_hwndMain ); // pop us back on top
//SetFocus (g_qeglobals.d_hwndCamera);
}
}
else
{
InfoBox(va("Aborting BSP process because map \"%s\" couldn't be saved!",name));
}
}
void DLLBuildDone()
{
g_hToolThread = NULL;
CTime tEnd = CTime::GetCurrentTime();
CTimeSpan tElapsed = tEnd - g_tBegin;
CString strElapsed;
strElapsed.Format("Run time was %i hours, %i minutes and %i seconds", tElapsed.GetHours(), tElapsed.GetMinutes(), tElapsed.GetSeconds());
Sys_Printf(strElapsed.GetBuffer(0));
Pointfile_Check();
if (g_PrefsDlg.m_bRunQuake == TRUE)
{
char cCurDir[1024];
GetCurrentDirectory(1024, cCurDir);
CString strExePath = g_PrefsDlg.m_strQuake2;
CString strOrgPath;
CString strOrgFile;
ExtractPath_and_Filename(currentmap, strOrgPath, strOrgFile);
if (g_PrefsDlg.m_bSetGame == TRUE) // run in place with set game.. don't copy map
{
CString strBasePath = ValueForKey(g_qeglobals.d_project_entity, "basepath");
strExePath += " +set game ";
strExePath += strBasePath;
WinExec(strExePath, SW_SHOW);
}
else
{
CString strCopyPath = strExePath;
char* pBuffer = strCopyPath.GetBufferSetLength(_MAX_PATH + 1);
pBuffer[strCopyPath.ReverseFind('\\') + 1] = '\0';
strCopyPath.ReleaseBuffer();
SetCurrentDirectory(strCopyPath);
CString strOrgPath;
CString strOrgFile;
ExtractPath_and_Filename(currentmap, strOrgPath, strOrgFile);
AddSlash(strCopyPath);
FindReplace(strOrgFile, ".map", ".bsp");
strCopyPath += "\\baseq2\\maps\\";
strCopyPath += strOrgFile;
AddSlash(strOrgPath);
strOrgPath += strOrgFile;
bool bRun = (strOrgPath.CompareNoCase(strCopyPath) == 0);
if (!bRun)
bRun = (CopyFile(strOrgPath, strCopyPath, FALSE) == TRUE);
if (bRun)
{
FindReplace(strOrgFile, ".bsp", "");
strExePath += " +map ";
strExePath += strOrgFile;
WinExec(strExePath, SW_SHOW);
}
}
SetCurrentDirectory(cCurDir);
}
}
/*
=============
DoColor
=============
*/
class CMyColorDialog : public CColorDialog
{
DECLARE_DYNCREATE(CMyColorDialog);
// Construction
public:
CMyColorDialog( COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd*
pParentWnd = NULL );
// Statics
protected:
enum { NCUSTCOLORS = 16 };
static COLORREF c_CustColors[NCUSTCOLORS];
static COLORREF c_LastCustColors[NCUSTCOLORS];
static bool c_NeedToInitCustColors;
protected:
static void InitCustColors();
static void SaveCustColors();
// Dialog Data
protected:
//{{AFX_DATA(CMyColorDialog)
//}}AFX_DATA
// Overrides
protected:
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CMyColorDialog)
public:
virtual int DoModal();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CMyColorDialog)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
IMPLEMENT_DYNCREATE(CMyColorDialog, CColorDialog)
bool CMyColorDialog::c_NeedToInitCustColors = true;
COLORREF CMyColorDialog::c_CustColors[];
COLORREF CMyColorDialog::c_LastCustColors[];
#define SECTION _T("Custom Colors")
void CMyColorDialog::InitCustColors() {
for (int i = 0; i < NCUSTCOLORS; i++) {
CString entry; entry.Format("%d",i);
c_LastCustColors[i] = c_CustColors[i] =
::AfxGetApp()->GetProfileInt(SECTION,entry,RGB(255,255,255));
}
c_NeedToInitCustColors= false;
}
void CMyColorDialog::SaveCustColors() {
for (int i = 0; i < NCUSTCOLORS; i++) {
if (c_LastCustColors[i] != c_CustColors[i]) {
CString entry; entry.Format("%d",i);
if (c_CustColors[i] == RGB(255,255,255)) {
::AfxGetApp()->WriteProfileString(SECTION,entry,NULL);
} else {
::AfxGetApp()->WriteProfileInt(SECTION, entry,c_CustColors[i]);
}
c_LastCustColors[i] = c_CustColors[i];
}
}
}
CMyColorDialog::CMyColorDialog( COLORREF clrInit, DWORD dwFlags,
CWnd* pParentWnd) : CColorDialog(clrInit,dwFlags,pParentWnd)
{
//{{AFX_DATA_INIT(CMyColorDialog)
//}}AFX_DATA_INIT
if (c_NeedToInitCustColors) {
InitCustColors();
}
m_cc.lpCustColors = c_CustColors;
}
int CMyColorDialog::DoModal() {
int code = CColorDialog::DoModal();
SaveCustColors();
return code;
}
void CMyColorDialog::DoDataExchange(CDataExchange* pDX) {
// overridden (calls this base class)
CColorDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyColorDialog)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyColorDialog, CColorDialog)
//{{AFX_MSG_MAP(CMyColorDialog)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void DoNewColor(int* i1, int* i2, int* i3)
{
COLORREF cr = (*i1) +
((*i2) <<8) +
((*i3) <<16);
CMyColorDialog dlg(cr, CC_FULLOPEN | CC_RGBINIT);
if (dlg.DoModal() == IDOK)
{
*i1 = (dlg.m_cc.rgbResult & 255);
*i2 = ((dlg.m_cc.rgbResult >> 8) & 255);
*i3 = ((dlg.m_cc.rgbResult >> 16) & 255);
}
}
qboolean DoColor(int iIndex)
{
COLORREF cr = (int)(g_qeglobals.d_savedinfo.colors[iIndex][0]*255) +
(((int)(g_qeglobals.d_savedinfo.colors[iIndex][1]*255))<<8) +
(((int)(g_qeglobals.d_savedinfo.colors[iIndex][2]*255))<<16);
CMyColorDialog dlg(cr, CC_FULLOPEN | CC_RGBINIT);
if (dlg.DoModal() == IDOK)
{
g_qeglobals.d_savedinfo.colors[iIndex][0] = (dlg.m_cc.rgbResult&255)/255.0;
g_qeglobals.d_savedinfo.colors[iIndex][1] = ((dlg.m_cc.rgbResult>>8)&255)/255.0;
g_qeglobals.d_savedinfo.colors[iIndex][2] = ((dlg.m_cc.rgbResult>>16)&255)/255.0;
/*
** scale colors so that at least one component is at 1.0F
** if this is meant to select an entity color
*/
if ( iIndex == COLOR_ENTITY )
{
float largest = 0.0F;
if ( g_qeglobals.d_savedinfo.colors[iIndex][0] > largest )
largest = g_qeglobals.d_savedinfo.colors[iIndex][0];
if ( g_qeglobals.d_savedinfo.colors[iIndex][1] > largest )
largest = g_qeglobals.d_savedinfo.colors[iIndex][1];
if ( g_qeglobals.d_savedinfo.colors[iIndex][2] > largest )
largest = g_qeglobals.d_savedinfo.colors[iIndex][2];
if ( largest == 0.0F )
{
g_qeglobals.d_savedinfo.colors[iIndex][0] = 1.0F;
g_qeglobals.d_savedinfo.colors[iIndex][1] = 1.0F;
g_qeglobals.d_savedinfo.colors[iIndex][2] = 1.0F;
}
else
{
float scaler = 1.0F / largest;
g_qeglobals.d_savedinfo.colors[iIndex][0] *= scaler;
g_qeglobals.d_savedinfo.colors[iIndex][1] *= scaler;
g_qeglobals.d_savedinfo.colors[iIndex][2] *= scaler;
}
}
Sys_UpdateWindows (W_ALL);
return true;
}
else return false;
}
/* Copied from MSDN */
BOOL DoMru(HWND hWnd,WORD wId)
{
char szFileName[128];
OFSTRUCT of;
BOOL fExist;
if (!ConfirmModified())
return false;
GetMenuItem(g_qeglobals.d_lpMruMenu, wId, TRUE, szFileName, sizeof(szFileName));
// Test if the file exists.
fExist = OpenFile(szFileName ,&of,OF_EXIST) != HFILE_ERROR;
if (fExist) {
// Place the file on the top of MRU.
AddNewItem(g_qeglobals.d_lpMruMenu,(LPSTR)szFileName);
// Now perform opening this file !!!
Map_LoadFile (szFileName);
}
else
// Remove the file on MRU.
DelMenuItem(g_qeglobals.d_lpMruMenu,wId,TRUE);
// Refresh the File menu.
PlaceMenuMRUItem(g_qeglobals.d_lpMruMenu,GetSubMenu(GetMenu(hWnd),0),
ID_FILE_EXIT);
return fExist;
}
/*
==============
Main_Create
==============
*/
void MFCCreate (HINSTANCE hInstance)
{
HMENU hMenu = NULL;
int i = sizeof(g_qeglobals.d_savedinfo);
long l = i;
LoadRegistryInfo("SavedInfo", &g_qeglobals.d_savedinfo, &l);
// this is tacky, but they only want a few extra things saved....
//
l = sizeof(g_bPatchShowBounds);
LoadRegistryInfo("_g_bPatchShowBounds", &g_bPatchShowBounds, &l);
l = sizeof(g_PrefsDlg.m_bSelectCurves);
LoadRegistryInfo("_g_PrefsDlg.m_bSelectCurves", &g_PrefsDlg.m_bSelectCurves,&l);
int nOldSize = g_qeglobals.d_savedinfo.iSize;
if (g_qeglobals.d_savedinfo.iSize != sizeof(g_qeglobals.d_savedinfo))
{
// fill in new defaults
g_qeglobals.d_savedinfo.iSize = sizeof(g_qeglobals.d_savedinfo);
g_qeglobals.d_savedinfo.fGamma = 1.0;
g_qeglobals.d_savedinfo.iTexMenu = ID_VIEW_NEAREST;
g_qeglobals.d_savedinfo.m_nTextureTweak = 1;
//g_qeglobals.d_savedinfo.exclude = INCLUDE_EASY | INCLUDE_NORMAL | INCLUDE_HARD | INCLUDE_DEATHMATCH;
g_qeglobals.d_savedinfo.show_coordinates = true;
g_qeglobals.d_savedinfo.show_names = true;
for (i=0 ; i<3 ; i++)
{
g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25;
g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0;
g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75;
g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5;
g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25;
}
g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0;
g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0;
g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0;
g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5;
g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0;
g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75;
// old size was smaller, reload original prefs
if (nOldSize < sizeof(g_qeglobals.d_savedinfo))
{
long l = nOldSize;
LoadRegistryInfo("SavedInfo", &g_qeglobals.d_savedinfo, &l);
}
}
if ( ( hMenu = GetMenu( g_qeglobals.d_hwndMain ) ) != 0 )
{
// by default all of these are checked because that's how they're defined in the menu editor
if ( !g_qeglobals.d_savedinfo.show_names )
CheckMenuItem( hMenu, ID_VIEW_SHOWNAMES, MF_BYCOMMAND | MF_UNCHECKED );
if ( !g_qeglobals.d_savedinfo.show_coordinates )
CheckMenuItem( hMenu, ID_VIEW_SHOWCOORDINATES, MF_BYCOMMAND | MF_UNCHECKED );
// hmmm, if I breakpoint here it never reaches it in Trek/Q3 mode (normal mode as well?)
//
if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS )
CheckMenuItem( hMenu, ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_UNCHECKED );
if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT )
CheckMenuItem( hMenu, ID_VIEW_ENTITY, MF_BYCOMMAND | MF_UNCHECKED );
if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS )
CheckMenuItem( hMenu, ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_UNCHECKED );
if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WATER )
CheckMenuItem( hMenu, ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_UNCHECKED );
if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD )
CheckMenuItem( hMenu, ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_UNCHECKED );
if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP )
CheckMenuItem( hMenu, ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_UNCHECKED );
if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINT )
CheckMenuItem( hMenu, ID_VIEW_SHOWHINT, MF_BYCOMMAND | MF_UNCHECKED );
}
}
/*
=============================================================
REGISTRY INFO
=============================================================
*/
BOOL SaveRegistryInfo(const char *pszName, void *pvBuf, long lSize)
{
LONG lres;
DWORD dwDisp;
HKEY hKeyId;
lres = RegCreateKeyEx(HKEY_CURRENT_USER,
#ifdef QUAKE3
"Software\\QERadiant\\Q3Trek_QERadiant",
#else
"Software\\QERadiant\\QERadiant",
#endif
0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyId, &dwDisp);
if (lres != ERROR_SUCCESS)
return FALSE;
lres = RegSetValueEx(hKeyId, pszName, 0, REG_BINARY, (unsigned char*)pvBuf, lSize);
RegCloseKey(hKeyId);
if (lres != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
BOOL LoadRegistryInfo(const char *pszName, void *pvBuf, long *plSize)
{
HKEY hKey;
long lres, lType, lSize;
if (plSize == NULL)
plSize = &lSize;
// enables people to keep seperate prefs for SoF and Trek versions of the editor...
//
#ifdef QUAKE3
lres = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\QERadiant\\Q3Trek_QERadiant", 0, KEY_READ, &hKey);
#else
lres = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\QERadiant\\QERadiant", 0, KEY_READ, &hKey);
#endif
if (lres != ERROR_SUCCESS)
return FALSE;
lres = RegQueryValueEx(hKey, pszName, NULL, (unsigned long*)&lType, (unsigned char*)pvBuf, (unsigned long*)plSize);
RegCloseKey(hKey);
if (lres != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
BOOL SaveWindowState(HWND hWnd, const char *pszName)
{
RECT rc;
GetWindowRect(hWnd, &rc);
if (hWnd != g_qeglobals.d_hwndMain) // && g_pParentWnd->CurrentStyle() == QR_QE4)
{
if (::GetParent(hWnd) != g_qeglobals.d_hwndMain)
{
::SetParent(hWnd, g_qeglobals.d_hwndMain);
}
MapWindowPoints(NULL, g_qeglobals.d_hwndMain, (POINT *)&rc, 2);
}
BOOL b = SaveRegistryInfo(pszName, &rc, sizeof(rc));
return b;
}
BOOL LoadWindowState(HWND hWnd, const char *pszName)
{
RECT rc;
LONG lSize = sizeof(rc);
if (LoadRegistryInfo(pszName, &rc, &lSize))
{
if (rc.left < 0)
rc.left = 0;
if (rc.top < 0)
rc.top = 0;
if (rc.right < rc.left + 16)
rc.right = rc.left + 16;
if (rc.bottom < rc.top + 16)
rc.bottom = rc.top + 16;
MoveWindow(hWnd, rc.left, rc.top, rc.right - rc.left,
rc.bottom - rc.top, FALSE);
return TRUE;
}
return FALSE;
}
/*
===============================================================
STATUS WINDOW
===============================================================
*/
void Sys_UpdateStatusBar( void )
{
extern int g_numbrushes, g_numentities;
char numbrushbuffer[100]="";
sprintf( numbrushbuffer, "Brushes: %d Entities: %d", g_numbrushes, g_numentities );
g_pParentWnd->SetStatusText(2, numbrushbuffer);
//Sys_Status( numbrushbuffer, 2 );
}
void Sys_Status(const char *psz, int part )
{
SendMessage(g_qeglobals.d_hwndStatus, SB_SETTEXT, part, (LPARAM)psz);
}
static HWND CreateMyStatusWindow(HINSTANCE hInst)
{
HWND hWnd;
int partsize[3] = { 300, 1100, -1 };
hWnd = CreateWindowEx( WS_EX_TOPMOST, // no extended styles
STATUSCLASSNAME, // status bar
"", // no text
WS_CHILD | WS_BORDER | WS_VISIBLE, // styles
-100, -100, 10, 10, // x, y, cx, cy
g_qeglobals.d_hwndMain, // parent window
(HMENU)100, // window ID
hInst, // instance
NULL); // window data
SendMessage( hWnd, SB_SETPARTS, 3, ( long ) partsize );
return hWnd;
}
//==============================================================
#define NUMBUTTONS 15
HWND CreateToolBar(HINSTANCE hinst)
{
HWND hwndTB;
TBADDBITMAP tbab;
TBBUTTON tbb[NUMBUTTONS];
// Ensure that the common control DLL is loaded.
InitCommonControls();
// Create a toolbar that the user can customize and that has a
// tooltip associated with it.
hwndTB = CreateWindowEx(0, TOOLBARCLASSNAME, (LPSTR) NULL,
WS_CHILD | TBSTYLE_TOOLTIPS | CCS_ADJUSTABLE | WS_BORDER,
0, 0, 0, 0, g_qeglobals.d_hwndMain, (HMENU) IDR_TOOLBAR1, hinst, NULL);
// Send the TB_BUTTONSTRUCTSIZE message, which is required for
// backward compatibility.
SendMessage(hwndTB, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
// Add the bitmap containing button images to the toolbar.
tbab.hInst = hinst;
tbab.nID = IDR_TOOLBAR1;
SendMessage(hwndTB, TB_ADDBITMAP, (WPARAM)NUMBUTTONS, (WPARAM) &tbab);
// Fill the TBBUTTON array with button information, and add the
// buttons to the toolbar.
tbb[0].iBitmap = 0;
tbb[0].idCommand = ID_BRUSH_FLIPX;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = TBSTYLE_BUTTON;
tbb[0].dwData = 0;
tbb[0].iString = 0;
tbb[1].iBitmap = 2;
tbb[1].idCommand = ID_BRUSH_FLIPY;
tbb[1].fsState = TBSTATE_ENABLED;
tbb[1].fsStyle = TBSTYLE_BUTTON;
tbb[1].dwData = 0;
tbb[1].iString = 0;
tbb[2].iBitmap = 4;
tbb[2].idCommand = ID_BRUSH_FLIPZ;
tbb[2].fsState = TBSTATE_ENABLED;
tbb[2].fsStyle = TBSTYLE_BUTTON;
tbb[2].dwData = 0;
tbb[2].iString = 0;
tbb[3].iBitmap = 1;
tbb[3].idCommand = ID_BRUSH_ROTATEX;
tbb[3].fsState = TBSTATE_ENABLED;
tbb[3].fsStyle = TBSTYLE_BUTTON;
tbb[3].dwData = 0;
tbb[3].iString = 0;
tbb[4].iBitmap = 3;
tbb[4].idCommand = ID_BRUSH_ROTATEY;
tbb[4].fsState = TBSTATE_ENABLED;
tbb[4].fsStyle = TBSTYLE_BUTTON;
tbb[4].dwData = 0;
tbb[4].iString = 0;
tbb[5].iBitmap = 5;
tbb[5].idCommand = ID_BRUSH_ROTATEZ;
tbb[5].fsState = TBSTATE_ENABLED;
tbb[5].fsStyle = TBSTYLE_BUTTON;
tbb[5].dwData = 0;
tbb[5].iString = 0;
tbb[6].iBitmap = 6;
tbb[6].idCommand = ID_SELECTION_SELECTCOMPLETETALL;
tbb[6].fsState = TBSTATE_ENABLED;
tbb[6].fsStyle = TBSTYLE_BUTTON;
tbb[6].dwData = 0;
tbb[6].iString = 0;
tbb[7].iBitmap = 7;
tbb[7].idCommand = ID_SELECTION_SELECTTOUCHING;
tbb[7].fsState = TBSTATE_ENABLED;
tbb[7].fsStyle = TBSTYLE_BUTTON;
tbb[7].dwData = 0;
tbb[7].iString = 0;
tbb[8].iBitmap = 8;
tbb[8].idCommand = ID_SELECTION_SELECTPARTIALTALL;
tbb[8].fsState = TBSTATE_ENABLED;
tbb[8].fsStyle = TBSTYLE_BUTTON;
tbb[8].dwData = 0;
tbb[8].iString = 0;
tbb[9].iBitmap = 9;
tbb[9].idCommand = ID_SELECTION_SELECTINSIDE;
tbb[9].fsState = TBSTATE_ENABLED;
tbb[9].fsStyle = TBSTYLE_BUTTON;
tbb[9].dwData = 0;
tbb[9].iString = 0;
tbb[10].iBitmap = 10;
tbb[10].idCommand = ID_SELECTION_CSGSUBTRACT;
tbb[10].fsState = TBSTATE_ENABLED;
tbb[10].fsStyle = TBSTYLE_BUTTON;
tbb[10].dwData = 0;
tbb[10].iString = 0;
tbb[11].iBitmap = 11;
tbb[11].idCommand = ID_SELECTION_MAKEHOLLOW;
tbb[11].fsState = TBSTATE_ENABLED;
tbb[11].fsStyle = TBSTYLE_BUTTON;
tbb[11].dwData = 0;
tbb[11].iString = 0;
tbb[12].iBitmap = 12;
tbb[12].idCommand = ID_TEXTURES_WIREFRAME;
tbb[12].fsState = TBSTATE_ENABLED;
tbb[12].fsStyle = TBSTYLE_BUTTON;
tbb[12].dwData = 0;
tbb[12].iString = 0;
tbb[13].iBitmap = 13;
tbb[13].idCommand = ID_TEXTURES_FLATSHADE;
tbb[13].fsState = TBSTATE_ENABLED;
tbb[13].fsStyle = TBSTYLE_BUTTON;
tbb[13].dwData = 0;
tbb[13].iString = 0;
tbb[14].iBitmap = 14;
tbb[14].idCommand = ID_VIEW_TRILINEAR;
tbb[14].fsState = TBSTATE_ENABLED;
tbb[14].fsStyle = TBSTYLE_BUTTON;
tbb[14].dwData = 0;
tbb[14].iString = 0;
SendMessage(hwndTB, TB_ADDBUTTONS, (WPARAM)NUMBUTTONS,
(LPARAM) (LPTBBUTTON) &tbb);
ShowWindow(hwndTB, SW_SHOW);
return hwndTB;
}