Allow wxApp::MacOpenFile, MacPrintFile, MacNewFile, and MacReopenApp

to be overridden in Python.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26164 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2004-03-10 03:19:51 +00:00
parent ec656cfe29
commit 26eac43ed1
3 changed files with 78 additions and 32 deletions

View File

@@ -80,6 +80,9 @@ Updated wx.lib.calendar with many fixes and enhancements from Joerg
Added wx.Display and wx.VideoMode. Added wx.Display and wx.VideoMode.
AppleEvents can be handled by overriding wx.App methods MacOpenFile,
MacPrintFile, MacNewFile, and MacReopenApp.

View File

@@ -579,6 +579,11 @@ public:
#endif #endif
// virtual int FilterEvent(wxEvent& event); // This one too???? // virtual int FilterEvent(wxEvent& event); // This one too????
// For catching Apple Events
virtual void MacOpenFile(const wxString &fileName);
virtual void MacPrintFile(const wxString &fileName);
virtual void MacNewFile();
virtual void MacReopenApp();
static bool GetMacSupportPCMenuShortcuts(); static bool GetMacSupportPCMenuShortcuts();
static long GetMacAboutMenuItemId(); static long GetMacAboutMenuItemId();

View File

@@ -137,7 +137,7 @@ int wxPyApp::MainLoop() {
bool wxPyApp::OnInitGui() { bool wxPyApp::OnInitGui() {
bool rval=True; bool rval=True;
wxApp::OnInitGui(); // in this case always call the base class version wxApp::OnInitGui(); // in this case always call the base class version
wxPyBeginBlockThreads(); wxPyBeginBlockThreads();
if (wxPyCBH_findCallback(m_myInst, "OnInitGui")) if (wxPyCBH_findCallback(m_myInst, "OnInitGui"))
rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("()"));
wxPyEndBlockThreads(); wxPyEndBlockThreads();
@@ -174,8 +174,8 @@ void wxPyApp::OnAssert(const wxChar *file,
} }
wxLogDebug(buf); wxLogDebug(buf);
return; return;
} }
// If the OnAssert is overloaded in the Python class then call it... // If the OnAssert is overloaded in the Python class then call it...
bool found; bool found;
wxPyBeginBlockThreads(); wxPyBeginBlockThreads();
@@ -244,6 +244,44 @@ void wxPyApp::OnAssert(const wxChar *file,
} }
#endif #endif
// For catching Apple Events
void wxPyApp::MacOpenFile(const wxString &fileName)
{
wxPyBeginBlockThreads();
if (wxPyCBH_findCallback(m_myInst, "MacOpenFile")) {
PyObject* s = wx2PyString(fileName);
wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", s));
Py_DECREF(s);
}
wxPyEndBlockThreads();
}
void wxPyApp::MacPrintFile(const wxString &fileName)
{
wxPyBeginBlockThreads();
if (wxPyCBH_findCallback(m_myInst, "MacPrintFile")) {
PyObject* s = wx2PyString(fileName);
wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", s));
Py_DECREF(s);
}
wxPyEndBlockThreads();
}
void wxPyApp::MacNewFile()
{
wxPyBeginBlockThreads();
if (wxPyCBH_findCallback(m_myInst, "MacNewFile"))
wxPyCBH_callCallback(m_myInst, Py_BuildValue("()"));
wxPyEndBlockThreads();
}
void wxPyApp::MacReopenApp()
{
wxPyBeginBlockThreads();
if (wxPyCBH_findCallback(m_myInst, "MacReopenApp"))
wxPyCBH_callCallback(m_myInst, Py_BuildValue("()"));
wxPyEndBlockThreads();
}
/*static*/ /*static*/
@@ -334,8 +372,8 @@ void wxPyApp::_BootstrapApp()
bool result; bool result;
PyObject* retval = NULL; PyObject* retval = NULL;
PyObject* pyint = NULL; PyObject* pyint = NULL;
// Get any command-line args passed to this program from the sys module // Get any command-line args passed to this program from the sys module
int argc = 0; int argc = 0;
char** argv = NULL; char** argv = NULL;
@@ -355,7 +393,7 @@ void wxPyApp::_BootstrapApp()
result = wxEntryStart(argc, argv); result = wxEntryStart(argc, argv);
delete [] argv; delete [] argv;
wxPyBeginBlockThreads(); wxPyBeginBlockThreads();
if (! result) { if (! result) {
PyErr_SetString(PyExc_SystemError, "wxEntryStart failed!"); PyErr_SetString(PyExc_SystemError, "wxEntryStart failed!");
@@ -368,9 +406,9 @@ void wxPyApp::_BootstrapApp()
// It's now ok to generate exceptions for assertion errors. // It's now ok to generate exceptions for assertion errors.
wxPythonApp->SetStartupComplete(True); wxPythonApp->SetStartupComplete(True);
// Call the Python wxApp's OnInit function // Call the Python wxApp's OnInit function
if (wxPyCBH_findCallback(m_myInst, "OnInit")) { if (wxPyCBH_findCallback(m_myInst, "OnInit")) {
PyObject* method = m_myInst.GetLastFound(); PyObject* method = m_myInst.GetLastFound();
PyObject* argTuple = PyTuple_New(0); PyObject* argTuple = PyTuple_New(0);
@@ -379,8 +417,8 @@ void wxPyApp::_BootstrapApp()
Py_DECREF(method); Py_DECREF(method);
if (retval == NULL) if (retval == NULL)
goto error; goto error;
pyint = PyNumber_Int(retval); pyint = PyNumber_Int(retval);
if (! pyint) { if (! pyint) {
PyErr_SetString(PyExc_TypeError, "OnInit should return a boolean value"); PyErr_SetString(PyExc_TypeError, "OnInit should return a boolean value");
goto error; goto error;
@@ -391,8 +429,8 @@ void wxPyApp::_BootstrapApp()
// Is it okay if there is no OnInit? Probably so... // Is it okay if there is no OnInit? Probably so...
result = True; result = True;
} }
if (! result) { if (! result) {
PyErr_SetString(PyExc_SystemExit, "OnInit returned False, exiting..."); PyErr_SetString(PyExc_SystemExit, "OnInit returned False, exiting...");
} }
@@ -400,7 +438,7 @@ void wxPyApp::_BootstrapApp()
error: error:
Py_XDECREF(retval); Py_XDECREF(retval);
Py_XDECREF(pyint); Py_XDECREF(pyint);
wxPyEndBlockThreads(); wxPyEndBlockThreads();
}; };
@@ -587,7 +625,7 @@ bool wxPySwigInstance_Check(PyObject* obj) {
PyObject* __wxPyFixStockObjects(PyObject* /* self */, PyObject* args) PyObject* __wxPyFixStockObjects(PyObject* /* self */, PyObject* args)
{ {
wxPy_ReinitStockObjects(2); wxPy_ReinitStockObjects(2);
RETURN_NONE(); RETURN_NONE();
} }
@@ -596,7 +634,7 @@ static void rsoPass2(const char* name)
{ {
static PyObject* unbornObjectClass = NULL; static PyObject* unbornObjectClass = NULL;
PyObject* obj; PyObject* obj;
if (unbornObjectClass == NULL) { if (unbornObjectClass == NULL) {
unbornObjectClass = PyDict_GetItemString(wxPython_dict, "_wxPyUnbornObject"); unbornObjectClass = PyDict_GetItemString(wxPython_dict, "_wxPyUnbornObject");
Py_INCREF(unbornObjectClass); Py_INCREF(unbornObjectClass);
@@ -609,7 +647,7 @@ static void rsoPass2(const char* name)
// Change its class // Change its class
PyObject_SetAttrString(obj, "__class__", unbornObjectClass); PyObject_SetAttrString(obj, "__class__", unbornObjectClass);
} }
static void rsoPass3(const char* name, const char* classname, void* ptr) static void rsoPass3(const char* name, const char* classname, void* ptr)
@@ -620,17 +658,17 @@ static void rsoPass3(const char* name, const char* classname, void* ptr)
// Find the object instance // Find the object instance
obj = PyDict_GetItemString(wxPython_dict, (char*)dropwx(name)); obj = PyDict_GetItemString(wxPython_dict, (char*)dropwx(name));
wxCHECK_RET(obj != NULL, wxT("Unable to find stock object")); wxCHECK_RET(obj != NULL, wxT("Unable to find stock object"));
wxCHECK_RET(wxPySwigInstance_Check(obj), wxT("Not a swig instance")); wxCHECK_RET(wxPySwigInstance_Check(obj), wxT("Not a swig instance"));
// Find the class object and put it back in the instance // Find the class object and put it back in the instance
classobj = PyDict_GetItemString(wxPython_dict, (char*)dropwx(classname)); classobj = PyDict_GetItemString(wxPython_dict, (char*)dropwx(classname));
wxCHECK_RET(classobj != NULL, wxT("Unable to find stock class object")); wxCHECK_RET(classobj != NULL, wxT("Unable to find stock class object"));
PyObject_SetAttrString(obj, "__class__", classobj); PyObject_SetAttrString(obj, "__class__", classobj);
// Rebuild the .this swigified pointer with the new value of the C++ pointer // Rebuild the .this swigified pointer with the new value of the C++ pointer
ptrobj = wxPyMakeSwigPtr(ptr, wxString(classname, *wxConvCurrent)); ptrobj = wxPyMakeSwigPtr(ptr, wxString(classname, *wxConvCurrent));
PyObject_SetAttrString(obj, "this", ptrobj); PyObject_SetAttrString(obj, "this", ptrobj);
Py_DECREF(ptrobj); Py_DECREF(ptrobj);
} }
@@ -774,10 +812,10 @@ void wxPyOORClientData_dtor(wxPyOORClientData* self) {
if (PyErr_Occurred()) if (PyErr_Occurred())
PyErr_Clear(); // just ignore it for now PyErr_Clear(); // just ignore it for now
PyObject* dict = PyObject_GetAttrString(self->m_obj, "__dict__"); PyObject* dict = PyObject_GetAttrString(self->m_obj, "__dict__");
if (dict) { if (dict) {
// Clear the instance's dictionary // Clear the instance's dictionary
PyDict_Clear(dict); PyDict_Clear(dict);
// put the name of the old class into the instance, and then reset the // put the name of the old class into the instance, and then reset the
@@ -1660,7 +1698,7 @@ PyObject* wxPy_ConvertList(wxListBase* listbase) {
pyList = PyList_New(0); pyList = PyList_New(0);
while (node) { while (node) {
wxObj = node->GetData(); wxObj = node->GetData();
pyObj = wxPyMake_wxObject(wxObj); pyObj = wxPyMake_wxObject(wxObj);
PyList_Append(pyList, pyObj); PyList_Append(pyList, pyObj);
node = node->GetNext(); node = node->GetNext();
} }
@@ -1675,7 +1713,7 @@ long wxPyGetWinHandle(wxWindow* win) {
#ifdef __WXMSW__ #ifdef __WXMSW__
return (long)win->GetHandle(); return (long)win->GetHandle();
#endif #endif
// Find and return the actual X-Window. // Find and return the actual X-Window.
#ifdef __WXGTK__ #ifdef __WXGTK__
if (win->m_wxwindow) { if (win->m_wxwindow) {
@@ -1689,11 +1727,11 @@ long wxPyGetWinHandle(wxWindow* win) {
#endif #endif
} }
#endif #endif
#ifdef __WXMAC__ #ifdef __WXMAC__
return (long)MAC_WXHWND(win->MacGetRootWindow()); return (long)MAC_WXHWND(win->MacGetRootWindow());
#endif #endif
return 0; return 0;
} }
@@ -2214,7 +2252,7 @@ bool wxPy4int_seq_helper(PyObject* source, int* i1, int* i2, int* i3, int* i4) {
bool wxPySimple_typecheck(PyObject* source, const wxChar* classname, int seqLen) bool wxPySimple_typecheck(PyObject* source, const wxChar* classname, int seqLen)
{ {
void* ptr; void* ptr;
if (wxPySwigInstance_Check(source) && if (wxPySwigInstance_Check(source) &&
wxPyConvertSwigPtr(source, (void **)&ptr, classname)) wxPyConvertSwigPtr(source, (void **)&ptr, classname))
return True; return True;
@@ -2222,9 +2260,9 @@ bool wxPySimple_typecheck(PyObject* source, const wxChar* classname, int seqLen)
PyErr_Clear(); PyErr_Clear();
if (PySequence_Check(source) && PySequence_Length(source) == seqLen) if (PySequence_Check(source) && PySequence_Length(source) == seqLen)
return True; return True;
return False; return False;
} }
bool wxSize_helper(PyObject* source, wxSize** obj) bool wxSize_helper(PyObject* source, wxSize** obj)
{ {
@@ -2253,7 +2291,7 @@ bool wxRealPoint_helper(PyObject* source, wxRealPoint** obj) {
**obj = wxRealPoint(-1,-1); **obj = wxRealPoint(-1,-1);
return True; return True;
} }
// If source is an object instance then it may already be the right type // If source is an object instance then it may already be the right type
if (wxPySwigInstance_Check(source)) { if (wxPySwigInstance_Check(source)) {
wxRealPoint* ptr; wxRealPoint* ptr;
@@ -2394,8 +2432,8 @@ bool wxColour_typecheck(PyObject* source) {
if (PyString_Check(source) || PyUnicode_Check(source)) if (PyString_Check(source) || PyUnicode_Check(source))
return True; return True;
return False; return False;
} }
@@ -2406,7 +2444,7 @@ bool wxPoint2D_helper(PyObject* source, wxPoint2D** obj) {
**obj = wxPoint2D(-1,-1); **obj = wxPoint2D(-1,-1);
return True; return True;
} }
// If source is an object instance then it may already be the right type // If source is an object instance then it may already be the right type
if (wxPySwigInstance_Check(source)) { if (wxPySwigInstance_Check(source)) {
wxPoint2D* ptr; wxPoint2D* ptr;