aboutsummaryrefslogtreecommitdiffstats
path: root/lib/wx/c_src
diff options
context:
space:
mode:
Diffstat (limited to 'lib/wx/c_src')
-rw-r--r--lib/wx/c_src/wxePrintout.cpp254
-rw-r--r--lib/wx/c_src/wxe_impl.cpp11
-rw-r--r--lib/wx/c_src/wxe_impl.h8
3 files changed, 149 insertions, 124 deletions
diff --git a/lib/wx/c_src/wxePrintout.cpp b/lib/wx/c_src/wxePrintout.cpp
index ea1c76edcc..1bcbc5f1a4 100644
--- a/lib/wx/c_src/wxePrintout.cpp
+++ b/lib/wx/c_src/wxePrintout.cpp
@@ -1,41 +1,62 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2008-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2008-2011. All Rights Reserved.
+ *
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
* compliance with the License. You should have received a copy of the
* Erlang Public License along with this software. If not, it can be
* retrieved online at http://www.erlang.org/.
- *
+ *
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
- *
- * %CopyrightEnd%
+ *
+ * %CopyrightEnd%
*/
#include <wx/wx.h>
#include "wxe_impl.h"
#include "wxe_return.h"
+#include "gen/wxe_macros.h"
+#include "gen/wxe_derived_dest.h"
/* *****************************************************************/
/* Special Class impls */
+#define INVOKE_CALLBACK_INIT(port, callback, class_str) \
+ { \
+ wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(port); \
+ wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false); \
+ rt.addInt(callback); \
+ rt.addRef(((WxeApp *) wxTheApp)->getRef((void *)this, memenv), class_str);
+
+#define INVOKE_CALLBACK_END(port, args) \
+ rt.endList(1 + (args)); \
+ rt.addAtom("_wx_invoke_cb_"); \
+ rt.addTupleCount(3); \
+ rt.send(); \
+ handle_callback_batch(port); \
+ }
+
+#define INVOKE_CALLBACK(port, callback, class_str) \
+ INVOKE_CALLBACK_INIT(port, callback, class_str); \
+ INVOKE_CALLBACK_END(port, 0)
+/* *****************************************************************/
/* Printing special */
wxEPrintout::~wxEPrintout() {
- clear_cb(onPrintPage);
- clear_cb(onPreparePrinting);
- clear_cb(onBeginPrinting);
- clear_cb(onEndPrinting);
- clear_cb(onBeginDocument);
- clear_cb(onEndDocument);
- clear_cb(hasPage);
- clear_cb(getPageInfo);
+ clear_cb(port, onPrintPage);
+ clear_cb(port, onPreparePrinting);
+ clear_cb(port, onBeginPrinting);
+ clear_cb(port, onEndPrinting);
+ clear_cb(port, onBeginDocument);
+ clear_cb(port, onEndDocument);
+ clear_cb(port, hasPage);
+ clear_cb(port, getPageInfo);
((WxeApp *)wxTheApp)->clearPtr(this);
}
@@ -43,73 +64,42 @@ wxEPrintout::~wxEPrintout() {
bool wxEPrintout::OnBeginDocument(int startPage, int endPage)
{
if(onBeginDocument) {
- wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(port);
- char * bp = ((WxeApp *) wxTheApp)->cb_buff;
-
- wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
- rt.addInt(onBeginDocument);
- rt.addRef(((WxeApp *) wxTheApp)->getRef((void *)this, memenv), "wxPrintout");
+ INVOKE_CALLBACK_INIT(port, onBeginDocument, "wxPrintout");
rt.addInt(startPage);
rt.addInt(endPage);
- rt.endList(3);
- rt.addAtom("_wx_invoke_cb_");
- rt.addTupleCount(3);
- rt.send();
- handle_callback_batch(port);
- return *(int*) bp;
- } else {
- return wxPrintout::OnBeginDocument(startPage,endPage);
- }
+ INVOKE_CALLBACK_END(port, 2);
+ if(((WxeApp *) wxTheApp)->cb_len > 0) {
+ char * bp = ((WxeApp *) wxTheApp)->cb_buff;
+ return *(int*) bp;
+ }
+ }
+ return wxPrintout::OnBeginDocument(startPage,endPage);
}
-void wxEPrintout::OnEndDocument()
+void wxEPrintout::OnEndDocument()
{
if(onEndDocument) {
- wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(port);
- wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
- rt.addInt(onEndDocument);
- rt.addRef(((WxeApp *) wxTheApp)->getRef((void *)this, memenv), "wxPrintout");
- rt.endList(1);
- rt.addAtom("_wx_invoke_cb_");
- rt.addTupleCount(3);
- rt.send();
- handle_callback_batch(port);
+ INVOKE_CALLBACK(port, onEndDocument, "wxPrintout");
} else {
wxPrintout::OnEndDocument();
- }
+ }
}
-void wxEPrintout::OnBeginPrinting()
+void wxEPrintout::OnBeginPrinting()
{
if(onBeginPrinting) {
- wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(port);
- wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
- rt.addInt(onBeginPrinting);
- rt.addRef(((WxeApp *) wxTheApp)->getRef((void *)this, memenv), "wxPrintout");
- rt.endList(1);
- rt.addAtom("_wx_invoke_cb_");
- rt.addTupleCount(3);
- rt.send();
- handle_callback_batch(port);
+ INVOKE_CALLBACK(port, onBeginPrinting, "wxPrintout");
} else {
wxPrintout::OnBeginPrinting();
- }
+ }
}
-void wxEPrintout::OnEndPrinting()
+void wxEPrintout::OnEndPrinting()
{
if(onEndPrinting) {
- wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(port);
- wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
- rt.addInt(onEndPrinting);
- rt.addRef(((WxeApp *) wxTheApp)->getRef((void *)this, memenv), "wxPrintout");
- rt.endList(1);
- rt.addAtom("_wx_invoke_cb_");
- rt.addTupleCount(3);
- rt.send();
- handle_callback_batch(port);
+ INVOKE_CALLBACK(port, onEndPrinting, "wxPrintout");
} else {
wxPrintout::OnEndPrinting();
}
@@ -119,92 +109,120 @@ void wxEPrintout::OnPreparePrinting()
{
if(onPreparePrinting) {
- wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(port);
- wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
- rt.addInt(onPreparePrinting);
- rt.addRef(((WxeApp *) wxTheApp)->getRef((void *)this, memenv), "wxPrintout");
- rt.endList(1);
- rt.addAtom("_wx_invoke_cb_");
- rt.addTupleCount(3);
- rt.send();
- handle_callback_batch(port);
+ INVOKE_CALLBACK(port, onPreparePrinting, "wxPrintout");
} else {
wxPrintout::OnPreparePrinting();
- }
+ }
}
-bool wxEPrintout::HasPage(int page)
+bool wxEPrintout::HasPage(int page)
{
if(hasPage) {
- wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(port);
- wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
- rt.addInt(hasPage);
- rt.addRef(((WxeApp *) wxTheApp)->getRef((void *)this, memenv), "wxPrintout");
+ INVOKE_CALLBACK_INIT(port, hasPage, "wxPrintout");
rt.addInt(page);
- rt.endList(2);
- rt.addAtom("_wx_invoke_cb_");
- rt.addTupleCount(3);
- rt.send();
- char * bp = ((WxeApp *) wxTheApp)->cb_buff;
- handle_callback_batch(port);
- return *(int*) bp;
- } else {
- return wxPrintout::HasPage(page);
- }
+ INVOKE_CALLBACK_END(port, 1);
+ if(((WxeApp *) wxTheApp)->cb_len > 0) {
+ char * bp = ((WxeApp *) wxTheApp)->cb_buff;
+ return *(int*) bp;
+ }
+ }
+ return wxPrintout::HasPage(page);
}
bool wxEPrintout::OnPrintPage(int page)
{
- wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(port);
- wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
- rt.addInt(onPrintPage);
- rt.addRef(((WxeApp *) wxTheApp)->getRef((void *)this, memenv), "wxPrintout");
+ INVOKE_CALLBACK_INIT(port, onPrintPage, "wxPrintout");
rt.addInt(page);
- rt.endList(2);
- rt.addAtom("_wx_invoke_cb_");
- rt.addTupleCount(3);
- rt.send();
- handle_callback_batch(port);
- //fprintf(stderr,"%d ", __LINE__);handle_callback_batch(port); fprintf(stderr,"%d\r\n", __LINE__);
- char * bp = ((WxeApp *) wxTheApp)->cb_buff;
- return *(int*) bp;
+ INVOKE_CALLBACK_END(port, 1);
+ if(((WxeApp *) wxTheApp)->cb_len > 0) {
+ char * bp = ((WxeApp *) wxTheApp)->cb_buff;
+ return *(int*) bp;
+ }
+ return FALSE;
}
-
+
void wxEPrintout::GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo)
{
if(getPageInfo) {
- wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(port);
- wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
- rt.addInt(getPageInfo);
- rt.addRef(((WxeApp *) wxTheApp)->getRef((void *)this, memenv), "wxPrintout");
- rt.endList(1);
- rt.addAtom("_wx_invoke_cb_");
- rt.addTupleCount(3);
- rt.send();
- handle_callback_batch(port);
- //fprintf(stderr,"%d ", __LINE__);handle_callback_batch(port); fprintf(stderr,"%d\r\n", __LINE__);
+ INVOKE_CALLBACK(port, getPageInfo, "wxPrintout");
+ if(((WxeApp *) wxTheApp)->cb_len > 0) {
+ char * bp = ((WxeApp *) wxTheApp)->cb_buff;
+ *minPage = *(int *) bp; bp += 4;
+ *maxPage = *(int *) bp; bp += 4;
+ *pageFrom = *(int *) bp; bp += 4;
+ *pageTo = *(int *) bp; bp += 4;
+ }
+ }
+ wxPrintout::GetPageInfo(minPage, maxPage, pageFrom, pageTo);
+}
+
+/* *****************************************************************/
+// ListCtrl with callbacks for VIRTUAL_TABLES
+
+wxString EwxListCtrl::OnGetItemText(long item, long col) const {
+ if(onGetItemText) {
+ INVOKE_CALLBACK_INIT(port, onGetItemText, "wxListCtrl");
+ rt.addInt(item);
+ rt.addInt(col);
+ INVOKE_CALLBACK_END(port, 2);
+ if(((WxeApp *) wxTheApp)->cb_len > 0) {
+ char * bp = ((WxeApp *) wxTheApp)->cb_buff;
+ wxString str = wxString(bp, wxConvUTF8);
+ return str;
+ }
+ }
+ return wxT("OnGetItemText not correctly defined");
+}
+wxListItemAttr* EwxListCtrl::OnGetItemAttr(long item) const {
+ if(onGetItemAttr) {
+ INVOKE_CALLBACK_INIT(port, onGetItemAttr, "wxListCtrl");
+ rt.addInt(item);
+ INVOKE_CALLBACK_END(port, 1);
char * bp = ((WxeApp *) wxTheApp)->cb_buff;
- *minPage = *(int *) bp; bp += 4;
- *maxPage = *(int *) bp; bp += 4;
- *pageFrom = *(int *) bp; bp += 4;
- *pageTo = *(int *) bp; bp += 4;
- } else {
- wxPrintout::GetPageInfo(minPage, maxPage, pageFrom, pageTo);
+ wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(port);
+ if(((WxeApp *) wxTheApp)->cb_len > 0) {
+ return (wxListItemAttr *) ((WxeApp *) wxTheApp)->getPtr(bp, memenv);
+ }
+ }
+ return NULL;
+}
+
+int EwxListCtrl::OnGetItemImage(long item) const {
+ return OnGetItemColumnImage(item, 0);
+}
+
+int EwxListCtrl::OnGetItemColumnImage(long item, long col) const {
+ if(onGetItemColumnImage) {
+ INVOKE_CALLBACK_INIT(port, onGetItemColumnImage, "wxListCtrl");
+ rt.addInt(item);
+ rt.addInt(col);
+ INVOKE_CALLBACK_END(port, 2);
+ if(((WxeApp *) wxTheApp)->cb_len > 0) {
+ char * bp = ((WxeApp *) wxTheApp)->cb_buff;
+ return *(int *) bp;
+ }
}
+ return -1;
+}
+
+EwxListCtrl::~EwxListCtrl() {
+ clear_cb(port, onGetItemText);
+ clear_cb(port, onGetItemAttr);
+ clear_cb(port, onGetItemColumnImage);
+ ((WxeApp *)wxTheApp)->clearPtr(this);
}
+// tools
-void wxEPrintout::clear_cb(int callback)
+void clear_cb(ErlDrvPort port, int callback)
{
if(callback > 0) {
wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(port);
wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
- // NOTE: Remove this later when changing from funs to gen_server
rt.addAtom("wx_delete_cb");
rt.addInt(callback);
rt.addTupleCount(2);
rt.send();
}
}
-
diff --git a/lib/wx/c_src/wxe_impl.cpp b/lib/wx/c_src/wxe_impl.cpp
index 365fb691a1..897c2b7cca 100644
--- a/lib/wx/c_src/wxe_impl.cpp
+++ b/lib/wx/c_src/wxe_impl.cpp
@@ -395,6 +395,7 @@ int WxeApp::dispatch(wxList * batch, int blevel, int list_type)
// erl_drv_mutex_unlock(wxe_batch_locker_m); should be called after
// whatever cleaning is necessary
memcpy(cb_buff, event->buffer, event->len);
+ cb_len = event->len;
return blevel;
default:
erl_drv_mutex_unlock(wxe_batch_locker_m);
@@ -448,6 +449,7 @@ void WxeApp::dispatch_cb(wxList * batch, wxList * temp, ErlDrvTermData process)
break;
case WXE_CB_RETURN:
memcpy(cb_buff, event->buffer, event->len);
+ cb_len = event->len;
callback_returned = 1;
return;
case WXE_CB_START:
@@ -893,8 +895,6 @@ int wxCALLBACK wxEListCtrlCompare(long item1, long item2, long callbackInfoPtr)
{
callbackInfo * cb = (callbackInfo *)callbackInfoPtr;
wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(cb->port);
- char * bp = ((WxeApp *) wxTheApp)->cb_buff;
-
wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
rt.addInt(cb->callbackID);
rt.addInt(item1);
@@ -904,5 +904,10 @@ int wxCALLBACK wxEListCtrlCompare(long item1, long item2, long callbackInfoPtr)
rt.addTupleCount(3);
rt.send();
handle_callback_batch(cb->port);
- return *(int*) bp;
+
+ if(((WxeApp *) wxTheApp)->cb_len > 0) {
+ char * bp = ((WxeApp *) wxTheApp)->cb_buff;
+ return *(int*) bp;
+ } else
+ return 0;
}
diff --git a/lib/wx/c_src/wxe_impl.h b/lib/wx/c_src/wxe_impl.h
index 39c02f8c1a..dd872745be 100644
--- a/lib/wx/c_src/wxe_impl.h
+++ b/lib/wx/c_src/wxe_impl.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2011. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -179,6 +179,7 @@ public:
// Temp container for callbacks
char cb_buff[256];
+ int cb_len;
};
class wxETreeItemData : public wxTreeItemData
@@ -232,8 +233,6 @@ class wxEPrintout : public wxPrintout
bool OnPrintPage(int page);
void GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo);
- void clear_cb(int callback);
-
int onPrintPage;
int onPreparePrinting;
int onBeginPrinting;
@@ -246,6 +245,9 @@ class wxEPrintout : public wxPrintout
ErlDrvPort port;
};
+void clear_cb(ErlDrvPort port, int callback);
+
+
// Implementation of wxListCtrlCompare
struct callbackInfo {
ErlDrvPort port;