/* -*- 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; }