]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dataview.cpp
Docuement wxDataObject::IsSupported()
[wxWidgets.git] / src / gtk / dataview.cpp
index 282c0637e972365053f44f55a5f4de8378dc6286..8fd5e3793256030c076ccca687570e53de0d2931 100644 (file)
@@ -74,6 +74,9 @@ public:
     gboolean iter_parent( GtkTreeIter *iter, GtkTreeIter *child );
 
     // dnd iface
+   
+    bool EnableDragSource( const wxDataFormat &format );
+    
     gboolean row_draggable( GtkTreeDragSource *drag_source, GtkTreePath *path );
     gboolean drag_data_delete( GtkTreeDragSource *drag_source, GtkTreePath* path );
     gboolean drag_data_get( GtkTreeDragSource *drag_source, GtkTreePath *path,
@@ -124,6 +127,8 @@ private:
     GtkSortType           m_sort_order;
     wxDataViewColumn     *m_dataview_sort_column;
     int                   m_sort_column;
+    GtkTargetEntry        m_dragSourceTargetEntry;
+    wxCharBuffer          m_dragSourceTargetEntryTarget;
 };
 
 
@@ -527,6 +532,8 @@ wxgtk_tree_model_get_column_type (GtkTreeModel *tree_model,
 
     wxString wxtype = wxtree_model->internal->GetDataViewModel()->GetColumnType( (unsigned int) index );
 
+    wxPrintf( "get_column_type %s\n", wxtype );
+
     if (wxtype == wxT("string"))
         gtype = G_TYPE_STRING;
     else
@@ -2515,26 +2522,23 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column),
 
 }
 
-IMPLEMENT_CLASS(wxDataViewColumn, wxDataViewColumnBase)
-
 #include <wx/listimpl.cpp>
 WX_DEFINE_LIST(wxDataViewColumnList)
 
 wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewRenderer *cell,
                                     unsigned int model_column, int width,
-                                    wxAlignment align, int flags ) :
-    wxDataViewColumnBase( title, cell, model_column, width, align, flags )
+                                    wxAlignment align, int flags )
+    : wxDataViewColumnBase( cell, model_column )
 {
     Init( align, flags, width );
 
-    gtk_tree_view_column_set_clickable( GTK_TREE_VIEW_COLUMN(m_column), TRUE );
     SetTitle( title );
 }
 
 wxDataViewColumn::wxDataViewColumn( const wxBitmap &bitmap, wxDataViewRenderer *cell,
                                     unsigned int model_column, int width,
-                                    wxAlignment align, int flags ) :
-    wxDataViewColumnBase( bitmap, cell, model_column, width, align, flags )
+                                    wxAlignment align, int flags )
+    : wxDataViewColumnBase( bitmap, cell, model_column )
 {
     Init( align, flags, width );
 
@@ -2570,10 +2574,6 @@ void wxDataViewColumn::Init(wxAlignment align, int flags, int width)
         wxGtkTreeCellDataFunc, (gpointer) GetRenderer(), NULL );
 }
 
-wxDataViewColumn::~wxDataViewColumn()
-{
-}
-
 void wxDataViewColumn::OnInternalIdle()
 {
     if (m_isConnected)
@@ -2628,7 +2628,7 @@ void wxDataViewColumn::SetBitmap( const wxBitmap &bitmap )
     {
         GtkImage *gtk_image = GTK_IMAGE(m_image);
 
-        GdkBitmap *mask = (GdkBitmap *) NULL;
+        GdkBitmap *mask = NULL;
         if (bitmap.GetMask())
             mask = bitmap.GetMask()->GetBitmap();
 
@@ -2693,7 +2693,7 @@ void wxDataViewColumn::SetSortable( bool sortable )
 {
     GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column);
 
-    if (sortable)
+    if ( sortable )
     {
         gtk_tree_view_column_set_sort_column_id( column, GetModelColumn() );
     }
@@ -2701,13 +2701,28 @@ void wxDataViewColumn::SetSortable( bool sortable )
     {
         gtk_tree_view_column_set_sort_column_id( column, -1 );
         gtk_tree_view_column_set_sort_indicator( column, FALSE );
+        gtk_tree_view_column_set_clickable( column, FALSE );
     }
 }
 
 bool wxDataViewColumn::IsSortable() const
 {
     GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column);
-    return (gtk_tree_view_column_get_sort_column_id( column ) != -1);
+    return gtk_tree_view_column_get_clickable( column );
+}
+
+void wxDataViewColumn::SetAsSortKey( bool WXUNUSED(sort) )
+{
+    // it might not make sense to have this function in wxHeaderColumn at
+    // all in fact, changing of the sort order should only be done using the
+    // associated control API
+    wxFAIL_MSG( "not implemented" );
+}
+
+bool wxDataViewColumn::IsSortKey() const
+{
+    GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column);
+    return gtk_tree_view_column_get_sort_indicator( column );
 }
 
 bool wxDataViewColumn::IsResizeable() const
@@ -2903,15 +2918,34 @@ void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node )
 
 // GTK+ dnd iface
 
+bool wxDataViewCtrlInternal::EnableDragSource( const wxDataFormat &format )
+{
+    wxGtkString atom_str( gdk_atom_name( format  ) );
+    m_dragSourceTargetEntryTarget = wxCharBuffer( atom_str );
+    
+    m_dragSourceTargetEntry.target =  m_dragSourceTargetEntryTarget.data();
+    m_dragSourceTargetEntry.flags = 0;
+    m_dragSourceTargetEntry.info = static_cast<guint>(-1);
+    
+    gtk_tree_view_enable_model_drag_source( GTK_TREE_VIEW(m_owner->GtkGetTreeView() ),
+       GDK_BUTTON1_MASK, &m_dragSourceTargetEntry, 1, (GdkDragAction) GDK_ACTION_COPY );
+       
+    return true;
+}
+
 gboolean wxDataViewCtrlInternal::row_draggable( GtkTreeDragSource *WXUNUSED(drag_source),
     GtkTreePath *path )
 {
     GtkTreeIter iter;
     if (!get_iter( &iter, path )) return FALSE;
-
     wxDataViewItem item( (void*) iter.user_data );
 
-    return m_wx_model->IsDraggable( item );
+    wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DRAGGABLE, m_owner->GetId() );
+    event.SetItem( item );
+    event.SetModel( m_wx_model );
+    m_owner->HandleWindowEvent( event );
+    
+    return event.IsDraggable();
 }
 
 gboolean
@@ -2926,24 +2960,31 @@ gboolean wxDataViewCtrlInternal::drag_data_get( GtkTreeDragSource *WXUNUSED(drag
 {
     GtkTreeIter iter;
     if (!get_iter( &iter, path )) return FALSE;
-
     wxDataViewItem item( (void*) iter.user_data );
 
-    wxDataFormat format( selection_data->target );
-
-    size_t size = m_wx_model->GetDragDataSize( item, format );
-    if (size == 0) return FALSE;
+    wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_GET_DRAG_DATA_SIZE, m_owner->GetId() );
+    event.SetItem( item );
+    event.SetModel( m_wx_model );
+    event.SetDataFormat( selection_data->target );
+    m_owner->HandleWindowEvent( event );
+    if (event.GetDragDataSize() < 1) return FALSE;
+    size_t size = (size_t) event.GetDragDataSize();
 
     void *data = malloc( size );
 
-    m_wx_model->GetDragData( item, format, data, size );
-
-    gtk_selection_data_set( selection_data, selection_data->target,
-        8, (const guchar*) data, size );
+    event.SetEventType( wxEVT_COMMAND_DATAVIEW_ITEM_GET_DRAG_DATA );
+    event.SetDragDataBuffer( data );
+    gboolean res = FALSE;
+    if (m_owner->HandleWindowEvent( event ))
+    {
+        gtk_selection_data_set( selection_data, selection_data->target,
+            8, (const guchar*) data, size );
+        res = TRUE;
+    }
 
     free( data );
 
-    return TRUE;
+    return res;
 }
 
 gboolean
@@ -3701,8 +3742,6 @@ void wxDataViewCtrl::Init()
     m_cols.DeleteContents( true );
 }
 
-static GtkTargetEntry gs_target;
-
 bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
            const wxPoint& pos, const wxSize& size,
            long style, const wxValidator& validator )
@@ -3727,12 +3766,6 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
     g_signal_connect (m_treeview, "size_allocate",
                      G_CALLBACK (gtk_dataviewctrl_size_callback), this);
 
-    gs_target.target = const_cast<char *>("UTF8_STRING");
-    gs_target.flags = 0;
-    gs_target.info = static_cast<guint>(-1);
-    gtk_tree_view_enable_model_drag_source( GTK_TREE_VIEW(m_treeview),
-       GDK_BUTTON1_MASK, &gs_target, 1, (GdkDragAction) GDK_ACTION_COPY );
-
 #ifdef __WXGTK26__
     if (!gtk_check_version(2,6,0))
     {
@@ -3854,6 +3887,11 @@ bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model )
     return true;
 }
 
+bool wxDataViewCtrl::EnableDragSource( const wxDataFormat &format )
+{
+    return m_internal->EnableDragSource( format );
+}
+
 bool wxDataViewCtrl::AppendColumn( wxDataViewColumn *col )
 {
     if (!wxDataViewCtrlBase::AppendColumn(col))
@@ -4005,6 +4043,17 @@ void wxDataViewCtrl::Collapse( const wxDataViewItem & item )
     gtk_tree_path_free( path );
 }
 
+bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const
+{
+    GtkTreeIter iter;
+    iter.user_data = item.GetID();
+    GtkTreePath *path = m_internal->get_path( &iter );
+    bool res = gtk_tree_view_row_expanded( GTK_TREE_VIEW(m_treeview), path );
+    gtk_tree_path_free( path );
+    
+    return res;
+}
+
 wxDataViewItem wxDataViewCtrl::GetSelection() const
 {
     GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
@@ -4094,12 +4143,23 @@ void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel )
 
     gtk_tree_selection_unselect_all( selection );
 
+    wxDataViewItem last_parent;
+
     size_t i;
     for (i = 0; i < sel.GetCount(); i++)
     {
+        wxDataViewItem item = sel[i];
+        wxDataViewItem parent = GetModel()->GetParent( item );
+        if (parent)
+        {
+            if (parent != last_parent)
+                ExpandAncestors(item);
+        }
+        last_parent = parent;
+
         GtkTreeIter iter;
         iter.stamp = m_internal->GetGtkModel()->stamp;
-        iter.user_data = (gpointer) sel[i].GetID();
+        iter.user_data = (gpointer) item.GetID();
         gtk_tree_selection_select_iter( selection, &iter );
     }
 
@@ -4108,6 +4168,8 @@ void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel )
 
 void wxDataViewCtrl::Select( const wxDataViewItem & item )
 {
+    ExpandAncestors(item);
+
     GtkDisableSelectionEvents();
 
     GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
@@ -4170,6 +4232,8 @@ void wxDataViewCtrl::UnselectAll()
 void wxDataViewCtrl::EnsureVisible(const wxDataViewItem& item,
                                    const wxDataViewColumn *WXUNUSED(column))
 {
+    ExpandAncestors(item);
+
     GtkTreeIter iter;
     iter.user_data = (gpointer) item.GetID();
     GtkTreePath *path = m_internal->get_path( &iter );