summaryrefslogtreecommitdiff
path: root/hammer/childfrm.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/childfrm.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'hammer/childfrm.cpp')
-rw-r--r--hammer/childfrm.cpp911
1 files changed, 911 insertions, 0 deletions
diff --git a/hammer/childfrm.cpp b/hammer/childfrm.cpp
new file mode 100644
index 0000000..924f65e
--- /dev/null
+++ b/hammer/childfrm.cpp
@@ -0,0 +1,911 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Implements the MDI child window. Each MDI child window contains one
+// or more views. If it contains more than one view, there is a splitter
+// seperating the views. All views in a given MDI child window reflect
+// a single document.
+//
+//===========================================================================//
+
+#include "stdafx.h"
+#include <oleauto.h>
+#include <oaidl.h>
+#if _MSC_VER < 1300
+#include <afxpriv.h>
+#else
+#define WM_INITIALUPDATE 0x0364 // (params unused) - sent to children
+#endif
+#include "hammer.h"
+#include "Options.h"
+#include "MainFrm.h"
+#include "ChildFrm.h"
+#include "MapDoc.h"
+#include "MapView2D.h"
+#include "MapViewLogical.h"
+#include "MapView3D.h"
+#include "GlobalFunctions.h"
+#include "materialdlg.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+
+IMPLEMENT_DYNCREATE(CChildFrame, CMDIChildWnd)
+
+
+BEGIN_MESSAGE_MAP(CChildFrame, CMDIChildWnd)
+ //{{AFX_MSG_MAP(CChildFrame)
+ ON_WM_SETFOCUS()
+ ON_WM_SIZE()
+ ON_WM_CREATE()
+ ON_WM_PAINT()
+ ON_WM_CLOSE()
+ ON_COMMAND(ID_VIEW_2DXY, OnView2dxy)
+ ON_COMMAND(ID_VIEW_2DYZ, OnView2dyz)
+ ON_COMMAND(ID_VIEW_2DXZ, OnView2dxz)
+ ON_COMMAND(ID_VIEW_2DLOGICAL, OnViewLogical)
+ ON_COMMAND(ID_VIEW_3DPOLYGON, OnView3dPolygon)
+ ON_COMMAND(ID_VIEW_3DTEXTURED, OnView3dTextured)
+ ON_COMMAND(ID_VIEW_3DTEXTURED_SHADED, OnView3dTexturedShaded)
+ ON_COMMAND(ID_VIEW_LIGHTINGPREVIEW, OnView3dLightingPreview)
+ ON_COMMAND(ID_VIEW_LIGHTINGPREVIEW_RAYTRACED, OnView3dLightingPreviewRayTraced)
+ ON_COMMAND(ID_VIEW_3DLIGHTMAP_GRID, OnView3dLightmapGrid)
+ ON_COMMAND(ID_VIEW_3DWIREFRAME, OnView3dWireframe)
+ ON_COMMAND(ID_VIEW_3DSMOOTH, OnView3dSmooth)
+ //ON_COMMAND(ID_VIEW_3DENGINE, OnView3dEngine)
+ ON_COMMAND(ID_VIEW_AUTOSIZE4, OnViewAutosize4)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_AUTOSIZE4, OnUpdateViewAutosize4)
+ ON_COMMAND(ID_VIEW_MAXIMIZEPANE, OnViewMaximizepane)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_MAXIMIZERESTOREACTIVEVIEW, OnUpdateViewMaximizepane)
+ ON_COMMAND(ID_WINDOW_TOGGLE, OnWindowToggle)
+ ON_COMMAND(ID_VIEW_MAXIMIZERESTOREACTIVEVIEW, OnViewMaximizepane)
+ ON_WM_DESTROY()
+ //}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+
+static BOOL g_b4Views = TRUE;
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : b4Views -
+//-----------------------------------------------------------------------------
+void SetDefaultChildType(BOOL b4Views)
+{
+ g_b4Views = b4Views;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor. Initializes data members.
+//-----------------------------------------------------------------------------
+CChildFrame::CChildFrame(void)
+{
+ m_bReady = FALSE;
+ bAutosize4 = TRUE;
+ bFirstPaint = TRUE;
+ bUsingSplitter = !g_b4Views ? FALSE : !Options.general.bIndependentwin;
+ m_wndSplitter = NULL;
+ m_bNeedsCentered = FALSE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CChildFrame::~CChildFrame(void)
+{
+ if (m_wndSplitter != NULL)
+ {
+ m_wndSplitter->DestroyWindow();
+ delete m_wndSplitter;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : cs -
+// Output : Returns TRUE on success, FALSE on failure.
+//-----------------------------------------------------------------------------
+BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
+{
+ //cs.style |= WS_MAXIMIZE;
+
+ return(CMDIChildWnd::PreCreateWindow(cs));
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input :
+// Output : CView *
+//-----------------------------------------------------------------------------
+CView * CChildFrame::GetActiveView()
+{
+ // find active pane in splitter wnd and replace it there
+ int iRow, iCol;
+ CView *pCurrentView;
+
+ if(bUsingSplitter)
+ {
+ m_wndSplitter->GetActivePane(&iRow, &iCol);
+
+ // If no active view for the frame, return FALSE because this
+ // function retrieves the current document from the active view.
+ if ((pCurrentView= (CView*) m_wndSplitter->GetPane(iRow, iCol))==NULL)
+ return NULL;
+ }
+ else
+ {
+ pCurrentView = CMDIChildWnd::GetActiveView();
+ }
+
+ return pCurrentView;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : bSplitter -
+//-----------------------------------------------------------------------------
+void CChildFrame::SetSplitterMode(BOOL bSplitter)
+{
+ if(bSplitter == bUsingSplitter)
+ return; // already at this mode
+
+ if(!bSplitter)
+ {
+ // delete the splitterwnd.. first, get the view that it is currently
+ // using.
+ CView * pActiveView = GetActiveView();
+ CDocument* pDoc = pActiveView->GetDocument();
+
+ BOOL bAutoDelete=pDoc->m_bAutoDelete;
+ pDoc->m_bAutoDelete=FALSE;
+
+ pActiveView->SetRedraw(FALSE);
+ m_wndSplitter->SetRedraw(FALSE);
+ pActiveView->SetParent(this);
+
+ m_wndSplitter->DestroyWindow();
+ delete m_wndSplitter;
+ m_wndSplitter = NULL;
+
+ pDoc->m_bAutoDelete = bAutoDelete;
+
+ // redraw active view
+ CRect r;
+ GetClientRect(r);
+ pActiveView->SetRedraw(TRUE);
+ pActiveView->MoveWindow(0, 0, r.right, r.bottom, TRUE);
+ }
+ else
+ {
+ CView * pActiveView = GetActiveView();
+ Assert(pActiveView);
+ CMapDoc* pDoc = (CMapDoc*) pActiveView->GetDocument();
+
+ BOOL bAutoDelete=pDoc->m_bAutoDelete;
+ pDoc->m_bAutoDelete=FALSE;
+ pActiveView->DestroyWindow();
+ pDoc->m_bAutoDelete = bAutoDelete;
+
+ // creating new four views.
+ m_wndSplitter = new CMySplitterWnd;
+ if(!m_wndSplitter->CreateStatic(this, 2, 2))
+ {
+ TRACE0("Failed to create split bar ");
+ return; // failed to create
+ }
+
+ CRect r;
+ GetClientRect(r);
+ CSize sizeView(r.Width()/2 - 3, r.Height()/2 - 3);
+
+ CCreateContext context;
+ context.m_pNewViewClass = NULL;
+ context.m_pCurrentDoc = pDoc;
+ context.m_pNewDocTemplate = NULL;
+ context.m_pLastView = NULL;
+ context.m_pCurrentFrame = this;
+
+ context.m_pNewViewClass = RUNTIME_CLASS(CMapView2D);
+ m_wndSplitter->CreateView(0, 1, RUNTIME_CLASS(CMapView2D),
+ sizeView, &context);
+ m_wndSplitter->CreateView(1, 0, RUNTIME_CLASS(CMapView2D),
+ sizeView, &context);
+ m_wndSplitter->CreateView(1, 1, RUNTIME_CLASS(CMapView2D),
+ sizeView, &context);
+
+ context.m_pNewViewClass = RUNTIME_CLASS(CMapView3D);
+
+ m_wndSplitter->CreateView(0, 0, context.m_pNewViewClass,
+ sizeView, &context);
+ }
+
+ bUsingSplitter = bSplitter;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Replaces the current active view with a given view type.
+// Input : *pViewClass -
+// Output : CView
+//-----------------------------------------------------------------------------
+CView *CChildFrame::ReplaceView(CRuntimeClass *pViewClass)
+{
+ //
+ // Verify that there is an active view to replace.
+ //
+ CView *pCurrentView = GetActiveView();
+ if (!pCurrentView)
+ {
+ return(NULL);
+ }
+
+ //
+ // If we're already displaying this kind of view, no need to go
+ // further.
+ //
+ if ((pCurrentView->IsKindOf(pViewClass)) == TRUE)
+ {
+ return(pCurrentView);
+ }
+
+ //
+ // Get pointer to CDocument object so that it can be used in the
+ // creation process of the new view. Set flag so that the document
+ // will not be deleted when view is destroyed.
+ //
+ CMapDoc *pDoc = (CMapDoc *)pCurrentView->GetDocument();
+ BOOL bAutoDelete = pDoc->m_bAutoDelete;
+ pDoc->m_bAutoDelete=FALSE;
+
+ int iRow = 0, iCol = 0;
+ CRect rect;
+
+ // Delete existing view
+ if (bUsingSplitter)
+ {
+ pCurrentView->GetClientRect(rect);
+ m_wndSplitter->GetActivePane(&iRow, &iCol);
+ m_wndSplitter->DeleteView(iRow, iCol);
+ }
+ else
+ {
+ pCurrentView->DestroyWindow();
+ }
+
+ // Restore the autodelete flag.
+ pDoc->m_bAutoDelete = bAutoDelete;
+
+ // Create new view and redraw.
+ CCreateContext context;
+
+ context.m_pNewViewClass = pViewClass;
+ context.m_pCurrentDoc = pDoc;
+ context.m_pNewDocTemplate = NULL;
+ context.m_pLastView = NULL;
+ context.m_pCurrentFrame=this;
+
+ CView *pNewView = NULL;
+
+ if (bUsingSplitter)
+ {
+ if (m_wndSplitter->CreateView(iRow, iCol, pViewClass, rect.Size(), &context))
+ {
+ pNewView = (CView *)m_wndSplitter->GetPane(iRow, iCol);
+ }
+ }
+ else
+ {
+ pNewView = (CView *)pViewClass->CreateObject();
+ if (pNewView)
+ {
+ CRect r;
+ GetClientRect(r);
+
+ if (!pNewView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, r, this, AFX_IDW_PANE_FIRST, &context))
+ {
+ pNewView = NULL;
+ }
+ }
+ }
+
+ if (!pNewView)
+ {
+ TRACE0("Warning: couldn't create view for frame\n");
+ return(NULL);
+ }
+
+ pNewView->SendMessage(WM_INITIALUPDATE, 0, 0);
+
+ if (bUsingSplitter)
+ {
+ m_wndSplitter->RecalcLayout();
+ }
+
+ return(pNewView);
+}
+
+
+#ifdef _DEBUG
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input :
+//-----------------------------------------------------------------------------
+void CChildFrame::AssertValid() const
+{
+ CMDIChildWnd::AssertValid();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : dc -
+//-----------------------------------------------------------------------------
+void CChildFrame::Dump(CDumpContext& dc) const
+{
+ CMDIChildWnd::Dump(dc);
+}
+
+#endif //_DEBUG
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Stores layout information in the registry for use next session.
+//-----------------------------------------------------------------------------
+void CChildFrame::SaveOptions(void)
+{
+ if (bUsingSplitter)
+ {
+ //
+ // Save the draw type for each pane of the splitter.
+ //
+ for (int nRow = 0; nRow < 2; nRow++)
+ {
+ for (int nCol = 0; nCol < 2; nCol++)
+ {
+ CMapView *pView = dynamic_cast<CMapView*>(m_wndSplitter->GetPane(nRow, nCol));
+ if (pView != NULL)
+ {
+ char szKey[30];
+ sprintf(szKey, "DrawType%d,%d", nRow, nCol);
+ APP()->WriteProfileInt("Splitter", szKey, pView->GetDrawType());
+ }
+ }
+ }
+
+ int nWidth, nHeight, nMin;
+ m_wndSplitter->GetColumnInfo( 0, nWidth, nMin );
+ m_wndSplitter->GetRowInfo( 0, nHeight, nMin );
+
+ APP()->WriteProfileInt( "Splitter", "SplitterWidth", nWidth );
+ APP()->WriteProfileInt( "Splitter", "SplitterHeight", nHeight );
+
+ //
+ // Save the window position, size, and minimized/maximized state.
+ //
+ WINDOWPLACEMENT wp;
+ wp.length = sizeof(wp);
+ GetWindowPlacement(&wp);
+
+ char szPlacement[100];
+ sprintf(szPlacement, "(%d %d) (%d %d) (%d %d %d %d) %d", wp.ptMaxPosition.x, wp.ptMaxPosition.y, wp.ptMinPosition.x, wp.ptMinPosition.y, wp.rcNormalPosition.bottom, wp.rcNormalPosition.left, wp.rcNormalPosition.right, wp.rcNormalPosition.top, wp.showCmd);
+ APP()->WriteProfileString("Splitter", "WindowPlacement", szPlacement);
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Calls ReplaceView with the appropriate runtime class information to
+// switch the active view to given view type.
+// Input : eViewType - 2d xy, xz, 3d textured, flat, etc.
+//-----------------------------------------------------------------------------
+void CChildFrame::SetViewType(DrawType_t eViewType)
+{
+ CMapView *pNewView = NULL;
+
+ switch (eViewType)
+ {
+ case VIEW2D_XY:
+ case VIEW2D_XZ:
+ case VIEW2D_YZ:
+ pNewView = (CMapView2D *)ReplaceView(RUNTIME_CLASS(CMapView2D));
+ break;
+
+ case VIEW_LOGICAL:
+ pNewView = (CMapViewLogical *)ReplaceView(RUNTIME_CLASS(CMapViewLogical));
+ break;
+
+ default:
+ case VIEW3D_WIREFRAME:
+ case VIEW3D_POLYGON:
+ case VIEW3D_TEXTURED:
+ case VIEW3D_TEXTURED_SHADED:
+ case VIEW3D_LIGHTMAP_GRID:
+ case VIEW3D_LIGHTING_PREVIEW2:
+ case VIEW3D_LIGHTING_PREVIEW_RAYTRACED:
+ case VIEW3D_SMOOTHING_GROUP:
+ //case VIEW3D_ENGINE:
+ pNewView = (CMapView3D *)ReplaceView(RUNTIME_CLASS(CMapView3D));
+ break;
+ }
+
+ if (pNewView != NULL)
+ {
+ SetActiveView( dynamic_cast<CView*>(pNewView->GetViewWnd()) );
+ pNewView->SetDrawType(eViewType);
+ pNewView->UpdateView( MAPVIEW_UPDATE_OBJECTS );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the ID_VIEW_2DXY command when the active view is a 3D view.
+//-----------------------------------------------------------------------------
+void CChildFrame::OnView2dxy(void)
+{
+ SetViewType(VIEW2D_XY);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the ID_VIEW_2DYZ command when the active view is a 3D view.
+//-----------------------------------------------------------------------------
+void CChildFrame::OnView2dyz(void)
+{
+ SetViewType(VIEW2D_YZ);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the ID_VIEW_2DXZ command when the active view is a 3D view.
+//-----------------------------------------------------------------------------
+void CChildFrame::OnView2dxz(void)
+{
+ SetViewType(VIEW2D_XZ);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the ID_VIEW_2DLOGICAL command when the active view is a 3D view.
+//-----------------------------------------------------------------------------
+void CChildFrame::OnViewLogical(void)
+{
+ SetViewType(VIEW_LOGICAL);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the ID_VIEW_3DWIREFRAME command when the active view is a 2D view.
+//-----------------------------------------------------------------------------
+void CChildFrame::OnView3dWireframe(void)
+{
+ SetViewType(VIEW3D_WIREFRAME);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the ID_VIEW_3DPOLYGON command when the active view is a 2D view.
+//-----------------------------------------------------------------------------
+void CChildFrame::OnView3dPolygon(void)
+{
+ SetViewType(VIEW3D_POLYGON);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the ID_VIEW_3DTEXTURED command when the active view is a 2D view.
+//-----------------------------------------------------------------------------
+void CChildFrame::OnView3dTextured(void)
+{
+ SetViewType(VIEW3D_TEXTURED);
+}
+
+void CChildFrame::OnView3dTexturedShaded(void)
+{
+ SetViewType(VIEW3D_TEXTURED_SHADED);
+}
+
+void CChildFrame::OnView3dLightingPreview(void)
+{
+ SetViewType(VIEW3D_LIGHTING_PREVIEW2);
+}
+
+void CChildFrame::OnView3dLightingPreviewRayTraced(void)
+{
+ SetViewType(VIEW3D_LIGHTING_PREVIEW_RAYTRACED);
+}
+//-----------------------------------------------------------------------------
+// Purpose: Handles the ID_VIEW_3DTEXTURED command when the active view is a 2D view.
+//-----------------------------------------------------------------------------
+void CChildFrame::OnView3dLightmapGrid(void)
+{
+ SetViewType(VIEW3D_LIGHTMAP_GRID);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the ID_VIEW_3DSMOOTH command when the active view is a 3D view.
+//-----------------------------------------------------------------------------
+void CChildFrame::OnView3dSmooth(void)
+{
+ SetViewType(VIEW3D_SMOOTHING_GROUP);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the ID_VIEW_3DENGINE command when the active view is a 2D view.
+//-----------------------------------------------------------------------------
+//void CChildFrame::OnView3dEngine(void)
+//{
+// SetViewType(VIEW3D_ENGINE);
+//}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Overloaded to handle the 2x2 splitter. If the splitter is enabled,
+// the splitter window is createed and one 3D view and three 2D views
+// are added to it.
+// Input : lpcs -
+// pContext -
+// Output : Returns TRUE on success, FALSE on failure.
+//-----------------------------------------------------------------------------
+BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext *pContext)
+{
+ //
+ // If we are using the splitter, create the splitter and 4 views.
+ //
+ if (bUsingSplitter)
+ {
+ m_wndSplitter = new CMySplitterWnd;
+ Assert(m_wndSplitter != NULL);
+
+ if (m_wndSplitter == NULL)
+ {
+ return(FALSE);
+ }
+
+ if (!m_wndSplitter->CreateStatic(this, 2, 2))
+ {
+ delete m_wndSplitter;
+ m_wndSplitter = NULL;
+ TRACE0("Failed to create split bar ");
+ return(FALSE);
+ }
+
+ //
+ // Calculate the size of each view within the splitter,
+ //
+ CRect r;
+ GetClientRect(r);
+ CSize sizeView((r.Width() / 2) - 3, (r.Height() / 2) - 3);
+
+ //
+ // Create the 4 views as they were when the user last closed the app.
+ //
+ DrawType_t eDrawType[2][2];
+
+ eDrawType[0][0] = (DrawType_t)APP()->GetProfileInt("Splitter", "DrawType0,0", VIEW3D_WIREFRAME);
+ eDrawType[0][1] = (DrawType_t)APP()->GetProfileInt("Splitter", "DrawType0,1", VIEW2D_XY);
+ eDrawType[1][0] = (DrawType_t)APP()->GetProfileInt("Splitter", "DrawType1,0", VIEW2D_YZ);
+ eDrawType[1][1] = (DrawType_t)APP()->GetProfileInt("Splitter", "DrawType1,1", VIEW2D_XZ);
+
+ for (int nRow = 0; nRow < 2; nRow++)
+ {
+ for (int nCol = 0; nCol < 2; nCol++)
+ {
+ // These might be lying around in people's registry.
+ if ((eDrawType[nRow][nCol] == VIEW3D_ENGINE) || (eDrawType[nRow][nCol] >= VIEW_TYPE_LAST))
+ {
+ eDrawType[nRow][nCol] = VIEW3D_TEXTURED;
+ }
+
+ switch (eDrawType[nRow][nCol])
+ {
+ case VIEW2D_XY:
+ case VIEW2D_XZ:
+ case VIEW2D_YZ:
+ {
+ m_wndSplitter->CreateView(nRow, nCol, RUNTIME_CLASS(CMapView2D), sizeView, pContext);
+ break;
+ }
+
+ case VIEW_LOGICAL:
+ {
+ m_wndSplitter->CreateView(nRow, nCol, RUNTIME_CLASS(CMapViewLogical), sizeView, pContext);
+ break;
+ }
+
+ case VIEW3D_WIREFRAME:
+ case VIEW3D_POLYGON:
+ case VIEW3D_TEXTURED:
+ case VIEW3D_TEXTURED_SHADED:
+ case VIEW3D_LIGHTMAP_GRID:
+ case VIEW3D_LIGHTING_PREVIEW2:
+ case VIEW3D_LIGHTING_PREVIEW_RAYTRACED:
+ case VIEW3D_SMOOTHING_GROUP:
+ {
+ m_wndSplitter->CreateView(nRow, nCol, RUNTIME_CLASS(CMapView3D), sizeView, pContext);
+ break;
+ }
+ }
+
+ CMapView *pView = dynamic_cast<CMapView*>(m_wndSplitter->GetPane(nRow, nCol));
+ if (pView != NULL)
+ {
+ pView->SetDrawType(eDrawType[nRow][nCol]);
+ }
+ }
+ }
+
+ int nWidth = APP()->GetProfileInt("Splitter", "SplitterWidth", -1);
+ int nHeight = APP()->GetProfileInt("Splitter", "SplitterHeight", -1);
+
+ if ( nWidth != -1 && nHeight != -1 )
+ {
+ m_wndSplitter->SetRowInfo( 0, nHeight, 0 );
+ m_wndSplitter->SetColumnInfo( 0, nWidth, 0 );
+ m_wndSplitter->RecalcLayout();
+ }
+ else
+ {
+ m_bNeedsCentered = TRUE;
+ }
+
+ m_bReady = TRUE;
+ return TRUE;
+ }
+
+ //
+ // No splitter, call default creation code.
+ //
+ return(CMDIChildWnd::OnCreateClient(lpcs, pContext));
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CChildFrame::CenterViews(void)
+{
+ if (!bUsingSplitter || !m_bReady)
+ {
+ return;
+ }
+
+ WriteDebug("childfrm::centerviews");
+
+ CRect r;
+ GetClientRect(r);
+ CSize sizeView(r.Width()/2 - 3, r.Height()/2 - 3);
+
+ sizeView.cy = max(0, sizeView.cy);
+ sizeView.cx = max(0, sizeView.cx);
+
+ m_wndSplitter->SetRowInfo(0, sizeView.cy, 0);
+ m_wndSplitter->SetRowInfo(1, sizeView.cy, 0);
+ m_wndSplitter->SetColumnInfo(0, sizeView.cx, 0);
+ m_wndSplitter->SetColumnInfo(1, sizeView.cx, 0);
+ m_wndSplitter->RecalcLayout();
+
+ WriteDebug("childfrm::centerviews done");
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CChildFrame::OnViewAutosize4(void)
+{
+ if (!bUsingSplitter)
+ {
+ return;
+ }
+
+ if (0) // bAutosize4)
+ {
+ bAutosize4 = FALSE;
+ }
+ else
+ {
+ // resize 4 views
+ CenterViews();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : pCmdUI -
+//-----------------------------------------------------------------------------
+void CChildFrame::OnUpdateViewAutosize4(CCmdUI *pCmdUI)
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : nType -
+// cx -
+// cy -
+//-----------------------------------------------------------------------------
+void CChildFrame::OnSize(UINT nType, int cx, int cy)
+{
+ CMDIChildWnd::OnSize(nType, cx, cy);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : lpCreateStruct -
+// Output : int
+//-----------------------------------------------------------------------------
+int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
+{
+ if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
+ {
+ return(-1);
+ }
+
+ //
+ // The splitter gets its layout from the registry.
+ //
+ if ( bUsingSplitter && CHammer::IsNewDocumentVisible() )
+ {
+ CString str = APP()->GetProfileString("Splitter", "WindowPlacement", "");
+ if (!str.IsEmpty())
+ {
+ WINDOWPLACEMENT wp;
+ wp.length = sizeof(wp);
+ wp.flags = 0;
+ sscanf(str, "(%d %d) (%d %d) (%d %d %d %d) %d", &wp.ptMaxPosition.x, &wp.ptMaxPosition.y, &wp.ptMinPosition.x, &wp.ptMinPosition.y, &wp.rcNormalPosition.bottom, &wp.rcNormalPosition.left, &wp.rcNormalPosition.right, &wp.rcNormalPosition.top, &wp.showCmd);
+
+ if (wp.showCmd == SW_SHOWMAXIMIZED)
+ {
+ PostMessage(WM_SYSCOMMAND, SC_MAXIMIZE);
+ }
+ else
+ {
+ SetWindowPlacement(&wp);
+ }
+ }
+ }
+
+ return(0);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CChildFrame::OnPaint(void)
+{
+ if (bFirstPaint)
+ {
+ ValidateRect(NULL);
+ bFirstPaint = FALSE;
+ if ( m_bNeedsCentered )
+ {
+ CenterViews();
+ }
+ Invalidate();
+ return;
+ }
+
+ CPaintDC dc(this); // device context for painting
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *pWnd -
+//-----------------------------------------------------------------------------
+void CMySplitterWnd::ToggleMax(CWnd *pWnd)
+{
+ int ir, ic;
+
+ if(!pMaxPrev)
+ {
+ int dummy;
+ // save current info
+ GetRowInfo(0, sizePrev[1][0], dummy);
+ GetRowInfo(1, sizePrev[1][1], dummy);
+ GetColumnInfo(0, sizePrev[0][0], dummy);
+ GetColumnInfo(1, sizePrev[0][1], dummy);
+ }
+
+ if(pWnd != pMaxPrev)
+ {
+ // maximize this one
+ int iRow, iCol;
+ CRect r;
+ GetClientRect(r);
+ VERIFY(IsChildPane(pWnd, &iRow, &iCol));
+
+ for(ir = 0; ir < 2; ir++)
+ {
+ for(ic = 0; ic < 2; ic++)
+ {
+ SetRowInfo(ir, 0, 0);
+ SetColumnInfo(ic, 0, 0);
+ }
+ }
+
+ SetRowInfo(iRow, r.Height(), 5);
+ SetColumnInfo(iCol, r.Width(), 5);
+
+ pMaxPrev = pWnd;
+ }
+ else
+ {
+ // restore saved info
+ SetRowInfo(0, sizePrev[1][0], 0);
+ SetRowInfo(1, sizePrev[1][1], 0);
+ SetColumnInfo(0, sizePrev[0][0], 0);
+ SetColumnInfo(1, sizePrev[0][1], 0);
+
+ pMaxPrev = NULL;
+ }
+
+ RecalcLayout();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CChildFrame::OnViewMaximizepane(void)
+{
+ if (!bUsingSplitter)
+ {
+ return;
+ }
+
+ // find current wndsplitter pane, & call ToggleMax() in
+ // cmysplitterwnd.
+ if (m_wndSplitter->GetActivePane())
+ {
+ m_wndSplitter->ToggleMax(m_wndSplitter->GetActivePane());
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *pCmdUI -
+//-----------------------------------------------------------------------------
+void CChildFrame::OnUpdateViewMaximizepane(CCmdUI *pCmdUI)
+{
+ pCmdUI->Enable();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input :
+//-----------------------------------------------------------------------------
+void CChildFrame::OnWindowToggle(void)
+{
+// SetSplitterMode(!bUsingSplitter);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Saves the splitter setup for next time.
+//-----------------------------------------------------------------------------
+void CChildFrame::OnClose(void)
+{
+ SaveOptions();
+ CFrameWnd::OnClose();
+}
+void CChildFrame::OnSetFocus( CWnd* pOldWnd )
+{
+ CMDIChildWnd::OnSetFocus( pOldWnd );
+
+ CMapDoc *pDoc = dynamic_cast<CMapDoc*>(GetActiveDocument());
+
+ if ( pDoc )
+ CMapDoc::SetActiveMapDoc( pDoc );
+}
+