]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxDataViewSortedListModel, which doesn't work
authorRobert Roebling <robert@roebling.de>
Tue, 28 Feb 2006 10:47:28 +0000 (10:47 +0000)
committerRobert Roebling <robert@roebling.de>
Tue, 28 Feb 2006 10:47:28 +0000 (10:47 +0000)
    yet, but you get the idea..

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37760 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dataview.h
src/common/datavcmn.cpp

index 5d2b516d772eaac4f949c149e36fdb4dd596fac2..0ae37bf18b59711c81f713137bae2eb9e726ecea 100644 (file)
@@ -89,21 +89,21 @@ public:
     virtual bool SetValue( wxVariant &variant, size_t col, size_t row ) = 0;
 
     // delegated notifiers
-    bool RowAppended();
-    bool RowPrepended();
-    bool RowInserted( size_t before );
-    bool RowDeleted( size_t row );
-    bool RowChanged( size_t row );
-    bool ValueChanged( size_t col, size_t row );
-    bool Cleared();
+    virtual bool RowAppended();
+    virtual bool RowPrepended();
+    virtual bool RowInserted( size_t before );
+    virtual bool RowDeleted( size_t row );
+    virtual bool RowChanged( size_t row );
+    virtual bool ValueChanged( size_t col, size_t row );
+    virtual bool Cleared();
 
     // Used internally    
-    void AddViewingColumn( wxDataViewColumn *view_column, size_t model_column );
-    void RemoveViewingColumn( wxDataViewColumn *column );
+    virtual void AddViewingColumn( wxDataViewColumn *view_column, size_t model_column );
+    virtual void RemoveViewingColumn( wxDataViewColumn *column );
     
     // Used internally    
-    void SetNotifier( wxDataViewListModelNotifier *notifier );
-    wxDataViewListModelNotifier* GetNotifier();
+    virtual void SetNotifier( wxDataViewListModelNotifier *notifier );
+    virtual wxDataViewListModelNotifier* GetNotifier();
     
 private:
     wxDataViewListModelNotifier *m_notifier;
@@ -113,6 +113,51 @@ protected:
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewListModel)
 };
 
+// --------------------------------------------------------- 
+// wxDataViewSortedListModel
+// --------------------------------------------------------- 
+
+typedef int (wxCALLBACK *wxDataViewListModelCompare)
+    (size_t row1, size_t row2, size_t col, wxDataViewListModel* model );
+
+WX_DEFINE_SORTED_EXPORTED_ARRAY_SIZE_T(size_t, wxDataViewSortedIndexArray );
+
+class wxDataViewSortedListModel: public wxDataViewListModel
+{
+public:
+    wxDataViewSortedListModel( wxDataViewListModel *child );
+    virtual ~wxDataViewSortedListModel();
+
+    virtual size_t GetNumberOfRows();
+    virtual size_t GetNumberOfCols();
+    // return type as reported by wxVariant
+    virtual wxString GetColType( size_t col );
+    // get value into a wxVariant
+    virtual wxVariant GetValue( size_t col, size_t row );
+    // set value, call ValueChanged() afterwards!
+    virtual bool SetValue( wxVariant &variant, size_t col, size_t row );
+
+    // delegated notifiers
+    virtual bool RowAppended();
+    virtual bool RowPrepended();
+    virtual bool RowInserted( size_t before );
+    virtual bool RowDeleted( size_t row );
+    virtual bool RowChanged( size_t row );
+    virtual bool ValueChanged( size_t col, size_t row );
+    virtual bool Cleared();
+
+    // Used internally    
+    void SetNotifier( wxDataViewListModelNotifier *notifier );
+    wxDataViewListModelNotifier* GetNotifier();
+    
+private:
+    wxDataViewListModel             *m_child;
+    wxDataViewSortedIndexArray       m_array;
+
+protected:
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewSortedListModel)
+};
+
 // --------------------------------------------------------- 
 // wxDataViewCellBase
 // --------------------------------------------------------- 
index d7d71ca59c44dfe9ffde0c0b8907bb6c7b455d93..2168ba3072b5a510b95a18970cb49294612d606a 100644 (file)
@@ -166,6 +166,182 @@ wxDataViewListModelNotifier* wxDataViewListModel::GetNotifier()
     return m_notifier;
 }
 
+// --------------------------------------------------------- 
+// wxDataViewSortedListModel
+// --------------------------------------------------------- 
+
+int wxCALLBACK wxDataViewListModelSortedDefaultCompare
+      (size_t row1, size_t row2, size_t col, wxDataViewListModel* model )
+{
+    wxVariant value1 = model->GetValue( col, row1 );
+    wxVariant value2 = model->GetValue( col, row2 );
+    if (value1.GetType() == wxT("string"))
+    {
+        wxString str1 = value1.GetString();
+        wxString str2 = value2.GetString();
+        return str1.Cmp( str2 );
+    }
+    if (value1.GetType() == wxT("long"))
+    {
+        long l1 = value1.GetLong();
+        long l2 = value2.GetLong();
+        return l1-l2;
+    }
+    if (value1.GetType() == wxT("double"))
+    {
+        double d1 = value1.GetDouble();
+        double d2 = value2.GetDouble();
+        if (d1 == d2) return 0;
+        if (d1 < d2) return 1;
+        return -1;
+    }
+    if (value1.GetType() == wxT("datetime"))
+    {
+        wxDateTime dt1 = value1.GetDateTime();
+        wxDateTime dt2 = value2.GetDateTime();
+        if (dt1.IsEqualTo(dt2)) return 0;
+        if (dt1.IsEarlierThan(dt2)) return 1;
+        return -1;
+    }
+
+    return 0;
+}
+
+static wxDataViewListModelCompare   s_CmpFunc;
+static wxDataViewListModel         *s_CmpModel;
+static size_t                       s_CmpCol;
+
+int LINKAGEMODE wxDataViewIntermediateCmp( size_t row1, size_t row2 )
+{
+    return s_CmpFunc( row1, row2, s_CmpCol, s_CmpModel );
+}
+
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewSortedListModel, wxDataViewListModel)
+
+wxDataViewSortedListModel::wxDataViewSortedListModel( wxDataViewListModel *child ) :
+  m_array( wxDataViewIntermediateCmp )
+{
+    m_child = child;
+    s_CmpCol = 0;
+    s_CmpModel = child;
+    s_CmpFunc = wxDataViewListModelSortedDefaultCompare;
+}
+
+wxDataViewSortedListModel::~wxDataViewSortedListModel()
+{
+}
+
+size_t wxDataViewSortedListModel::GetNumberOfRows()
+{
+    return m_child->GetNumberOfRows();
+}
+
+size_t wxDataViewSortedListModel::GetNumberOfCols()
+{
+    return m_child->GetNumberOfCols();
+}
+
+wxString wxDataViewSortedListModel::GetColType( size_t col )
+{
+    return m_child->GetColType( col );
+}
+
+wxVariant wxDataViewSortedListModel::GetValue( size_t col, size_t row )
+{
+    size_t child_row = m_array[row];
+    return m_child->GetValue( col, child_row );
+}
+
+bool wxDataViewSortedListModel::SetValue( wxVariant &variant, size_t col, size_t row )
+{
+    size_t child_row = m_array[row];
+    bool ret = m_child->SetValue( variant, col, child_row );
+    // resort in ::ValueChanged()
+    return ret;
+}
+
+bool wxDataViewSortedListModel::RowAppended()
+{
+    // you can only append
+    bool ret = m_child->RowAppended();
+    
+    // report RowInsrted
+    
+    return ret;
+}
+
+bool wxDataViewSortedListModel::RowPrepended()
+{
+    // you can only append
+    bool ret = m_child->RowAppended();
+    
+    // report RowInsrted
+    
+    return ret;
+}
+
+bool wxDataViewSortedListModel::RowInserted( size_t before )
+{
+    // you can only append
+    bool ret = m_child->RowAppended();
+    
+    // report different RowInsrted
+    
+    return ret;
+}
+
+bool wxDataViewSortedListModel::RowDeleted( size_t row )
+{
+    size_t child_row = m_array[row];
+    
+    bool ret = m_child->RowDeleted( child_row );
+    
+    wxDataViewListModel::RowDeleted( row );
+    
+    return ret;
+}
+
+bool wxDataViewSortedListModel::RowChanged( size_t row )
+{
+    size_t child_row = m_array[row];
+    bool ret = m_child->RowChanged( child_row );
+    
+    // report delete old pos, inserted new pos
+    
+    return ret;
+}
+
+bool wxDataViewSortedListModel::ValueChanged( size_t col, size_t row )
+{
+    size_t child_row = m_array[row];
+    bool ret = m_child->ValueChanged( col, child_row );
+    
+    // Do nothing if not the sorted col..
+    // report delete old pos, inserted new pos
+    
+    return ret;
+}
+
+bool wxDataViewSortedListModel::Cleared()
+{
+    bool ret = m_child->Cleared();
+    
+    wxDataViewListModel::Cleared();
+    
+    return ret;
+}
+
+void wxDataViewSortedListModel::SetNotifier( wxDataViewListModelNotifier *notifier )
+{
+    wxDataViewListModel::SetNotifier( notifier );
+}
+
+wxDataViewListModelNotifier* wxDataViewSortedListModel::GetNotifier()
+{
+    return wxDataViewListModel::GetNotifier();
+}
+
 // --------------------------------------------------------- 
 // wxDataViewCellBase
 // ---------------------------------------------------------