#include "StdAfx.h"
#include "HtmlCtrl.h"
#include "Html_Host_Handlers.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#if _MFC_VER >= 0x0700
#include <afxocc.h>
#else
#include <..\src\occimpl.h>
#endif
#include "DocHostSite.h"
#include "HtmlDialog.h"
IMPLEMENT_DYNAMIC(CHtmlCtrl, CHtmlView)
BEGIN_MESSAGE_MAP(CHtmlCtrl, CHtmlView)
ON_WM_DESTROY()
ON_WM_MOUSEACTIVATE()
END_MESSAGE_MAP()
BOOL CHtmlCtrl::CreateFromStatic(UINT nID, CWnd* pParent, CHtml_Host_Handlers *pHtml_Host_Handlers)
{
CStatic wndStatic;
if (!wndStatic.SubclassDlgItem(nID, pParent))
return FALSE;
CRect rc;
wndStatic.GetWindowRect(&rc);
pParent->ScreenToClient(&rc);
wndStatic.DestroyWindow();
m_pHtml_Host_Handlers = pHtml_Host_Handlers;
m_pDocument2 = NULL;
m_bCtl_mode = true;
return Create(NULL, NULL, (WS_CHILD | WS_VISIBLE ), rc, pParent, nID, NULL);
}
BOOL CHtmlCtrl::Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT & rect,
CWnd * pParentWnd,
UINT nID,
CCreateContext * pContext)
{
if (!m_pOccManager)
{
m_pOccManager = new CDocHostOccManager;
ASSERT(m_pOccManager);
if (!m_pOccManager)
return FALSE;
m_pOccManager->SetView( m_pHtml_Host_Handlers );
}
::AfxEnableControlContainer( m_pOccManager );
m_pCreateContext = pContext;
if (!CView::Create(lpszClassName, lpszWindowName,
dwStyle, rect, pParentWnd, nID, pContext))
{
return FALSE;
}
RECT rectClient;
GetClientRect(&rectClient);
if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, lpszWindowName,
WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST))
{
DestroyWindow();
return FALSE;
}
LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown();
HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2, (void**) &m_pBrowserApp);
if (!SUCCEEDED(hr))
{
m_pBrowserApp = NULL;
m_wndBrowser.DestroyWindow();
DestroyWindow();
return FALSE;
}
return TRUE;
}
#if _MFC_VER >= 0x0700
BOOL CHtmlCtrl::CreateControlSite(COleControlContainer * pContainer,
COleControlSite ** ppSite,
UINT ,
REFCLSID )
{
ASSERT(m_pOccManager);
if (!m_pOccManager)
return FALSE;
*ppSite = m_pOccManager->CreateSite( pContainer );
return (*ppSite) ? TRUE : FALSE;
}
#endif
void CHtmlCtrl::OnDestroy()
{
if (!m_bCtl_mode){
CHtmlView::OnDestroy();
return;
}
if (m_pBrowserApp) {
m_pBrowserApp->Release();
m_pBrowserApp = NULL;
}
CWnd::OnDestroy();
}
int CHtmlCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg)
{
if (!m_bCtl_mode){
return CHtmlView::OnMouseActivate(pDesktopWnd, nHitTest, msg);
}
return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, msg);
}
void CHtmlCtrl::OnBeforeNavigate2( LPCTSTR lpszURL,
DWORD nFlags,
LPCTSTR lpszTargetFrameName,
CByteArray& baPostedData,
LPCTSTR lpszHeaders,
BOOL* pbCancel )
{
const char APP_PROTOCOL[] = "app:";
int len = _tcslen(APP_PROTOCOL);
if (_tcsnicmp(lpszURL, APP_PROTOCOL, len)==0) {
OnAppCmd(lpszURL + len);
*pbCancel = TRUE;
}
CHtmlView::OnBeforeNavigate2(lpszURL, nFlags,
lpszTargetFrameName, baPostedData,
lpszHeaders, pbCancel);
}
void CHtmlCtrl::OnAppCmd(LPCTSTR lpszWhere)
{
UINT cmd;
int x;
CString s(lpszWhere);
cmd = atoi(lpszWhere);
x = s.Find("@",0);
if ( x>=0)
m_pHtml_Host_Handlers->_onHtmlCmd(cmd, lpszWhere+x+1);
else
m_pHtml_Host_Handlers->_onHtmlCmd(cmd, " ");
}
void CHtmlCtrl::OnDocumentComplete(LPCTSTR lpszURL)
{
if (m_pDocument2!=NULL)
return;
HRESULT hr;
hr = GetHtmlDocument()->QueryInterface(IID_IHTMLDocument, (void**) &m_pDocument);
if (!SUCCEEDED(hr)) {
m_pDocument= NULL;
return;
}
hr = GetHtmlDocument()->QueryInterface(IID_IHTMLDocument2, (void**) &m_pDocument2);
if (!SUCCEEDED(hr)) {
m_pDocument2= NULL;
return;
}
IDispatch *disp;
m_pDocument->get_Script( &disp);
SetHtmlScript(disp);
BSTR str;
m_pDocument2->get_title(&str);
m_html_Title = str;
IHTMLStyle *p_St;
m_pDocument2->get_body(&p_Body);
p_Body->get_style( &p_St);
VARIANT vt;
vt.vt = VT_BSTR;
hr = p_St->get_width(&vt);
m_html_width = _wtoi(vt.bstrVal);
hr = p_St->get_height(&vt);
m_html_height = _wtoi(vt.bstrVal);
m_pHtml_Host_Handlers->_onDocumentComplete();
CHtmlView::OnDocumentComplete(lpszURL);
}