]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/datavcmn.cpp
don't stop on NULs in Replace()
[wxWidgets.git] / src / common / datavcmn.cpp
index 63a90366569cbd959b85ed199b82e19c12e3cb52..7f85194b9bc8065dff598ef1a550bd75f2378861 100644 (file)
 #if wxUSE_DATAVIEWCTRL
 
 #include "wx/dataview.h"
-
 #include "wx/spinctrl.h"
 
+#include "wx/weakref.h"
+
 #ifndef WX_PRECOMP
     #include "wx/dc.h"
     #include "wx/settings.h"
@@ -658,7 +659,11 @@ wxDataViewRendererBase::wxDataViewRendererBase( const wxString &varianttype,
                                                 int WXUNUSED(align) )
 {
     m_variantType = varianttype;
-    m_editorCtrl = NULL;
+    m_owner = NULL;
+}
+
+wxDataViewRendererBase::~wxDataViewRendererBase()
+{
 }
 
 const wxDataViewCtrl* wxDataViewRendererBase::GetView() const
@@ -666,6 +671,17 @@ const wxDataViewCtrl* wxDataViewRendererBase::GetView() const
     return wx_const_cast(wxDataViewRendererBase*, this)->GetOwner()->GetOwner();
 }
 
+class wxKillRef: public wxWindowRef
+{       
+public: 
+   wxKillRef( wxWindow *win ) : wxWindowRef( win ) { }
+   virtual void OnObjectDestroy()
+   {
+      get()->PopEventHandler( true );
+      delete this;
+   }
+};
+
 bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect labelRect )
 {
     m_item = item; // remember for later
@@ -675,6 +691,7 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la
     GetOwner()->GetOwner()->GetModel()->GetValue( value, item, col );
 
     m_editorCtrl = CreateEditorCtrl( GetOwner()->GetOwner()->GetMainWindow(), labelRect, value );
+    (void) new wxKillRef( m_editorCtrl.get() );
 
     wxDataViewEditorCtrlEvtHandler *handler =
         new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this );
@@ -699,11 +716,10 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la
 
 void wxDataViewRendererBase::CancelEditing()
 {
-    wxPendingDelete.Append( m_editorCtrl );
-
     GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
-
-    // m_editorCtrl->PopEventHandler( true );
+    
+    m_editorCtrl->Hide();
+    wxPendingDelete.Append( m_editorCtrl );
 }
 
 bool wxDataViewRendererBase::FinishEditing()
@@ -711,10 +727,11 @@ bool wxDataViewRendererBase::FinishEditing()
     wxVariant value;
     GetValueFromEditorCtrl( m_editorCtrl, value );
 
-    wxPendingDelete.Append( m_editorCtrl );
-
     GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
 
+    m_editorCtrl->Hide();
+    wxPendingDelete.Append( m_editorCtrl );
+    
     if (!Validate(value))
         return false;
 
@@ -722,8 +739,6 @@ bool wxDataViewRendererBase::FinishEditing()
     GetOwner()->GetOwner()->GetModel()->SetValue( value, m_item, col );
     GetOwner()->GetOwner()->GetModel()->ValueChanged( m_item, col );
 
-    // m_editorCtrl->PopEventHandler( true );
-
     // Now we should send Editing Done event
     wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, GetOwner()->GetOwner()->GetId() );
     event.SetDataViewColumn( GetOwner() );
@@ -914,7 +929,7 @@ wxDataViewCtrlBase::AppendTextColumn( const wxString &label, unsigned int model_
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewTextRenderer( wxT("string"), mode, (int)align ),
+        new wxDataViewTextRenderer( wxT("string"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -925,7 +940,7 @@ wxDataViewCtrlBase::AppendIconTextColumn( const wxString &label, unsigned int mo
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, (int)align ),
+        new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -937,7 +952,7 @@ wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, unsigned int mode
 {
 
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ),
+        new wxDataViewToggleRenderer( wxT("bool"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -948,7 +963,7 @@ wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, unsigned int mo
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ),
+        new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -959,7 +974,7 @@ wxDataViewCtrlBase::AppendDateColumn( const wxString &label, unsigned int model_
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ),
+        new wxDataViewDateRenderer( wxT("datetime"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -970,7 +985,7 @@ wxDataViewCtrlBase::AppendBitmapColumn( const wxString &label, unsigned int mode
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ),
+        new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -981,7 +996,7 @@ wxDataViewCtrlBase::AppendTextColumn( const wxBitmap &label, unsigned int model_
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewTextRenderer( wxT("string"), mode, (int)align ),
+        new wxDataViewTextRenderer( wxT("string"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -992,7 +1007,7 @@ wxDataViewCtrlBase::AppendIconTextColumn( const wxBitmap &label, unsigned int mo
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, (int)align ),
+        new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -1003,7 +1018,7 @@ wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap &label, unsigned int mode
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ),
+        new wxDataViewToggleRenderer( wxT("bool"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -1014,7 +1029,7 @@ wxDataViewCtrlBase::AppendProgressColumn( const wxBitmap &label, unsigned int mo
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ),
+        new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -1025,7 +1040,7 @@ wxDataViewCtrlBase::AppendDateColumn( const wxBitmap &label, unsigned int model_
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ),
+        new wxDataViewDateRenderer( wxT("datetime"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -1036,7 +1051,7 @@ wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap &label, unsigned int mode
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ),
+        new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode ),
         model_column, width, align, flags );
     AppendColumn( ret );
     return ret;
@@ -1047,7 +1062,7 @@ wxDataViewCtrlBase::PrependTextColumn( const wxString &label, unsigned int model
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewTextRenderer( wxT("string"), mode, (int)align ),
+        new wxDataViewTextRenderer( wxT("string"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;
@@ -1058,7 +1073,7 @@ wxDataViewCtrlBase::PrependIconTextColumn( const wxString &label, unsigned int m
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, (int)align ),
+        new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;
@@ -1070,7 +1085,7 @@ wxDataViewCtrlBase::PrependToggleColumn( const wxString &label, unsigned int mod
 {
 
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ),
+        new wxDataViewToggleRenderer( wxT("bool"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;
@@ -1081,7 +1096,7 @@ wxDataViewCtrlBase::PrependProgressColumn( const wxString &label, unsigned int m
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ),
+        new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;
@@ -1092,7 +1107,7 @@ wxDataViewCtrlBase::PrependDateColumn( const wxString &label, unsigned int model
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ),
+        new wxDataViewDateRenderer( wxT("datetime"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;
@@ -1103,7 +1118,7 @@ wxDataViewCtrlBase::PrependBitmapColumn( const wxString &label, unsigned int mod
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ),
+        new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;
@@ -1114,7 +1129,7 @@ wxDataViewCtrlBase::PrependTextColumn( const wxBitmap &label, unsigned int model
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewTextRenderer( wxT("string"), mode, (int)align ),
+        new wxDataViewTextRenderer( wxT("string"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;
@@ -1125,7 +1140,7 @@ wxDataViewCtrlBase::PrependIconTextColumn( const wxBitmap &label, unsigned int m
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, (int)align ),
+        new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;
@@ -1136,7 +1151,7 @@ wxDataViewCtrlBase::PrependToggleColumn( const wxBitmap &label, unsigned int mod
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ),
+        new wxDataViewToggleRenderer( wxT("bool"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;
@@ -1147,7 +1162,7 @@ wxDataViewCtrlBase::PrependProgressColumn( const wxBitmap &label, unsigned int m
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ),
+        new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;
@@ -1158,7 +1173,7 @@ wxDataViewCtrlBase::PrependDateColumn( const wxBitmap &label, unsigned int model
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ),
+        new wxDataViewDateRenderer( wxT("datetime"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;
@@ -1169,7 +1184,7 @@ wxDataViewCtrlBase::PrependBitmapColumn( const wxBitmap &label, unsigned int mod
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
     wxDataViewColumn *ret = new wxDataViewColumn( label,
-        new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ),
+        new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode ),
         model_column, width, align, flags );
     PrependColumn( ret );
     return ret;