diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/childfrm.cpp | |
| download | archived-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.cpp | 911 |
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 ); +} + |