/* -*- 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. */ // genview.cpp : implementation file // #include "stdafx.h" #include "np.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif #ifdef EDITOR #include "mainfrm.h" // Need this to access CMainFrame::OnLoadHomePage() //#include "edres1.h" #endif #include "edt.h" #include "button.h" #include "libevent.h" #include "findrepl.h" ///////////////////////////////////////////////////////////////////////////// // CGenericView #ifndef _AFXDLL #undef new #endif IMPLEMENT_DYNCREATE(CGenericView, CView) #ifndef _AFXDLL #define new DEBUG_NEW #endif CGenericView::CGenericView() { // no one has focus yet m_hWndFocus = NULL; m_pContext = NULL; m_bInPrintPreview = FALSE; m_bRestoreComposerToolbar = FALSE; m_hCtlBrush = NULL; } CGenericView::~CGenericView() { // when the view goes down, it would be a good idea to let the context // know. if(GetContext() != NULL) { GetContext()->ClearView(); } if(m_hCtlBrush) DeleteObject(m_hCtlBrush); } BEGIN_MESSAGE_MAP(CGenericView, CView) //{{AFX_MSG_MAP(CGenericView) ON_WM_LBUTTONDBLCLK() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_WM_RBUTTONDBLCLK() ON_WM_RBUTTONDOWN() ON_WM_RBUTTONUP() ON_WM_MOUSEACTIVATE() ON_WM_CTLCOLOR() ON_WM_MOVE() ON_WM_SETFOCUS() ON_WM_KILLFOCUS() ON_WM_NCPAINT() ON_WM_NCCALCSIZE() ON_COMMAND(ID_FILE_MAILTO, OnFileMailto) ON_UPDATE_COMMAND_UI(ID_FILE_MAILTO, OnUpdateFileMailto) ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_UPDATE_COMMAND_UI(ID_FILE_OPEN, OnUpdateFileOpen) ON_COMMAND(ID_NETSCAPE_SAVE_AS, OnNetscapeSaveAs) ON_UPDATE_COMMAND_UI(ID_NETSCAPE_SAVE_AS, OnUpdateNetscapeSaveAs) ON_COMMAND(ID_FILE_SAVEFRAME_AS, OnNetscapeSaveFrameAs) ON_UPDATE_COMMAND_UI(ID_FILE_SAVEFRAME_AS, OnUpdateNetscapeSaveFrameAs) ON_COMMAND(ID_NAVIGATE_BACK, OnNavigateBack) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_BACK, OnUpdateNavigateBack) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_FORWARD, OnUpdateNavigateForward) ON_COMMAND(ID_NAVIGATE_FORWARD, OnNavigateForward) ON_COMMAND(ID_NAVIGATE_RELOAD, OnNavigateReload) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_RELOAD, OnUpdateNavigateReload) ON_COMMAND(ID_VIEW_LOADIMAGES, OnViewLoadimages) ON_UPDATE_COMMAND_UI(ID_VIEW_LOADIMAGES, OnUpdateViewLoadimages) ON_COMMAND(ID_FILE_PRINT, OnFilePrint) ON_UPDATE_COMMAND_UI(ID_FILE_PRINT, OnUpdateFilePrint) ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_PREVIEW, OnUpdateFilePrintPreview) ON_COMMAND(ID_EDIT_FINDINCURRENT, OnEditFindincurrent) ON_UPDATE_COMMAND_UI(ID_EDIT_FINDINCURRENT, OnUpdateEditFindincurrent) ON_COMMAND(ID_EDIT_WITHFRAME_FINDINCURRENT, OnEditFindincurrent) ON_UPDATE_COMMAND_UI(ID_EDIT_WITHFRAME_FINDINCURRENT, OnUpdateEditWithFrameFindincurrent) ON_COMMAND(ID_EDIT_FINDAGAIN, OnEditFindAgain) ON_UPDATE_COMMAND_UI(ID_EDIT_FINDAGAIN, OnUpdateEditFindAgain) ON_COMMAND(ID_NAVIGATE_INTERRUPT, OnNavigateInterrupt) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_INTERRUPT, OnUpdateNavigateInterrupt) ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy) ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut) ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste) ON_COMMAND(ID_EDIT_SELECT_ALL, OnSelectAll) ON_COMMAND(ID_FILE_VIEWSOURCE, OnFileViewsource) ON_UPDATE_COMMAND_UI(ID_FILE_VIEWSOURCE, OnUpdateFileViewsource) ON_COMMAND(ID_FILE_DOCINFO, OnFileDocinfo) ON_UPDATE_COMMAND_UI(ID_FILE_DOCINFO, OnUpdateFileDocinfo) ON_COMMAND(ID_VIEW_PAGESERVICES, OnViewPageServices) ON_UPDATE_COMMAND_UI(ID_VIEW_PAGESERVICES, OnUpdateViewPageServices) ON_COMMAND(ID_GO_HOME, OnGoHome) ON_UPDATE_COMMAND_UI(ID_GO_HOME, OnUpdateGoHome) ON_COMMAND(ID_FILE_UPLOADFILE, OnFileUploadfile) ON_UPDATE_COMMAND_UI(ID_FILE_UPLOADFILE, OnUpdateFileUploadfile) ON_COMMAND(ID_NAVIGATE_RELOADCELL, OnNavigateReloadcell) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_RELOADCELL, OnUpdateNavigateReloadcell) ON_COMMAND(ID_VIEW_FRAME_INFO, OnViewFrameInfo) ON_UPDATE_COMMAND_UI(ID_VIEW_FRAME_INFO, OnUpdateViewFrameInfo) ON_COMMAND(ID_VIEW_FRAME_SOURCE, OnViewFrameSource) ON_UPDATE_COMMAND_UI(ID_VIEW_FRAME_SOURCE, OnUpdateViewFrameSource) //}}AFX_MSG_MAP #ifdef EDITOR // Open file or URL to edit on Browser menu - Opens into new windows ON_UPDATE_COMMAND_UI(ID_FILE_OPEN_TO_EDIT, OnUpdateFileOpen) #endif END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CGenericView drawing void CGenericView::OnDraw(CDC* pDC) { } ///////////////////////////////////////////////////////////////////////////// // CGenericView diagnostics #ifdef _DEBUG void CGenericView::AssertValid() const { CView::AssertValid(); } void CGenericView::Dump(CDumpContext& dc) const { CView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CGenericView message handlers CGenericDoc *CGenericView::GetDocument() { CGenericDoc *pRetval = NULL; if(m_pContext != NULL) { pRetval = m_pContext->GetDocument(); } return(pRetval); } void CGenericView::SetContext(CAbstractCX *pContext) { ASSERT(pContext->IsWindowContext()); m_pContext = (CWinCX *)pContext; #ifdef WIN32 if (GetFrame() && GetFrame()->GetFrameWnd()) { long lRemExStyles; if (lRemExStyles = ((CGenericFrame*)GetFrame()->GetFrameWnd())->GetRemovedExStyles()) { long lStyles = GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE); lStyles &= ~lRemExStyles; SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, lStyles); } } #endif } void CGenericView::FrameClosing() { // The view is closing. // Are we responsible for print preveiw? // If so close it down. if(IsInPrintPreview() == TRUE) { HDC pDC = GetContext()->GetContextDC(); CDC *tDC = CDC::FromHandle(pDC); OnEndPrintPreview(tDC, NULL, CPoint(0, 0), (CPreviewView *)GetContext()->GetFrame()->GetFrameWnd()->GetActiveView()); GetContext()->ReleaseContextDC(pDC); } // Get rid of the context if around. if(GetContext() && GetContext()->IsDestroyed() == FALSE) { GetContext()->DestroyContext(); } } CFrameGlue *CGenericView::GetFrame() const { CFrameGlue *pRetval = NULL; if(m_pContext != NULL) { pRetval = m_pContext->GetFrame(); } return(pRetval); } BOOL CGenericView::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { // Attempt to pass this off to form elements first. // See who's got focus. CWnd *pFocus = GetFocus(); if(pFocus != NULL) { // Make sure it's a child of us, and not a CGenericView (like us). // We block on the generic view, because it is already in the message map of the frame // and should get appropriately called there. BOOL bViewChild = IsChild(pFocus); BOOL bGenericView = pFocus->IsKindOf(RUNTIME_CLASS(CGenericView)); if(bViewChild == TRUE && bGenericView == FALSE) { // Try an OnCmdMessage directly on the window with focus. // Probably a form widget. // 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)) { 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; } } } } // Proceed as normal. return CView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); } void CGenericView::OnActivateView(BOOL bActivate, CView *pActivateView, CView *pDeactivateView) { // Tell the frame what the new acitve context is. // See if we should update the frame's idea of the currently active context. // Don't set the active context to be absent, someone else needs to become // active immediately if there is a gap. // If we do clear it, things like print and print preview won't work. if(bActivate == TRUE) { // Frame may be gone (WM_ENDSESSION bug fix). if(GetFrame()) { GetFrame()->SetActiveContext(GetContext()); } } // If we're being deactivated, do so now. if(bActivate == FALSE) { if(GetContext()) { GetContext()->ActivateCX(FALSE); } } // Call the base. CView::OnActivateView(bActivate, pActivateView, pDeactivateView); // If we've been activated, reflect this now. if(bActivate == TRUE) { if(GetContext()) { GetContext()->ActivateCX(TRUE); } } } void CGenericView::OnLButtonDblClk(UINT nFlags, CPoint point) { CView::OnLButtonDblClk(nFlags, point); // Pass it off to the context to handle. if(GetContext() != NULL && GetContext()->IsDestroyed() == FALSE) { GetContext()->OnLButtonDblClkCX(nFlags, point); } } void CGenericView::OnLButtonDown(UINT nFlags, CPoint point) { // Clear current focus owner. // This will get set correctly later on in the call chain when a window // get's activated. m_hWndFocus = NULL; // Call the base. CView::OnLButtonDown(nFlags, point); // Pass it off to the context to handle. if(GetContext() != NULL && GetContext()->IsDestroyed() == FALSE) { GetContext()->OnLButtonDownCX(nFlags, point); } } void CGenericView::OnLButtonUp(UINT nFlags, CPoint point) { CView::OnLButtonUp(nFlags, point); // If focus didn't go to one of the children, this will give it back // to the frame so that our command keys work. if(GetFrame() != NULL) { if(GetFrame()->GetFrameWnd() != NULL) { CPoint ptScreen = point; ClientToScreen( &ptScreen ); HWND hWndPt = ::WindowFromPoint( ptScreen ); if( ::IsChild( GetFrame()->GetFrameWnd()->m_hWnd, hWndPt ) || (GetFrame()->GetFrameWnd()->m_hWnd == hWndPt) ) { GetFrame()->GetFrameWnd()->SetFocus(); } } } // Pass it off to the context to handle. if(GetContext() != NULL && GetContext()->IsDestroyed() == FALSE) { BOOL bReturnImmediately = FALSE; GetContext()->OnLButtonUpCX(nFlags, point, bReturnImmediately); if(bReturnImmediately) { return; } } } void CGenericView::OnMouseMove(UINT nFlags, CPoint point) { CView::OnMouseMove(nFlags, point); // Pass it off to the context to handle. if(GetContext() != NULL && GetContext()->IsDestroyed() == FALSE) { BOOL bReturnImmediately = FALSE; GetContext()->OnMouseMoveCX(nFlags, point, bReturnImmediately); if(bReturnImmediately) { return; } } } void CGenericView::OnRButtonDblClk(UINT nFlags, CPoint point) { CView::OnRButtonDblClk(nFlags, point); // Pass it off to the context to handle. if(GetContext() != NULL && GetContext()->IsDestroyed() == FALSE) { GetContext()->OnRButtonDblClkCX(nFlags, point); } } void CGenericView::OnRButtonDown(UINT nFlags, CPoint point) { // Force ourselves as active. // Bug fix 61140, CGenFrame::OnCmdMsg doesn't know where to send // resultant message. CFrameWnd *pFrame = NULL; if(GetFrame()) { pFrame = GetFrame()->GetFrameWnd(); } if(pFrame && pFrame->IsChild(this)) { pFrame->SetActiveView(this); } CView::OnRButtonDown(nFlags, point); // Pass it off to the context to handle. if(GetContext() != NULL && GetContext()->IsDestroyed() == FALSE) { GetContext()->OnRButtonDownCX(nFlags, point); } } void CGenericView::OnRButtonUp(UINT nFlags, CPoint point) { CView::OnRButtonUp(nFlags, point); // Pass it off to the context to handle. if(GetContext() != NULL && GetContext()->IsDestroyed() == FALSE) { GetContext()->OnRButtonUpCX(nFlags, point); } } int CGenericView::OnMouseActivate( CWnd *pWin, UINT uHitTest, UINT uMessage ) { if(GetContext() && GetContext()->IsDestroyed() == FALSE) { if(::GetCursor() == (theApp.LoadCursor(IDC_SELECTANCHOR))) { // Prevent the frame from becoming active while dragging return MA_NOACTIVATE; } } return CView::OnMouseActivate(pWin, uHitTest, uMessage); } // // Form element background colors // HBRUSH CGenericView::OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ) { if(!GetContext() || GetContext()->IsDestroyed()) return NULL; // only color buttons if((nCtlColor != CTLCOLOR_BTN) && (nCtlColor != CTLCOLOR_STATIC)) return(CWnd::OnCtlColor(pDC, pWnd, nCtlColor ) ); CWnd::OnCtlColor(pDC, pWnd, nCtlColor); // Assume the document background color COLORREF rgbCurrentColor = GetContext()->m_rgbBackgroundColor; #ifndef MOZ_NGLAYOUT // We need to use the background associated with the form element if there is one // (e.g. a form element in a table cell with a specified background color) if (pWnd->IsKindOf(RUNTIME_CLASS(CNetscapeButton))) { LO_FormElementStruct* pElement = ((CNetscapeButton*)pWnd)->GetElement(); if (pElement && pElement->text_attr && pElement->text_attr->no_background == FALSE) rgbCurrentColor = RGB(pElement->text_attr->bg.red, pElement->text_attr->bg.green, pElement->text_attr->bg.blue); } #endif if(m_hCtlBrush == NULL) { // was no brush, just make a new one m_hCtlBrush = ::CreateSolidBrush(0x02000000L | rgbCurrentColor); m_rgbBrushColor = rgbCurrentColor; } else if(m_rgbBrushColor != rgbCurrentColor) { // old brush existed but was a different color -- destroy and remake DeleteObject(m_hCtlBrush); m_hCtlBrush = ::CreateSolidBrush(0x02000000L | rgbCurrentColor); m_rgbBrushColor = rgbCurrentColor; } HPALETTE hOldPal = NULL; if(GetContext()->GetPalette()) { hOldPal = ::SelectPalette(pDC->GetSafeHdc(), GetContext()->GetPalette(), FALSE); } pDC->SetBkMode(TRANSPARENT); pDC->SetBkColor(0x02000000L | rgbCurrentColor); // XXX WHS Look into this more // if(hOldPal) { // ::SelectPalette(pDC->GetSafeHdc(), hOldPal, FALSE); // } return(m_hCtlBrush); } #ifndef MOZ_MAIL_NEWS extern "C" void DoAltMailComposition(MWContext *pContext); #endif // MOZ_MAIL_NEWS void CGenericView::OnFileMailto() { // Pass this off to the context for handling. #ifndef MOZ_MAIL_NEWS DoAltMailComposition(GetContext()->GetContext()); #else /* MOZ_MAIL_NEWS */ if(GetContext()) { GetContext()->MailDocument(); } #endif /* MOZ_MAIL_NEWS */ } void CGenericView::OnUpdateFileMailto(CCmdUI* pCmdUI) { if(GetContext()) { if(GetContext()->IsGridParent() || GetContext()->IsGridCell()) { pCmdUI->SetText(szLoadString(IDS_MAIL_FRAME)); } else { pCmdUI->SetText(szLoadString(IDS_MAIL_NOFRAME)); } pCmdUI->Enable(GetContext()->CanMailDocument()); } else { pCmdUI->Enable(FALSE); } } // Opens a file to browse - currently called only from browser, // but will be called from editor in future // Context figures out which and opens in new window // only if called from and editor void CGenericView::OnFileOpen() { if(GetContext()) { GetContext()->OpenFile(); } } void CGenericView::OnUpdateFileOpen(CCmdUI* pCmdUI) { if(GetContext()) { pCmdUI->Enable(GetContext()->CanOpenFile()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnNetscapeSaveAs() { if(GetContext()) { GetContext()->SaveAs(); } } void CGenericView::OnUpdateNetscapeSaveAs(CCmdUI* pCmdUI) { if(GetContext()) { pCmdUI->Enable(GetContext()->CanSaveAs()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnNetscapeSaveFrameAs() { if(GetContext()) { GetContext()->SaveAs(); } } void CGenericView::OnUpdateNetscapeSaveFrameAs(CCmdUI* pCmdUI) { if(GetContext()) { if(GetContext()->IsGridParent() || GetContext()->IsGridCell()) { pCmdUI->Enable(GetContext()->CanSaveAs()); } else { pCmdUI->Enable(FALSE); } } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnNavigateBack() { // Let the context have it. if(GetContext()) { GetContext()->ResetToolTipImg(); GetContext()->AllBack(); } } void CGenericView::OnUpdateNavigateBack(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { pCmdUI->Enable(GetContext()->CanAllBack()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnNavigateForward() { // Let the context have it. if(GetContext()) { GetContext()->ResetToolTipImg(); GetContext()->AllForward(); } } void CGenericView::OnUpdateNavigateForward(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { pCmdUI->Enable(GetContext()->CanAllForward()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnNavigateReload() { // Let the context have it. if(GetContext()) { GetContext()->ResetToolTipImg(); if(::GetKeyState(VK_SHIFT) & 0x8000) { // Shift key was down, do it up baby. GetContext()->AllReload(NET_SUPER_RELOAD); } else { GetContext()->AllReload(); } } } void CGenericView::OnUpdateNavigateReload(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { #ifdef EDITOR if ( EDT_IS_EDITOR((GetContext()->GetContext())) ) { // Don't allow reload for an unsaved new document pCmdUI->Enable(!EDT_IS_NEW_DOCUMENT((GetContext()->GetContext())) && GetContext()->CanAllReload()); } else #endif pCmdUI->Enable(GetContext()->CanAllReload()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnViewLoadimages() { // Let the context have it. if(GetContext()) { GetContext()->ViewImages(); } } void CGenericView::OnUpdateViewLoadimages(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { pCmdUI->Enable(GetContext()->CanViewImages()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnFilePrint() { // Let the context have it. // Make sure it's the active context which gets this. // In print preview of a frame cell, the command goes to the // parent view, which isn't able to print, so route it manually.... if(GetFrame() && GetFrame()->GetActiveWinContext() && GetFrame()->GetActiveWinContext()->CanPrint()) { // if there is a full page plugin on the page, there can't be anything else // on the page so just tell it to print whatever it wants, using it's own // print context dialog. We pass NULL as a parameter today, but in the // future, we should pass in at least the printer chosen by the user. if(GetFrame()->GetActiveWinContext()->ContainsFullPagePlugin()) { // there can be only one plugin if it is full page #ifdef MOZ_NGLAYOUT XP_ASSERT(0); #else NPL_Print(GetFrame()->GetActiveWinContext()->GetContext()->pluginList, NULL); #endif return; } GetFrame()->GetActiveWinContext()->Print(); } } void CGenericView::OnUpdateFilePrint(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { // Only change the text for menu items... if (pCmdUI->m_pMenu) { MWContextType type = GetContext()->GetContext() ? GetContext()->GetContext()->type : MWContextBrowser; // Only change the menu for browser windows if (type == MWContextBrowser) { // Need to change the menu item depending on wether or not we are a frame. if(GetContext()->IsGridCell() || GetContext()->IsGridParent()) { pCmdUI->SetText(szLoadString(IDS_PRINT_FRAME)); } else { pCmdUI->SetText(szLoadString(IDS_PRINT_NOFRAME)); } } } pCmdUI->Enable(GetContext()->CanPrint()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnUpdateFilePrintPreview(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { // Don't enable print preview for full-page plugins, because it isn't // currently supported (i.e. there's no routine in the plugin API to ask // the plugin to do something sensible) pCmdUI->Enable(!GetContext()->ContainsFullPagePlugin() && GetContext()->CanPrint(TRUE)); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnEditFindincurrent() { // Let the context have it. if(GetContext()) { GetContext()->AllFind(); } } void CGenericView::OnUpdateEditFindincurrent(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { pCmdUI->Enable(GetContext()->CanAllFind()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnUpdateEditWithFrameFindincurrent(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { if(pCmdUI->m_pMenu) pCmdUI->m_pMenu->ModifyMenu(CASTUINT(ID_EDIT_WITHFRAME_FINDINCURRENT), CASTUINT(MF_BYCOMMAND | MF_STRING), CASTUINT(ID_EDIT_WITHFRAME_FINDINCURRENT), szLoadString(CASTUINT(GetContext()->IsGridCell() ? IDS_FINDINFRAME : IDS_FINDINPAGE))); pCmdUI->Enable(!GetContext()->IsGridParent() && GetContext()->CanAllFind()); return; } pCmdUI->Enable(FALSE); } void CGenericView::OnEditFindAgain() { // Let the context have it. if(GetContext()) { GetContext()->FindAgain(); } } void CGenericView::OnUpdateEditFindAgain(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { pCmdUI->Enable(GetContext()->CanFindAgain()); } else { pCmdUI->Enable(FALSE); } } // // Someone has requested a find operation // LRESULT CGenericView::OnFindReplace(WPARAM wParam, LPARAM lParam) { CFindReplaceDialog * dlg = ::CFindReplaceDialog::GetNotifier(lParam); if (!dlg) return NULL; FINDREPLACE findstruct = dlg->m_fr; if (dlg->IsTerminating()) { // dlg->DestroyWindow(); return NULL; } MWContext *pSearchContext = ((CNetscapeFindReplaceDialog*)dlg)->GetSearchContext(); #ifdef EDITOR BOOL bReplaceAll = (BOOL)(findstruct.Flags & FR_REPLACEALL); // If no search context set, use current window's if( !pSearchContext ) { if( GetContext() ) pSearchContext = GetContext()->GetContext(); if( !pSearchContext ) return NULL; } BOOL bEditor = EDT_IS_EDITOR(pSearchContext); // Ignore everything except FINDNEXT if not a Composer if( !bEditor && ((findstruct.Flags & FR_FINDNEXT) == 0) ) return NULL; #else // Something wrong or user cancelled dialog box if((findstruct.Flags & FR_FINDNEXT) == 0) return NULL; #endif CWinCX *pCX; // can only find if we have a window if (pSearchContext && ABSTRACTCX(pSearchContext)->IsFrameContext()) { pCX = WINCX(pSearchContext); } else pCX = GetContext(); if(pCX) { #ifdef EDITOR if(bEditor && (findstruct.Flags & FR_REPLACE) || bReplaceAll) { // Only Composer currently replaces text // TODO: NEED TO FINISH GETTING CORRECT PARAMS: CAN WE DO DIRECTION OR WRAP IN WINDOWS? EDT_ReplaceText(pSearchContext, findstruct.lpstrReplaceWith, bReplaceAll, findstruct.lpstrFindWhat, !dlg->MatchCase() /* bCaseless */, !dlg->SearchDown() /*bBackward*/, FALSE /*bDoWrap*/); // Continue to search for next string unless we replaced all if( bReplaceAll ) return TRUE; } #endif // remember this string for next time theApp.m_csFindString = findstruct.lpstrFindWhat; theApp.m_csReplaceString = findstruct.lpstrReplaceWith; theApp.m_bMatchCase = dlg->MatchCase(); theApp.m_bSearchDown = dlg->SearchDown(); // this will pull the values we just set out of theApp and do the find // operation for us pCX->DoFind(dlg, findstruct.lpstrFindWhat, dlg->MatchCase(), dlg->SearchDown(), TRUE); } return(TRUE); } void CGenericView::OnNavigateInterrupt() { // Let the context have it. if(GetContext()) { GetContext()->AllInterrupt(); } } void CGenericView::OnUpdateNavigateInterrupt(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { pCmdUI->Enable(GetContext()->CanAllInterrupt()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnEditCopy() { // Let the context have it. if(GetContext()) { SetCursor(theApp.LoadStandardCursor(IDC_WAIT)); GetContext()->CopySelection(); SetCursor(theApp.LoadStandardCursor(IDC_ARROW)); } } void CGenericView::OnUpdateEditCopy(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { pCmdUI->Enable(GetContext()->CanCopySelection()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnUpdateEditCut(CCmdUI* pCmdUI) { // Disable until supported. pCmdUI->Enable(FALSE); } void CGenericView::OnUpdateEditPaste(CCmdUI* pCmdUI) { // Disable until supported. pCmdUI->Enable(FALSE); } void CGenericView::OnSelectAll() { #ifdef MOZ_NGLAYOUT XP_ASSERT(0); #else LO_SelectAll(GetContext()->GetDocumentContext()); #endif } //#ifndef NO_TAB_NAVIGATION // BOOL CGenericView::procTabNavigation( MSG * pMsg ) BOOL CGenericView::procTabNavigation(UINT nChar, UINT forward, UINT controlKey ) { // Call the base. // BOOL bTranslated = CView::PreTranslateMessage(pMsg); //if ( bTranslated || pMsg->message != WM_KEYDOWN) // return( bTranslated ); if( nChar != VK_TAB && nChar != VK_SPACE && nChar != VK_RETURN ) return( FALSE ); if( GetContext() == NULL || GetContext()->IsDestroyed() == TRUE) return( FALSE ); BOOL ret; if( nChar == VK_TAB ) { // setTabFocusNext will search siblings ret = GetContext()->setTabFocusNext( forward ); // 1 is forward return( ret ); // ret == TRUE if key handled by me or by one of my sibling } if ( nChar == VK_RETURN ) { // nChar == VK_SPACE || // fire action for links only. // Form elements will handle this in their OnChar ret = GetContext()->fireTabFocusElement( nChar ); return( ret ); // ret == TRUE if I fired a link. } // should not reach here return( FALSE ); } // BOOL CGenericView::procTabNavigation( MSG * pMsg ) //#endif /* NO_TAB_NAVIGATION */ BOOL CGenericView::PreTranslateMessage(MSG * pMsg) { return(FALSE); } void CGenericView::OnFileViewsource() { // Have the context handle it. if(GetContext()) { GetContext()->ViewSource(); } } void CGenericView::OnUpdateFileViewsource(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { pCmdUI->Enable(GetContext()->CanViewSource()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnFileDocinfo() { // Have the context handle it. if(GetContext()) { GetContext()->DocumentInfo(); } } void CGenericView::OnUpdateFileDocinfo(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { pCmdUI->Enable(GetContext()->CanDocumentInfo()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnViewPageServices() { URL_Struct *pNewUrl_s; char *url; if(GetContext() && GetContext()->GetContext()) { if(SHIST_CurrentHandlesPageServices(GetContext()->GetContext())) { url = SHIST_GetCurrentPageServicesURL(GetContext()->GetContext()); if(url) { pNewUrl_s = NET_CreateURLStruct(url, NET_DONT_RELOAD); GetContext()->GetUrl(pNewUrl_s, FO_PRESENT); } } } } void CGenericView::OnUpdateViewPageServices(CCmdUI* pCmdUI) { if(GetContext() && GetContext()->GetContext()) { pCmdUI->Enable(SHIST_CurrentHandlesPageServices(GetContext()->GetContext())); } else pCmdUI->Enable(FALSE); } void CGenericView::OnGoHome() { // Have the context handle it. if(GetContext()) { GetContext()->GoHome(); } } void CGenericView::OnUpdateGoHome(CCmdUI* pCmdUI) { // Defer to the context. if(GetContext()) { pCmdUI->Enable(GetContext()->CanGoHome()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnMove(int x, int y) { CView::OnMove(x, y); if(GetContext()) { GetContext()->OnMoveCX(); } } void CGenericView::OnNcPaint() { // Call the base (it will handle scrollers and other stuff). CView::OnNcPaint(); // Now, tell the context to do anything it needs to do. if(GetContext()) { GetContext()->OnNcPaintCX(); } } void CGenericView::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp) { // Call the base (it will fill in all the normal stuff). CView::OnNcCalcSize(bCalcValidRects, lpncsp); // Now, have the context shrink us if appropriate. if(GetContext()) { GetContext()->OnNcCalcSizeCX(bCalcValidRects, lpncsp); } } void CGenericView::OnFileUploadfile() { // Have the context handle it. if(GetContext()) { GetContext()->UploadFile(); } } void CGenericView::OnUpdateFileUploadfile(CCmdUI* pCmdUI) { // Defer to the context. if(GetContext()) { pCmdUI->Enable(GetContext()->CanUploadFile()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnNavigateReloadcell() { // Have the current context reload. if(GetContext()) { if(::GetKeyState(VK_SHIFT) & 0x8000) { // Shift key was down, do the super thing. GetContext()->Reload(NET_SUPER_RELOAD); } else { GetContext()->Reload(); } } } void CGenericView::OnUpdateNavigateReloadcell(CCmdUI* pCmdUI) { // Defer to the context's wisdom. if(GetContext()) { pCmdUI->Enable(GetContext()->IsGridCell() == TRUE && GetContext()->IsGridParent() == FALSE); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnViewFrameInfo() { if(GetContext()) { GetContext()->FrameInfo(); } } void CGenericView::OnUpdateViewFrameInfo(CCmdUI* pCmdUI) { // Defer to the context if(GetContext()) { pCmdUI->Enable(GetContext()->CanFrameInfo()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnViewFrameSource() { if(GetContext()) { GetContext()->FrameSource(); } } void CGenericView::OnUpdateViewFrameSource(CCmdUI* pCmdUI) { // Defer to the context if(GetContext()) { pCmdUI->Enable(GetContext()->CanFrameSource()); } else { pCmdUI->Enable(FALSE); } } void CGenericView::OnSetFocus(CWnd* pOldWnd) { #ifndef MOZ_NGLAYOUT CView::OnSetFocus(pOldWnd); if(GetContext() && !GetContext()->IsDestroyed() && GetContext()->GetContext()) { // send the event to libmocha --- do any further processing // in our closure routine JSEvent *event; event = XP_NEW_ZAP(JSEvent); event->type = EVENT_FOCUS; ET_SendEvent(GetContext()->GetContext(), NULL, event, NULL, this); } #endif /* MOZ_NGLAYOUT */ } void CGenericView::OnKillFocus(CWnd* pNewWnd) { #ifndef MOZ_NGLAYOUT CView::OnKillFocus(pNewWnd); if(GetContext() && !GetContext()->IsDestroyed() && GetContext()->GetContext()) { // send the event to libmocha --- do any further processing // in our closure routine JSEvent *event; event = XP_NEW_ZAP(JSEvent); event->type = EVENT_BLUR; ET_SendEvent(GetContext()->GetContext(), NULL, event, NULL, this); } #endif /* MOZ_NGLAYOUT */ }