mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
922 lines
26 KiB
922 lines
26 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1999
|
|
//
|
|
// File: childfrm.cpp
|
|
//
|
|
// Contents: Child frame implementation
|
|
//
|
|
// History: 01-Jan-96 TRomano Created
|
|
// 16-Jul-96 WayneSc Add code to switch views
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "AMC.h"
|
|
#include "ChildFrm.h"
|
|
#include "AMCDoc.h"
|
|
#include "AMCView.h"
|
|
#include "treectrl.h"
|
|
#include "afxpriv.h"
|
|
#include "mainfrm.h"
|
|
#include "amcpriv.h"
|
|
#include "sysmenu.h"
|
|
#include "amcmsgid.h"
|
|
#include "caption.h"
|
|
#include "strings.h"
|
|
#include "menubtns.h"
|
|
|
|
bool CanCloseDoc(void);
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CChildFrame
|
|
|
|
IMPLEMENT_DYNCREATE(CChildFrame, CMDIChildWnd)
|
|
|
|
BEGIN_MESSAGE_MAP(CChildFrame, CMDIChildWnd)
|
|
//{{AFX_MSG_MAP(CChildFrame)
|
|
ON_WM_CREATE()
|
|
ON_WM_SIZE()
|
|
ON_WM_DESTROY()
|
|
ON_WM_CLOSE()
|
|
ON_WM_MDIACTIVATE()
|
|
ON_COMMAND(ID_CUSTOMIZE_VIEW, OnCustomizeView)
|
|
ON_WM_NCPAINT()
|
|
ON_WM_NCACTIVATE()
|
|
ON_WM_SYSCOMMAND()
|
|
ON_WM_INITMENUPOPUP()
|
|
//}}AFX_MSG_MAP
|
|
|
|
ON_MESSAGE(WM_SETTEXT, OnSetText)
|
|
ON_MESSAGE(WM_GETICON, OnGetIcon)
|
|
ON_MESSAGE(WM_SETMESSAGESTRING, OnSetMessageString)
|
|
ON_COMMAND_RANGE(ID_MMC_MAXIMIZE, ID_MMC_RESTORE, OnMaximizeOrRestore)
|
|
ON_UPDATE_COMMAND_UI(ID_CUSTOMIZE_VIEW, OnUpdateCustomizeView)
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CChildFrame construction/destruction
|
|
|
|
CChildFrame::CChildFrame()
|
|
{
|
|
m_pAMCView = NULL;
|
|
m_fDestroyed = false;
|
|
m_fCurrentlyMinimized = false;
|
|
m_fCurrentlyActive = false;
|
|
m_fCreateVisible = true;
|
|
}
|
|
|
|
CChildFrame::~CChildFrame()
|
|
{
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CChildFrame diagnostics
|
|
|
|
#ifdef _DEBUG
|
|
void CChildFrame::AssertValid() const
|
|
{
|
|
CMDIChildWnd::AssertValid();
|
|
}
|
|
|
|
void CChildFrame::Dump(CDumpContext& dc) const
|
|
{
|
|
CMDIChildWnd::Dump(dc);
|
|
}
|
|
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CChildFrame message handlers
|
|
|
|
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
BOOL bSuccess=FALSE;
|
|
|
|
// Let default implementation fill in most of the details
|
|
if (!CMDIChildWnd::PreCreateWindow(cs))
|
|
return (FALSE);
|
|
|
|
// Remove the edge from the window so the splitter can paint it.
|
|
cs.dwExStyle &=~WS_EX_CLIENTEDGE;
|
|
|
|
WNDCLASS wc;
|
|
LPCTSTR pszChildFrameClassName = g_szChildFrameClassName;
|
|
|
|
if (::GetClassInfo(AfxGetInstanceHandle(), cs.lpszClass, &wc))
|
|
{
|
|
// Clear the H and V REDRAW flags
|
|
wc.style &= ~(CS_HREDRAW | CS_VREDRAW);
|
|
wc.hIcon = AfxGetApp()->LoadIcon(IDR_AMCTYPE);
|
|
wc.lpszClassName = pszChildFrameClassName;
|
|
|
|
// Register this new style;
|
|
bSuccess=AfxRegisterClass(&wc);
|
|
}
|
|
|
|
|
|
// Use the new child frame window class
|
|
cs.lpszClass = pszChildFrameClassName;
|
|
//cs.style &= ~FWS_ADDTOTITLE;
|
|
|
|
// force maximized if in SDI User mode
|
|
if (AMCGetApp()->GetMode() == eMode_User_SDI)
|
|
cs.style |= WS_MAXIMIZE;
|
|
|
|
// do not paint over the children
|
|
cs.style |= WS_CLIPCHILDREN;
|
|
|
|
return bSuccess;
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CChildFrame::OnUpdateFrameTitle
|
|
*
|
|
* PURPOSE: Sets the window title. It might be possible to short out this
|
|
* function.
|
|
*
|
|
* PARAMETERS:
|
|
* BOOL bAddToTitle :
|
|
*
|
|
* RETURNS:
|
|
* void
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
void
|
|
CChildFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
|
|
{
|
|
DECLARE_SC(sc,TEXT("CChildFrame::OnUpdateFrameTitle"));
|
|
|
|
if ((GetStyle() & FWS_ADDTOTITLE) == 0)
|
|
return; // leave child window alone!
|
|
|
|
CDocument* pDocument = GetActiveDocument();
|
|
if (bAddToTitle && pDocument != NULL)
|
|
{
|
|
sc = ScCheckPointers(m_pAMCView, E_UNEXPECTED);
|
|
if(sc)
|
|
return;
|
|
|
|
sc = ScCheckPointers(m_pAMCView->GetWindowTitle());
|
|
if(sc)
|
|
return;
|
|
|
|
// set title if changed, but don't remove completely
|
|
AfxSetWindowText(m_hWnd, m_pAMCView->GetWindowTitle());
|
|
}
|
|
|
|
// update our parent window last
|
|
GetMDIFrame()->OnUpdateFrameTitle(bAddToTitle);
|
|
}
|
|
|
|
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
static UINT anIndicators[] =
|
|
{
|
|
ID_SEPARATOR, // status line indicator
|
|
IDS_PROGRESS, // place holder for progress bar
|
|
IDS_STATUS_STATIC, // place holder for static control
|
|
};
|
|
|
|
DECLARE_SC (sc, _T("CChildFrame::OnCreate"));
|
|
|
|
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
|
|
{
|
|
sc = E_UNEXPECTED;
|
|
return -1;
|
|
}
|
|
|
|
/*
|
|
* status bar should be themed (block controls the scope of activator)
|
|
*/
|
|
{
|
|
CThemeContextActivator activator;
|
|
|
|
// Create the status bar and panes
|
|
m_wndStatusBar.Create(this, WS_CHILD|WS_VISIBLE|SBARS_SIZEGRIP, 0x1003);
|
|
m_wndStatusBar.CreatePanes(anIndicators, countof(anIndicators));
|
|
}
|
|
|
|
// Add the control to the dock site
|
|
m_StatusDockSite.Create(CDockSite::DSS_BOTTOM);
|
|
m_StatusDockSite.Attach(&m_wndStatusBar);
|
|
m_StatusDockSite.Show();
|
|
|
|
// Tell the dock manager about the site.
|
|
m_DockingManager.Attach(&m_StatusDockSite);
|
|
|
|
CAMCView* const pAMCView = GetAMCView();
|
|
if (pAMCView == NULL)
|
|
{
|
|
sc = E_UNEXPECTED;
|
|
return -1;
|
|
}
|
|
|
|
pAMCView->SetChildFrameWnd(m_hWnd);
|
|
|
|
SViewData* pVD = pAMCView->GetViewData();
|
|
if (NULL == pVD)
|
|
{
|
|
sc = E_UNEXPECTED;
|
|
return -1;
|
|
}
|
|
|
|
// Create the menubuttons manager and toolbars manager (one per view).
|
|
m_spMenuButtonsMgr = std::auto_ptr<CMenuButtonsMgrImpl>(new CMenuButtonsMgrImpl());
|
|
if (NULL == m_spMenuButtonsMgr.get())
|
|
{
|
|
sc = E_UNEXPECTED;
|
|
return -1;
|
|
}
|
|
|
|
// Let SViewData be aware of the CMenuButtonsMgr.
|
|
pVD->SetMenuButtonsMgr(static_cast<CMenuButtonsMgr*>(m_spMenuButtonsMgr.get()));
|
|
|
|
CMainFrame* pFrame = AMCGetMainWnd();
|
|
sc = ScCheckPointers (pFrame, E_UNEXPECTED);
|
|
if (sc)
|
|
return -1;
|
|
|
|
ASSERT_KINDOF (CMainFrame, pFrame);
|
|
|
|
// Init the CMenuButtonsMgr.
|
|
sc = m_spMenuButtonsMgr->ScInit(pFrame, this);
|
|
if (sc)
|
|
return -1;
|
|
|
|
// Create the Standard toolbar UI.
|
|
pVD->m_spNodeManager->InitViewData(reinterpret_cast<LONG_PTR>(pVD));
|
|
ASSERT(pVD->m_spVerbSet != NULL);
|
|
|
|
AppendToSystemMenu (this, eMode_User_SDI);
|
|
RenderDockSites();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void CChildFrame::RenderDockSites()
|
|
{
|
|
CRect clientRect;
|
|
GetClientRect(&clientRect);
|
|
|
|
CWnd* pWnd=GetWindow(GW_CHILD);
|
|
|
|
if(pWnd)
|
|
{
|
|
m_DockingManager.BeginLayout();
|
|
m_DockingManager.RenderDockSites(pWnd->m_hWnd, clientRect);
|
|
m_DockingManager.EndLayout();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
bool CChildFrame::IsCustomizeViewEnabled()
|
|
{
|
|
bool fEnable = false;
|
|
CAMCDoc* pDoc = CAMCDoc::GetDocument();
|
|
|
|
if (pDoc != NULL)
|
|
{
|
|
fEnable = (AMCGetApp()->GetMode() == eMode_Author) ||
|
|
pDoc->AllowViewCustomization();
|
|
}
|
|
|
|
return (fEnable);
|
|
}
|
|
|
|
void CChildFrame::OnUpdateCustomizeView(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->Enable (IsCustomizeViewEnabled());
|
|
}
|
|
|
|
// Display Customize View dialog
|
|
// When a child window is maximized, then it becomes a CMainFrame so the handler is
|
|
// necessary here to process the Scope Pane command on the system menu
|
|
void CChildFrame::OnCustomizeView()
|
|
{
|
|
CAMCView* pView = GetAMCView();
|
|
|
|
if (pView != NULL)
|
|
{
|
|
INodeCallback* pCallback = pView->GetNodeCallback();
|
|
SViewData* pViewData = pView->GetViewData();
|
|
|
|
ASSERT (pCallback != NULL);
|
|
ASSERT (pViewData != NULL);
|
|
|
|
pCallback->OnCustomizeView (reinterpret_cast<LONG_PTR>(pViewData));
|
|
}
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::OnInitMenuPopup
|
|
*
|
|
* WM_INITMENUPOPUP handler for CChildFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void CChildFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
|
|
{
|
|
/*
|
|
* Bug 201113: don't allow child system menus in SDI mode
|
|
*/
|
|
if (bSysMenu && (AMCGetApp()->GetMode() == eMode_User_SDI))
|
|
{
|
|
SendMessage (WM_CANCELMODE);
|
|
return;
|
|
}
|
|
|
|
CMDIChildWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
|
|
|
|
/*
|
|
* CFrameWnd::OnInitMenuPopup doesn't do UI updates for system menus,
|
|
* so we have to do it here
|
|
*/
|
|
if (bSysMenu)
|
|
{
|
|
int nEnable = IsCustomizeViewEnabled() ? MF_ENABLED : MF_GRAYED;
|
|
pPopupMenu->EnableMenuItem (ID_CUSTOMIZE_VIEW, MF_BYCOMMAND | nEnable);
|
|
}
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::OnSize
|
|
*
|
|
* WM_SIZE handler for CChildFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
void CChildFrame::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CChildFrame::OnSize"));
|
|
|
|
// bypass CMDIChildWnd::OnSize so we won't get MFC's docking stuff
|
|
// (we still need to call Default so Windows' MDI stuff will work right)
|
|
CWnd::OnSize(nType, cx, cy);
|
|
|
|
if (nType != SIZE_MINIMIZED)
|
|
{
|
|
RenderDockSites();
|
|
CAMCView* pAMCView = GetAMCView();
|
|
ASSERT (pAMCView != NULL);
|
|
|
|
if (pAMCView)
|
|
pAMCView->AdjustTracker (cx, cy);
|
|
}
|
|
|
|
|
|
// update our parent frame - in case we are now maximized or not
|
|
CMDIFrameWnd* pwndMDIFrame = GetMDIFrame();
|
|
|
|
if (pwndMDIFrame)
|
|
pwndMDIFrame->OnUpdateFrameTitle(TRUE);
|
|
|
|
/*
|
|
* If we're moving to or from the minimized state, notify snap-ins.
|
|
* We don't need to send the notification if we're only creating a
|
|
* temporary view that will never be shown.
|
|
*/
|
|
if (m_fCurrentlyMinimized != (nType == SIZE_MINIMIZED) && m_fCreateVisible)
|
|
{
|
|
m_fCurrentlyMinimized = (nType == SIZE_MINIMIZED);
|
|
SendMinimizeNotification (m_fCurrentlyMinimized);
|
|
}
|
|
|
|
// send the size notification to the view.
|
|
if(GetAMCView())
|
|
{
|
|
sc = GetAMCView()->ScOnSize(nType, cx, cy);
|
|
if(sc)
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
BOOL CChildFrame::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CMDIFrameWnd* pParentWnd, CCreateContext* pContext)
|
|
{
|
|
if (pParentWnd == NULL)
|
|
{
|
|
CWnd* pMainWnd = AfxGetThread()->m_pMainWnd;
|
|
ASSERT(pMainWnd != NULL);
|
|
ASSERT_KINDOF(CMDIFrameWnd, pMainWnd);
|
|
pParentWnd = (CMDIFrameWnd*)pMainWnd;
|
|
}
|
|
ASSERT(::IsWindow(pParentWnd->m_hWndMDIClient));
|
|
|
|
// first copy into a CREATESTRUCT for PreCreate
|
|
CREATESTRUCT cs;
|
|
cs.dwExStyle = 0L;
|
|
cs.lpszClass = lpszClassName;
|
|
cs.lpszName = lpszWindowName;
|
|
cs.style = dwStyle;
|
|
cs.x = rect.left;
|
|
cs.y = rect.top;
|
|
cs.cx = rect.right - rect.left;
|
|
cs.cy = rect.bottom - rect.top;
|
|
cs.hwndParent = pParentWnd->m_hWnd;
|
|
cs.hMenu = NULL;
|
|
cs.hInstance = AfxGetInstanceHandle();
|
|
cs.lpCreateParams = (LPVOID)pContext;
|
|
|
|
if (!PreCreateWindow(cs))
|
|
{
|
|
PostNcDestroy();
|
|
return FALSE;
|
|
}
|
|
// extended style must be zero for MDI Children (except under Win4)
|
|
// ASSERT(afxData.bWin4 || cs.dwExStyle == 0);
|
|
ASSERT(cs.hwndParent == pParentWnd->m_hWnd); // must not change
|
|
|
|
// now copy into a MDICREATESTRUCT for real create
|
|
MDICREATESTRUCT mcs;
|
|
mcs.szClass = cs.lpszClass;
|
|
mcs.szTitle = cs.lpszName;
|
|
mcs.hOwner = cs.hInstance;
|
|
mcs.x = cs.x;
|
|
mcs.y = cs.y;
|
|
mcs.cx = cs.cx;
|
|
mcs.cy = cs.cy;
|
|
mcs.style = cs.style & ~(WS_MAXIMIZE | WS_VISIBLE);
|
|
mcs.lParam = reinterpret_cast<LPARAM>(cs.lpCreateParams);
|
|
|
|
// create the window through the MDICLIENT window
|
|
AfxHookWindowCreate(this);
|
|
HWND hWnd = (HWND)::SendMessage(pParentWnd->m_hWndMDIClient,
|
|
WM_MDICREATE, 0, (LPARAM)&mcs);
|
|
if (!AfxUnhookWindowCreate())
|
|
PostNcDestroy(); // cleanup if MDICREATE fails too soon
|
|
|
|
if (hWnd == NULL)
|
|
return FALSE;
|
|
|
|
// special handling of visibility (always created invisible)
|
|
if (cs.style & WS_VISIBLE)
|
|
{
|
|
// place the window on top in z-order before showing it
|
|
::BringWindowToTop(hWnd);
|
|
|
|
// show it as specified
|
|
if (cs.style & WS_MINIMIZE)
|
|
ShowWindow(SW_SHOWMINIMIZED);
|
|
else if (cs.style & WS_MAXIMIZE)
|
|
ShowWindow(SW_SHOWMAXIMIZED);
|
|
else
|
|
ShowWindow(SW_SHOWNORMAL);
|
|
|
|
// make sure it is active (visibility == activation)
|
|
pParentWnd->MDIActivate(this);
|
|
|
|
// refresh MDI Window menu
|
|
::SendMessage(pParentWnd->m_hWndMDIClient, WM_MDIREFRESHMENU, 0, 0);
|
|
}
|
|
|
|
ASSERT(hWnd == m_hWnd);
|
|
return TRUE;
|
|
}
|
|
|
|
void CChildFrame::OnDestroy()
|
|
{
|
|
// NOTE - The un-hooking of the dock manager stops the rebar sending a height change
|
|
// when the rebar goes away.
|
|
m_DockingManager.RemoveAll();
|
|
|
|
m_fDestroyed = true;
|
|
|
|
CMDIChildWnd::OnDestroy();
|
|
}
|
|
|
|
void CChildFrame::OnMaximizeOrRestore(UINT nID)
|
|
{
|
|
ASSERT(nID == ID_MMC_MAXIMIZE || nID == ID_MMC_RESTORE);
|
|
|
|
WINDOWPLACEMENT wp;
|
|
wp.length = sizeof(wp);
|
|
GetWindowPlacement(&wp);
|
|
|
|
UINT newShowCmd = (nID == ID_MMC_MAXIMIZE) ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL;
|
|
|
|
if (wp.showCmd != newShowCmd)
|
|
{
|
|
wp.showCmd = newShowCmd;
|
|
SetWindowPlacement(&wp);
|
|
}
|
|
}
|
|
|
|
|
|
void CChildFrame::OnClose()
|
|
{
|
|
CAMCDoc* pDoc = CAMCDoc::GetDocument();
|
|
ASSERT(pDoc != NULL);
|
|
if (pDoc)
|
|
{
|
|
int cViews = 0;
|
|
CAMCViewPosition pos = pDoc->GetFirstAMCViewPosition();
|
|
while (pos != NULL)
|
|
{
|
|
CAMCView* pView = pDoc->GetNextAMCView(pos);
|
|
|
|
if ((pView != NULL) && ++cViews >= 2)
|
|
break;
|
|
}
|
|
|
|
if (cViews == 1)
|
|
{
|
|
if (!CanCloseDoc())
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
// if not closing last view, then give it
|
|
// a chance to clean up first.
|
|
// (if whole doc is closing CAMCDoc will handle
|
|
// closing all the views.)
|
|
CAMCView* pView = GetAMCView();
|
|
if (pView != NULL)
|
|
{
|
|
CAMCDoc* pAMCDoc = CAMCDoc::GetDocument();
|
|
|
|
/*
|
|
* Don't allow the user to close the last persisted view.
|
|
*/
|
|
if (pView->IsPersisted() &&
|
|
(pAMCDoc != NULL) &&
|
|
(pAMCDoc->GetNumberOfPersistedViews() == 1))
|
|
{
|
|
MMCMessageBox (IDS_CantCloseLastPersistableView);
|
|
return;
|
|
}
|
|
|
|
pView->CloseView();
|
|
}
|
|
}
|
|
}
|
|
|
|
CMDIChildWnd::OnClose();
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::OnUpdateFrameMenu
|
|
*
|
|
* WM_UPDATEFRAMEMENU handler for CChildFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void CChildFrame::OnUpdateFrameMenu(BOOL bActivate, CWnd* pActivateWnd,
|
|
HMENU hMenuAlt)
|
|
{
|
|
ASSERT_VALID (this);
|
|
DECLARE_SC (sc, _T("CChildFrame::OnUpdateFrameMenu"));
|
|
|
|
// let the base class select the right menu
|
|
CMDIChildWnd::OnUpdateFrameMenu (bActivate, pActivateWnd, hMenuAlt);
|
|
|
|
// make sure the child has the WS_SYSMENU bit
|
|
// (it won't if it's created maximized)
|
|
ModifyStyle (0, WS_SYSMENU);
|
|
|
|
// by now, the right menu is selected; reflect it to the toolbar
|
|
CMainFrame* pFrame = static_cast<CMainFrame *>(GetParentFrame ());
|
|
ASSERT_KINDOF (CMainFrame, pFrame);
|
|
pFrame->NotifyMenuChanged ();
|
|
|
|
// Add the menubuttons only on activate, the CMenubar
|
|
// removes all menus during deactivate.
|
|
if (bActivate)
|
|
{
|
|
ASSERT(NULL != m_spMenuButtonsMgr.get());
|
|
if (NULL != m_spMenuButtonsMgr.get())
|
|
{
|
|
// Now add the menu buttons to main menu
|
|
sc = m_spMenuButtonsMgr->ScAddMenuButtonsToMainMenu();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::OnGetIcon
|
|
*
|
|
* WM_GETICON handler for CChildFrame.
|
|
*
|
|
* NOTE: the control over the icon remains with the callee - it is responsible
|
|
* for releasing the resource. Coller should never release the returned
|
|
* handle
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
LRESULT CChildFrame::OnGetIcon (WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CAMCDoc* pDoc = CAMCDoc::GetDocument();
|
|
|
|
/*
|
|
* use the custom icon if we have one
|
|
*/
|
|
if ((pDoc != NULL) && pDoc->HasCustomIcon())
|
|
return ((LRESULT) pDoc->GetCustomIcon ((wParam == ICON_BIG)));
|
|
|
|
/*
|
|
* no custom icon, use the default icon
|
|
*/
|
|
const int cxIcon = GetSystemMetrics ((wParam == ICON_BIG) ? SM_CXICON : SM_CXSMICON);
|
|
const int cyIcon = GetSystemMetrics ((wParam == ICON_BIG) ? SM_CYICON : SM_CYSMICON);
|
|
|
|
// use cached copy - it never changes
|
|
// do not delete this ever - since we only have one copy,
|
|
// we do not leak. releassing is expensive and does not pay off
|
|
static HICON s_hMMCIcon = (HICON)::LoadImage (AfxGetResourceHandle(),
|
|
MAKEINTRESOURCE (IDR_AMCTYPE),
|
|
IMAGE_ICON, cxIcon, cyIcon, 0);
|
|
|
|
return (LRESULT)s_hMMCIcon;
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::OnSysCommand
|
|
*
|
|
* WM_SYSCOMMAND handler for CChildFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void CChildFrame::OnSysCommand(UINT nID, LPARAM lParam)
|
|
{
|
|
switch (nID)
|
|
{
|
|
case ID_CUSTOMIZE_VIEW:
|
|
OnCustomizeView();
|
|
break;
|
|
|
|
case SC_CLOSE:
|
|
{
|
|
// eat Ctrl+F4 in SDI simulation mode...
|
|
if (AMCGetApp()->GetMode() == eMode_User_SDI)
|
|
break;
|
|
|
|
// ...or if Close is disabled or doesn't exist on the system menu
|
|
CMenu* pSysMenu = GetSystemMenu (FALSE);
|
|
UINT nCloseState = pSysMenu->GetMenuState (SC_CLOSE, MF_BYCOMMAND);
|
|
|
|
if ((nCloseState == 0xFFFFFFFF) ||
|
|
(nCloseState & (MF_GRAYED | MF_DISABLED)))
|
|
break;
|
|
|
|
// all systems go, let MDI have it
|
|
CMDIChildWnd::OnSysCommand(nID, lParam);
|
|
break;
|
|
}
|
|
|
|
case SC_NEXTWINDOW:
|
|
case SC_PREVWINDOW:
|
|
// eat Ctrl+(Shift+)Tab and Ctrl+(Shift+)F6 in SDI simulation mode
|
|
if (AMCGetApp()->GetMode() != eMode_User_SDI)
|
|
CMDIChildWnd::OnSysCommand(nID, lParam);
|
|
break;
|
|
|
|
default:
|
|
CMDIChildWnd::OnSysCommand(nID, lParam);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::GetDefaultAccelerator
|
|
*
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
HACCEL CChildFrame::GetDefaultAccelerator()
|
|
{
|
|
// use document specific accelerator table ONLY
|
|
// Dont use CFrameWnd::m_hAccel, because we don't base accelerators
|
|
// on document type but rather on mode. This is taken care of
|
|
// in CAMCDoc.
|
|
return (NULL);
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::OnSetMessageString
|
|
*
|
|
* WM_SETMESSAGESTRING handler for CChildFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
LRESULT CChildFrame::OnSetMessageString(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
/*
|
|
* if this we're going to set the idle message string and we've
|
|
* been given a custom status line string, use that one instead
|
|
*/
|
|
if ((wParam == AFX_IDS_IDLEMESSAGE) && !m_strStatusText.IsEmpty())
|
|
{
|
|
ASSERT (lParam == 0);
|
|
wParam = 0;
|
|
lParam = (LPARAM)(LPCTSTR) m_strStatusText;
|
|
}
|
|
|
|
// sometimes we'll get a WM_SETMESSAGESTRING after being destroyed,
|
|
// don't pass it through or we'll crash inside the status bar code
|
|
if (m_fDestroyed)
|
|
return (0);
|
|
|
|
return (CMDIChildWnd::OnSetMessageString (wParam, lParam));
|
|
}
|
|
|
|
void CChildFrame::ToggleStatusBar ()
|
|
{
|
|
m_StatusDockSite.Toggle();
|
|
RenderDockSites();
|
|
|
|
if (m_StatusDockSite.IsVisible())
|
|
UpdateStatusText ();
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::OnMDIActivate
|
|
*
|
|
* WM_MDIACTIVATE handler for CChildFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void CChildFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd)
|
|
{
|
|
DECLARE_SC (sc, _T("CChildFrame::OnMDIActivate"));
|
|
SetChildFrameActive(bActivate);
|
|
|
|
CMDIChildWnd::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);
|
|
|
|
sc = ScCheckPointers(m_pAMCView, E_UNEXPECTED);
|
|
if (sc)
|
|
return;
|
|
|
|
if (bActivate)
|
|
{
|
|
// If the window being de-activated is not of childframe type then this
|
|
// is the first active view (childframe).
|
|
bool bFirstActiveView = pDeactivateWnd ? (FALSE == pDeactivateWnd->IsKindOf (RUNTIME_CLASS (CChildFrame)))
|
|
: true;
|
|
sc = m_pAMCView->ScFireEvent(CAMCViewObserver::ScOnActivateView, m_pAMCView, bFirstActiveView);
|
|
|
|
// if activation changes - need to set frame to dirty
|
|
CAMCDoc* pDoc = CAMCDoc::GetDocument ();
|
|
|
|
if (pDoc == NULL)
|
|
(sc = E_UNEXPECTED).TraceAndClear();
|
|
else
|
|
{
|
|
pDoc->SetFrameModifiedFlag (true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// If the window being activated is not of childframe type then this is
|
|
// the last active view (childframe).
|
|
bool bLastActiveView = pActivateWnd ? (FALSE == pActivateWnd->IsKindOf (RUNTIME_CLASS (CChildFrame)))
|
|
: true;
|
|
sc = m_pAMCView->ScFireEvent(CAMCViewObserver::ScOnDeactivateView, m_pAMCView, bLastActiveView);
|
|
}
|
|
|
|
if (sc)
|
|
return;
|
|
|
|
/*
|
|
* Notify snap-ins of an activation change
|
|
*/
|
|
NotifyCallback (NCLBK_ACTIVATE, bActivate, 0);
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::SendMinimizeNotification
|
|
*
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void CChildFrame::SendMinimizeNotification (bool fMinimized) const
|
|
{
|
|
if(m_pAMCView != NULL)
|
|
m_pAMCView->ScOnMinimize(m_fCurrentlyMinimized);
|
|
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::NotifyCallback
|
|
*
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
HRESULT CChildFrame::NotifyCallback (
|
|
NCLBK_NOTIFY_TYPE event,
|
|
LONG_PTR arg,
|
|
LPARAM param) const
|
|
{
|
|
if (m_pAMCView == NULL)
|
|
return (E_FAIL);
|
|
|
|
HNODE hNode = m_pAMCView->GetSelectedNode();
|
|
|
|
if (hNode == NULL)
|
|
return (E_FAIL);
|
|
|
|
INodeCallback* pNodeCallback = m_pAMCView->GetNodeCallback();
|
|
|
|
if (pNodeCallback == NULL)
|
|
return (E_FAIL);
|
|
|
|
return (pNodeCallback->Notify (hNode, event, arg, param));
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::OnNcPaint
|
|
*
|
|
* WM_NCPAINT handler for CChildFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void CChildFrame::OnNcPaint()
|
|
{
|
|
Default();
|
|
DrawFrameCaption (this, m_fCurrentlyActive);
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::OnNcActivate
|
|
*
|
|
* WM_NCACTIVATE handler for CChildFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
BOOL CChildFrame::OnNcActivate(BOOL bActive)
|
|
{
|
|
BOOL rc = CMDIChildWnd::OnNcActivate(bActive);
|
|
|
|
m_fCurrentlyActive = bActive;
|
|
DrawFrameCaption (this, m_fCurrentlyActive);
|
|
|
|
return (rc);
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::OnSetText
|
|
*
|
|
* WM_SETTEXT handler for CChildFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
LRESULT CChildFrame::OnSetText (WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LRESULT rc = Default();
|
|
DrawFrameCaption (this, m_fCurrentlyActive);
|
|
|
|
return (rc);
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::ActivateFrame
|
|
*
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void CChildFrame::ActivateFrame(int nCmdShow /*= -1*/)
|
|
{
|
|
if ((nCmdShow == -1) && !m_fCreateVisible)
|
|
nCmdShow = SW_SHOWNOACTIVATE;
|
|
/*
|
|
* When this flag [m_fCreateVisible] is set, the frame will show itself with the
|
|
* SW_SHOWMINNOACTIVE flag instead of the default flag. Doing this will
|
|
* avoid the side effect of restoring the currently active child frame
|
|
* if it is maximized at the time the new frame is created invisibly.
|
|
*/
|
|
// The SW_SHOWMINNOACTIVE was changed to SW_SHOWNOACTIVATE.
|
|
// It does preserve the active window from mentioned side effect,
|
|
// plus it also allows scripts (using Object Moded) to create invisible views,
|
|
// position and then show them as normal (not minimized) windows,
|
|
// thus providing same result as creating visible and then hiding the view.
|
|
// While minimized window must be restored first in order to change their position.
|
|
|
|
CMDIChildWnd::ActivateFrame (nCmdShow);
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CChildFrame::SetCreateVisible
|
|
*
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
bool CChildFrame::SetCreateVisible (bool fCreateVisible)
|
|
{
|
|
bool fOldState = m_fCreateVisible;
|
|
m_fCreateVisible = fCreateVisible;
|
|
|
|
return (fOldState);
|
|
}
|