/****************************************************************************** Copyright (c) 1999-2000 Microsoft Corporation Module Name: MarsHost.cpp Abstract: Initialization of mars Revision History: Anand Arvind (aarvind) 2000-01-05 created Seong Kook Khang (SKKhang) 05/10/00 Clean up, merge with MarsEvnt.cpp, etc. for Whistler. ******************************************************************************/ #include "stdwin.h" #include "stdatl.h" #include "rstrpriv.h" #include "rstrmgr.h" #include "MarsHost.h" ///////////////////////////////////////////////////////////////////////////// // // CSRWebBrowserEvents // ///////////////////////////////////////////////////////////////////////////// CSRWebBrowserEvents::CSRWebBrowserEvents() { } CSRWebBrowserEvents::~CSRWebBrowserEvents() { Detach(); } void CSRWebBrowserEvents::Attach( /*[in]*/ IWebBrowser2* pWB ) { Detach(); m_pWB2 = pWB; if( m_pWB2 ) { CSRWebBrowserEvents_DispWBE2::DispEventAdvise( m_pWB2 ); } } void CSRWebBrowserEvents::Detach() { if( m_pWB2 ) { CSRWebBrowserEvents_DispWBE2::DispEventUnadvise( m_pWB2 ); m_pWB2.Release(); } } ///////////////////////////////////////////////////////////////////////////// // CSRWebBrowserEvents - DWebBrowserEvents2 event methods void __stdcall CSRWebBrowserEvents::BeforeNavigate2( IDispatch *pDisp, VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers, VARIANT_BOOL *Cancel ) { // // We control navigation with the CanNavigatePage but for all help links // navigation should be auto-enabled. All Help links have a OnLink_ as // part of the URL so if this is contained in the URL // if( V_BSTR(URL) != NULL && wcsstr( V_BSTR(URL), L"OnLink_") != NULL ) { *Cancel = VARIANT_FALSE ; } else { if ( g_pRstrMgr->GetCanNavigatePage() ) { *Cancel = VARIANT_FALSE ; } else { *Cancel = VARIANT_TRUE ; } }; } void __stdcall CSRWebBrowserEvents::NewWindow2( IDispatch **ppDisp, VARIANT_BOOL *Cancel ) { } void __stdcall CSRWebBrowserEvents::NavigateComplete2( IDispatch *pDisp, VARIANT *URL ) { } void __stdcall CSRWebBrowserEvents::DocumentComplete( IDispatch *pDisp, VARIANT *URL ) { } ///////////////////////////////////////////////////////////////////////////// // // CSRMarsHost // ///////////////////////////////////////////////////////////////////////////// //#define PANEL_NAVBAR L"NavBar" #define PANEL_CONTENTS L"Contents" CSRMarsHost::CSRMarsHost() { m_fPassivated = false; m_cWebBrowserEvents = NULL; } CSRMarsHost::~CSRMarsHost() { (void)Passivate(); if ( m_cWebBrowserEvents ) { m_cWebBrowserEvents->Release(); } } HRESULT CSRMarsHost::FinalConstruct() { HRESULT hr = S_OK ; hr = CSRWebBrowserEvents_Object::CreateInstance( &m_cWebBrowserEvents ); if ( FAILED(hr) ) goto Exit; m_cWebBrowserEvents->AddRef(); Exit: return( hr ); } HRESULT CSRMarsHost::Passivate() { m_fPassivated = true; if ( m_cWebBrowserEvents ) { m_cWebBrowserEvents->Detach(); } return( S_OK ); } ///////////////////////////////////////////////////////////////////////////// // CSRMarsHost - IMarsHost methods STDMETHODIMP CSRMarsHost::OnHostNotify( /*[in]*/ MARSHOSTEVENT event, /*[in]*/ IUnknown *punk, /*[in]*/ LPARAM lParam ) { HRESULT hr; if( event == MARSHOST_ON_WIN_INIT ) { g_pRstrMgr->SetFrameHwnd( (HWND)lParam ); } if( event == MARSHOST_ON_WIN_PASSIVATE ) { g_pRstrMgr->SetFrameHwnd( NULL ); } // // Handle panel-related things. // if( event == MARSHOST_ON_PANEL_CONTROL_CREATE ) { CComQIPtr panel = punk; if( panel ) { CComBSTR name; hr = panel->get_name( &name ); if( FAILED(hr) ) { goto Exit; } if( name == PANEL_CONTENTS ) { CComPtr disp; if( SUCCEEDED(panel->get_content( &disp )) ) { CComQIPtr wb2( disp ); if( wb2 ) { wb2->put_RegisterAsDropTarget( VARIANT_FALSE ); m_cWebBrowserEvents->Attach( wb2 ); } } } } } hr = S_OK; Exit: return( hr ); } STDMETHODIMP CSRMarsHost::OnNewWindow2( /*[in,out]*/ IDispatch **ppDisp , /*[in,out]*/ VARIANT_BOOL *Cancel ) { return( S_OK ); } STDMETHODIMP CSRMarsHost::FindBehavior( /*[in]*/ IMarsPanel *pPanel, /*[in]*/ BSTR bstrBehavior, /*[in]*/ BSTR bstrBehaviorUrl, /*[in]*/ IElementBehaviorSite *pSite, /*[retval, out]*/ IElementBehavior **ppBehavior ) { return( S_OK ); } STDMETHODIMP CSRMarsHost::OnShowChrome( /*[in]*/ BSTR bstrWebPanel, /*[in]*/ DISPID dispidEvent, /*[in]*/ BOOL fVisible, /*[in]*/ BSTR bstrCurrentPlace, /*[in]*/ IMarsPanelCollection *pMarsPanelCollection ) { return( S_OK ); } STDMETHODIMP CSRMarsHost::PreTranslateMessage( /*[in]*/ MSG *msg ) { HRESULT hr = S_OK; switch( msg->message ) { case WM_CLOSE: { if ( g_pRstrMgr->DenyClose() ) { goto Exit; // Cancel close when restoring } } break; case WM_DISPLAYCHANGE : { // // If display changes to 640x480 from something higher then // the window has to be resized to fit in the new display // RECT rc; DWORD dwWidth = LOWORD(msg->lParam); DWORD dwHeight = HIWORD(msg->lParam); CWindow cWnd; cWnd.Attach( msg->hwnd ); if ( dwHeight < 540 ) { rc.left = 0; rc.top = 0; rc.right = 620; rc.bottom = 420; //g_cRestoreShell.m_dwCurrentWidth = rc.right ; //g_cRestoreShell.m_dwCurrentHeight = rc.bottom ; ::AdjustWindowRectEx( &rc, cWnd.GetStyle(), FALSE, cWnd.GetExStyle() ); ::SetWindowPos(msg->hwnd, NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER); cWnd.CenterWindow(::GetDesktopWindow()); // ignore error return if any } else { rc.left = 0; rc.top = 0; rc.right = 770; rc.bottom = 540; //g_cRestoreShell.m_dwCurrentWidth = rc.right ; //g_cRestoreShell.m_dwCurrentHeight = rc.bottom ; ::AdjustWindowRectEx( &rc, cWnd.GetStyle(), FALSE, cWnd.GetExStyle() ); ::SetWindowPos(msg->hwnd, NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER); cWnd.CenterWindow(::GetDesktopWindow()); // ignore error return if any } } break; case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: { if ( msg->wParam & MK_CONTROL || msg->wParam & MK_SHIFT || GetKeyState(VK_MENU) < 0 ) { goto Exit; // IE opens link in a seperate page so force cancelling } } break; case WM_SYSKEYDOWN: case WM_SYSKEYUP: { if ( ( HIWORD(msg->lParam) & KF_ALTDOWN ) != 0 ) // Alt pressed { if ( msg->wParam == VK_LEFT || msg->wParam == VK_RIGHT ) { goto Exit; // IE does not cancel Alt-Left so force cancelling } } } break; case WM_KEYDOWN: case WM_KEYUP: { switch( msg->wParam ) { case VK_F5: goto Exit; // Disable refresh... case 'N': if ( GetKeyState(VK_CONTROL) < 0 ) { goto Exit; // Disable Ctrl-N combination } } } break; case WM_MOUSEWHEEL: // // Disable Mouse Wheel navigation... not used in SR // return( S_OK ); } hr = E_NOTIMPL; Exit: return( hr ); } // end of file