/////////////////////////////////////////////////////////////////////////////
-%module activex
+%module(package="wx") activex
%{
#include "wx/wxPython/wxPython.h"
//---------------------------------------------------------------------------
%import core.i
-%pythoncode { wx = core }
+%pythoncode { wx = _core }
+%pythoncode { __docfilter__ = wx.__DocFilter(globals()) }
MAKE_CONST_WXSTRING_NOSWIG(PanelNameStr);
-%include _activex_rename.i
-
//---------------------------------------------------------------------------
%{
// Some conversion helpers
static wxVariant _PyObj2Variant(PyObject* value);
-static PyObject* _Variant2PyObj(wxVariant& value, bool useNone=False);
+static bool _PyObj2Variant(PyObject* value, wxVariant& wv);
+static PyObject* _Variant2PyObj(wxVariant& value, bool useNone=false);
static wxString _VARTYPEname(VARTYPE vt);
// Check if an exception has been raised (blocking threads)
inline bool wxPyErr_Occurred()
{
bool rval;
- wxPyBeginBlockThreads();
+ wxPyBlock_t blocked = wxPyBeginBlockThreads();
rval = PyErr_Occurred() != NULL;
- wxPyEndBlockThreads();
+ wxPyEndBlockThreads(blocked);
return rval;
}
specify the class of the ActiveX object that is to be created. A
CLSID can be constructed from either a ProgID string, (such as
'WordPad.Document.1') or a classID string, (such as
-'{CA8A9783-280D-11CF-A24D-444553540000}').");
+'{CA8A9783-280D-11CF-A24D-444553540000}').", "");
class CLSID {
public:
{
private:
CLSID m_CLSID;
+
+ DECLARE_ABSTRACT_CLASS(wxActiveXWindow);
+
public:
wxActiveXWindow( wxWindow* parent, const CLSID& clsId, wxWindowID id = -1,
const wxPoint& pos = wxDefaultPosition,
NameMap::const_iterator it = m_methodNames.find(name);
if (it == m_methodNames.end()) {
wxString msg;
- msg << "method <" << name << "> not found";
+ msg << _T("method <") << name << _T("> not found");
wxPyErr_SetString(PyExc_KeyError, msg.mb_str());
static wxFuncX BadVal;
return BadVal;
NameMap::const_iterator it = m_propNames.find(name);
if (it == m_propNames.end()) {
wxString msg;
- msg << "property <" << name << "> not found";
+ msg << _T("property <") << name << _T("> not found");
wxPyErr_SetString(PyExc_KeyError, msg.mb_str());
static wxPropX BadVal;
return BadVal;
void SetAXProp(const wxString& name, PyObject* value)
{
const wxPropX& prop = GetAXPropDesc(name);
- wxPyBeginBlockThreads();
+ wxPyBlock_t blocked = wxPyBeginBlockThreads();
if (! PyErr_Occurred() ) {
if (! prop.CanSet()) {
wxString msg;
- msg << "property <" << name << "> is readonly";
+ msg << _T("property <") << name << _T("> is readonly");
PyErr_SetString(PyExc_TypeError, msg.mb_str());
goto done;
} else {
VARIANT v = {prop.arg.vt};
if (!VariantToMSWVariant(wxV, v) || PyErr_Occurred()) {
wxString msg;
- msg << "Unable to convert value to expected type: ("
- << _VARTYPEname(prop.arg.vt) << ") for property <"
- << name << ">";
+ msg << _T("Unable to convert value to expected type: (")
+ << _VARTYPEname(prop.arg.vt) << _T(") for property <")
+ << name << _T(">");
PyErr_SetString(PyExc_TypeError, msg.mb_str());
goto done;
}
}
}
done:
- wxPyEndBlockThreads();
+ wxPyEndBlockThreads(blocked);
}
{
PyObject* rval = NULL;
const wxPropX& prop = GetAXPropDesc(name);
- wxPyBeginBlockThreads();
+ wxPyBlock_t blocked = wxPyBeginBlockThreads();
if (! PyErr_Occurred() ) {
if (! prop.CanGet()) {
wxString msg;
- msg << "property <" << name << "> is writeonly";
+ msg << _T("property <") << name << _T("> is writeonly");
PyErr_SetString(PyExc_TypeError, msg.mb_str());
goto done;
} else {
wxVariant wv;
if (!MSWVariantToVariant(v, wv) || PyErr_Occurred()) {
wxString msg;
- msg << "Unable to convert value to expected type: ("
- << _VARTYPEname(prop.arg.vt) << ") for property <"
- << name << ">";
+ msg << _T("Unable to convert value to expected type: (")
+ << _VARTYPEname(prop.arg.vt) << _T(") for property <")
+ << name << _T(">");
PyErr_SetString(PyExc_TypeError, msg.mb_str());
goto done;
}
}
}
done:
- wxPyEndBlockThreads();
+ wxPyEndBlockThreads(blocked);
return rval;
}
PyObject* rval = NULL;
const wxFuncX& func = GetAXMethodDesc(name);
- wxPyBeginBlockThreads();
+ wxPyBlock_t blocked = wxPyBeginBlockThreads();
if (! PyErr_Occurred() ) {
nargs = func.params.size();
if (nargs > 0)
goto done;
if (!VariantToMSWVariant(wxV, vargs[nargs - i - 1]) || PyErr_Occurred()) {
wxString msg;
- msg << "Unable to convert value to expected type: ("
+ msg << _T("Unable to convert value to expected type: (")
<< _VARTYPEname(vargs[nargs - i - 1].vt)
- << ") for parameter " << i;
+ << _T(") for parameter ") << i;
PyErr_SetString(PyExc_TypeError, msg.mb_str());
goto done;
}
// conversion errors for now
wxVariant wv;
MSWVariantToVariant(rv, wv);
- rval = _Variant2PyObj(wv, True);
+ rval = _Variant2PyObj(wv, true);
VariantClear(&rv);
if (func.hasOut) {
const wxParamX &px = func.params[i];
if (px.IsOut()) {
MSWVariantToVariant(va, wv);
- PyObject* obj = _Variant2PyObj(wv, True);
+ PyObject* obj = _Variant2PyObj(wv, true);
PyList_Append(lst, obj);
}
}
PyErr_Clear();
}
done:
- wxPyEndBlockThreads();
+ wxPyEndBlockThreads(blocked);
if (vargs) {
for (int i = 0; i < nargs; i++)
VariantClear(&vargs[i]);
return rval;
}
};
+
+IMPLEMENT_ABSTRACT_CLASS( wxActiveXWindow, wxWindow );
%}
implementation automatically handles converting parameters and
return values to/from the types expected by the ActiveX code as
specified by the TypeInfo.
-");
+", "");
+MustHaveApp(wxActiveXWindow);
+
class wxActiveXWindow : public wxWindow
{
public:
long style = 0,
const wxString& name = wxPyPanelNameStr),
"Creates an ActiveX control from the clsID given and makes it act
-as much like a regular wx.Window as possible.");
+as much like a regular wx.Window as possible.", "");
DocDeclStr(
const CLSID& , GetCLSID() const,
- "Return the CLSID used to construct this ActiveX window");
+ "Return the CLSID used to construct this ActiveX window", "");
DocDeclStr(
int , GetAXEventCount() const,
- "Number of events defined for this control");
+ "Number of events defined for this control", "");
DocDeclStr(
const wxFuncX& , GetAXEventDesc(int idx) const,
- "Returns event description by index");
+ "Returns event description by index", "");
DocDeclStr(
int , GetAXPropCount() const,
- "Number of properties defined for this control");
+ "Number of properties defined for this control", "");
%nokwargs GetAXPropDesc;
- DocStr(GetPropDesc, "Returns property description by index or by name");
+ DocStr(GetPropDesc, "Returns property description by index or by name", "");
const wxPropX& GetAXPropDesc(int idx) const;
const wxPropX& GetAXPropDesc(const wxString& name) const;
DocDeclStr(
int , GetAXMethodCount() const,
- "Number of methods defined for this control");
+ "Number of methods defined for this control", "");
%nokwargs GetAXMethodDesc;
- DocStr(GetMethodDesc, "Returns method description by index or name");
+ DocStr(GetMethodDesc, "Returns method description by index or name", "");
const wxFuncX& GetAXMethodDesc(int idx) const;
const wxFuncX& GetAXMethodDesc(const wxString& name) const;
DocDeclStr(
const wxFuncXArray& , GetAXEvents(),
"Returns a sequence of FuncX objects describing the events
-available for this ActiveX object.");
+available for this ActiveX object.", "");
DocDeclStr(
const wxFuncXArray& , GetAXMethods(),
"Returns a sequence of FuncX objects describing the methods
-available for this ActiveX object.");
+available for this ActiveX object.", "");
DocDeclStr(
const wxPropXArray& , GetAXProperties(),
"Returns a sequence of PropX objects describing the properties
-available for this ActiveX object.");
+available for this ActiveX object.", "");
DocDeclStr(
void , SetAXProp(const wxString& name, PyObject* value),
- "Set a property of the ActiveX object by name.");
+ "Set a property of the ActiveX object by name.", "");
DocDeclStr(
PyObject* , GetAXProp(const wxString& name),
- "Get the value of an ActiveX property by name.");
+ "Get the value of an ActiveX property by name.", "");
%nokwargs _CallAXMethod;
DocDeclStr(
PyObject* , _CallAXMethod(const wxString& name, PyObject* args),
"The implementation for CallMethod. Calls an ActiveX method, by
-name passing the parameters given in args.");
+name passing the parameters given in args.", "");
%pythoncode {
def CallAXMethod(self, name, *args):
"""
DocDeclStr(
wxEventType , RegisterActiveXEvent(const wxString& eventName),
- "Creates a standard wx event ID for the given eventName.");
+ "Creates a standard wx event ID for the given eventName.", "");
ActiveX events. Any event parameters from the ActiveX cntrol are
turned into attributes of the Python proxy for this event object.
Additionally, there is a property called eventName that will
-return (suprizingly <wink>) the name of the ActiveX event.");
+return (surprisingly <wink>) the name of the ActiveX event.", "");
class wxActiveXEvent : public wxCommandEvent
{
wxString EventName();
%extend {
- DocStr(_preInit,
-"This is called by the EventThunker before calling the handler.
-We'll convert and load the ActiveX event parameters into
-attributes of the Python event object.");
- void _preInit(PyObject* pyself) {
- wxPyBeginBlockThreads();
+
+ // This is called by the EventThunker before calling the
+ // handler. We'll convert and load the ActiveX event parameters into
+ // attributes of the Python event object.
+ void _preCallInit(PyObject* pyself) {
+ wxPyBlock_t blocked = wxPyBeginBlockThreads();
PyObject* pList = PyList_New(0);
PyObject_SetAttrString(pyself, "paramList", pList);
Py_DECREF(pList);
for (int i=0; i<self->ParamCount(); i+=1) {
- PyObject* name = PyString_FromString((char*)self->ParamName(i).mb_str());
- PyObject* val = _Variant2PyObj((*self)[i], True);
+ PyObject* name = PyString_FromString((char*)(const char*)self->ParamName(i).mb_str());
+ PyObject* val = _Variant2PyObj((*self)[i], true);
PyObject_SetAttr(pyself, name, val);
PyList_Append(pList, name);
Py_DECREF(val);
Py_DECREF(name);
}
- wxPyEndBlockThreads();
+ wxPyEndBlockThreads(blocked);
+ }
+
+ // This one is called by the EventThunker after calling the
+ // handler. It reloads any "out" parameters from the python attributes
+ // back into the wxVariant they came from.
+ void _postCallCleanup(PyObject* pyself) {
+ wxPyBlock_t blocked = wxPyBeginBlockThreads();
+ for (int i=0; i<self->ParamCount(); i+=1) {
+ PyObject* val = PyObject_GetAttrString(
+ pyself, (char*)(const char*)self->ParamName(i).mb_str());
+ _PyObj2Variant(val, (*self)[i]);
+ Py_DECREF(val);
+ }
+ wxPyEndBlockThreads(blocked);
}
+
+
}
};
if (value == Py_None)
return rval;
+#if PYTHON_API_VERSION >= 1012 // Python 2.3+
else if (PyBool_Check(value))
rval = (value == Py_True) ? true : false;
-
+#endif
+
else if (PyInt_Check(value))
rval = PyInt_AS_LONG(value);
// TODO: PyList of strings --> wxArrayString
// wxDateTime
// list of objects
+ // etc.
else {
PyErr_SetString(PyExc_TypeError, "Unsupported object type in _PyObj2Variant");
return rval;
}
+// This one uses the type of the variant to try and force the conversion
+bool _PyObj2Variant(PyObject* value, wxVariant& wv)
+{
+ wxString type = wv.GetType();
+
+ if ( type == _T("long") || type == _T("bool") || type == _T("char") )
+ wv = PyInt_AsLong(value);
+
+ else if ( type == _T("string") )
+ wv = Py2wxString(value);
+
+ else if ( type == _T("double") )
+ wv = PyFloat_AsDouble(value);
+
+ else {
+ // it's some other type that we dont' handle yet. Log it?
+ return false;
+ }
+ return true;
+}
// Caller should already have the GIL!
PyObject* _Variant2PyObj(wxVariant& value, bool useNone)
else if (value.IsType(_T("double")))
rval = PyFloat_FromDouble(value);
- else if (value.IsType(_T("bool")))
- rval = PyBool_FromLong((bool)value);
+ else if (value.IsType(_T("bool"))) {
+ rval = (bool)value ? Py_True : Py_False;
+ Py_INCREF(rval);
+ }
else if (value.IsType(_T("string")))
rval = wx2PyString(value);
%{
-// A class derived from out wxActiveXWindow for the IE WebBrowser
+// A class derived from our wxActiveXWindow for the IE WebBrowser
// control that will serve as a base class for a Python
// implementation. This is done so we can "eat our own dog food"
// and use a class at least mostly generated by genaxmodule, but
private:
wxAutoOleInterface<IWebBrowser2> m_webBrowser;
+ DECLARE_ABSTRACT_CLASS(wxIEHtmlWindowBase);
+
public:
wxIEHtmlWindowBase ( wxWindow* parent, const CLSID& clsId, wxWindowID id = -1,
// need to prepend this as poxy MSHTML will not recognise a HTML comment
// as starting a html document and treats it as plain text
// Does nayone know how to force it to html mode ?
- pstrm->prepend = "<html>";
+#if wxUSE_UNICODE
+ // TODO: What to do in this case???
+#else
+ pstrm->prepend = _T("<html>");
+#endif
// strip leading whitespace as it can confuse MSHTML
wxAutoOleInterface<IStream> strm(pstrm);
// return ! m_bAmbientUserMode;
// };
};
+
+IMPLEMENT_ABSTRACT_CLASS( wxIEHtmlWindowBase, wxActiveXWindow );
+
%}
%feature("noautodoc") wxIEHtmlWindowBase::GetText;
+MustHaveApp(wxIEHtmlWindowBase);
+
class wxIEHtmlWindowBase : public wxActiveXWindow {
public:
+ %pythonAppend wxIEHtmlWindowBase "self._setOORInfo(self)"
wxIEHtmlWindowBase ( wxWindow* parent, const CLSID& clsId, wxWindowID id = -1,
const wxPoint& pos = wxDefaultPosition,