]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/datavcmn.cpp
Added missing URL attribute testing
[wxWidgets.git] / src / common / datavcmn.cpp
index d7c44d97e0349f13695a53a15fc7403be23a0394..6d99b9684f4893ee41278237682181d96b74601a 100644 (file)
@@ -33,12 +33,46 @@ bool operator == (const wxDataViewItem &left, const wxDataViewItem &right)
 
 
 // ---------------------------------------------------------
-// wxDataViewModel
+// wxDataViewModelNotifier
 // ---------------------------------------------------------
 
-#include <wx/listimpl.cpp>
+#include "wx/listimpl.cpp"
 WX_DEFINE_LIST(wxDataViewModelNotifiers);
 
+bool wxDataViewModelNotifier::ItemsAdded( const wxDataViewItem &parent, const wxDataViewItemArray &items )
+{
+    size_t count = items.GetCount();
+    size_t i;
+    for (i = 0; i < count; i++)
+        if (!ItemAdded( parent, items[i] )) return false;
+        
+    return true;
+}
+
+bool wxDataViewModelNotifier::ItemsDeleted( const wxDataViewItem &parent, const wxDataViewItemArray &items )
+{
+    size_t count = items.GetCount();
+    size_t i;
+    for (i = 0; i < count; i++)
+        if (!ItemDeleted( parent, items[i] )) return false;
+    
+    return true;
+}
+
+bool wxDataViewModelNotifier::ItemsChanged( const wxDataViewItemArray &items )
+{
+    size_t count = items.GetCount();
+    size_t i;
+    for (i = 0; i < count; i++)
+        if (!ItemChanged( items[i] )) return false;
+        
+    return true;
+}
+
+// ---------------------------------------------------------
+// wxDataViewModel
+// ---------------------------------------------------------
+
 wxDataViewModel::wxDataViewModel()
 {
     m_notifiers.DeleteContents( true );
@@ -89,6 +123,51 @@ bool wxDataViewModel::ItemChanged( const wxDataViewItem &item )
     return ret;
 }
 
+bool wxDataViewModel::ItemsAdded( const wxDataViewItem &parent, const wxDataViewItemArray &items )
+{
+    bool ret = true;
+
+    wxDataViewModelNotifiers::iterator iter;
+    for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter)
+    {
+        wxDataViewModelNotifier* notifier = *iter;
+        if (!notifier->ItemsAdded( parent, items ))
+            ret = false;
+    }
+
+    return ret;
+}
+
+bool wxDataViewModel::ItemsDeleted( const wxDataViewItem &parent, const wxDataViewItemArray &items )
+{
+    bool ret = true;
+
+    wxDataViewModelNotifiers::iterator iter;
+    for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter)
+    {
+        wxDataViewModelNotifier* notifier = *iter;
+        if (!notifier->ItemsDeleted( parent, items ))
+            ret = false;
+    }
+
+    return ret;
+}
+
+bool wxDataViewModel::ItemsChanged( const wxDataViewItemArray &items )
+{
+    bool ret = true;
+
+    wxDataViewModelNotifiers::iterator iter;
+    for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter)
+    {
+        wxDataViewModelNotifier* notifier = *iter;
+        if (!notifier->ItemsChanged( items ))
+            ret = false;
+    }
+
+    return ret;
+}
+
 bool wxDataViewModel::ValueChanged( const wxDataViewItem &item, unsigned int col )
 {
     bool ret = true;
@@ -195,7 +274,7 @@ int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem
     // items must be different
     unsigned long litem1 = (unsigned long) item1.GetID();
     unsigned long litem2 = (unsigned long) item2.GetID();
-    
+
     if (!ascending)
         return litem2-litem2;
 
@@ -268,15 +347,18 @@ unsigned int wxDataViewIndexListModel::GetRow( const wxDataViewItem &item ) cons
 
 wxDataViewItem wxDataViewIndexListModel::GetItem( unsigned int row ) const
 {
+    wxASSERT( row < m_hash.GetCount() );
     return wxDataViewItem( m_hash[row] );
 }
 
-int wxDataViewIndexListModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
-                                       unsigned int column, bool ascending )
+int wxDataViewIndexListModel::Compare(const wxDataViewItem& item1,
+                                      const wxDataViewItem& item2,
+                                      unsigned int WXUNUSED(column),
+                                      bool ascending)
 {
     if (ascending)
         return GetRow(item1) - GetRow(item2);
-    
+
     return GetRow(item2) - GetRow(item1);
 }
 
@@ -306,29 +388,29 @@ bool wxDataViewIndexListModel::IsContainer( const wxDataViewItem &item ) const
     return false;
 }
 
-wxDataViewItem wxDataViewIndexListModel::GetFirstChild( const wxDataViewItem &parent ) const
+unsigned int wxDataViewIndexListModel::GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const
 {
-    if (!parent.IsOk())
-    {
-        if (m_hash.GetCount() == 0)
-            return wxDataViewItem(0);
+    if (item.IsOk())
+        return 0;
 
-        return wxDataViewItem( m_hash[0]);
-    }
+    children = m_hash;
 
-    return wxDataViewItem(0);
+    return m_hash.GetCount();
 }
 
-wxDataViewItem wxDataViewIndexListModel::GetNextSibling( const wxDataViewItem &item ) const
-{
-    if (!item.IsOk())
-        return wxDataViewItem(0);
+//-----------------------------------------------------------------------------
+// wxDataViewIconText
+//-----------------------------------------------------------------------------
 
-    int pos = m_hash.Index( item.GetID() );
-    if ((pos == wxNOT_FOUND) || (pos == (int) (m_hash.GetCount()-1)))
-        return wxDataViewItem(0);
+IMPLEMENT_DYNAMIC_CLASS(wxDataViewIconText,wxObject)
 
-    return wxDataViewItem( m_hash[pos+1] );
+IMPLEMENT_VARIANT_OBJECT(wxDataViewIconText)
+
+bool operator == (const wxDataViewIconText &one, const wxDataViewIconText &two)
+{
+    if (one.GetText() != two.GetText()) return false;
+    if (one.IsSameAs(two)) return false;
+    return true;
 }
 
 // ---------------------------------------------------------
@@ -371,6 +453,13 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la
     m_editorCtrl->SetFocus();
 #endif
 
+    // Now we should send Editing Started event
+    wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, GetOwner()->GetOwner()->GetId() );
+    event.SetDataViewColumn( GetOwner() );
+    event.SetModel( GetOwner()->GetOwner()->GetModel() );
+    event.SetItem( item );
+    GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event );
+
     return true;
 }
 
@@ -401,6 +490,13 @@ bool wxDataViewRendererBase::FinishEditing()
 
     // 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() );
+    event.SetModel( GetOwner()->GetOwner()->GetModel() );
+    event.SetItem( m_item );
+    GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event );
+
     return true;
 }
 
@@ -538,18 +634,12 @@ IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase, wxControl)
 wxDataViewCtrlBase::wxDataViewCtrlBase()
 {
     m_model = NULL;
-    m_cols.DeleteContents( true );
     m_expander_column = 0;
     m_indent = 8;
 }
 
 wxDataViewCtrlBase::~wxDataViewCtrlBase()
 {
-    // IMPORTANT: before calling DecRef() on our model (since it may
-    //            result in a free() call), erase all columns (since
-    //            they hold a pointer to our model)
-    m_cols.Clear();
-
     if (m_model)
     {
         m_model->DecRef();
@@ -590,11 +680,22 @@ wxDataViewCtrlBase::AppendTextColumn( const wxString &label, unsigned int model_
     return ret;
 }
 
+wxDataViewColumn *
+wxDataViewCtrlBase::AppendIconTextColumn( const wxString &label, unsigned int model_column,
+                            wxDataViewCellMode mode, int width, wxAlignment align, int flags )
+{
+    wxDataViewColumn *ret = new wxDataViewColumn( label,
+        new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, (int)align ),
+        model_column, width, align, flags );
+    AppendColumn( ret );
+    return ret;
+}
+
 wxDataViewColumn *
 wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, unsigned int model_column,
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
 {
-    
+
     wxDataViewColumn *ret = new wxDataViewColumn( label,
         new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ),
         model_column, width, align, flags );
@@ -646,6 +747,17 @@ wxDataViewCtrlBase::AppendTextColumn( const wxBitmap &label, unsigned int model_
     return ret;
 }
 
+wxDataViewColumn *
+wxDataViewCtrlBase::AppendIconTextColumn( const wxBitmap &label, unsigned int model_column,
+                            wxDataViewCellMode mode, int width, wxAlignment align, int flags )
+{
+    wxDataViewColumn *ret = new wxDataViewColumn( label,
+        new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, (int)align ),
+        model_column, width, align, flags );
+    AppendColumn( ret );
+    return ret;
+}
+
 wxDataViewColumn *
 wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap &label, unsigned int model_column,
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
@@ -693,55 +805,30 @@ wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap &label, unsigned int mode
 bool
 wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col )
 {
-    m_cols.Append( (wxObject*) col );
     col->SetOwner( (wxDataViewCtrl*) this );
     return true;
 }
 
-unsigned int wxDataViewCtrlBase::GetColumnCount() const
-{
-    return m_cols.GetCount();
-}
-
-bool wxDataViewCtrlBase::DeleteColumn( unsigned int WXUNUSED(pos) )
-{
-    return false;
-}
-
-bool wxDataViewCtrlBase::ClearColumns()
-{
-    return false;
-}
-
-wxDataViewColumn* wxDataViewCtrlBase::GetColumn( unsigned int pos )
-{
-    if( pos >= m_cols.GetCount() )
-        return NULL;
-
-    return (wxDataViewColumn*) m_cols[ pos ];
-}
-
 // ---------------------------------------------------------
 // wxDataViewEvent
 // ---------------------------------------------------------
 
 IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent,wxNotifyEvent)
 
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_SELECTED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_DESELECTED)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED)
+
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED)
+
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED)
 
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_ADDED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_CHANGED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED)
-
 #endif
+