1
/////////////////////////////////////////////////////////////////////////////
3
// Purpose: ActiveX controls (such as Internet Explorer) in a wxWindow
7
// Created: 18-Mar-2004
8
// RCS-ID: $Id: activex.i 39219 2006-05-19 01:10:46Z RD $
9
// Copyright: (c) 2004 by Total Control Software
10
// Licence: wxWindows license
11
/////////////////////////////////////////////////////////////////////////////
14
%module(package="wx") activex
17
#include "wx/wxPython/wxPython.h"
18
#include "wx/wxPython/pyclasses.h"
19
#include "wx/wxPython/pyistream.h"
21
#include "wxactivex.h"
24
//---------------------------------------------------------------------------
27
%pythoncode { wx = _core }
28
%pythoncode { __docfilter__ = wx.__DocFilter(globals()) }
30
MAKE_CONST_WXSTRING_NOSWIG(PanelNameStr);
33
//---------------------------------------------------------------------------
35
typedef unsigned short USHORT;
37
typedef long MEMBERID;
38
typedef unsigned short VARTYPE;
42
// Since SWIG doesn't support nested classes, we need to fool it a bit
43
// and make them look like global classes. These defines make the C++ code
44
// know what we are doing.
45
#define wxParamX wxActiveX::ParamX
46
#define wxFuncX wxActiveX::FuncX
47
#define wxPropX wxActiveX::PropX
48
#define wxParamXArray wxActiveX::ParamXArray
49
#define wxFuncXArray wxActiveX::FuncXArray
50
#define wxPropXArray wxActiveX::PropXArray
55
// Some conversion helpers
56
static wxVariant _PyObj2Variant(PyObject* value);
57
static bool _PyObj2Variant(PyObject* value, wxVariant& wv);
58
static PyObject* _Variant2PyObj(wxVariant& value, bool useNone=false);
59
static wxString _VARTYPEname(VARTYPE vt);
61
// Check if an exception has been raised (blocking threads)
62
inline bool wxPyErr_Occurred()
65
wxPyBlock_t blocked = wxPyBeginBlockThreads();
66
rval = PyErr_Occurred() != NULL;
67
wxPyEndBlockThreads(blocked);
73
//---------------------------------------------------------------------------
77
"This class wraps the Windows CLSID structure and is used to
78
specify the class of the ActiveX object that is to be created. A
79
CLSID can be constructed from either a ProgID string, (such as
80
'WordPad.Document.1') or a classID string, (such as
81
'{CA8A9783-280D-11CF-A24D-444553540000}').", "");
86
CLSID(const wxString& id)
89
CLSID* self = new CLSID;
90
memset(self, 0, sizeof(CLSID));
92
if (id[0] == _T('{')) {
93
// Looks like a classID string
96
(LPOLESTR)(const wchar_t *)id.wc_str(wxConvUTF8),
102
(LPOLESTR)(const wchar_t *)id.wc_str(wxConvUTF8),
105
if (result != NOERROR) {
106
wxPyErr_SetString(PyExc_ValueError, "Not a recognized classID or progID");
113
~CLSID() { delete self; }
115
wxString GetCLSIDString()
119
if (StringFromCLSID(*self, &s) == S_OK) {
124
str = _T("Error!"); // TODO: raise exception?
128
wxString GetProgIDString()
132
if (ProgIDFromCLSID(*self, &s) == S_OK) {
137
str = _T("Error!"); // TODO: raise exception?
142
%pythoncode { def __str__(self): return self.GetCLSIDString() }
146
//---------------------------------------------------------------------------
149
%define MAKE_ARRAY_WRAPPER(basetype, arrayname)
154
bool __nonzero__() { return self->size() > 0; }
155
int __len__() { return self->size(); }
157
const basetype& __getitem__(int idx) {
158
if ( idx >= 0 && idx < self->size() )
161
static basetype BadVal;
162
wxPyErr_SetString(PyExc_IndexError, "Index out of range");
171
//---------------------------------------------------------------------------
185
%feature("shadow") vt_type_get "vt_type = property(_activex.ParamX_vt_type_get)";
186
%extend { wxString vt_type_get() { return _VARTYPEname(self->vt); } }
188
%feature("shadow") IsIn "isIn = property(_activex.ParamX_IsIn)";
189
%feature("shadow") IsOut "isOut = property(_activex.ParamX_IsOut)";
190
%feature("shadow") IsRetVal "isRetVal = property(_activex.ParamX_IsRetVal)";
193
bool IsRetVal() const;
206
wxParamXArray params;
219
%feature("shadow") CanGet "canGet = property(_activex.PropX_CanGet)";
220
%feature("shadow") CanSet "canSet = property(_activex.PropX_CanSet)";
227
MAKE_ARRAY_WRAPPER(wxParamX, wxParamXArray);
228
MAKE_ARRAY_WRAPPER(wxFuncX, wxFuncXArray);
229
MAKE_ARRAY_WRAPPER(wxPropX, wxPropXArray);
232
//---------------------------------------------------------------------------
236
// C++ version of a Python-aware wxActiveX
237
class wxActiveXWindow : public wxActiveX
242
DECLARE_ABSTRACT_CLASS(wxActiveXWindow);
245
wxActiveXWindow( wxWindow* parent, const CLSID& clsId, wxWindowID id = -1,
246
const wxPoint& pos = wxDefaultPosition,
247
const wxSize& size = wxDefaultSize,
249
const wxString& name = wxPyPanelNameStr)
250
: wxActiveX(parent, clsId, id, pos, size, style, name)
255
const CLSID& GetCLSID() const { return m_CLSID; }
258
// Renamed versions of some base class methods that delegate
259
// to the base where appropriate, and raise Python exceptions
261
int GetAXEventCount() const { return wxActiveX::GetEventCount(); }
262
int GetAXPropCount() const { return wxActiveX::GetPropCount(); }
263
int GetAXMethodCount() const { return wxActiveX::GetMethodCount(); }
265
const wxFuncX& GetAXEventDesc(int idx) const
267
static wxFuncX BadVal;
268
if (idx < 0 || idx >= GetAXEventCount()) {
269
wxPyErr_SetString(PyExc_IndexError, "Index out of range");
272
return m_events[idx];
274
const wxFuncX& GetAXMethodDesc(int idx) const
276
static wxFuncX BadVal;
277
if (idx < 0 || idx >= GetAXMethodCount()) {
278
wxPyErr_SetString(PyExc_IndexError, "Index out of range");
281
return m_methods[idx];
283
const wxPropX& GetAXPropDesc(int idx) const
285
static wxPropX BadVal;
286
if (idx < 0 || idx >= GetAXPropCount()) {
287
wxPyErr_SetString(PyExc_IndexError, "Index out of range");
293
const wxFuncX& GetAXMethodDesc(const wxString& name) const
295
NameMap::const_iterator it = m_methodNames.find(name);
296
if (it == m_methodNames.end()) {
298
msg << _T("method <") << name << _T("> not found");
299
wxPyErr_SetString(PyExc_KeyError, msg.mb_str());
300
static wxFuncX BadVal;
303
return GetAXMethodDesc(it->second);
305
const wxPropX& GetAXPropDesc(const wxString& name) const
307
NameMap::const_iterator it = m_propNames.find(name);
308
if (it == m_propNames.end()) {
310
msg << _T("property <") << name << _T("> not found");
311
wxPyErr_SetString(PyExc_KeyError, msg.mb_str());
312
static wxPropX BadVal;
315
return GetAXPropDesc(it->second);
318
// Accessors for the internal vectors of events, methods and
319
// proprties. Can be used as sequence like objects from
321
const wxFuncXArray& GetAXEvents() { return m_events; }
322
const wxFuncXArray& GetAXMethods() { return m_methods; }
323
const wxPropXArray& GetAXProperties() { return m_props; }
326
// Set a property from a Python object
327
void SetAXProp(const wxString& name, PyObject* value)
329
const wxPropX& prop = GetAXPropDesc(name);
330
wxPyBlock_t blocked = wxPyBeginBlockThreads();
331
if (! PyErr_Occurred() ) {
332
if (! prop.CanSet()) {
334
msg << _T("property <") << name << _T("> is readonly");
335
PyErr_SetString(PyExc_TypeError, msg.mb_str());
338
wxVariant wxV = _PyObj2Variant(value);
339
if (PyErr_Occurred())
341
VARIANT v = {prop.arg.vt};
342
if (!VariantToMSWVariant(wxV, v) || PyErr_Occurred()) {
344
msg << _T("Unable to convert value to expected type: (")
345
<< _VARTYPEname(prop.arg.vt) << _T(") for property <")
347
PyErr_SetString(PyExc_TypeError, msg.mb_str());
350
PyThreadState* tstate = wxPyBeginAllowThreads();
351
SetProp(prop.memid, v);
353
wxPyEndAllowThreads(tstate);
357
wxPyEndBlockThreads(blocked);
361
// Get a property and convert it to a Python object
362
PyObject* GetAXProp(const wxString& name)
364
PyObject* rval = NULL;
365
const wxPropX& prop = GetAXPropDesc(name);
366
wxPyBlock_t blocked = wxPyBeginBlockThreads();
367
if (! PyErr_Occurred() ) {
368
if (! prop.CanGet()) {
370
msg << _T("property <") << name << _T("> is writeonly");
371
PyErr_SetString(PyExc_TypeError, msg.mb_str());
374
PyThreadState* tstate = wxPyBeginAllowThreads();
375
VARIANT v = GetPropAsVariant(prop.memid);
376
wxPyEndAllowThreads(tstate);
378
if (!MSWVariantToVariant(v, wv) || PyErr_Occurred()) {
380
msg << _T("Unable to convert value to expected type: (")
381
<< _VARTYPEname(prop.arg.vt) << _T(") for property <")
383
PyErr_SetString(PyExc_TypeError, msg.mb_str());
386
rval = _Variant2PyObj(wv);
391
wxPyEndBlockThreads(blocked);
396
// If both IsIn and isOut are false, assume it is actually an
398
bool paramIsIn(const wxParamX& p)
400
return p.IsIn() || (!p.IsIn() && !p.IsOut());
404
// Call a method of the ActiveX object
405
PyObject* _CallAXMethod(const wxString& name, PyObject* args)
407
VARIANTARG *vargs = NULL;
409
PyObject* rval = NULL;
410
const wxFuncX& func = GetAXMethodDesc(name);
412
wxPyBlock_t blocked = wxPyBeginBlockThreads();
413
if (! PyErr_Occurred() ) {
414
nargs = func.params.size();
416
vargs = new VARIANTARG[nargs];
419
// init type of vargs, in reverse order
421
for (i = 0; i < nargs; i++)
422
vargs[nargs - i - 1].vt = func.params[i].vt;
424
// Map the args coming from Python to the input parameters in vargs
427
while ( i<nargs && pi<PyTuple_Size(args) ) {
428
// Move to the next input param.
429
if (! paramIsIn(func.params[i])) {
433
// convert the python object
434
PyObject* obj = PyTuple_GetItem(args, pi);
435
if (obj == Py_None) // special-case None?
436
vargs[nargs - i - 1].vt = VT_EMPTY;
438
wxVariant wxV = _PyObj2Variant(obj);
439
if (PyErr_Occurred())
441
if (!VariantToMSWVariant(wxV, vargs[nargs - i - 1]) || PyErr_Occurred()) {
443
msg << _T("Unable to convert value to expected type: (")
444
<< _VARTYPEname(vargs[nargs - i - 1].vt)
445
<< _T(") for parameter ") << i;
446
PyErr_SetString(PyExc_TypeError, msg.mb_str());
456
PyThreadState* tstate = wxPyBeginAllowThreads();
457
VARIANT rv = CallMethod(func.memid, vargs, nargs);
458
wxPyEndAllowThreads(tstate);
460
// Convert the return value and any out-params, ignoring
461
// conversion errors for now
463
MSWVariantToVariant(rv, wv);
464
rval = _Variant2PyObj(wv, true);
468
// make a list and put the rval in it if it is not None
469
PyObject* lst = PyList_New(0);
471
PyList_Append(lst, rval);
475
// find the out params and convert them
476
for (int i = 0; i < nargs; i++) {
477
VARIANTARG& va = vargs[nargs - i - 1];
478
const wxParamX &px = func.params[i];
480
MSWVariantToVariant(va, wv);
481
PyObject* obj = _Variant2PyObj(wv, true);
482
PyList_Append(lst, obj);
485
rval = PyList_AsTuple(lst);
488
if (PyErr_Occurred())
492
wxPyEndBlockThreads(blocked);
494
for (int i = 0; i < nargs; i++)
495
VariantClear(&vargs[i]);
502
IMPLEMENT_ABSTRACT_CLASS( wxActiveXWindow, wxWindow );
507
// Now tell SWIG about this new class that is implemented above.
509
DocStr(wxActiveXWindow,
510
"ActiveXWindow derives from wxWindow and the constructor accepts a
511
CLSID for the ActiveX Control that should be created. The
512
ActiveXWindow class simply adds methods that allow you to query
513
some of the TypeInfo exposed by the ActiveX object, and also to
514
get/set properties or call methods by name. The Python
515
implementation automatically handles converting parameters and
516
return values to/from the types expected by the ActiveX code as
517
specified by the TypeInfo.
521
MustHaveApp(wxActiveXWindow);
523
class wxActiveXWindow : public wxWindow
526
%pythonAppend wxActiveXWindow "self._setOORInfo(self)"
529
wxActiveXWindow( wxWindow* parent, const CLSID& clsId, wxWindowID id = -1,
530
const wxPoint& pos = wxDefaultPosition,
531
const wxSize& size = wxDefaultSize,
533
const wxString& name = wxPyPanelNameStr),
534
"Creates an ActiveX control from the clsID given and makes it act
535
as much like a regular wx.Window as possible.", "");
538
const CLSID& , GetCLSID() const,
539
"Return the CLSID used to construct this ActiveX window", "");
543
int , GetAXEventCount() const,
544
"Number of events defined for this control", "");
547
const wxFuncX& , GetAXEventDesc(int idx) const,
548
"Returns event description by index", "");
552
int , GetAXPropCount() const,
553
"Number of properties defined for this control", "");
555
%nokwargs GetAXPropDesc;
556
DocStr(GetPropDesc, "Returns property description by index or by name", "");
557
const wxPropX& GetAXPropDesc(int idx) const;
558
const wxPropX& GetAXPropDesc(const wxString& name) const;
563
int , GetAXMethodCount() const,
564
"Number of methods defined for this control", "");
566
%nokwargs GetAXMethodDesc;
567
DocStr(GetMethodDesc, "Returns method description by index or name", "");
568
const wxFuncX& GetAXMethodDesc(int idx) const;
569
const wxFuncX& GetAXMethodDesc(const wxString& name) const;
573
const wxFuncXArray& , GetAXEvents(),
574
"Returns a sequence of FuncX objects describing the events
575
available for this ActiveX object.", "");
578
const wxFuncXArray& , GetAXMethods(),
579
"Returns a sequence of FuncX objects describing the methods
580
available for this ActiveX object.", "");
583
const wxPropXArray& , GetAXProperties(),
584
"Returns a sequence of PropX objects describing the properties
585
available for this ActiveX object.", "");
590
void , SetAXProp(const wxString& name, PyObject* value),
591
"Set a property of the ActiveX object by name.", "");
595
PyObject* , GetAXProp(const wxString& name),
596
"Get the value of an ActiveX property by name.", "");
599
%nokwargs _CallAXMethod;
601
PyObject* , _CallAXMethod(const wxString& name, PyObject* args),
602
"The implementation for CallMethod. Calls an ActiveX method, by
603
name passing the parameters given in args.", "");
605
def CallAXMethod(self, name, *args):
607
Front-end for _CallMethod. Simply passes all positional args
608
after the name as a single tuple to _CallMethod.
610
return self._CallAXMethod(name, args)
614
//---------------------------------------------------------------------------
618
wxEventType , RegisterActiveXEvent(const wxString& eventName),
619
"Creates a standard wx event ID for the given eventName.", "");
623
DocStr(wxActiveXEvent,
624
"An instance of ActiveXEvent is sent to the handler for all bound
625
ActiveX events. Any event parameters from the ActiveX cntrol are
626
turned into attributes of the Python proxy for this event object.
627
Additionally, there is a property called eventName that will
628
return (surprisingly <wink>) the name of the ActiveX event.", "");
630
class wxActiveXEvent : public wxCommandEvent
633
%feature("shadow") EventName "eventName = property(_activex.ActiveXEvent_EventName)";
634
wxString EventName();
638
// This is called by the EventThunker before calling the
639
// handler. We'll convert and load the ActiveX event parameters into
640
// attributes of the Python event object.
641
void _preCallInit(PyObject* pyself) {
642
wxPyBlock_t blocked = wxPyBeginBlockThreads();
643
PyObject* pList = PyList_New(0);
644
PyObject_SetAttrString(pyself, "paramList", pList);
646
for (int i=0; i<self->ParamCount(); i+=1) {
647
PyObject* name = PyString_FromString((char*)(const char*)self->ParamName(i).mb_str());
648
PyObject* val = _Variant2PyObj((*self)[i], true);
649
PyObject_SetAttr(pyself, name, val);
650
PyList_Append(pList, name);
654
wxPyEndBlockThreads(blocked);
657
// This one is called by the EventThunker after calling the
658
// handler. It reloads any "out" parameters from the python attributes
659
// back into the wxVariant they came from.
660
void _postCallCleanup(PyObject* pyself) {
661
wxPyBlock_t blocked = wxPyBeginBlockThreads();
662
for (int i=0; i<self->ParamCount(); i+=1) {
663
PyObject* val = PyObject_GetAttrString(
664
pyself, (char*)(const char*)self->ParamName(i).mb_str());
665
_PyObj2Variant(val, (*self)[i]);
668
wxPyEndBlockThreads(blocked);
675
//---------------------------------------------------------------------------
679
// Caller should already have the GIL!
680
wxVariant _PyObj2Variant(PyObject* value)
684
if (value == Py_None)
687
#if PYTHON_API_VERSION >= 1012 // Python 2.3+
688
else if (PyBool_Check(value))
689
rval = (value == Py_True) ? true : false;
692
else if (PyInt_Check(value))
693
rval = PyInt_AS_LONG(value);
695
else if (PyFloat_Check(value))
696
rval = PyFloat_AS_DOUBLE(value);
698
else if (PyString_Check(value) || PyUnicode_Check(value))
699
rval = Py2wxString(value);
701
// TODO: PyList of strings --> wxArrayString
707
PyErr_SetString(PyExc_TypeError, "Unsupported object type in _PyObj2Variant");
714
// This one uses the type of the variant to try and force the conversion
715
bool _PyObj2Variant(PyObject* value, wxVariant& wv)
717
wxString type = wv.GetType();
719
if ( type == _T("long") || type == _T("bool") || type == _T("char") )
720
wv = PyInt_AsLong(value);
722
else if ( type == _T("string") )
723
wv = Py2wxString(value);
725
else if ( type == _T("double") )
726
wv = PyFloat_AsDouble(value);
729
// it's some other type that we dont' handle yet. Log it?
735
// Caller should already have the GIL!
736
PyObject* _Variant2PyObj(wxVariant& value, bool useNone)
738
PyObject* rval = NULL;
740
if (value.IsNull()) {
745
// should "char" be treated as an int or as a string?
746
else if (value.IsType(_T("char")) || value.IsType(_T("long")))
747
rval = PyInt_FromLong(value);
749
else if (value.IsType(_T("double")))
750
rval = PyFloat_FromDouble(value);
752
else if (value.IsType(_T("bool"))) {
753
rval = (bool)value ? Py_True : Py_False;
757
else if (value.IsType(_T("string")))
758
rval = wx2PyString(value);
766
PyErr_SetString(PyExc_TypeError, "Unsupported object type in _Variant2PyObj");
773
wxString _VARTYPEname(VARTYPE vt)
780
return _T("VT_VARIANT");
800
// decimals are converted from doubles too
808
return _T("wx.DateTime");
814
return _T("VT_UNKNOWN");
817
return _T("VT_DISPATCH");
820
return _T("VT_EMPTY");
823
return _T("VT_NULL");
826
return _T("VT_VOID");
830
msg << _T("unsupported type ") << vt;
837
//---------------------------------------------------------------------------
838
//---------------------------------------------------------------------------
843
// A class derived from our wxActiveXWindow for the IE WebBrowser
844
// control that will serve as a base class for a Python
845
// implementation. This is done so we can "eat our own dog food"
846
// and use a class at least mostly generated by genaxmodule, but
847
// also get some of the extra stuff like loading a document from
848
// a string or a stream, getting text contents, etc. that
849
// Lindsay's version gives us.
852
#include <wx/mstream.h>
854
#include <winerror.h>
855
#include <exdispid.h>
861
#include "IEHtmlStream.h"
863
class wxIEHtmlWindowBase : public wxActiveXWindow {
865
wxAutoOleInterface<IWebBrowser2> m_webBrowser;
867
DECLARE_ABSTRACT_CLASS(wxIEHtmlWindowBase);
871
wxIEHtmlWindowBase ( wxWindow* parent, const CLSID& clsId, wxWindowID id = -1,
872
const wxPoint& pos = wxDefaultPosition,
873
const wxSize& size = wxDefaultSize,
875
const wxString& name = wxPyPanelNameStr)
876
: wxActiveXWindow(parent, clsId, id, pos, size, style, name)
880
// Get IWebBrowser2 Interface
881
hret = m_webBrowser.QueryInterface(IID_IWebBrowser2, m_ActiveX);
882
wxASSERT(SUCCEEDED(hret));
885
m_webBrowser->put_MenuBar(VARIANT_FALSE);
886
m_webBrowser->put_AddressBar(VARIANT_FALSE);
887
m_webBrowser->put_StatusBar(VARIANT_FALSE);
888
m_webBrowser->put_ToolBar(VARIANT_FALSE);
890
m_webBrowser->put_RegisterAsBrowser(VARIANT_TRUE);
891
m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE);
893
m_webBrowser->Navigate( L"about:blank", NULL, NULL, NULL, NULL );
897
void SetCharset(const wxString& charset)
902
IDispatch *pDisp = NULL;
903
hret = m_webBrowser->get_Document(&pDisp);
904
wxAutoOleInterface<IDispatch> disp(pDisp);
908
wxAutoOleInterface<IHTMLDocument2> doc(IID_IHTMLDocument2, disp);
910
doc->put_charset((BSTR) (const wchar_t *) charset.wc_str(wxConvUTF8));
911
//doc->put_charset((BSTR) wxConvUTF8.cMB2WC(charset).data());
916
bool LoadString(const wxString& html)
919
size_t len = html.length();
920
len *= sizeof(wxChar);
921
data = (char *) malloc(len);
922
memcpy(data, html.c_str(), len);
923
return LoadStream(new wxOwnedMemInputStream(data, len));
927
bool LoadStream(IStreamAdaptorBase *pstrm)
929
// need to prepend this as poxy MSHTML will not recognise a HTML comment
930
// as starting a html document and treats it as plain text
931
// Does nayone know how to force it to html mode ?
933
// TODO: What to do in this case???
935
pstrm->prepend = _T("<html>");
938
// strip leading whitespace as it can confuse MSHTML
939
wxAutoOleInterface<IStream> strm(pstrm);
941
// Document Interface
942
IDispatch *pDisp = NULL;
943
HRESULT hret = m_webBrowser->get_Document(&pDisp);
946
wxAutoOleInterface<IDispatch> disp(pDisp);
949
// get IPersistStreamInit
950
wxAutoOleInterface<IPersistStreamInit>
951
pPersistStreamInit(IID_IPersistStreamInit, disp);
953
if (pPersistStreamInit.Ok())
955
HRESULT hr = pPersistStreamInit->InitNew();
957
hr = pPersistStreamInit->Load(strm);
959
return SUCCEEDED(hr);
965
bool LoadStream(wxInputStream *is)
967
// wrap reference around stream
968
IwxStreamAdaptor *pstrm = new IwxStreamAdaptor(is);
971
return LoadStream(pstrm);
975
wxString GetStringSelection(bool asHTML)
977
wxAutoOleInterface<IHTMLTxtRange> tr(wxieGetSelRange(m_oleObject));
979
return wxEmptyString;
985
hr = tr->get_htmlText(&text);
987
hr = tr->get_text(&text);
989
return wxEmptyString;
997
wxString GetText(bool asHTML)
999
if (! m_webBrowser.Ok())
1000
return wxEmptyString;
1002
// get document dispatch interface
1003
IDispatch *iDisp = NULL;
1004
HRESULT hr = m_webBrowser->get_Document(&iDisp);
1006
return wxEmptyString;
1008
// Query for Document Interface
1009
wxAutoOleInterface<IHTMLDocument2> hd(IID_IHTMLDocument2, iDisp);
1013
return wxEmptyString;
1016
IHTMLElement *_body = NULL;
1017
hd->get_body(&_body);
1019
return wxEmptyString;
1020
wxAutoOleInterface<IHTMLElement> body(_body);
1027
hr = body->get_innerHTML(&text);
1029
hr = body->get_innerText(&text);
1031
return wxEmptyString;
1034
SysFreeString(text);
1040
// void wxIEHtmlWin::SetEditMode(bool seton)
1042
// m_bAmbientUserMode = ! seton;
1043
// AmbientPropertyChanged(DISPID_AMBIENT_USERMODE);
1046
// bool wxIEHtmlWin::GetEditMode()
1048
// return ! m_bAmbientUserMode;
1052
IMPLEMENT_ABSTRACT_CLASS( wxIEHtmlWindowBase, wxActiveXWindow );
1057
// we'll document it in the derived Python class
1058
%feature("noautodoc") wxIEHtmlWindowBase;
1059
%feature("noautodoc") wxIEHtmlWindowBase::SetCharset;
1060
%feature("noautodoc") wxIEHtmlWindowBase::LoadString;
1061
%feature("noautodoc") wxIEHtmlWindowBase::LoadStream;
1062
%feature("noautodoc") wxIEHtmlWindowBase::GetStringSelection;
1063
%feature("noautodoc") wxIEHtmlWindowBase::GetText;
1066
MustHaveApp(wxIEHtmlWindowBase);
1068
class wxIEHtmlWindowBase : public wxActiveXWindow {
1070
%pythonAppend wxIEHtmlWindowBase "self._setOORInfo(self)"
1072
wxIEHtmlWindowBase ( wxWindow* parent, const CLSID& clsId, wxWindowID id = -1,
1073
const wxPoint& pos = wxDefaultPosition,
1074
const wxSize& size = wxDefaultSize,
1076
const wxString& name = wxPyPanelNameStr);
1078
void SetCharset(const wxString& charset);
1079
bool LoadString(const wxString& html);
1080
bool LoadStream(wxInputStream *is);
1081
wxString GetStringSelection(bool asHTML);
1082
wxString GetText(bool asHTML);
1096
enum wxIEHtmlRefreshLevel
1098
wxIEHTML_REFRESH_NORMAL = 0,
1099
wxIEHTML_REFRESH_IFEXPIRED = 1,
1100
wxIEHTML_REFRESH_CONTINUE = 2,
1101
wxIEHTML_REFRESH_COMPLETELY = 3
1106
class wxIEHtmlWin : public wxWindow
1109
%pythonAppend wxIEHtmlWin "self._setOORInfo(self)"
1111
wxIEHtmlWin(wxWindow * parent, wxWindowID id = -1,
1112
const wxPoint& pos = wxDefaultPosition,
1113
const wxSize& size = wxDefaultSize,
1115
const wxString& name = wxPyPanelNameStr);
1117
void LoadUrl(const wxString& url);
1118
bool LoadString(wxString html);
1119
bool LoadStream(wxInputStream *is);
1121
%pythoncode { Navigate = LoadUrl }
1123
void SetCharset(wxString charset);
1124
void SetEditMode(bool seton);
1126
wxString GetStringSelection(bool asHTML = false);
1127
wxString GetText(bool asHTML = false);
1133
%name(RefreshPage)bool Refresh(wxIEHtmlRefreshLevel level);
1140
wxEVT_COMMAND_MSHTML_BEFORENAVIGATE2 = RegisterActiveXEvent('BeforeNavigate2')
1141
wxEVT_COMMAND_MSHTML_NEWWINDOW2 = RegisterActiveXEvent('NewWindow2')
1142
wxEVT_COMMAND_MSHTML_DOCUMENTCOMPLETE = RegisterActiveXEvent('DocumentComplete')
1143
wxEVT_COMMAND_MSHTML_PROGRESSCHANGE = RegisterActiveXEvent('ProgressChange')
1144
wxEVT_COMMAND_MSHTML_STATUSTEXTCHANGE = RegisterActiveXEvent('StatusTextChange')
1145
wxEVT_COMMAND_MSHTML_TITLECHANGE = RegisterActiveXEvent('TitleChange')
1147
EVT_MSHTML_BEFORENAVIGATE2 = wx.PyEventBinder(wxEVT_COMMAND_MSHTML_BEFORENAVIGATE2, 1)
1148
EVT_MSHTML_NEWWINDOW2 = wx.PyEventBinder(wxEVT_COMMAND_MSHTML_NEWWINDOW2, 1)
1149
EVT_MSHTML_DOCUMENTCOMPLETE = wx.PyEventBinder(wxEVT_COMMAND_MSHTML_DOCUMENTCOMPLETE, 1)
1150
EVT_MSHTML_PROGRESSCHANGE = wx.PyEventBinder(wxEVT_COMMAND_MSHTML_PROGRESSCHANGE, 1)
1151
EVT_MSHTML_STATUSTEXTCHANGE = wx.PyEventBinder(wxEVT_COMMAND_MSHTML_STATUSTEXTCHANGE, 1)
1152
EVT_MSHTML_TITLECHANGE = wx.PyEventBinder(wxEVT_COMMAND_MSHTML_TITLECHANGE, 1)
1157
//---------------------------------------------------------------------------
1158
// Include some extra Python code into the proxy module
1160
%pythoncode "_activex_ex.py"
1162
//---------------------------------------------------------------------------