2 #include <wx/strconv.h>
4 #include <wx/listctrl.h>
14 DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_BEFORENAVIGATE2
);
15 DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_NEWWINDOW2
);
16 DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_DOCUMENTCOMPLETE
);
17 DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_PROGRESSCHANGE
);
18 DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_STATUSTEXTCHANGE
);
19 DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_TITLECHANGE
);
21 IMPLEMENT_DYNAMIC_CLASS(wxMSHTMLEvent
, wxNotifyEvent
);
24 //////////////////////////////////////////////////////////////////////
25 BEGIN_EVENT_TABLE(wxIEHtmlWin
, wxActiveX
)
28 class FS_DWebBrowserEvents2
: public IDispatch
31 DECLARE_OLE_UNKNOWN(FS_DWebBrowserEvents2
);
37 FS_DWebBrowserEvents2(wxIEHtmlWin
*iewin
) : m_iewin(iewin
) {}
38 ~FS_DWebBrowserEvents2()
43 STDMETHODIMP
GetIDsOfNames(REFIID r
, OLECHAR
** o
, unsigned int i
, LCID l
, DISPID
* d
)
48 STDMETHODIMP
GetTypeInfo(unsigned int i
, LCID l
, ITypeInfo
** t
)
53 STDMETHODIMP
GetTypeInfoCount(unsigned int* i
)
58 void Post(WXTYPE etype
, wxString text
, long l1
= 0, long l2
= 0)
60 if (! m_iewin
|| ! m_iewin
->GetParent())
64 event
.SetId(m_iewin
->GetId());
65 event
.SetEventType(etype
);
70 m_iewin
->GetParent()->AddPendingEvent(event
);
73 bool Process(WXTYPE etype
, wxString text
= "", long l1
= 0, long l2
= 0)
75 if (! m_iewin
|| ! m_iewin
->GetParent())
79 event
.SetId(m_iewin
->GetId());
80 event
.SetEventType(etype
);
85 m_iewin
->GetParent()->ProcessEvent(event
);
87 return event
.IsAllowed();
90 wxString
GetStrArg(VARIANT
& v
)
92 VARTYPE vt
= v
.vt
& ~VT_BYREF
;
95 return GetStrArg(*v
.pvarVal
);
96 else if (vt
== VT_BSTR
)
99 return (v
.pbstrVal
? *v
.pbstrVal
: L
"");
107 #define STR_ARG(arg) GetStrArg(pDispParams->rgvarg[arg])
109 #define LONG_ARG(arg)\
110 (pDispParams->rgvarg[arg].lVal)
113 STDMETHODIMP
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
114 WORD wFlags
, DISPPARAMS
* pDispParams
,
115 VARIANT
* pVarResult
, EXCEPINFO
* pExcepInfo
,
116 unsigned int * puArgErr
)
118 if (wFlags
& DISPATCH_PROPERTYGET
)
121 switch (dispIdMember
)
123 case DISPID_BEFORENAVIGATE2
:
124 if (Process(wxEVT_COMMAND_MSHTML_BEFORENAVIGATE2
, STR_ARG(5)))
125 *pDispParams
->rgvarg
->pboolVal
= VARIANT_FALSE
;
127 *pDispParams
->rgvarg
->pboolVal
= VARIANT_TRUE
;
130 case DISPID_NEWWINDOW2
:
131 if (Process(wxEVT_COMMAND_MSHTML_NEWWINDOW2
))
132 *pDispParams
->rgvarg
->pboolVal
= VARIANT_FALSE
;
134 *pDispParams
->rgvarg
->pboolVal
= VARIANT_TRUE
;
137 case DISPID_PROGRESSCHANGE
:
138 Post(wxEVT_COMMAND_MSHTML_PROGRESSCHANGE
, "", LONG_ARG(1), LONG_ARG(0));
141 case DISPID_DOCUMENTCOMPLETE
:
142 Post(wxEVT_COMMAND_MSHTML_DOCUMENTCOMPLETE
, STR_ARG(0));
145 case DISPID_STATUSTEXTCHANGE
:
146 Post(wxEVT_COMMAND_MSHTML_STATUSTEXTCHANGE
, STR_ARG(0));
149 case DISPID_TITLECHANGE
:
150 Post(wxEVT_COMMAND_MSHTML_TITLECHANGE
, STR_ARG(0));
160 DEFINE_OLE_TABLE(FS_DWebBrowserEvents2
)
161 OLE_IINTERFACE(IUnknown
)
162 OLE_INTERFACE(DIID_DWebBrowserEvents2
, DWebBrowserEvents2
)
166 static const CLSID CLSID_MozillaBrowser
=
167 { 0x1339B54C, 0x3453, 0x11D2,
168 { 0x93, 0xB9, 0x00, 0x00,
169 0x00, 0x00, 0x00, 0x00 } };
172 //#define PROGID L"Shell.Explorer"
173 #define PROGID CLSID_WebBrowser
174 //#define PROGID CLSID_HTMLDocument
175 //#define PROGID L"MSCAL.Calendar"
176 //#define PROGID L"WordPad.Document.1"
177 //#define PROGID L"SoftwareFX.ChartFX.20"
180 wxIEHtmlWin::wxIEHtmlWin(wxWindow
* parent
, wxWindowID id
,
184 const wxString
& name
)
185 : wxActiveX(parent
, PROGID
, id
, pos
, size
, style
, name
)
190 wxIEHtmlWin::~wxIEHtmlWin()
194 void wxIEHtmlWin::SetupBrowser()
198 // Get IWebBrowser2 Interface
199 hret
= m_webBrowser
.QueryInterface(IID_IWebBrowser2
, m_ActiveX
);
200 assert(SUCCEEDED(hret
));
202 // Web Browser Events
203 FS_DWebBrowserEvents2
*events
= new FS_DWebBrowserEvents2(this);
204 hret
= ConnectAdvise(DIID_DWebBrowserEvents2
, events
);
205 if (! SUCCEEDED(hret
))
209 m_webBrowser
->put_MenuBar(VARIANT_FALSE
);
210 m_webBrowser
->put_AddressBar(VARIANT_FALSE
);
211 m_webBrowser
->put_StatusBar(VARIANT_FALSE
);
212 m_webBrowser
->put_ToolBar(VARIANT_FALSE
);
214 m_webBrowser
->put_RegisterAsBrowser(VARIANT_TRUE
);
215 m_webBrowser
->put_RegisterAsDropTarget(VARIANT_TRUE
);
217 m_webBrowser
->Navigate( L
"about:blank", NULL
, NULL
, NULL
, NULL
);
221 void wxIEHtmlWin::SetEditMode(bool seton
)
223 m_bAmbientUserMode
= ! seton
;
224 AmbientPropertyChanged(DISPID_AMBIENT_USERMODE
);
227 bool wxIEHtmlWin::GetEditMode()
229 return ! m_bAmbientUserMode
;
233 void wxIEHtmlWin::SetCharset(wxString charset
)
236 IDispatch
*pDisp
= NULL
;
237 HRESULT hret
= m_webBrowser
->get_Document(&pDisp
);
238 wxAutoOleInterface
<IDispatch
> disp(pDisp
);
242 wxAutoOleInterface
<IHTMLDocument2
> doc(IID_IHTMLDocument2
, disp
);
244 doc
->put_charset((BSTR
) (const wchar_t*)charset
.wc_str(wxConvUTF8
));
249 class IStreamAdaptorBase
: public IStream
252 DECLARE_OLE_UNKNOWN(IStreamAdaptorBase
);
255 IStreamAdaptorBase() {}
256 virtual ~IStreamAdaptorBase() {}
259 HRESULT STDMETHODCALLTYPE
Read(void __RPC_FAR
*pv
, ULONG cb
, ULONG __RPC_FAR
*pcbRead
) = 0;
260 HRESULT STDMETHODCALLTYPE
Write(const void __RPC_FAR
*pv
, ULONG cb
, ULONG __RPC_FAR
*pcbWritten
) {return E_NOTIMPL
;}
263 HRESULT STDMETHODCALLTYPE
Seek(LARGE_INTEGER dlibMove
, DWORD dwOrigin
, ULARGE_INTEGER __RPC_FAR
*plibNewPosition
) {return E_NOTIMPL
;}
264 HRESULT STDMETHODCALLTYPE
SetSize(ULARGE_INTEGER libNewSize
) {return E_NOTIMPL
;}
265 HRESULT STDMETHODCALLTYPE
CopyTo(IStream __RPC_FAR
*pstm
, ULARGE_INTEGER cb
, ULARGE_INTEGER __RPC_FAR
*pcbRead
, ULARGE_INTEGER __RPC_FAR
*pcbWritten
) {return E_NOTIMPL
;}
266 HRESULT STDMETHODCALLTYPE
Commit(DWORD grfCommitFlags
) {return E_NOTIMPL
;}
267 HRESULT STDMETHODCALLTYPE
Revert(void) {return E_NOTIMPL
;}
268 HRESULT STDMETHODCALLTYPE
LockRegion(ULARGE_INTEGER libOffset
, ULARGE_INTEGER cb
, DWORD dwLockType
) {return E_NOTIMPL
;}
269 HRESULT STDMETHODCALLTYPE
UnlockRegion(ULARGE_INTEGER libOffset
, ULARGE_INTEGER cb
, DWORD dwLockType
) {return E_NOTIMPL
;}
270 HRESULT STDMETHODCALLTYPE
Stat(STATSTG __RPC_FAR
*pstatstg
, DWORD grfStatFlag
) {return E_NOTIMPL
;}
271 HRESULT STDMETHODCALLTYPE
Clone(IStream __RPC_FAR
*__RPC_FAR
*ppstm
) {return E_NOTIMPL
;}
274 DEFINE_OLE_TABLE(IStreamAdaptorBase
)
275 OLE_IINTERFACE(IUnknown
)
276 OLE_IINTERFACE(ISequentialStream
)
277 OLE_IINTERFACE(IStream
)
280 class IStreamAdaptor
: public IStreamAdaptorBase
287 IStreamAdaptor(istream
*is
) : IStreamAdaptorBase(), m_is(is
)
289 wxASSERT(m_is
!= NULL
);
297 HRESULT STDMETHODCALLTYPE
Read(void __RPC_FAR
*pv
, ULONG cb
, ULONG __RPC_FAR
*pcbRead
)
299 m_is
->read((char *) pv
, cb
);
301 *pcbRead
= m_is
->gcount();
308 void wxIEHtmlWin::LoadUrl(const wxString
& url
)
310 VARIANTARG navFlag
, targetFrame
, postData
, headers
;
311 navFlag
.vt
= VT_EMPTY
;
313 navFlag
.iVal
= navNoReadFromCache
;
314 targetFrame
.vt
= VT_EMPTY
;
315 postData
.vt
= VT_EMPTY
;
316 headers
.vt
= VT_EMPTY
;
319 hret
= m_webBrowser
->Navigate((BSTR
) (const wchar_t*)url
.wc_str(wxConvUTF8
),
320 &navFlag
, &targetFrame
, &postData
, &headers
);
324 bool wxIEHtmlWin::LoadString(wxString html
)
326 string s
= html
.mb_str(wxConvUTF8
);
327 istringstream
*is
= new istringstream(s
);
328 return LoadStream(is
);
331 bool wxIEHtmlWin::LoadStream(istream
*is
)
333 // wrap refernce around stream
334 IStreamAdaptor
*pstrm
= new IStreamAdaptor(is
);
337 wxAutoOleInterface
<IStream
> strm(pstrm
);
339 // Document Interface
340 IDispatch
*pDisp
= NULL
;
341 HRESULT hret
= m_webBrowser
->get_Document(&pDisp
);
344 wxAutoOleInterface
<IDispatch
> disp(pDisp
);
347 // get IPersistStreamInit
348 wxAutoOleInterface
<IPersistStreamInit
>
349 pPersistStreamInit(IID_IPersistStreamInit
, disp
);
351 if (pPersistStreamInit
.Ok())
353 HRESULT hr
= pPersistStreamInit
->InitNew();
355 hr
= pPersistStreamInit
->Load(strm
);
361 bool wxIEHtmlWin::GoBack()
364 hret
= m_webBrowser
->GoBack();
368 bool wxIEHtmlWin::GoForward()
371 hret
= m_webBrowser
->GoForward();
375 bool wxIEHtmlWin::GoHome()
378 hret
= m_webBrowser
->GoHome();
382 bool wxIEHtmlWin::GoSearch()
385 hret
= m_webBrowser
->GoSearch();
389 bool wxIEHtmlWin::Refresh(wxIEHtmlRefreshLevel level
)
395 levelArg
.iVal
= level
;
396 hret
= m_webBrowser
->Refresh2(&levelArg
);
400 bool wxIEHtmlWin::Stop()
403 hret
= m_webBrowser
->Stop();
407 ///////////////////////////////////////////////////////////////////////////////
409 static wxAutoOleInterface
<IHTMLSelectionObject
> GetSelObject(IOleObject
*oleObject
)
411 // Query for IWebBrowser interface
412 wxAutoOleInterface
<IWebBrowser2
> wb(IID_IWebBrowser2
, oleObject
);
414 return wxAutoOleInterface
<IHTMLSelectionObject
>();
416 IDispatch
*iDisp
= NULL
;
417 HRESULT hr
= wb
->get_Document(&iDisp
);
419 return wxAutoOleInterface
<IHTMLSelectionObject
>();
421 // Query for Document Interface
422 wxAutoOleInterface
<IHTMLDocument2
> hd(IID_IHTMLDocument2
, iDisp
);
426 return wxAutoOleInterface
<IHTMLSelectionObject
>();
428 IHTMLSelectionObject
*_so
= NULL
;
429 hr
= hd
->get_selection(&_so
);
431 // take ownership of selection object
432 wxAutoOleInterface
<IHTMLSelectionObject
> so(_so
);
437 static wxAutoOleInterface
<IHTMLTxtRange
> GetSelRange(IOleObject
*oleObject
)
439 wxAutoOleInterface
<IHTMLTxtRange
> tr
;
441 wxAutoOleInterface
<IHTMLSelectionObject
> so(GetSelObject(oleObject
));
445 IDispatch
*iDisp
= NULL
;
446 HRESULT hr
= so
->createRange(&iDisp
);
450 // Query for IHTMLTxtRange interface
451 tr
.QueryInterface(IID_IHTMLTxtRange
, iDisp
);
457 wxString
wxIEHtmlWin::GetStringSelection(bool asHTML
)
459 wxAutoOleInterface
<IHTMLTxtRange
> tr(GetSelRange(m_oleObject
));
467 hr
= tr
->get_htmlText(&text
);
469 hr
= tr
->get_text(&text
);
479 wxString
wxIEHtmlWin::GetText(bool asHTML
)
481 if (! m_webBrowser
.Ok())
484 // get document dispatch interface
485 IDispatch
*iDisp
= NULL
;
486 HRESULT hr
= m_webBrowser
->get_Document(&iDisp
);
490 // Query for Document Interface
491 wxAutoOleInterface
<IHTMLDocument2
> hd(IID_IHTMLDocument2
, iDisp
);
498 IHTMLElement
*_body
= NULL
;
499 hd
->get_body(&_body
);
502 wxAutoOleInterface
<IHTMLElement
> body(_body
);
509 hr
= body
->get_innerHTML(&text
);
511 hr
= body
->get_innerText(&text
);