//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1999 - 1999 // // File: evtsink.cpp // //-------------------------------------------------------------------------- #include "stdafx.h" #include "winnls.h" #include "AMC.h" #include "AMCDoc.h" #include "AMCView.h" #include "histlist.h" #include "exdisp.h" // for the IE dispatch interfaces. #include "websnk.h" #include "evtsink.h" #include "WebCtrl.h" #include "cstr.h" #include "constatbar.h" #ifdef DBG CTraceTag tagWebEventSink(TEXT("Web View"), TEXT("Web Event Sink")); #endif // DBG CWebEventSink::CWebEventSink() : m_bBrowserBackEnabled(false), m_bBrowserForwardEnabled(false), m_pWebViewControl(NULL), m_pStatusBar(NULL), m_pwndProgressCtrl(NULL), m_pHistoryList(NULL) { } SC CWebEventSink::ScInitialize(CAMCWebViewCtrl *pWebViewControl) { DECLARE_SC(sc, TEXT("CWebEventSink::ScInitialize")); sc = ScCheckPointers(pWebViewControl); if(sc) return sc; m_pWebViewControl = pWebViewControl; CAMCView* pAMCView = dynamic_cast(pWebViewControl->GetParent()); CFrameWnd* pwndParentFrame = pWebViewControl->GetParentFrame(); sc = ScCheckPointers(pAMCView, pwndParentFrame); if(sc) return sc; m_pHistoryList = pAMCView->GetHistoryList(); sc = ScCheckPointers(m_pHistoryList); if(sc) return sc; // Create the status bar for this instance of the web control m_pStatusBar = dynamic_cast(pwndParentFrame); sc = ScCheckPointers(m_pStatusBar, E_UNEXPECTED); if(sc) return sc; // find the progress control on the status bar for the parent frame CAMCStatusBar* pwndStatusBar = reinterpret_cast(pwndParentFrame->GetMessageBar()); sc = ScCheckPointers(pwndStatusBar); if(sc) return sc; ASSERT_KINDOF (CAMCStatusBar, pwndStatusBar); m_pwndProgressCtrl = pwndStatusBar->GetStatusProgressCtrlHwnd(); m_fLastTextWasEmpty = false; return sc; } CWebEventSink::~CWebEventSink() { /* * clear the status bar text */ if (m_pStatusBar != NULL) m_pStatusBar->ScSetStatusText(NULL); } void CWebEventSink::SetActiveTo(BOOL /*bState*/) { } STDMETHODIMP_(void) CWebEventSink::BeforeNavigate(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT* PostData, BSTR Headers, VARIANT_BOOL* Cancel) { Trace(tagWebEventSink, TEXT("BeginNavigate(URL:%s, flags:%0X, targetfrm:%s, headers:%s)\n"), URL, Flags, TargetFrameName, Headers); bool bPageBreak = IsPageBreak(URL); m_pHistoryList->OnPageBreakStateChange(bPageBreak); m_pHistoryList->UpdateWebBar (HB_STOP, TRUE); // turn on "stop" button } STDMETHODIMP_(void) CWebEventSink::CommandStateChange(int Command, VARIANT_BOOL Enable) { if(Command == CSC_NAVIGATEFORWARD) { m_bBrowserForwardEnabled = Enable; } else if(Command == CSC_NAVIGATEBACK) { m_bBrowserBackEnabled = Enable; } } STDMETHODIMP_(void) CWebEventSink::DownloadBegin() { Trace(tagWebEventSink, TEXT("DownloadBegin()")); } STDMETHODIMP_(void) CWebEventSink::DownloadComplete() { Trace(tagWebEventSink, TEXT("DownloadComplete()")); } STDMETHODIMP_(void) CWebEventSink::FrameBeforeNavigate(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT* PostData, BSTR Headers, VARIANT_BOOL* Cancel) { m_pHistoryList->UpdateWebBar (HB_STOP, TRUE); // turn on "stop" button } STDMETHODIMP_(void) CWebEventSink::FrameNavigateComplete(BSTR URL) { } STDMETHODIMP_(void) CWebEventSink::FrameNewWindow(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT* PostData, BSTR Headers, VARIANT_BOOL* Processed) { } bool CWebEventSink::IsPageBreak(BSTR URL) { USES_CONVERSION; CStr strURL = OLE2T(URL); strURL.MakeLower(); bool bPageBreak = (_tcsstr(strURL, PAGEBREAK_URL) != NULL); return bPageBreak; } STDMETHODIMP_(void) CWebEventSink::NavigateComplete(BSTR URL) { Trace(tagWebEventSink, TEXT("NavigateComplete()\n")); // Set progress bar position to 0 m_pwndProgressCtrl->SetPos (0); bool bPageBreak = IsPageBreak(URL); m_pHistoryList->OnPageBreakStateChange(bPageBreak); // send the browser state across AFTER sending the OnPageBreakStateChange and BEFORE // the OnPageBreak. m_pHistoryList->OnBrowserStateChange(m_bBrowserForwardEnabled, m_bBrowserBackEnabled); if(bPageBreak) { // Extract the Page Break ID. Since bPageBreak is true, the URL // is guaranteed to be prefixed with PAGEBREAK_URL USES_CONVERSION; LPCTSTR szPageBreakID = OLE2CT(URL) + _tcslen(PAGEBREAK_URL); int nPageBreakID = _tstoi(szPageBreakID); //PageBreakIDs start with 1; _tstoi returns 0 if it can't convert ASSERT(nPageBreakID != 0); m_pHistoryList->ScOnPageBreak(nPageBreakID); } } STDMETHODIMP_(void) CWebEventSink::NewWindow(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT* PostData, BSTR Headers, BSTR Referrer) { } STDMETHODIMP_(void) CWebEventSink::Progress(long Progress, long ProgressMax) { Trace(tagWebEventSink, TEXT("Progress(Progress:%ld ProgressMax:%ld)\n"), Progress, ProgressMax); // display progress only if the web view is visible. if(m_pWebViewControl && m_pWebViewControl->IsWindowVisible()) { m_pwndProgressCtrl->SetRange (0, ProgressMax); m_pwndProgressCtrl->SetPos (Progress); } // maintain "stop" button m_pHistoryList->UpdateWebBar (HB_STOP, ProgressMax != 0); } STDMETHODIMP_(void) CWebEventSink::PropertyChange(BSTR szProperty) { } STDMETHODIMP_(void) CWebEventSink::Quit(VARIANT_BOOL* pCancel) { Trace(tagWebEventSink, TEXT("Quit()")); } STDMETHODIMP_(void) CWebEventSink::StatusTextChange(BSTR bstrText) { // display progress only if the web view is visible. if(m_pWebViewControl && m_pWebViewControl->IsWindowVisible()) { bool fThisTextIsEmpty = ((bstrText == NULL) || (bstrText[0] == 0)); if (m_fLastTextWasEmpty && fThisTextIsEmpty) return; m_fLastTextWasEmpty = fThisTextIsEmpty; Trace(tagWebEventSink, TEXT("StatusTextChange(%s)"), bstrText); USES_CONVERSION; m_pStatusBar->ScSetStatusText(W2T( bstrText)); } } STDMETHODIMP_(void) CWebEventSink::TitleChange(BSTR Text) { Trace(tagWebEventSink, TEXT("TitleChange(%s)"), Text); } STDMETHODIMP_(void) CWebEventSink::WindowActivate() { } STDMETHODIMP_(void) CWebEventSink::WindowMove() { } STDMETHODIMP_(void) CWebEventSink::WindowResize() { }