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,
GtkSortType m_sort_order;
wxDataViewColumn *m_dataview_sort_column;
int m_sort_column;
+ GtkTargetEntry m_dragSourceTargetEntry;
+ wxCharBuffer m_dragSourceTargetEntryTarget;
};
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
}
-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 );
wxGtkTreeCellDataFunc, (gpointer) GetRenderer(), NULL );
}
-wxDataViewColumn::~wxDataViewColumn()
-{
-}
-
void wxDataViewColumn::OnInternalIdle()
{
if (m_isConnected)
{
GtkImage *gtk_image = GTK_IMAGE(m_image);
- GdkBitmap *mask = (GdkBitmap *) NULL;
+ GdkBitmap *mask = NULL;
if (bitmap.GetMask())
mask = bitmap.GetMask()->GetBitmap();
{
GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column);
- if (sortable)
+ if ( sortable )
{
gtk_tree_view_column_set_sort_column_id( column, GetModelColumn() );
}
{
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
// 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
{
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
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 )
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))
{
return true;
}
+bool wxDataViewCtrl::EnableDragSource( const wxDataFormat &format )
+{
+ return m_internal->EnableDragSource( format );
+}
+
bool wxDataViewCtrl::AppendColumn( wxDataViewColumn *col )
{
if (!wxDataViewCtrlBase::AppendColumn(col))
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) );
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 );
}
void wxDataViewCtrl::Select( const wxDataViewItem & item )
{
+ ExpandAncestors(item);
+
GtkDisableSelectionEvents();
GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
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 );