mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-31 22:25:30 +00:00
705 lines
21 KiB
C++
705 lines
21 KiB
C++
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||
|
*
|
||
|
* The contents of this file are subject to the Netscape Public License
|
||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||
|
* http://www.mozilla.org/NPL/
|
||
|
*
|
||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||
|
* for the specific language governing rights and limitations under the
|
||
|
* NPL.
|
||
|
*
|
||
|
* The Initial Developer of this code under the NPL is Netscape
|
||
|
* Communications Corporation. Portions created by Netscape are
|
||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||
|
* Reserved.
|
||
|
*/
|
||
|
|
||
|
// ipframe.cpp : implementation of the CInPlaceFrame class
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
|
||
|
#include "mainfrm.h"
|
||
|
#include "ipframe.h"
|
||
|
#include "ssl.h"
|
||
|
#include "srvritem.h"
|
||
|
#include "genchrom.h"
|
||
|
#include "quickfil.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
#ifdef XP_WIN32
|
||
|
HMENU AFXAPI AfxMergeMenus(HMENU hMenuShared, HMENU hMenuSource,
|
||
|
LONG* lpMenuWidths, int iWidthIndex, BOOL bMergeHelpMenus = FALSE);
|
||
|
#else
|
||
|
void AFXAPI _AfxMergeMenus(CMenu* pMenuShared, CMenu* pMenuSource,
|
||
|
LONG FAR* lpMenuWidths, int iWidthIndex);
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CInPlaceFrame
|
||
|
|
||
|
#ifndef _AFXDLL
|
||
|
#undef new
|
||
|
#endif
|
||
|
IMPLEMENT_DYNCREATE(CInPlaceFrame, COleIPFrameWnd)
|
||
|
#ifndef _AFXDLL
|
||
|
#define new DEBUG_NEW
|
||
|
#endif
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CInPlaceFrame, COleIPFrameWnd)
|
||
|
//{{AFX_MSG_MAP(CInPlaceFrame)
|
||
|
ON_WM_CREATE()
|
||
|
ON_WM_SETFOCUS()
|
||
|
ON_COMMAND(ID_HOTLIST_VIEW, OnHotlistView)
|
||
|
ON_REGISTERED_MESSAGE(WM_FINDREPLACE, OnFindReplace)
|
||
|
ON_WM_INITMENUPOPUP()
|
||
|
ON_WM_MENUSELECT()
|
||
|
ON_WM_QUERYNEWPALETTE()
|
||
|
ON_WM_PALETTECHANGED()
|
||
|
ON_COMMAND(ID_TOOLS_WEB, OnToolsWeb)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
#include "toolbar.cpp"
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CInPlaceFrame construction/destruction
|
||
|
|
||
|
CInPlaceFrame::CInPlaceFrame()
|
||
|
{
|
||
|
TRACE("Creating IPFrame\n");
|
||
|
m_pProxy2Frame = NULL;
|
||
|
m_bCreatedControls = FALSE;
|
||
|
m_bUIActive = FALSE;
|
||
|
}
|
||
|
|
||
|
CInPlaceFrame::~CInPlaceFrame()
|
||
|
{
|
||
|
TRACE("Destroying IPFrame\n");
|
||
|
// Give up being the frame.
|
||
|
if(m_pProxy2Frame) {
|
||
|
GetMainWinContext()->m_pFrame = m_pProxy2Frame;
|
||
|
m_pProxy2Frame->SetMainContext(GetMainContext());
|
||
|
m_pProxy2Frame->SetActiveContext(GetActiveContext());
|
||
|
CMainFrame* pFrame = (CMainFrame* )m_pProxy2Frame->GetFrameWnd();
|
||
|
pFrame->Release();
|
||
|
|
||
|
}
|
||
|
|
||
|
// Clear our ideas of the currently active context and main context.
|
||
|
// This keeps the CFrameGlue destructor from clearing the frame pointer
|
||
|
// in the context which we just reset above.
|
||
|
SetMainContext(NULL);
|
||
|
SetActiveContext(NULL);
|
||
|
}
|
||
|
|
||
|
int CInPlaceFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
||
|
{
|
||
|
TRACE("CInPlaceFrame::OnCreate called\n");
|
||
|
if (COleIPFrameWnd::OnCreate(lpCreateStruct) == -1)
|
||
|
return -1;
|
||
|
|
||
|
// CResizeBar implements in-place resizing.
|
||
|
if (!m_wndResizeBar.Create(this))
|
||
|
{
|
||
|
TRACE0("Failed to create resize bar\n");
|
||
|
return -1; // fail to create
|
||
|
}
|
||
|
|
||
|
// By default, it is a good idea to register a drop-target that does
|
||
|
// nothing with your frame window. This prevents drops from
|
||
|
// "falling through" to a container that supports drag-drop.
|
||
|
m_dropTarget.Register(this);
|
||
|
|
||
|
TRACE("Success in OnCreate\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
BOOL CInPlaceFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext) {
|
||
|
TRACE("CInPlaceFrame::LoadFrame called\n");
|
||
|
|
||
|
// Let the view know that we're the frame for the time being.
|
||
|
// We'll have to handle passing along every CFrameGlue call to
|
||
|
// the real frame along with handling it ourselves,
|
||
|
// except GetFrameWnd().
|
||
|
ASSERT(pContext);
|
||
|
CGenericDoc *pDoc;
|
||
|
if(pContext) {
|
||
|
ASSERT(pContext->m_pCurrentDoc);
|
||
|
if(pContext->m_pCurrentDoc) {
|
||
|
// Must be a CGenericDoc.
|
||
|
ASSERT(pContext->m_pCurrentDoc->IsKindOf(RUNTIME_CLASS(CGenericDoc)));
|
||
|
pDoc = (CGenericDoc *)pContext->m_pCurrentDoc;
|
||
|
|
||
|
// Get the context.
|
||
|
ASSERT(pDoc->GetContext()->IsFrameContext());
|
||
|
CWinCX *pCX = (CWinCX *)pDoc->GetContext();
|
||
|
|
||
|
// Take over being the frame.
|
||
|
m_pProxy2Frame = pCX->m_pFrame;
|
||
|
CMainFrame* pFrame = (CMainFrame* )m_pProxy2Frame->GetFrameWnd();
|
||
|
pFrame->AddRef();
|
||
|
// pCX->m_pFrame = (CFrameGlue *)this;
|
||
|
|
||
|
// Set our current and active context.
|
||
|
SetMainContext(pCX);
|
||
|
SetActiveContext(pCX);
|
||
|
|
||
|
// We'll need to unhook ourselves when we close down.
|
||
|
}
|
||
|
}
|
||
|
BOOL bRetVal = COleIPFrameWnd::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext);
|
||
|
return bRetVal;
|
||
|
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CInPlaceFrame diagnostics
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
void CInPlaceFrame::AssertValid() const
|
||
|
{
|
||
|
COleIPFrameWnd::AssertValid();
|
||
|
}
|
||
|
|
||
|
void CInPlaceFrame::Dump(CDumpContext& dc) const
|
||
|
{
|
||
|
COleIPFrameWnd::Dump(dc);
|
||
|
}
|
||
|
#endif //_DEBUG
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CInPlaceFrame commands
|
||
|
|
||
|
CFrameWnd *CInPlaceFrame::GetFrameWnd() {
|
||
|
return((CFrameWnd *)this);
|
||
|
}
|
||
|
|
||
|
void CInPlaceFrame::UpdateHistoryDialog() {
|
||
|
// Pass it off.
|
||
|
if(m_pProxy2Frame) {
|
||
|
m_pProxy2Frame->UpdateHistoryDialog();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// OnCreateControlBars is called by the framework to create control bars on the
|
||
|
// container application's windows. pWndFrame is the top level frame window of
|
||
|
// the container and is always non-NULL. pWndDoc is the doc level frame window
|
||
|
// and will be NULL when the container is an SDI application. A server
|
||
|
// application can place MFC control bars on either window.
|
||
|
BOOL CInPlaceFrame::OnCreateControlBars(CWnd* pWndFrame, CWnd* pWndDoc)
|
||
|
{
|
||
|
TRACE("CInPlaceFrame::OnCreateControlBars called\n");
|
||
|
// Set the toolbar style.
|
||
|
// BOOL bCreate = m_wndToolBar.Create(pWndFrame);
|
||
|
// ASSERT(bCreate);
|
||
|
CGenericDoc* pDoc = (CGenericDoc*)GetActiveDocument( );
|
||
|
CNetscapeSrvrItem *pItem = pDoc->GetEmbeddedItem();
|
||
|
if (pItem->IsShowUI()) {
|
||
|
|
||
|
// Now that the application palette has been created (if
|
||
|
// appropriate) we can create the url bar. The animation
|
||
|
CCustToolbar *pCustToolbar = m_pProxy2Frame->GetChrome()->GetCustomizableToolbar();
|
||
|
pCustToolbar->SetNewParentFrame((CFrameWnd*)pWndFrame);
|
||
|
pCustToolbar->SetOwner(m_pProxy2Frame->GetFrameWnd());
|
||
|
#ifdef XP_WIN32
|
||
|
// this is an undocumented function that adds a control bar
|
||
|
// to the parent frame's control bar list. SetParent doesn't do this and
|
||
|
// this only occurs when the control bar is created. Since our control bar
|
||
|
// was created before we knew about this parent, we miss out on the only
|
||
|
// opportunity to do so. So this function is called.
|
||
|
// This now gets taken care of in CCustToolbar.
|
||
|
//((CFrameWnd*)pWndFrame)->AddControlBar(pCustToolbar);
|
||
|
#endif
|
||
|
// AddBookmarksMenu();
|
||
|
|
||
|
// might need custom colors so we need the palette to be around
|
||
|
m_iShowURLBar = TRUE;
|
||
|
m_iShowStarterBar = TRUE;
|
||
|
m_iCSID = INTL_DefaultDocCharSetID(0); // Set Global default.
|
||
|
|
||
|
// SetBarType(m_iShowStarterBar, m_iShowURLBar);
|
||
|
|
||
|
|
||
|
ASSERT( m_pProxy2Frame );
|
||
|
LPNSSTATUSBAR pIStatusBar = NULL;
|
||
|
m_pProxy2Frame->GetChrome()->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
|
||
|
if( pIStatusBar )
|
||
|
{
|
||
|
CNetscapeStatusBar *pStatusBar = ((CGenericStatusBar *)pIStatusBar)->GetNetscapeStatusBar();
|
||
|
|
||
|
if( !pStatusBar )
|
||
|
{
|
||
|
pIStatusBar->Create( pWndFrame, 0, 0, TRUE, FALSE ); // No task bar
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pStatusBar->m_pProxy2Frame = m_pProxy2Frame;
|
||
|
|
||
|
pStatusBar->SetParent( pWndFrame );
|
||
|
#ifdef XP_WIN32
|
||
|
((CFrameWnd *)pWndFrame)->AddControlBar( pStatusBar );
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
// pIStatusBar->Show( TRUE );
|
||
|
pIStatusBar->Release();
|
||
|
}
|
||
|
|
||
|
RecalcLayout();
|
||
|
|
||
|
// We've created the controls.
|
||
|
m_bCreatedControls = TRUE;
|
||
|
}
|
||
|
// Success so far. Also, accept drag and drop files from
|
||
|
// the file manager.
|
||
|
//
|
||
|
DragAcceptFiles();
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CInPlaceFrame::ShowControlBars(CFrameWnd* pFrameWnd, BOOL bShow)
|
||
|
{
|
||
|
|
||
|
CCustToolbar *pCustToolbar = m_pProxy2Frame->GetChrome()->GetCustomizableToolbar();
|
||
|
|
||
|
if(pCustToolbar)
|
||
|
{
|
||
|
if(pFrameWnd == pCustToolbar->GetParentFrame())
|
||
|
pCustToolbar->ShowWindow(bShow ? SW_SHOW : SW_HIDE);
|
||
|
}
|
||
|
|
||
|
LPNSSTATUSBAR pIStatusBar = NULL;
|
||
|
m_pProxy2Frame->GetChrome()->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
|
||
|
if( pIStatusBar )
|
||
|
{
|
||
|
CNetscapeStatusBar *pStatusBar = ((CGenericStatusBar *)pIStatusBar)->GetNetscapeStatusBar();
|
||
|
|
||
|
if(pStatusBar && pFrameWnd == pStatusBar->GetParentFrame())
|
||
|
{
|
||
|
pStatusBar->ShowWindow(bShow ? SW_SHOW : SW_HIDE);
|
||
|
}
|
||
|
|
||
|
pIStatusBar->Release();
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
void CInPlaceFrame::ReparentControlBars(void)
|
||
|
{
|
||
|
CCustToolbar *pCustToolbar = m_pProxy2Frame->GetChrome()->GetCustomizableToolbar();
|
||
|
|
||
|
if(pCustToolbar)
|
||
|
{
|
||
|
pCustToolbar->SetNewParentFrame(m_pProxy2Frame->GetFrameWnd());
|
||
|
pCustToolbar->ShowWindow(SW_SHOW);
|
||
|
}
|
||
|
|
||
|
|
||
|
LPNSSTATUSBAR pIStatusBar = NULL;
|
||
|
m_pProxy2Frame->GetChrome()->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
|
||
|
if( pIStatusBar )
|
||
|
{
|
||
|
CNetscapeStatusBar *pStatusBar = ((CGenericStatusBar *)pIStatusBar)->GetNetscapeStatusBar();
|
||
|
|
||
|
if(pStatusBar)
|
||
|
{
|
||
|
pStatusBar->SetParent( m_pProxy2Frame->GetFrameWnd() );
|
||
|
#ifdef XP_WIN32
|
||
|
m_pProxy2Frame->GetFrameWnd()->AddControlBar( pStatusBar );
|
||
|
#endif
|
||
|
pIStatusBar->Show(TRUE);
|
||
|
|
||
|
}
|
||
|
pIStatusBar->Release();
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//JOKI
|
||
|
void CInPlaceFrame::DestroyResizeBar()
|
||
|
{
|
||
|
//I had to resort to this rather than not creating m_wndResizeBar in ::OnCreate()
|
||
|
// Reason : I could not get hold of GetActiveDocument(in OnCreate) which is used to get
|
||
|
//the pNetscapeSrvrItem in turn used to call Get_ShowInplaceUI()
|
||
|
if(::IsWindow(m_wndResizeBar.m_hWnd))
|
||
|
m_wndResizeBar.DestroyWindow();
|
||
|
|
||
|
RecalcLayout();
|
||
|
}
|
||
|
|
||
|
BOOL CInPlaceFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
|
||
|
{
|
||
|
// Pump through any active child first.
|
||
|
// This will catch active control bars, etc.
|
||
|
CWinCX *pWinCX = NULL;
|
||
|
CWnd *pFocus = GetFocus();
|
||
|
BOOL bFrameChild;
|
||
|
|
||
|
if(pFocus != NULL) {
|
||
|
// Make sure it's a child of us, and not a CGenericView (we handle those below).
|
||
|
// Also make sure it's not a child of our main view.
|
||
|
// Those are handled by the view, not us.
|
||
|
bFrameChild = IsChild(pFocus);
|
||
|
BOOL bGenericView = pFocus->IsKindOf(RUNTIME_CLASS(CGenericView));
|
||
|
BOOL bViewChild = FALSE;
|
||
|
pWinCX = GetMainWinContext();
|
||
|
if(pWinCX && pWinCX->GetPane()) {
|
||
|
bViewChild = ::IsChild(pWinCX->GetPane(), pFocus->m_hWnd);
|
||
|
}
|
||
|
|
||
|
if(bFrameChild == TRUE && bGenericView == FALSE && bViewChild == FALSE) {
|
||
|
// Try an OnCmdMessage, probably a URL bar, or message list.
|
||
|
// Walk up the list of parents until we reach ourselves.
|
||
|
CWnd *pTarget = pFocus;
|
||
|
while(pTarget != NULL && pTarget != (CWnd *)this) {
|
||
|
if(pTarget->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) {
|
||
|
TRACE("IPFr WM_CMD:%u through CWnd:%p (control bar%s?)\n", nID, pTarget, (nCode == CN_COMMAND ? "" : " ui"));
|
||
|
return(TRUE);
|
||
|
}
|
||
|
pTarget = pTarget->GetParent();
|
||
|
|
||
|
// There are cases now where a child is actually a CGenericView
|
||
|
// such as the NavCenter HTML pane. Do not allow it to
|
||
|
// receive these messages.
|
||
|
if(pTarget->IsKindOf(RUNTIME_CLASS(CGenericView))) {
|
||
|
pTarget = NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(m_pProxy2Frame->GetFrameWnd() != NULL && (nID != ID_TOOLS_WEB)) {
|
||
|
if(m_pProxy2Frame->GetFrameWnd()->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
// always enable bookmark entries
|
||
|
if((nID >= FIRST_BOOKMARK_MENU_ID) && (nID < LAST_BOOKMARK_MENU_ID) && (nCode == CN_UPDATE_COMMAND_UI)) {
|
||
|
ASSERT(pExtra);
|
||
|
CCmdUI* pCmdUI = (CCmdUI*)pExtra;
|
||
|
pCmdUI->Enable();
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
// always enable windows menu entries
|
||
|
if((nID >= ID_WINDOW_WINDOW_0) && (nID < ID_WINDOW_WINDOW_0 + 10) && (nCode == CN_UPDATE_COMMAND_UI)) {
|
||
|
ASSERT(pExtra);
|
||
|
CCmdUI* pCmdUI = (CCmdUI*)pExtra;
|
||
|
pCmdUI->Enable();
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
// was this a windows menu selection ?
|
||
|
if((nID >= ID_WINDOW_WINDOW_0) && (nID < ID_WINDOW_WINDOW_0 + 10) && (nCode == CN_COMMAND)) {
|
||
|
CGenericFrame * pFrame = theApp.m_pFrameList;
|
||
|
|
||
|
// walk down frame list till we get to the one we wanted
|
||
|
while((nID >= ID_WINDOW_WINDOW_0) && (pFrame)) {
|
||
|
|
||
|
switch(pFrame->GetMainContext()->GetContext()->type) {
|
||
|
case MWContextMail:
|
||
|
case MWContextNews:
|
||
|
// these don't get added to the list so they don't count
|
||
|
break;
|
||
|
case MWContextMessageComposition:
|
||
|
case MWContextBrowser:
|
||
|
nID--;
|
||
|
break;
|
||
|
default:
|
||
|
// by default windows aren't added to the list
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// whether this window counted or not we need to move to the next one
|
||
|
if(pFrame && nID >= ID_WINDOW_WINDOW_0) {
|
||
|
pFrame = pFrame->m_pNext;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// if we got something un-minimize it and pop it to the front
|
||
|
if(pFrame) {
|
||
|
if(pFrame->IsIconic()) {
|
||
|
pFrame->ShowWindow(SW_RESTORE);
|
||
|
}
|
||
|
pFrame->BringWindowToTop();
|
||
|
}
|
||
|
|
||
|
// assume we got something or at least the message was for us
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
// Call the base.
|
||
|
// Redundant on the view, but can't risk different implementations
|
||
|
// at this time.
|
||
|
return COleIPFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void CInPlaceFrame::OnSetFocus(CWnd* pOldWnd)
|
||
|
{
|
||
|
COleIPFrameWnd::OnSetFocus(pOldWnd);
|
||
|
|
||
|
// Set ourselves on the active frame stack.
|
||
|
SetAsActiveFrame();
|
||
|
}
|
||
|
|
||
|
void CInPlaceFrame::OnHotlistView()
|
||
|
{
|
||
|
// Needs to have NavCenter pop up eventually.
|
||
|
}
|
||
|
|
||
|
BOOL CInPlaceFrame::OnCommand(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
if(COleIPFrameWnd::OnCommand(wParam, lParam)) {
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
CMainFrame *pMainFrame = (CMainFrame*)m_pProxy2Frame->GetFrameWnd();
|
||
|
|
||
|
if(pMainFrame)
|
||
|
if(pMainFrame->SendMessage(WM_COMMAND, wParam, lParam))
|
||
|
return(TRUE);
|
||
|
|
||
|
return(CommonCommand(wParam, lParam));
|
||
|
}
|
||
|
|
||
|
LRESULT CInPlaceFrame::OnFindReplace(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
CWinCX *pContext = GetActiveWinContext();
|
||
|
|
||
|
if(!pContext)
|
||
|
pContext = GetMainWinContext();
|
||
|
|
||
|
if(pContext && pContext->GetPane())
|
||
|
return(pContext->GetView()->OnFindReplace(wParam, lParam));
|
||
|
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CInPlaceFrame::BuildSharedMenu()
|
||
|
{
|
||
|
CGenericDoc* pDoc = (CGenericDoc*)GetActiveDocument( );
|
||
|
CNetscapeSrvrItem *pItem = pDoc->GetEmbeddedItem();
|
||
|
|
||
|
if (pItem->IsShowUI()) {
|
||
|
#ifdef XP_WIN32
|
||
|
HMENU hMenu = GetInPlaceMenu();
|
||
|
#else
|
||
|
// get runtime class from the doc template
|
||
|
CDocTemplate* pTemplate = pDoc->GetDocTemplate();
|
||
|
ASSERT_VALID(pTemplate);
|
||
|
HMENU hMenu = pTemplate->m_hMenuInPlaceServer;
|
||
|
#endif
|
||
|
|
||
|
// create shared menu
|
||
|
ASSERT(m_hSharedMenu == NULL);
|
||
|
if ((m_hSharedMenu = ::CreateMenu()) == NULL)
|
||
|
return FALSE;
|
||
|
|
||
|
// start out by getting menu from container
|
||
|
memset(&m_menuWidths, 0, sizeof m_menuWidths);
|
||
|
if (m_lpFrame->InsertMenus(m_hSharedMenu, &m_menuWidths) != S_OK)
|
||
|
{
|
||
|
::DestroyMenu(m_hSharedMenu);
|
||
|
m_hSharedMenu = NULL;
|
||
|
return FALSE;
|
||
|
}
|
||
|
// container shouldn't touch these
|
||
|
ASSERT(m_menuWidths.width[1] == 0);
|
||
|
ASSERT(m_menuWidths.width[3] == 0);
|
||
|
ASSERT(m_menuWidths.width[5] == 0);
|
||
|
|
||
|
// only copy the popups if there is a menu loaded
|
||
|
if (hMenu == NULL)
|
||
|
return TRUE;
|
||
|
#ifdef XP_WIN32
|
||
|
// insert our menu popups amongst the container menus
|
||
|
AfxMergeMenus(m_hSharedMenu, hMenu, &m_menuWidths.width[0], 1);
|
||
|
#else
|
||
|
// insert our menu popups amongst the container menus
|
||
|
_AfxMergeMenus(CMenu::FromHandle(m_hSharedMenu),
|
||
|
CMenu::FromHandle(hMenu), &m_menuWidths.width[0], 1);
|
||
|
#endif
|
||
|
// finally create the special OLE menu descriptor
|
||
|
m_hOleMenu = ::OleCreateMenuDescriptor(m_hSharedMenu, &m_menuWidths);
|
||
|
return m_hOleMenu != NULL;
|
||
|
}
|
||
|
else
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CInPlaceFrame::OnInitMenuPopup(CMenu * pPopup, UINT nIndex, BOOL bSysMenu)
|
||
|
{
|
||
|
CMainFrame *pMainFrame = (CMainFrame*)m_pProxy2Frame->GetFrameWnd();
|
||
|
|
||
|
pMainFrame->SendMessage(WM_INITMENUPOPUP, (WPARAM)pPopup->m_hMenu, MAKELPARAM(nIndex, bSysMenu));
|
||
|
|
||
|
}
|
||
|
|
||
|
void CInPlaceFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
|
||
|
{
|
||
|
if (nFlags == 0xFFFF) {
|
||
|
HMENU hMenu = m_hSharedMenu;
|
||
|
|
||
|
// Not all top-level windows have a menu bar (e.g. the chromeless ones)
|
||
|
// Also, Editor frame doesn't have these submenus
|
||
|
if (hMenu) {
|
||
|
int nCount;
|
||
|
UINT nCmdID;
|
||
|
|
||
|
// Menu is going away so destroy all the menu items we
|
||
|
|
||
|
// Now cleanup the history menu. We don't need to make any assumptions
|
||
|
// about the number of menu items, because there are no separators or
|
||
|
// pull-right sub-menus so we can tell by looking at the command IDs
|
||
|
HMENU hPopupMenu = FEU_FindSubmenu(hMenu, ID_NAVIGATE_BACK);
|
||
|
|
||
|
if (hPopupMenu) {
|
||
|
ASSERT(hPopupMenu);
|
||
|
nCount = ::GetMenuItemCount(hPopupMenu);
|
||
|
|
||
|
// It's easiest to do this by walking backwards over the menu items
|
||
|
for (int i = nCount - 1; i >= 0; i--) {
|
||
|
nCmdID = ::GetMenuItemID(hPopupMenu, i);
|
||
|
|
||
|
if (IS_HISTORY_ID(nCmdID))
|
||
|
VERIFY(::DeleteMenu(hPopupMenu, i, MF_BYPOSITION));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
COleIPFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu);
|
||
|
}
|
||
|
|
||
|
void CInPlaceFrame::OnToolsWeb()
|
||
|
{
|
||
|
CAbstractCX *pCX = FEU_GetLastActiveFrameContext(MWContextAny);
|
||
|
|
||
|
if(pCX)
|
||
|
pCX->NewWindow();
|
||
|
|
||
|
}
|
||
|
|
||
|
// Replace our current bookmarks menu with the mainframe's bookmarks menu and add
|
||
|
// Calendar and 3270 menus
|
||
|
void CInPlaceFrame::AddBookmarksMenu(void)
|
||
|
{
|
||
|
|
||
|
CMenu *pMenu=GetMenu();
|
||
|
|
||
|
//Communicator is always the second to last menu popup so adjust accordingly
|
||
|
int nWindowPosition = pMenu->GetMenuItemCount() - 2;
|
||
|
|
||
|
if(nWindowPosition != -1)
|
||
|
{
|
||
|
CMenu *pWindowMenu = pMenu->GetSubMenu(nWindowPosition);
|
||
|
|
||
|
// Check if we need to add the Calendar menu item
|
||
|
|
||
|
if(FEU_IsCalendarAvailable())
|
||
|
{
|
||
|
int nTaskBarPosition = WFE_FindMenuItem(pWindowMenu, ID_WINDOW_TASKBAR);
|
||
|
|
||
|
if(nTaskBarPosition != -1)
|
||
|
pWindowMenu->InsertMenu(nTaskBarPosition - 1, MF_BYPOSITION, ID_WINDOW_CALENDAR, szLoadString(IDS_CALENDAR_MENU));
|
||
|
}
|
||
|
|
||
|
if(FEU_IsIBMHostOnDemandAvailable())
|
||
|
{
|
||
|
int nTaskBarPosition = WFE_FindMenuItem(pWindowMenu, ID_WINDOW_TASKBAR);
|
||
|
|
||
|
if(nTaskBarPosition != -1)
|
||
|
pWindowMenu->InsertMenu(nTaskBarPosition - 1, MF_BYPOSITION, ID_WINDOW_IBMHOSTONDEMAND, szLoadString(IDS_IBMHOSTONDEMAND_MENU));
|
||
|
}
|
||
|
|
||
|
#ifdef XP_WIN32
|
||
|
// We can start or activate LiveWire SiteManager
|
||
|
// if we have a registration handle
|
||
|
if( bSiteMgrIsRegistered ){
|
||
|
int nTaskBarPosition = WFE_FindMenuItem(pWindowMenu, ID_WINDOW_TASKBAR);
|
||
|
|
||
|
if(nTaskBarPosition != -1)
|
||
|
pWindowMenu->InsertMenu(nTaskBarPosition - 1, MF_BYPOSITION, ID_ACTIVATE_SITE_MANAGER, szLoadString(IDS_SITE_MANAGER));
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// Replace the bookmark menu with a new menu that can have ON_DRAWITEM overridden
|
||
|
//Bookmark is the First Popup in the Communicator Menu so loop through to find it.
|
||
|
int nBookmarksPosition = 0;
|
||
|
while(!pWindowMenu->GetSubMenu(nBookmarksPosition) && nBookmarksPosition < pWindowMenu->GetMenuItemCount())
|
||
|
nBookmarksPosition++;
|
||
|
|
||
|
if(nBookmarksPosition < pWindowMenu->GetMenuItemCount())
|
||
|
{
|
||
|
CMenu *pOldBookmarksMenu = pWindowMenu->GetSubMenu(nBookmarksPosition);
|
||
|
char bookmarksStr[30];
|
||
|
|
||
|
if(pOldBookmarksMenu)
|
||
|
{
|
||
|
// get the mainframe's bookmark menu
|
||
|
CMainFrame *pMainFrame = (CMainFrame*)m_pProxy2Frame->GetFrameWnd();
|
||
|
|
||
|
CTreeMenu *pBookmarksMenu = pMainFrame->GetBookmarksMenu();
|
||
|
|
||
|
if(pBookmarksMenu)
|
||
|
{
|
||
|
pWindowMenu->DeleteMenu(nBookmarksPosition, MF_BYPOSITION);
|
||
|
pWindowMenu->GetMenuString(nBookmarksPosition, bookmarksStr, 30, MF_BYPOSITION);
|
||
|
pWindowMenu->InsertMenu(nBookmarksPosition, MF_BYPOSITION|MF_STRING|MF_POPUP, (UINT)pBookmarksMenu->GetSafeHmenu(), bookmarksStr);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
BOOL CInPlaceFrame::OnQueryNewPalette()
|
||
|
{
|
||
|
CCustToolbar *pCustToolbar = m_pProxy2Frame->GetChrome()->GetCustomizableToolbar();
|
||
|
CWnd* parent = pCustToolbar->GetParent( );
|
||
|
|
||
|
pCustToolbar->SendMessageToDescendants(WM_PALETTECHANGED, (WPARAM)this->GetSafeHwnd());
|
||
|
|
||
|
return COleIPFrameWnd::OnQueryNewPalette();
|
||
|
}
|
||
|
|
||
|
void CInPlaceFrame::OnPaletteChanged(CWnd* pFocusWnd)
|
||
|
{
|
||
|
CCustToolbar *pCustToolbar = m_pProxy2Frame->GetChrome()->GetCustomizableToolbar();
|
||
|
CWnd* parent = pCustToolbar->GetParent( );
|
||
|
pCustToolbar->SendMessageToDescendants(WM_PALETTECHANGED, (WPARAM)pFocusWnd->GetSafeHwnd());
|
||
|
COleIPFrameWnd::OnPaletteChanged(pFocusWnd);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
HMENU CInPlaceFrame::GetInPlaceMenu()
|
||
|
{
|
||
|
// get active document associated with this frame window
|
||
|
CDocument* pDoc = GetActiveDocument();
|
||
|
ASSERT_VALID(pDoc);
|
||
|
|
||
|
// get in-place menu from the doc template
|
||
|
CDocTemplate* pTemplate = pDoc->GetDocTemplate();
|
||
|
if (pTemplate)
|
||
|
return pTemplate->m_hMenuInPlaceServer;
|
||
|
else
|
||
|
return NULL;
|
||
|
}
|