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.
2054 lines
57 KiB
2054 lines
57 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1999
|
|
//
|
|
// File: mainfrm.cpp
|
|
//
|
|
// Contents: Main frame for amc
|
|
//
|
|
// History: 01-Jan-96 TRomano Created
|
|
// 16-Jul-96 WayneSc Add code to test switching views
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
#include "AMCDoc.h"
|
|
#include "AMCView.h"
|
|
#include "AMC.h"
|
|
#include "MainFrm.h"
|
|
#include "ChildFrm.h"
|
|
#include "treectrl.h"
|
|
#include "menubar.h"
|
|
#include "mdiuisim.h"
|
|
#include "toolbar.h"
|
|
#include "props.h"
|
|
#include "sysmenu.h"
|
|
|
|
#include "amcmsgid.h"
|
|
#include "HtmlHelp.h"
|
|
|
|
#include "strings.h"
|
|
#include "ndmgrp.h"
|
|
#include "amcmsgid.h"
|
|
#include "tbtrack.h"
|
|
#include "caption.h"
|
|
#include "scriptevents.h"
|
|
|
|
|
|
#ifdef DBG
|
|
CTraceTag tagMainFrame(TEXT("CMainFrame"), TEXT("Messages"));
|
|
#endif
|
|
|
|
//############################################################################
|
|
//############################################################################
|
|
//
|
|
// Implementation of class CMMCApplicationFrame
|
|
//
|
|
//############################################################################
|
|
//############################################################################
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* class CMMCApplicationFrame
|
|
*
|
|
*
|
|
* PURPOSE: The COM 0bject that exposes the Frame interface off the Application object.
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
class CMMCApplicationFrame :
|
|
public CMMCIDispatchImpl<Frame>,
|
|
public CTiedComObject<CMainFrame>
|
|
{
|
|
typedef CMainFrame CMyTiedObject;
|
|
|
|
public:
|
|
BEGIN_MMC_COM_MAP(CMMCApplicationFrame)
|
|
END_MMC_COM_MAP()
|
|
|
|
//Frame interface
|
|
public:
|
|
STDMETHOD(Maximize)();
|
|
STDMETHOD(Minimize)();
|
|
STDMETHOD(Restore)();
|
|
|
|
STDMETHOD(get_Left)(int *pLeft) {return GetCoordinate(pLeft, eLeft);}
|
|
STDMETHOD(put_Left)(int left) {return PutCoordinate(left, eLeft);}
|
|
|
|
STDMETHOD(get_Right)(int *pRight) {return GetCoordinate(pRight, eRight);}
|
|
STDMETHOD(put_Right)(int right) {return PutCoordinate(right, eRight);}
|
|
|
|
STDMETHOD(get_Top)(int *pTop) {return GetCoordinate(pTop, eTop);}
|
|
STDMETHOD(put_Top)(int top) {return PutCoordinate(top, eTop);}
|
|
|
|
STDMETHOD(get_Bottom)(int *pBottom) {return GetCoordinate(pBottom, eBottom);}
|
|
STDMETHOD(put_Bottom)(int bottom) {return PutCoordinate(bottom, eBottom);}
|
|
|
|
private:
|
|
enum eCoordinate { eLeft, eRight, eTop, eBottom };
|
|
|
|
STDMETHOD(GetCoordinate)(int *pCoordinate, eCoordinate e);
|
|
STDMETHOD(PutCoordinate)(int coordinate, eCoordinate e);
|
|
};
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMMCApplicationFrame::Maximize
|
|
*
|
|
* PURPOSE:
|
|
*
|
|
* RETURNS:
|
|
* HRESULT
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
HRESULT
|
|
CMMCApplicationFrame::Maximize()
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMMCApplicationFrame::Maximize"));
|
|
|
|
CMyTiedObject *pTiedObj = NULL;
|
|
|
|
sc = ScGetTiedObject(pTiedObj);
|
|
if(sc)
|
|
return sc.ToHr();
|
|
|
|
// do the operation
|
|
sc = pTiedObj->ScMaximize();
|
|
|
|
return sc.ToHr();
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMMCApplicationFrame::Minimize
|
|
*
|
|
* PURPOSE:
|
|
*
|
|
* RETURNS:
|
|
* HRESULT
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
HRESULT
|
|
CMMCApplicationFrame::Minimize()
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMMCApplicationFrame::Minimize"));
|
|
|
|
CMyTiedObject *pTiedObj = NULL;
|
|
|
|
sc = ScGetTiedObject(pTiedObj);
|
|
if(sc)
|
|
return sc.ToHr();
|
|
|
|
// do the operation
|
|
sc = pTiedObj->ScMinimize();
|
|
|
|
return sc.ToHr();
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMMCApplicationFrame::Restore
|
|
*
|
|
* PURPOSE:
|
|
*
|
|
* RETURNS:
|
|
* HRESULT
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
HRESULT
|
|
CMMCApplicationFrame::Restore()
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMMCApplicationFrame::Restore"));
|
|
|
|
CMyTiedObject *pTiedObj = NULL;
|
|
|
|
sc = ScGetTiedObject(pTiedObj);
|
|
if(sc)
|
|
return sc.ToHr();
|
|
|
|
sc = pTiedObj->ScRestore();
|
|
|
|
return sc.ToHr();
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMMCApplicationFrame::GetCoordinate
|
|
*
|
|
* PURPOSE:
|
|
*
|
|
* PARAMETERS:
|
|
* int * pCoordinate :
|
|
* eCoordinate e :
|
|
*
|
|
* RETURNS:
|
|
* HRESULT
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
HRESULT
|
|
CMMCApplicationFrame::GetCoordinate(int *pCoordinate, eCoordinate e)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMMCApplicationFrame::GetCoordinate"));
|
|
|
|
// check parameters
|
|
if(!pCoordinate)
|
|
{
|
|
sc = E_POINTER;
|
|
return sc.ToHr();
|
|
}
|
|
|
|
CMyTiedObject *pTiedObj = NULL;
|
|
|
|
sc = ScGetTiedObject(pTiedObj);
|
|
if(sc)
|
|
return sc.ToHr();
|
|
|
|
RECT rect;
|
|
|
|
// do the operation
|
|
sc = pTiedObj->ScGetPosition(rect);
|
|
if(sc)
|
|
return sc.ToHr();
|
|
|
|
switch(e)
|
|
{
|
|
case eTop:
|
|
*pCoordinate = rect.top;
|
|
break;
|
|
|
|
case eBottom:
|
|
*pCoordinate = rect.bottom;
|
|
break;
|
|
|
|
case eLeft:
|
|
*pCoordinate = rect.left;
|
|
break;
|
|
|
|
case eRight:
|
|
*pCoordinate = rect.right;
|
|
break;
|
|
|
|
default:
|
|
ASSERT(0 && "Should not come here!!");
|
|
break;
|
|
}
|
|
|
|
|
|
return sc.ToHr();
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMMCApplicationFrame::PutCoordinate
|
|
*
|
|
* PURPOSE:
|
|
*
|
|
* PARAMETERS:
|
|
* int coordinate :
|
|
* eCoordinate e :
|
|
*
|
|
* RETURNS:
|
|
* HRESULT
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
HRESULT
|
|
CMMCApplicationFrame::PutCoordinate(int coordinate, eCoordinate e)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMMCApplicationFrame::PutCoordinate"));
|
|
|
|
CMyTiedObject *pTiedObj = NULL;
|
|
|
|
sc = ScGetTiedObject(pTiedObj);
|
|
if(sc)
|
|
return sc.ToHr();
|
|
|
|
RECT rect;
|
|
|
|
sc = pTiedObj->ScGetPosition(rect);
|
|
if(sc)
|
|
return sc.ToHr();
|
|
|
|
switch(e)
|
|
{
|
|
case eTop:
|
|
rect.top = coordinate;
|
|
break;
|
|
|
|
case eBottom:
|
|
rect.bottom = coordinate;
|
|
break;
|
|
|
|
case eLeft:
|
|
rect.left = coordinate;
|
|
break;
|
|
|
|
case eRight:
|
|
rect.right = coordinate;
|
|
break;
|
|
|
|
default:
|
|
ASSERT(0 && "Should not come here!!");
|
|
break;
|
|
}
|
|
|
|
|
|
sc = pTiedObj->ScSetPosition(rect);
|
|
|
|
return sc.ToHr();
|
|
}
|
|
|
|
//############################################################################
|
|
//############################################################################
|
|
//
|
|
// Misc declarations
|
|
//
|
|
//############################################################################
|
|
//############################################################################
|
|
|
|
static TBBUTTON MainButtons[] =
|
|
{
|
|
{ 0, ID_FILE_NEW , TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, 0 },
|
|
{ 1, ID_FILE_OPEN , TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, 1 },
|
|
{ 2, ID_FILE_SAVE , TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, 2 },
|
|
{ 0, 0 , TBSTATE_ENABLED, TBSTYLE_SEP , {0,0}, 0L, 0 },
|
|
{ 3, ID_WINDOW_NEW , TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, 3 },
|
|
};
|
|
|
|
|
|
/*
|
|
* remove the definition that WTL might have given us
|
|
*/
|
|
#ifdef ID_VIEW_REFRESH
|
|
#undef ID_VIEW_REFRESH
|
|
#endif
|
|
|
|
enum DoWeNeedThis
|
|
{
|
|
ID_VIEW_REFRESH = 12797
|
|
};
|
|
|
|
//############################################################################
|
|
//############################################################################
|
|
//
|
|
// Implementation of class CMainFrame
|
|
//
|
|
//############################################################################
|
|
//############################################################################
|
|
|
|
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
|
|
|
|
// CODEWORK message reflection not working yet
|
|
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
|
|
//{{AFX_MSG_MAP(CMainFrame)
|
|
ON_WM_CREATE()
|
|
ON_WM_DRAWCLIPBOARD()
|
|
ON_WM_CHANGECBCHAIN()
|
|
ON_UPDATE_COMMAND_UI(ID_FILE_PRINT, OnUpdateFilePrint)
|
|
ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_SETUP, OnUpdateFilePrintSetup)
|
|
ON_WM_CLOSE()
|
|
ON_COMMAND(ID_VIEW_TOOLBAR, OnViewToolbar)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, OnUpdateViewToolbar)
|
|
ON_WM_SIZE()
|
|
ON_COMMAND(ID_HELP_HELPTOPICS, OnHelpTopics)
|
|
ON_COMMAND(ID_VIEW_REFRESH, OnViewRefresh)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_REFRESH, OnUpdateViewRefresh)
|
|
ON_WM_DESTROY()
|
|
ON_WM_SYSCOMMAND()
|
|
ON_WM_INITMENUPOPUP()
|
|
ON_COMMAND(ID_CONSOLE_PROPERTIES, OnConsoleProperties)
|
|
ON_WM_MOVE()
|
|
ON_WM_ACTIVATE()
|
|
ON_WM_NCACTIVATE()
|
|
ON_WM_NCPAINT()
|
|
ON_WM_PALETTECHANGED()
|
|
ON_WM_QUERYNEWPALETTE()
|
|
ON_COMMAND(ID_WINDOW_NEW, OnWindowNew)
|
|
ON_WM_SETTINGCHANGE()
|
|
ON_WM_MENUSELECT()
|
|
ON_MESSAGE(WM_UNINITMENUPOPUP, OnUnInitMenuPopup)
|
|
//}}AFX_MSG_MAP
|
|
|
|
#ifdef DBG
|
|
ON_COMMAND(ID_MMC_TRACE_DIALOG, OnMMCTraceDialog)
|
|
#endif
|
|
|
|
ON_MESSAGE(WM_SETTEXT, OnSetText)
|
|
|
|
ON_MESSAGE(MMC_MSG_PROP_SHEET_NOTIFY, OnPropertySheetNotify)
|
|
ON_MESSAGE(MMC_MSG_SHOW_SNAPIN_HELP_TOPIC, OnShowSnapinHelpTopic)
|
|
|
|
// The following entry is placed here for compatibilty with versions
|
|
// of mmc.lib that were compiled with the incorrect value for message
|
|
// MMC_MSG_SHOW_SNAPIN_HELP_TOPIC. MMC.lib function MMCPropertyHelp
|
|
// sends this message to the mainframe window when called by a snap-in.
|
|
|
|
ON_MESSAGE(MMC_MSG_SHOW_SNAPIN_HELP_TOPIC_ALT, OnShowSnapinHelpTopic)
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CMainFrame::OnMenuSelect
|
|
//
|
|
// Synopsis: Handles WM_MENUSELECT, sets status bar text for the
|
|
// given menu item.
|
|
//
|
|
// Arguments: [nItemID] - the resource id of menu item.
|
|
// [nFlags] - MF_* flags
|
|
// [hMenu] -
|
|
//
|
|
// Returns: none
|
|
//
|
|
//--------------------------------------------------------------------
|
|
void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hMenu)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMainFrame::OnMenuSelect"));
|
|
if (nFlags & MF_SYSMENU)
|
|
return;
|
|
|
|
CString strText = TEXT("");
|
|
CString strStatusText;
|
|
|
|
/*
|
|
* We need to handle special cases, most of the menu items have status text with them.
|
|
* The exception being, the favoties list, the windows list in windows menu and popup menus.
|
|
* The reason is the menu ids are not unique in main menu because we do TrackPopupMenu at
|
|
* three places first one for File, Window & Help menus done in menubar.cpp, second for
|
|
* Action & View menu in cmenu.cpp and third favorites menu in favui.cpp.
|
|
*/
|
|
|
|
/*
|
|
* Special case 1: Check to see if current menu is favorites menu, if so need to get status
|
|
* text for favorites list except for "Add to favorites.." and "Organize favorites.." items.
|
|
* The below test can break if "Add to Favorites..." is moved in menu resource.
|
|
*/
|
|
if ((IDS_ADD_TO_FAVORITES != nItemID) &&
|
|
(IDS_ORGANIZEFAVORITES != nItemID) &&
|
|
(GetMenuItemID(hMenu, 0) == IDS_ADD_TO_FAVORITES) )
|
|
{
|
|
strStatusText.LoadString(IDS_FAVORITES_ACTIVATE);
|
|
}
|
|
/*
|
|
* Special case 2: Handle any popup menus (popup menus dont have any ID).
|
|
*/
|
|
else if (nFlags & MF_POPUP)
|
|
{
|
|
// do nothing
|
|
}
|
|
// Special case 3: Assume mmc supports maximum of 1024 windows for status bar text sake.
|
|
else if ( (nItemID >= AFX_IDM_FIRST_MDICHILD) && (nItemID <= AFX_IDM_FIRST_MDICHILD+1024) )
|
|
{
|
|
strStatusText.LoadString(ID_WINDOW_ACTIVATEWINDOW);
|
|
}
|
|
else
|
|
{
|
|
strText.LoadString(nItemID);
|
|
|
|
int iSeparator = strText.Find(_T('\n'));
|
|
if (iSeparator < 0) // No status text so use the menu text as status text.
|
|
strStatusText = strText;
|
|
else
|
|
strStatusText = strText.Mid(iSeparator);
|
|
}
|
|
|
|
CChildFrame *pChildFrame = dynamic_cast<CChildFrame*>(GetActiveFrame());
|
|
if (!pChildFrame)
|
|
return;
|
|
|
|
sc = pChildFrame->ScSetStatusText(strStatusText);
|
|
if (sc)
|
|
return;
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMainFrame::ScGetFrame
|
|
*
|
|
* PURPOSE: Returns a pointer to the COM object that implements the
|
|
* Frame interface.
|
|
*
|
|
* PARAMETERS:
|
|
* Frame **ppFrame :
|
|
*
|
|
* RETURNS:
|
|
* SC
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
SC
|
|
CMainFrame::ScGetFrame(Frame **ppFrame)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMainFrame::ScGetFrame") );
|
|
|
|
if(!ppFrame)
|
|
{
|
|
sc = E_POINTER;
|
|
return sc;
|
|
}
|
|
|
|
*ppFrame = NULL;
|
|
|
|
// NOTE the com object cannot be cached with a smart pointer owned by CMainFrame
|
|
// since CMainFrame is VERY LONG living guy - it will lock mmc.exe from exitting
|
|
// it could be used by creating CComObjectCached, but CTiedComObjectCreator does
|
|
// not support that
|
|
// see bug # 101564
|
|
CComPtr<Frame> spFrame;
|
|
// create a CMMCApplicationFrame if not already done so.
|
|
sc = CTiedComObjectCreator<CMMCApplicationFrame>::ScCreateAndConnect(*this, spFrame);
|
|
if(sc)
|
|
return sc;
|
|
|
|
if(spFrame == NULL)
|
|
{
|
|
sc = E_UNEXPECTED;
|
|
return sc;
|
|
}
|
|
|
|
*ppFrame = spFrame.Detach();
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMainFrame::ScMaximize
|
|
*
|
|
* PURPOSE:
|
|
*
|
|
* RETURNS:
|
|
* SC
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
SC
|
|
CMainFrame::ScMaximize()
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMainFrame::ScMaximize"));
|
|
|
|
ShowWindow(SW_MAXIMIZE);
|
|
|
|
return sc;
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMainFrame::ScMinimize
|
|
*
|
|
* PURPOSE:
|
|
*
|
|
* RETURNS:
|
|
* SC
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
SC
|
|
CMainFrame::ScMinimize()
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMainFrame::ScMinimize"));
|
|
|
|
ShowWindow(SW_MINIMIZE);
|
|
|
|
return sc;
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMainFrame::ScRestore
|
|
*
|
|
* PURPOSE: Restores the position of the main frame.
|
|
*
|
|
* RETURNS:
|
|
* SC
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
SC
|
|
CMainFrame::ScRestore()
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMainFrame::ScRestore"));
|
|
|
|
ShowWindow(SW_RESTORE);
|
|
|
|
return sc;
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMainFrame::ScSetPosition
|
|
*
|
|
* PURPOSE: Sets the position of the main frame
|
|
*
|
|
* PARAMETERS:
|
|
* const RECT :
|
|
*
|
|
* RETURNS:
|
|
* SC
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
SC
|
|
CMainFrame::ScSetPosition(const RECT &rect)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMainFrame::ScSetPosition"));
|
|
|
|
int width = rect.right - rect.left + 1;
|
|
int height = rect.bottom - rect.top + 1;
|
|
|
|
SetWindowPos(NULL /*hWndInsertAfter*/, rect.left, rect.top, width, height, SWP_NOZORDER);
|
|
|
|
return sc;
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMainFrame::ScGetPosition
|
|
*
|
|
* PURPOSE:
|
|
*
|
|
* PARAMETERS:
|
|
* RECT & rect :
|
|
*
|
|
* RETURNS:
|
|
* SC
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
SC
|
|
CMainFrame::ScGetPosition(RECT &rect)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMainFrame::ScGetPosition"));
|
|
|
|
GetWindowRect(&rect);
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
|
|
// OnActivate is overridden to work around a SQL snap-in problem under
|
|
// Win9x. When SQL tries to force focus back to its property sheet it
|
|
// causes an infinite recursion of the OnActivate call.
|
|
// This override discards any activation that occurs during the processing
|
|
// of a prior activation.
|
|
void CMainFrame::OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized )
|
|
{
|
|
Trace(tagMainFrame, TEXT("OnActivate: nState=%d"), nState);
|
|
|
|
static bActivating = FALSE;
|
|
|
|
m_fCurrentlyActive = (nState != WA_INACTIVE);
|
|
|
|
// if activating
|
|
if (m_fCurrentlyActive)
|
|
{
|
|
CAMCApp* pApp = AMCGetApp();
|
|
ASSERT(NULL != pApp);
|
|
|
|
// if windows and we're already activating, prevent recursion
|
|
if ( (NULL != pApp) && (pApp->IsWin9xPlatform() == true) && bActivating)
|
|
return;
|
|
|
|
// Process activation request
|
|
bActivating = TRUE;
|
|
CMDIFrameWnd::OnActivate(nState, pWndOther, bMinimized);
|
|
bActivating = FALSE;
|
|
}
|
|
else
|
|
{
|
|
// if we have accelarators hilited (it happen when one press Alt+TAB)
|
|
// we need to remove them now.
|
|
SendMessage( WM_CHANGEUISTATE, MAKEWPARAM(UIS_SET, UISF_HIDEACCEL | UISF_HIDEFOCUS));
|
|
|
|
// Let unactivate through
|
|
CMDIFrameWnd::OnActivate(nState, pWndOther, bMinimized);
|
|
}
|
|
}
|
|
|
|
|
|
CAMCView* CMainFrame::GetActiveAMCView()
|
|
{
|
|
CChildFrame *pChildFrame = dynamic_cast<CChildFrame*>(GetActiveFrame());
|
|
if (!pChildFrame)
|
|
return NULL;
|
|
|
|
CAMCView* pAMCView = pChildFrame->GetAMCView();
|
|
ASSERT(pAMCView != NULL);
|
|
ASSERT(::IsWindow(*pAMCView));
|
|
|
|
if (pAMCView && ::IsWindow(*pAMCView))
|
|
return pAMCView;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CAMCTreeView* CMainFrame::_GetActiveAMCTreeView()
|
|
{
|
|
CAMCView* pAMCView = GetActiveAMCView();
|
|
CAMCTreeView* pAMCTreeView = pAMCView ? pAMCView->GetTreeCtrl() : NULL;
|
|
if (pAMCTreeView && ::IsWindow(*pAMCTreeView))
|
|
return pAMCTreeView;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void CMainFrame::OnDrawClipboard()
|
|
{
|
|
if (m_hwndToNotifyCBChange != NULL &&
|
|
::IsWindow(m_hwndToNotifyCBChange))
|
|
{
|
|
::SendMessage(m_hwndToNotifyCBChange, WM_DRAWCLIPBOARD, 0, 0);
|
|
m_hwndToNotifyCBChange = NULL;
|
|
}
|
|
|
|
if (m_hwndNextCB != NULL &&
|
|
::IsWindow(m_hwndNextCB))
|
|
{
|
|
::SendMessage(m_hwndNextCB, WM_DRAWCLIPBOARD, 0, 0);
|
|
}
|
|
|
|
CAMCDoc* pAMCDoc = CAMCDoc::GetDocument();
|
|
if (pAMCDoc)
|
|
{
|
|
CAMCViewPosition pos = pAMCDoc->GetFirstAMCViewPosition();
|
|
while (pos != NULL)
|
|
{
|
|
CAMCView* v = pAMCDoc->GetNextAMCView(pos);
|
|
|
|
if (v && ::IsWindow(*v))
|
|
v->OnUpdatePasteBtn();
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMainFrame::OnChangeCbChain(HWND hWndRemove, HWND hWndAfter)
|
|
{
|
|
if (m_hwndNextCB == hWndRemove)
|
|
m_hwndNextCB = hWndAfter;
|
|
else if (m_hwndNextCB != NULL && ::IsWindow(m_hwndNextCB))
|
|
::SendMessage(m_hwndNextCB, WM_CHANGECBCHAIN,
|
|
(WPARAM)hWndRemove, (LPARAM)hWndAfter);
|
|
}
|
|
|
|
void CMainFrame::OnWindowNew()
|
|
{
|
|
// lock AppEvents until this function is done
|
|
LockComEventInterface(AppEvents);
|
|
|
|
CAMCDoc* pAMCDoc = CAMCDoc::GetDocument();
|
|
ASSERT(pAMCDoc != NULL);
|
|
if (pAMCDoc != NULL)
|
|
{
|
|
pAMCDoc->SetMTNodeIDForNewView(ROOTNODEID);
|
|
pAMCDoc->CreateNewView(true);
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMainFrame construction/destruction
|
|
|
|
CMainFrame::CMainFrame()
|
|
:
|
|
m_hwndToNotifyCBChange(NULL),
|
|
m_hwndNextCB(NULL),
|
|
m_fCurrentlyMinimized(false),
|
|
m_fCurrentlyActive(false)
|
|
{
|
|
CommonConstruct();
|
|
}
|
|
|
|
void CMainFrame::CommonConstruct(void)
|
|
{
|
|
m_pRebar = NULL;
|
|
m_pMenuBar = NULL;
|
|
m_pToolBar = NULL;
|
|
m_pMDIChildWndFocused = NULL;
|
|
m_hMenuCurrent = NULL;
|
|
m_pToolbarTracker = NULL;
|
|
SetInRenameMode(false);
|
|
}
|
|
|
|
|
|
CMainFrame::~CMainFrame()
|
|
{
|
|
delete m_pMenuBar;
|
|
delete m_pToolBar;
|
|
delete m_pRebar;
|
|
delete m_pToolbarTracker;
|
|
}
|
|
|
|
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMainFrame::OnCreate"));
|
|
|
|
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
if (!m_wndMDIClient.SubclassWindow(m_hWndMDIClient))
|
|
{
|
|
ASSERT(0 && "Failed to subclass MDI client window\n");
|
|
return -1;
|
|
}
|
|
|
|
ASSERT(m_wndMDIClient.m_hWnd == m_hWndMDIClient);
|
|
|
|
// create the rebar
|
|
m_pRebar = new CRebarDockWindow;
|
|
m_pRebar->Create(this,WS_CHILD|WS_VISIBLE, IDR_REBAR);
|
|
|
|
// Create the toolbar like we just created the stat bar
|
|
//m_wndToolBar.Create(this, WS_CHILD|WS_VISIBLE|SBARS_SIZEGRIP, 0x1003);
|
|
m_ToolBarDockSite.Create(CDockSite::DSS_TOP);
|
|
m_ToolBarDockSite.Attach(m_pRebar);
|
|
m_ToolBarDockSite.Show();
|
|
|
|
m_DockingManager.Attach(&m_ToolBarDockSite);
|
|
|
|
AddMainFrameBars();
|
|
|
|
m_hwndNextCB = SetClipboardViewer();
|
|
if (m_hwndNextCB == NULL)
|
|
{
|
|
LRESULT lr = GetLastError();
|
|
ASSERT(lr == 0);
|
|
}
|
|
|
|
// append our modifications to the system menu
|
|
AppendToSystemMenu (this, eMode_Last + 1);
|
|
|
|
// create the toolbar tracker
|
|
m_pToolbarTracker = new CToolbarTracker (this);
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CMainFrame::PreCreateWindow"));
|
|
|
|
if (!CMDIFrameWnd::PreCreateWindow(cs))
|
|
return (FALSE);
|
|
|
|
static TCHAR szClassName[countof (MAINFRAME_CLASS_NAME)];
|
|
static bool fFirstTime = true;
|
|
|
|
if (fFirstTime)
|
|
{
|
|
USES_CONVERSION;
|
|
sc = StringCchCopy(szClassName, countof (MAINFRAME_CLASS_NAME), W2T (MAINFRAME_CLASS_NAME));
|
|
if (sc)
|
|
return FALSE;
|
|
|
|
fFirstTime = false;
|
|
}
|
|
|
|
WNDCLASS wc;
|
|
HINSTANCE hInst = AfxGetInstanceHandle();
|
|
BOOL fSuccess = GetClassInfo (hInst, szClassName, &wc);
|
|
|
|
// if we haven't already registered...
|
|
if (!fSuccess && ::GetClassInfo (hInst, cs.lpszClass, &wc))
|
|
{
|
|
// ...register a uniquely-named window class so
|
|
// MMCPropertyHelp the correct main window
|
|
wc.lpszClassName = szClassName;
|
|
wc.hIcon = GetDefaultIcon();
|
|
fSuccess = AfxRegisterClass (&wc);
|
|
}
|
|
|
|
if (fSuccess)
|
|
{
|
|
// Use the new child frame window class
|
|
cs.lpszClass = szClassName;
|
|
|
|
// remove MFC's title-munging styles
|
|
cs.style &= ~(FWS_ADDTOTITLE | FWS_PREFIXTITLE);
|
|
}
|
|
|
|
return (fSuccess);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMainFrame diagnostics
|
|
|
|
#ifdef _DEBUG
|
|
void CMainFrame::AssertValid() const
|
|
{
|
|
CMDIFrameWnd::AssertValid();
|
|
}
|
|
|
|
void CMainFrame::Dump(CDumpContext& dc) const
|
|
{
|
|
CMDIFrameWnd::Dump(dc);
|
|
}
|
|
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMainFrame message handlers
|
|
|
|
|
|
// this code is duplicated in ..\nodemgr\propsht.cpp
|
|
BOOL CALLBACK MyEnumThreadWindProc (HWND current, LPARAM lParam)
|
|
{ // this enumerates non-child-windows created by a given thread
|
|
|
|
if (!IsWindow (current))
|
|
return TRUE; // this shouldn't happen, but does!!!
|
|
|
|
if (!IsWindowVisible (current)) // if they've explicitly hidden a window,
|
|
return TRUE; // don't set focus to it.
|
|
|
|
// we'll return hwnd in here
|
|
HWND * phwnd = reinterpret_cast<HWND *>(lParam);
|
|
|
|
// don't bother returning property sheet dialog window handle
|
|
if (*phwnd == current)
|
|
return TRUE;
|
|
|
|
// also, don't return OleMainThreadWndClass window
|
|
TCHAR szCaption[14];
|
|
if (GetWindowText (current, szCaption, countof(szCaption)))
|
|
if (!lstrcmp (szCaption, _T("OLEChannelWnd")))
|
|
return TRUE;
|
|
|
|
// anything else will do
|
|
*phwnd = current;
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* METHOD: FArePropertySheetsOpen
|
|
*
|
|
* PURPOSE: Checks if there are propperty sheets open and asks to close them
|
|
* It is implemented as the following steps:
|
|
* 1. Collect all property pages (and their children) to the stack
|
|
* 2. Bring all the pages to the front, maintainig their z-order
|
|
* 3. Disable all those windows, plus MMC main window to disallow switching to them
|
|
* untill message box is dissmissed
|
|
* 4. Put all disabled windows to the stack, to be able to re-enable them
|
|
* 5. (if there are any sheets) display message box asking to close the sheets
|
|
* 6. Re-enable disabled windows
|
|
*
|
|
* PARAMETERS:
|
|
* CString* pstrUserMsg - [in] message to display
|
|
* bool bBringToFrontAndAskToClose [in] if need to proceed whole way. false -> just inspect and do nothing
|
|
*
|
|
* RETURNS:
|
|
* bool - [true == there are windows to close]
|
|
*
|
|
\***************************************************************************/
|
|
bool FArePropertySheetsOpen(CString* pstrUserMsg, bool bBringToFrontAndAskToClose /* = true */ )
|
|
{
|
|
std::stack<HWND, std::vector<HWND> > WindowStack;
|
|
std::stack<HWND, std::vector<HWND> > EnableWindowStack;
|
|
|
|
ASSERT (WindowStack.empty());
|
|
|
|
HWND hwndData = NULL;
|
|
|
|
while (TRUE)
|
|
{
|
|
USES_CONVERSION;
|
|
|
|
// Note: No need to localize this string
|
|
hwndData = ::FindWindowEx(NULL, hwndData, W2T(DATAWINDOW_CLASS_NAME), NULL);
|
|
if (hwndData == NULL)
|
|
break; // No more windows
|
|
|
|
ASSERT(IsWindow(hwndData));
|
|
|
|
// Check if the window belongs to the current process
|
|
DWORD dwPid = 0; // Process Id
|
|
::GetWindowThreadProcessId(hwndData, &dwPid);
|
|
if (dwPid != ::GetCurrentProcessId())
|
|
continue;
|
|
|
|
DataWindowData* pData = GetDataWindowData (hwndData);
|
|
ASSERT (pData != NULL);
|
|
|
|
HWND hwndPropSheet = pData->hDlg;
|
|
ASSERT (IsWindow (hwndPropSheet));
|
|
|
|
// don't allow lost data window to block mmc from exiting
|
|
// windows bug #425049 ntbug9 6/27/2001
|
|
if ( !IsWindow (hwndPropSheet) )
|
|
continue;
|
|
|
|
// if propsheet has other windows or prop pages up,
|
|
// then we send focus to them....
|
|
|
|
// grab first one that isn't property sheet dialog
|
|
HWND hwndOther = pData->hDlg;
|
|
EnumThreadWindows (::GetWindowThreadProcessId(pData->hDlg, NULL),
|
|
MyEnumThreadWindProc, (LPARAM)&hwndOther);
|
|
|
|
// if we got another window for this property sheet, we'll want
|
|
// it to be on top of the property sheet after the shuffle, so
|
|
// put it under the property sheet on the stack
|
|
if (IsWindow (hwndOther) && (hwndOther != hwndPropSheet))
|
|
WindowStack.push (hwndOther);
|
|
|
|
// push the property sheet on the stack
|
|
// of windows to bring to the foreground
|
|
WindowStack.push (hwndPropSheet);
|
|
}
|
|
|
|
bool fFoundSheets = !WindowStack.empty();
|
|
|
|
// we did the investigation, see if we were asked to do more
|
|
if ( !bBringToFrontAndAskToClose )
|
|
return (fFoundSheets);
|
|
|
|
HWND hwndMsgBoxParent = NULL;
|
|
|
|
// if we found property sheets, bring them to the foreground,
|
|
// maintaining their original Z-order
|
|
while (!WindowStack.empty())
|
|
{
|
|
HWND hwnd = WindowStack.top();
|
|
WindowStack.pop();
|
|
|
|
SetActiveWindow (hwnd);
|
|
SetForegroundWindow (hwnd);
|
|
|
|
if ( ::IsWindowEnabled(hwnd) )
|
|
{
|
|
// disable the pages while message box is displayed
|
|
::EnableWindow( hwnd, FALSE );
|
|
// remember to enable when done
|
|
EnableWindowStack.push(hwnd);
|
|
}
|
|
hwndMsgBoxParent = hwnd; // the last one wins the right to be the parent :-)
|
|
}
|
|
|
|
if (fFoundSheets && pstrUserMsg)
|
|
{
|
|
// parent the message box on the top-most property page to make it obvios to the user
|
|
CString strCaption;
|
|
LPCTSTR szCaption = LoadString(strCaption, IDR_MAINFRAME) ? (LPCTSTR)strCaption : NULL;
|
|
|
|
// disable main window as well
|
|
CWnd *pMainWnd = AfxGetMainWnd();
|
|
if ( pMainWnd && pMainWnd->IsWindowEnabled() )
|
|
{
|
|
pMainWnd->EnableWindow( FALSE );
|
|
// remember to enable when done
|
|
EnableWindowStack.push( pMainWnd->m_hWnd );
|
|
}
|
|
|
|
::MessageBox( hwndMsgBoxParent, *pstrUserMsg, szCaption , MB_ICONSTOP | MB_OK );
|
|
}
|
|
|
|
// make everything functional again
|
|
while (!EnableWindowStack.empty())
|
|
{
|
|
// enable the disabled window
|
|
::EnableWindow( EnableWindowStack.top(), TRUE );
|
|
EnableWindowStack.pop();
|
|
}
|
|
|
|
return (fFoundSheets);
|
|
}
|
|
|
|
|
|
bool CanCloseDoc(void)
|
|
{
|
|
CString strMessage;
|
|
CString strConsoleName;
|
|
|
|
AfxGetMainWnd()->GetWindowText (strConsoleName);
|
|
FormatString1 (strMessage, IDS_ClosePropertyPagesBeforeClosingTheDoc,
|
|
strConsoleName);
|
|
|
|
bool fPropSheets = FArePropertySheetsOpen(&strMessage);
|
|
|
|
return !fPropSheets;
|
|
}
|
|
|
|
|
|
void CMainFrame::OnClose()
|
|
{
|
|
/*
|
|
* Bug 233682: We need to make sure that we only handle WM_CLOSE when
|
|
* it's dispatched from our main message pump. If it comes from elsewhere
|
|
* (like the message pump in a modal dialog or message box), then we're
|
|
* likely in a state where we can't shut down cleanly.
|
|
*/
|
|
CAMCApp* pApp = AMCGetApp();
|
|
|
|
if (!pApp->DidCloseComeFromMainPump())
|
|
{
|
|
pApp->DelayCloseUntilIdle();
|
|
return;
|
|
}
|
|
|
|
// Reset the flag so that while processing this WM_CLOSE if there is
|
|
// any more WM_CLOSE messages from other sources it will not be processed.
|
|
pApp->ResetCloseCameFromMainPump();
|
|
|
|
if (!CanCloseDoc())
|
|
return;
|
|
|
|
// since this process includes event posting
|
|
// - we should guard the function from reentrance
|
|
static bool bInProgress = false;
|
|
if (!bInProgress)
|
|
{
|
|
bInProgress = true;
|
|
CMDIFrameWnd::OnClose();
|
|
bInProgress = false;
|
|
}
|
|
}
|
|
|
|
void CMainFrame::OnUpdateFilePrint(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->Enable(FALSE);
|
|
}
|
|
|
|
void CMainFrame::OnUpdateFilePrintSetup(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->Enable(FALSE);
|
|
}
|
|
|
|
#ifdef DBG
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* CMainFrame::OnMMCTraceDialog
|
|
*
|
|
* PURPOSE: In Debug mode, shows the Trace dialog, in response to the hotkey.
|
|
*
|
|
* RETURNS:
|
|
* void
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
void CMainFrame::OnMMCTraceDialog()
|
|
{
|
|
DoDebugTraceDialog();
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* METHOD: ScUpdateAllScopes
|
|
*
|
|
* PURPOSE: Just calls CDocument::UpdateAllViews.
|
|
* If we want to Update all views to delete empty views then
|
|
* First it gets list of empty views and then it closes them.
|
|
*
|
|
* PARAMETERS:
|
|
* lHint - [in] The action to perform.
|
|
* lParam - [in] Extra context info.
|
|
*
|
|
* RETURNS:
|
|
* SC
|
|
*
|
|
\***************************************************************************/
|
|
SC CMainFrame::ScUpdateAllScopes(LONG lHint, LPARAM lParam)
|
|
{
|
|
AFX_MANAGE_STATE (AfxGetAppModuleState());
|
|
DECLARE_SC(sc, TEXT("CMainFrame::ScUpdateAllScopes"));
|
|
|
|
// Updating all scopes may be requested as a result of document being deleted
|
|
// in that case we do not have a document, and thus do not have any views.
|
|
// So we are done.
|
|
if (NULL == CAMCDoc::GetDocument())
|
|
return sc;
|
|
|
|
// Special case, we cannot destroy the view during CDocument::UpdateAllViews
|
|
// as CDocument is enumerating the view collection. Nor we can do PostMessage
|
|
// to close view as scripts in (479627) web pages execute. Therefore we get the
|
|
// list of empty views and then destroy them.
|
|
if (lHint == VIEW_UPDATE_DELETE_EMPTY_VIEW)
|
|
{
|
|
// Get the list of AMCViews to be deleted.
|
|
if (lParam != NULL)
|
|
return (sc = E_UNEXPECTED);
|
|
|
|
CArray<CAMCView*, CAMCView*> rgEmptyAMCViews;
|
|
CAMCDoc::GetDocument()->UpdateAllViews (NULL, lHint, reinterpret_cast<CObject*>(&rgEmptyAMCViews));
|
|
|
|
// Now destroy each view.
|
|
for (int i = 0; i < rgEmptyAMCViews.GetSize(); i++)
|
|
{
|
|
CAMCView *pAMCView = rgEmptyAMCViews.GetAt(i);
|
|
sc = ScCheckPointers(pAMCView);
|
|
if (sc)
|
|
{
|
|
sc.TraceAndClear();
|
|
continue;
|
|
}
|
|
|
|
CChildFrame* pFrame = pAMCView->GetParentFrame();
|
|
|
|
sc = ScCheckPointers(pFrame);
|
|
if (sc)
|
|
{
|
|
sc.TraceAndClear();
|
|
continue;
|
|
}
|
|
|
|
// Send WM_CLOSE Synchronously else the web page views with scripts in them will
|
|
// have their scripts executed and may AV.
|
|
pFrame->SendMessage(WM_SYSCOMMAND, SC_CLOSE, 0);
|
|
}
|
|
|
|
}
|
|
else
|
|
CAMCDoc::GetDocument()->UpdateAllViews (NULL, lHint,
|
|
reinterpret_cast<CObject*>(lParam));
|
|
|
|
return (sc);
|
|
}
|
|
|
|
|
|
void CMainFrame::OnViewToolbar()
|
|
{
|
|
m_ToolBarDockSite.Toggle();
|
|
RenderDockSites();
|
|
}
|
|
|
|
void CMainFrame::OnUpdateViewToolbar(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(m_ToolBarDockSite.IsVisible());
|
|
pCmdUI->Enable(true);
|
|
}
|
|
|
|
|
|
void CMainFrame::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
// Don't call MFC version to size window
|
|
// CMDIFrameWnd::OnSize (nType, cx, cy);
|
|
|
|
if (nType != SIZE_MINIMIZED)
|
|
{
|
|
RenderDockSites();
|
|
MDIIconArrange();
|
|
}
|
|
|
|
CAMCDoc* pDoc = CAMCDoc::GetDocument();
|
|
|
|
if (pDoc != NULL)
|
|
pDoc->SetFrameModifiedFlag();
|
|
|
|
/*
|
|
* If we're moving to or from the minimized state, notify child windows.
|
|
*/
|
|
if (m_fCurrentlyMinimized != (nType == SIZE_MINIMIZED))
|
|
{
|
|
m_fCurrentlyMinimized = (nType == SIZE_MINIMIZED);
|
|
SendMinimizeNotifications (m_fCurrentlyMinimized);
|
|
}
|
|
}
|
|
|
|
|
|
void CMainFrame::OnMove(int x, int y)
|
|
{
|
|
CMDIFrameWnd::OnMove (x, y);
|
|
|
|
CAMCDoc* pDoc = CAMCDoc::GetDocument();
|
|
|
|
if (pDoc != NULL)
|
|
pDoc->SetFrameModifiedFlag();
|
|
}
|
|
|
|
void CMainFrame::RenderDockSites()
|
|
{
|
|
ASSERT_VALID (this);
|
|
|
|
CRect clientRect;
|
|
GetClientRect(&clientRect);
|
|
|
|
m_DockingManager.BeginLayout();
|
|
m_DockingManager.RenderDockSites(m_hWndMDIClient, clientRect);
|
|
m_DockingManager.EndLayout();
|
|
}
|
|
|
|
|
|
void CMainFrame::AddMainFrameBars(void)
|
|
{
|
|
/*
|
|
* activate our fusion context so the bars will be themed
|
|
*/
|
|
CThemeContextActivator activator;
|
|
|
|
AFX_MANAGE_STATE (AfxGetAppModuleState());
|
|
DECLARE_SC(sc, _T("CMainFrame::AddMainFrameBars"));
|
|
sc = ScCheckPointers(m_pRebar);
|
|
if (sc)
|
|
return;
|
|
|
|
// insert the menu bar
|
|
ASSERT (m_pMenuBar == NULL);
|
|
m_pMenuBar = new CMenuBar;
|
|
sc = ScCheckPointers(m_pMenuBar);
|
|
if (sc)
|
|
return;
|
|
|
|
m_pMenuBar->Create (this, m_pRebar, WS_VISIBLE, ID_MENUBAR);
|
|
m_pMenuBar->SetMenu (GetMenu ());
|
|
m_pMenuBar->Show (TRUE);
|
|
|
|
ASSERT(NULL == m_pToolBar);
|
|
m_pToolBar = new CMMCToolBar();
|
|
sc = ScCheckPointers(m_pToolBar);
|
|
if (sc)
|
|
return;
|
|
|
|
// Create the toolbar.
|
|
sc = m_pToolBar->ScInit(m_pRebar);
|
|
if (sc)
|
|
return;
|
|
|
|
m_pToolBar->Show(TRUE, true /* In new line*/);
|
|
}
|
|
|
|
|
|
SC CMainFrame::ScCreateNewView (CreateNewViewStruct* pcnvs, bool bEmitScriptEvents /*= true*/)
|
|
{
|
|
AFX_MANAGE_STATE (AfxGetAppModuleState());
|
|
|
|
// lock AppEvents until this function is done
|
|
LockComEventInterface(AppEvents);
|
|
|
|
DECLARE_SC (sc, _T("CMainFrame::ScCreateNewView"));
|
|
CAMCView* pNewView = NULL; // avoid "initialization skipped by 'goto Error'"
|
|
|
|
CAMCDoc* pAMCDoc = CAMCDoc::GetDocument();
|
|
ASSERT(pAMCDoc != NULL);
|
|
if (pAMCDoc == NULL)
|
|
return (sc = E_UNEXPECTED);
|
|
|
|
if (pcnvs == NULL)
|
|
return (sc = E_POINTER);
|
|
|
|
if ((AMCGetApp()->GetMode() == eMode_User_SDI) && pcnvs->fVisible)
|
|
return (sc = E_FAIL);
|
|
|
|
pAMCDoc->SetMTNodeIDForNewView (pcnvs->idRootNode);
|
|
pAMCDoc->SetNewWindowOptions (pcnvs->lWindowOptions);
|
|
pNewView = pAMCDoc->CreateNewView (pcnvs->fVisible, bEmitScriptEvents);
|
|
|
|
if (pNewView == NULL)
|
|
{
|
|
pcnvs->pViewData = NULL;
|
|
return (sc = E_FAIL);
|
|
}
|
|
|
|
pcnvs->pViewData = pNewView->GetViewData();
|
|
pcnvs->hRootNode = pNewView->GetRootNode();
|
|
|
|
return (sc);
|
|
}
|
|
|
|
|
|
void CMainFrame::OnHelpTopics()
|
|
{
|
|
ScOnHelpTopics();
|
|
}
|
|
|
|
SC CMainFrame::ScOnHelpTopics()
|
|
{
|
|
DECLARE_SC(sc, _T("CMainFrame::ScOnHelpTopics"));
|
|
/*
|
|
* if there is a view, route through it so the snap-in gets a crack
|
|
* at the help message (just like Help Topics from the Help menu).
|
|
*/
|
|
CConsoleView* pConsoleView = NULL;
|
|
sc = ScGetActiveConsoleView (pConsoleView);
|
|
if (sc)
|
|
return (sc);
|
|
|
|
if (pConsoleView != NULL)
|
|
{
|
|
sc = pConsoleView->ScHelpTopics ();
|
|
return sc;
|
|
}
|
|
|
|
HH_WINTYPE hhWinType;
|
|
ZeroMemory(&hhWinType, sizeof(hhWinType));
|
|
|
|
CAMCApp* pAMCApp = AMCGetApp();
|
|
if (NULL == pAMCApp)
|
|
return (sc = E_UNEXPECTED);
|
|
|
|
sc = pAMCApp->ScShowHtmlHelp(SC::GetHelpFile(), 0);
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
void CMainFrame::OnViewRefresh()
|
|
{
|
|
// if this doesn't fire before 10/1/99, remove this, OnUpdateViewRefresh, and all references to ID_VIEW_REFRESH (vivekj)
|
|
ASSERT(false && "If this assert ever fires, then we need ID_VIEW_REFRESH (see above) and we can remove the 'Do we need this?' and this assert");
|
|
CAMCTreeView* pAMCTreeView = _GetActiveAMCTreeView();
|
|
if (pAMCTreeView)
|
|
pAMCTreeView->ScReselect();
|
|
}
|
|
|
|
void CMainFrame::OnUpdateViewRefresh(CCmdUI* pCmdUI)
|
|
{
|
|
// if this doesn't fire before 10/1/99, remove this, OnUpdateView, and all references to ID_VIEW_REFRESH (vivekj)
|
|
ASSERT(false && "If this assert ever fires, then we need ID_VIEW_REFRESH (see above) and we can remove the 'Do we need this?' and this assert");
|
|
pCmdUI->Enable(TRUE);
|
|
}
|
|
|
|
void CMainFrame::OnDestroy()
|
|
{
|
|
DECLARE_SC(sc, _T("CMainFrame::OnDestroy"));
|
|
// NTRAID#NTBUG9-684811-2002/09/10 - MMC does not send WM_CHANGECBCHAIN message on shutdown if next viewer is NULL.
|
|
// since MMC could be the last window in the chain, it needs to call ChangeClipboardChain even
|
|
// if m_hwndNextCB is null
|
|
if (ChangeClipboardChain(m_hwndNextCB) == FALSE)
|
|
{
|
|
sc.FromLastError();
|
|
sc.TraceAndClear();
|
|
}
|
|
|
|
CMDIFrameWnd::OnDestroy();
|
|
}
|
|
|
|
|
|
void CMainFrame::OnUpdateFrameMenu(HMENU hMenuAlt)
|
|
{
|
|
// let the base class select the right menu
|
|
CMDIFrameWnd::OnUpdateFrameMenu (hMenuAlt);
|
|
|
|
// by now, the right menu is on the frame; reflect it to the toolbar
|
|
NotifyMenuChanged ();
|
|
}
|
|
|
|
|
|
void CMainFrame::NotifyMenuChanged ()
|
|
{
|
|
CMenu* pMenuCurrent = NULL;
|
|
|
|
// make sure we don't have menus for MDI or SDI User mode
|
|
switch (AMCGetApp()->GetMode())
|
|
{
|
|
case eMode_Author:
|
|
case eMode_User:
|
|
case eMode_User_MDI:
|
|
case eMode_User_SDI:
|
|
pMenuCurrent = CWnd::GetMenu();
|
|
break;
|
|
|
|
default:
|
|
ASSERT (false);
|
|
break;
|
|
}
|
|
|
|
m_hMenuCurrent = pMenuCurrent->GetSafeHmenu();
|
|
|
|
if (m_pMenuBar != NULL)
|
|
{
|
|
// reflect the new menu on the menu bar
|
|
m_pMenuBar->SetMenu (pMenuCurrent);
|
|
|
|
// detach the menu from the frame
|
|
SetMenu (NULL);
|
|
}
|
|
}
|
|
|
|
|
|
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
|
|
{
|
|
/*
|
|
* If mainframe is not the active window then do not translate
|
|
* the messages. (See Bug# 119355)
|
|
*/
|
|
if (!m_fCurrentlyActive)
|
|
return (FALSE);
|
|
|
|
CRebarWnd* pwndRebar = m_pRebar->GetRebar();
|
|
|
|
// give the rebar a crack
|
|
if (pwndRebar && pwndRebar->PreTranslateMessage (pMsg))
|
|
return (TRUE);
|
|
|
|
// give the menu bar a crack (for menu accelerators)
|
|
if (m_pMenuBar && m_pMenuBar->PreTranslateMessage (pMsg))
|
|
return (TRUE);
|
|
|
|
// give the base class a crack
|
|
if ((InRenameMode() == false) &&
|
|
(CMDIFrameWnd::PreTranslateMessage(pMsg)))
|
|
return (TRUE);
|
|
|
|
// not translated
|
|
return (FALSE);
|
|
}
|
|
|
|
|
|
void CMainFrame::OnIdle ()
|
|
{
|
|
if (m_pMenuBar != NULL)
|
|
{
|
|
CMDIChildWnd* pwndActive = MDIGetActive ();
|
|
|
|
// The menus are always visible in SDI & MDI modes.
|
|
switch (AMCGetApp()->GetMode())
|
|
{
|
|
|
|
case eMode_User_SDI:
|
|
{
|
|
BOOL bMaximized = (pwndActive != NULL) ? pwndActive->IsZoomed () : false;
|
|
ASSERT (bMaximized);
|
|
ASSERT (IsMenuVisible());
|
|
}
|
|
break;
|
|
|
|
case eMode_User_MDI:
|
|
ASSERT (pwndActive != NULL);
|
|
ASSERT (IsMenuVisible());
|
|
break;
|
|
}
|
|
|
|
ASSERT (m_pMenuBar->GetMenu() != NULL);
|
|
|
|
m_pMenuBar->OnIdle ();
|
|
}
|
|
}
|
|
|
|
void CMainFrame::ShowMenu (bool fShow)
|
|
{
|
|
CRebarWnd * pwndRebar = m_pRebar->GetRebar();
|
|
pwndRebar->ShowBand (pwndRebar->IdToIndex (ID_MENUBAR), fShow);
|
|
|
|
/*---------------------------------------------------------------------*/
|
|
/* if we're showing, the rebar must be showing, too; */
|
|
/* if we're hiding, the rebar should be hidden if no bands are visible */
|
|
/*---------------------------------------------------------------------*/
|
|
if ( fShow && !m_pRebar->IsVisible())
|
|
{
|
|
m_pRebar->Show (fShow);
|
|
RenderDockSites ();
|
|
}
|
|
}
|
|
|
|
static bool IsRebarBandVisible (CRebarWnd* pwndRebar, int nBandID)
|
|
{
|
|
REBARBANDINFO rbbi;
|
|
ZeroMemory (&rbbi, sizeof (rbbi));
|
|
rbbi.cbSize = sizeof (rbbi);
|
|
rbbi.fMask = RBBIM_STYLE;
|
|
|
|
pwndRebar->GetBandInfo (pwndRebar->IdToIndex (nBandID), &rbbi);
|
|
|
|
return ((rbbi.fStyle & RBBS_HIDDEN) == 0);
|
|
}
|
|
|
|
bool CMainFrame::IsMenuVisible ()
|
|
{
|
|
return (IsRebarBandVisible (m_pRebar->GetRebar(), ID_MENUBAR));
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Special UI processing depending on current active child
|
|
|
|
CString CMainFrame::GetFrameTitle()
|
|
{
|
|
/*
|
|
* If there's no active child window, then the document
|
|
* is being closed. Just use the default title.
|
|
*/
|
|
if (MDIGetActive() != NULL)
|
|
{
|
|
CAMCDoc* pDocument = CAMCDoc::GetDocument();
|
|
|
|
/*
|
|
* If there's a document, use its title.
|
|
*/
|
|
if (pDocument != NULL)
|
|
return (pDocument->GetCustomTitle());
|
|
}
|
|
|
|
return (m_strGenericTitle);
|
|
}
|
|
|
|
void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
|
|
{
|
|
AfxSetWindowText(m_hWnd, GetFrameTitle());
|
|
}
|
|
|
|
BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext)
|
|
{
|
|
if (!CMDIFrameWnd::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext))
|
|
return (FALSE);
|
|
|
|
// save the title we'll use for the main frame if there's no console open
|
|
m_strGenericTitle = m_strTitle;
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
|
|
{
|
|
switch (nID)
|
|
{
|
|
case ID_HELP_HELPTOPICS:
|
|
OnHelpTopics ();
|
|
break;
|
|
|
|
case ID_CUSTOMIZE_VIEW:
|
|
{
|
|
CChildFrame* pwndActive = dynamic_cast<CChildFrame*>(MDIGetActive ());
|
|
|
|
if (pwndActive != NULL)
|
|
pwndActive->OnSysCommand (nID, lParam);
|
|
else
|
|
CMDIFrameWnd::OnSysCommand(nID, lParam);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
CMDIFrameWnd::OnSysCommand(nID, lParam);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CMainFrame::UpdateChildSystemMenus ()
|
|
{
|
|
ProgramMode eMode = AMCGetApp()->GetMode();
|
|
|
|
// make necessary modifications to existing windows' system menus
|
|
for (CWnd* pwndT = MDIGetActive();
|
|
pwndT != NULL;
|
|
pwndT = pwndT->GetWindow (GW_HWNDNEXT))
|
|
{
|
|
CMenu* pSysMenu = pwndT->GetSystemMenu (FALSE);
|
|
|
|
if (pSysMenu != NULL)
|
|
{
|
|
// if not in author mode, protect author mode windows from
|
|
// user close
|
|
if (eMode != eMode_Author)
|
|
{
|
|
// Get AMCView object for this frame
|
|
CChildFrame *pChildFrm = dynamic_cast<CChildFrame*>(pwndT);
|
|
ASSERT(pChildFrm != NULL);
|
|
|
|
CAMCView* pView = pChildFrm->GetAMCView();
|
|
ASSERT(pView != NULL);
|
|
|
|
// if it's an author mode view, don't let user close it
|
|
if (pView && pView->IsAuthorModeView())
|
|
pSysMenu->EnableMenuItem (SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
|
|
}
|
|
|
|
// if we're not in SDI User mode, append common stuff
|
|
if (eMode != eMode_User_SDI)
|
|
AppendToSystemMenu (pwndT, eMode);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
|
|
{
|
|
CMDIFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
|
|
|
|
if (bSysMenu)
|
|
{
|
|
int nEnable = MF_GRAYED;
|
|
CChildFrame* pwndActive = dynamic_cast<CChildFrame*>(MDIGetActive ());
|
|
|
|
// if there's an active child, let it handle system menu validation
|
|
if ((pwndActive != NULL) && (pwndActive->IsCustomizeViewEnabled()))
|
|
nEnable = MF_ENABLED;
|
|
|
|
pPopupMenu->EnableMenuItem (ID_CUSTOMIZE_VIEW, MF_BYCOMMAND | nEnable);
|
|
}
|
|
else
|
|
{
|
|
// Check if Help menu by testing for "Help Topics" item
|
|
if (pPopupMenu->GetMenuState(ID_HELP_HELPTOPICS, MF_BYCOMMAND) != UINT(-1))
|
|
{
|
|
// View will update item
|
|
CAMCView* pView = GetActiveAMCView();
|
|
if (pView != NULL)
|
|
{
|
|
pView->UpdateSnapInHelpMenus(pPopupMenu);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
LRESULT CMainFrame::OnShowSnapinHelpTopic (WPARAM wParam, LPARAM lParam)
|
|
{
|
|
DECLARE_SC (sc, _T("CMainFrame::OnShowSnapinHelpTopic"));
|
|
|
|
CConsoleView* pConsoleView;
|
|
sc = ScGetActiveConsoleView (pConsoleView);
|
|
|
|
if (sc)
|
|
return (sc.ToHr());
|
|
|
|
/*
|
|
* ScGetActiveConsoleView will return success (S_FALSE) even if there's no
|
|
* active view. This is a valid case, occuring when there's no console
|
|
* file open. In this particular circumstance, it is an unexpected
|
|
* failure since we shouldn't get to this point in the code if there's
|
|
* no view.
|
|
*/
|
|
sc = ScCheckPointers (pConsoleView, E_UNEXPECTED);
|
|
if (sc)
|
|
return (sc.ToHr());
|
|
|
|
// forward this on the the active AMC view window
|
|
USES_CONVERSION;
|
|
sc = pConsoleView->ScShowSnapinHelpTopic (W2T (reinterpret_cast<LPOLESTR>(lParam)));
|
|
|
|
return (sc.ToHr());
|
|
}
|
|
|
|
SC CMainFrame::ScGetMenuAccelerators (LPTSTR pBuffer, int cchBuffer)
|
|
{
|
|
AFX_MANAGE_STATE (AfxGetAppModuleState());
|
|
|
|
if ((m_pMenuBar != NULL) && IsMenuVisible())
|
|
m_pMenuBar->GetAccelerators (cchBuffer, pBuffer);
|
|
|
|
else if (cchBuffer > 0)
|
|
pBuffer[0] = 0;
|
|
|
|
return (S_OK);
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CMainFrame::ScShowMMCMenus
|
|
//
|
|
// Synopsis: Show or hide MMC menus. (Action/View/Favs)
|
|
//
|
|
// Arguments: bShow
|
|
//
|
|
// Returns: SC
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CMainFrame::ScShowMMCMenus (bool bShow)
|
|
{
|
|
AFX_MANAGE_STATE (AfxGetAppModuleState());
|
|
DECLARE_SC(sc, _T("CMainFrame::ScShowMMCMenus"));
|
|
|
|
if ((m_pMenuBar != NULL) && IsMenuVisible())
|
|
sc = m_pMenuBar->ScShowMMCMenus(bShow);
|
|
else
|
|
return (sc = E_UNEXPECTED);
|
|
|
|
return (sc);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// This message is received from the node manager whenever a property
|
|
// sheet use the MMCPropertyChangeNotify() api.
|
|
// The wParam contains a copy of the handle information which must be freed.
|
|
//
|
|
LRESULT CMainFrame::OnPropertySheetNotify(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
TRACE_METHOD(CAMCView, OnPropertySheetNotify);
|
|
|
|
ASSERT(wParam != 0);
|
|
LPPROPERTYNOTIFYINFO pNotify = reinterpret_cast<LPPROPERTYNOTIFYINFO>(wParam);
|
|
|
|
// Crack the information from the handle object and send a notify to the snap-in
|
|
ASSERT((pNotify->pComponent != NULL || pNotify->pComponentData != NULL));
|
|
|
|
if (pNotify->pComponent != NULL)
|
|
pNotify->pComponent->Notify(NULL, MMCN_PROPERTY_CHANGE, pNotify->fScopePane, lParam);
|
|
|
|
else if (pNotify->pComponentData != NULL)
|
|
pNotify->pComponentData->Notify(NULL, MMCN_PROPERTY_CHANGE, pNotify->fScopePane, lParam);
|
|
|
|
::GlobalFree(pNotify);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
LRESULT CMainFrame::OnSetText (WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LRESULT rc;
|
|
CAMCDoc* pDoc = CAMCDoc::GetDocument();
|
|
|
|
/*
|
|
* If the document has a custom title, we don't want to append
|
|
* the maxed child's title to the main frame's title. To do this,
|
|
* we'll bypass DefFrameProc and go directly to DefWindowProc.
|
|
*/
|
|
if ((pDoc != NULL) && pDoc->HasCustomTitle())
|
|
rc = CWnd::DefWindowProc (WM_SETTEXT, wParam, lParam);
|
|
else
|
|
rc = Default();
|
|
|
|
DrawFrameCaption (this, m_fCurrentlyActive);
|
|
|
|
return (rc);
|
|
}
|
|
|
|
void CMainFrame::OnPaletteChanged( CWnd* pwndFocus)
|
|
{
|
|
if (pwndFocus != this)
|
|
{
|
|
CAMCDoc* pAMCDoc = CAMCDoc::GetDocument();
|
|
if (pAMCDoc)
|
|
{
|
|
HWND hwndFocus = pwndFocus->GetSafeHwnd();
|
|
CAMCViewPosition pos = pAMCDoc->GetFirstAMCViewPosition();
|
|
while (pos != NULL)
|
|
{
|
|
CAMCView* pv = pAMCDoc->GetNextAMCView(pos);
|
|
|
|
if (pv)
|
|
pv->SendMessage(WM_PALETTECHANGED, (WPARAM)hwndFocus);
|
|
}
|
|
}
|
|
}
|
|
|
|
CMDIFrameWnd::OnPaletteChanged(pwndFocus);
|
|
}
|
|
|
|
BOOL CMainFrame::OnQueryNewPalette()
|
|
{
|
|
CAMCView* pAMCView = GetActiveAMCView();
|
|
if (pAMCView != NULL)
|
|
return pAMCView->SendMessage(WM_QUERYNEWPALETTE);
|
|
|
|
return CMDIFrameWnd::OnQueryNewPalette();
|
|
}
|
|
|
|
void CMainFrame::OnConsoleProperties()
|
|
{
|
|
CConsolePropSheet().DoModal();
|
|
}
|
|
|
|
void CMainFrame::SetIconEx (HICON hIcon, BOOL fBig)
|
|
{
|
|
if (hIcon == NULL)
|
|
hIcon = GetDefaultIcon();
|
|
|
|
SetIcon (hIcon, fBig);
|
|
|
|
/*
|
|
* make sure the child icon on the menu bar gets updated
|
|
*/
|
|
ASSERT (m_pMenuBar != NULL);
|
|
m_pMenuBar->InvalidateMaxedChildIcon();
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CMainFrame::GetDefaultIcon
|
|
*
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
HICON CMainFrame::GetDefaultIcon () const
|
|
{
|
|
return (AfxGetApp()->LoadIcon (IDR_MAINFRAME));
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CMainFrame::SendMinimizeNotifications
|
|
*
|
|
* Causes each CChildFrame to send NCLBK_MINIMIZED.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void CMainFrame::SendMinimizeNotifications (bool fMinimized) const
|
|
{
|
|
CWnd* pwndMDIChild;
|
|
|
|
for (pwndMDIChild = m_wndMDIClient.GetWindow (GW_CHILD);
|
|
pwndMDIChild != NULL;
|
|
pwndMDIChild = pwndMDIChild->GetWindow (GW_HWNDNEXT))
|
|
{
|
|
// There used to be an ASSERT_ISKINDOF. However, that had to change to an if
|
|
// since the active background denies that assumption. See bug 428906.
|
|
if(pwndMDIChild->IsKindOf(RUNTIME_CLASS(CChildFrame)))
|
|
(static_cast<CChildFrame*>(pwndMDIChild))->SendMinimizeNotification (fMinimized);
|
|
}
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CMainFrame::OnNcActivate
|
|
*
|
|
* WM_NCACTIVATE handler for CMainFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
BOOL CMainFrame::OnNcActivate(BOOL bActive)
|
|
{
|
|
BOOL rc = CMDIFrameWnd::OnNcActivate(bActive);
|
|
DrawFrameCaption (this, m_fCurrentlyActive);
|
|
|
|
return (rc);
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CMainFrame::OnNcPaint
|
|
*
|
|
* WM_NCPAINT handler for CMainFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void CMainFrame::OnNcPaint()
|
|
{
|
|
Default();
|
|
DrawFrameCaption (this, m_fCurrentlyActive);
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* MsgForwardingEnumProc
|
|
*
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
static BOOL CALLBACK MsgForwardingEnumProc (HWND hwnd, LPARAM lParam)
|
|
{
|
|
/*
|
|
* if this isn't an MFC window, forward the message
|
|
*/
|
|
if (CWnd::FromHandlePermanent(hwnd) == NULL)
|
|
{
|
|
const MSG* pMsg = (const MSG*) lParam;
|
|
SendMessage (hwnd, pMsg->message, pMsg->wParam, pMsg->lParam);
|
|
}
|
|
|
|
/*
|
|
* continue enumeration
|
|
*/
|
|
return (true);
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CMainFrame::OnSettingChange
|
|
*
|
|
* WM_SETTINGCHANGE handler for CMainFrame.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
|
|
{
|
|
CMDIFrameWnd::OnSettingChange(uFlags, lpszSection);
|
|
|
|
/*
|
|
* MFC will send WM_SETTINGCHANGEs to all descendent MFC windows.
|
|
* There are some non-MFC windows owned by nodemgr that we also want
|
|
* to get this message. We'll send these manually.
|
|
*/
|
|
const MSG* pMsg = GetCurrentMessage();
|
|
EnumChildWindows (m_hWnd, MsgForwardingEnumProc, (LPARAM) pMsg);
|
|
|
|
/*
|
|
* If we're in SDI mode, then there can be some redrawing problems
|
|
* around the caption if the caption height changes significantly.
|
|
* (This is a USER MDI bug.) We can work around it by manually
|
|
* placing the maximized child window within the MDI client.
|
|
*
|
|
* Note that restoring and re-maximizing the active child window
|
|
* will put the window in the right place, it has the side effect
|
|
* of undesired window flicker (see 375430, et al) as well as
|
|
* a bunch of annoying sound effects if you have sounds associated
|
|
* with the "Restore Down" and/or "Maximize" sound events.
|
|
*/
|
|
if (AMCGetApp()->GetMode() == eMode_User_SDI)
|
|
{
|
|
CMDIChildWnd* pwndActive = MDIGetActive();
|
|
|
|
if (pwndActive)
|
|
{
|
|
/*
|
|
* get the size of the MDI client
|
|
*/
|
|
CRect rect;
|
|
m_wndMDIClient.GetClientRect (rect);
|
|
|
|
/*
|
|
* inflate the MDI client's client rect by the size of sizing
|
|
* borders, and add room for the caption at the top
|
|
*/
|
|
rect.InflateRect (GetSystemMetrics (SM_CXFRAME),
|
|
GetSystemMetrics (SM_CYFRAME));
|
|
rect.top -= GetSystemMetrics (SM_CYCAPTION);
|
|
|
|
/*
|
|
* put the window in the right place
|
|
*/
|
|
pwndActive->MoveWindow (rect);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CMainFrame::ScGetActiveStatusBar
|
|
*
|
|
* Returns the CConsoleStatusBar interface for the active view. If there's no
|
|
* active view, pStatusBar is set to NULL and S_FALSE is returned.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
SC CMainFrame::ScGetActiveStatusBar (
|
|
CConsoleStatusBar*& pStatusBar) /* O:CConsoleStatusBar for active view*/
|
|
{
|
|
AFX_MANAGE_STATE (AfxGetAppModuleState());
|
|
DECLARE_SC (sc, _T("CMainFrame::ScGetActiveStatusBar"));
|
|
|
|
pStatusBar = dynamic_cast<CConsoleStatusBar*>(GetActiveFrame());
|
|
|
|
if (pStatusBar == NULL)
|
|
sc = S_FALSE;
|
|
|
|
return (sc);
|
|
}
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CMainFrame::ScGetActiveConsoleView
|
|
*
|
|
* Returns the CConsoleView interface for the active view. If there's no
|
|
* active view, pConsoleView is set to NULL and S_FALSE is returned.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
SC CMainFrame::ScGetActiveConsoleView (
|
|
CConsoleView*& pConsoleView) /* O:CConsoleView for active view */
|
|
{
|
|
AFX_MANAGE_STATE (AfxGetAppModuleState());
|
|
DECLARE_SC (sc, _T("CMainFrame::ScGetActiveConsoleView"));
|
|
|
|
pConsoleView = GetActiveAMCView();
|
|
|
|
if (pConsoleView == NULL)
|
|
sc = S_FALSE;
|
|
|
|
return (sc);
|
|
}
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* METHOD: CMainFrame::OnUnInitMenuPopup
|
|
*
|
|
* PURPOSE: Used to remove accelerators once system menus are dismissed
|
|
*
|
|
* PARAMETERS:
|
|
* WPARAM wParam
|
|
* LPARAM lParam
|
|
*
|
|
* RETURNS:
|
|
* LRESULT - result code
|
|
*
|
|
\***************************************************************************/
|
|
afx_msg LRESULT CMainFrame::OnUnInitMenuPopup(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// hide accelerators whenever leaving system popup
|
|
if ( HIWORD(lParam) & MF_SYSMENU )
|
|
{
|
|
SendMessage( WM_CHANGEUISTATE, MAKEWPARAM(UIS_SET, UISF_HIDEACCEL | UISF_HIDEFOCUS));
|
|
}
|
|
|
|
return 0;
|
|
}
|