#include "wx/log.h"
#include "wx/dcclient.h"
#include "wx/sizer.h"
- #include "wx/icon.h"
- #include "wx/list.h"
#include "wx/settings.h"
- #include "wx/dataobj.h"
#include "wx/crt.h"
#endif
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
-class wxDataViewCtrlInternal;
-
-wxDataViewCtrlInternal *g_internal = NULL;
+static wxDataViewCtrlInternal *gs_internal = NULL;
class wxGtkTreeModelNode;
WX_DECLARE_LIST(wxDataViewItem, ItemList);
WX_DEFINE_LIST(ItemList)
-class wxDataViewCtrlInternal
+class WXDLLIMPEXP_ADV wxDataViewCtrlInternal
{
public:
wxDataViewCtrlInternal( wxDataViewCtrl *owner, wxDataViewModel *wx_model, GtkWxTreeModel *gtk_model );
gboolean iter_parent( GtkTreeIter *iter, GtkTreeIter *child );
// dnd iface
-
+
bool EnableDragSource( const wxDataFormat &format );
bool EnableDropTarget( 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;
wxDataObject *m_dragDataObject;
-
+
GtkTargetEntry m_dropTargetTargetEntry;
wxCharBuffer m_dropTargetTargetEntryTarget;
wxDataObject *m_dropDataObject;
// wxGtkTreeModelNode
//-----------------------------------------------------------------------------
+static
int LINKAGEMODE wxGtkTreeModelChildCmp( void** id1, void** id2 )
{
- int ret = g_internal->GetDataViewModel()->Compare( *id1, *id2,
- g_internal->GetSortColumn(), (g_internal->GetSortOrder() == GTK_SORT_ASCENDING) );
+ int ret = gs_internal->GetDataViewModel()->Compare( *id1, *id2,
+ gs_internal->GetSortColumn(), (gs_internal->GetSortOrder() == GTK_SORT_ASCENDING) );
return ret;
}
if (m_internal->IsSorted() || m_internal->GetDataViewModel()->HasDefaultCompare())
{
- g_internal = m_internal;
+ gs_internal = m_internal;
m_children.Sort( &wxGtkTreeModelChildCmp );
return m_children.Index( id );
}
if (m_internal->IsSorted() || m_internal->GetDataViewModel()->HasDefaultCompare())
{
- g_internal = m_internal;
+ gs_internal = m_internal;
m_children.Sort( &wxGtkTreeModelChildCmp );
return m_children.Index( id );
}
{
GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model;
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), FALSE);
- g_return_val_if_fail (wxtree_model->stamp == iter->stamp, 0);
-
+
+ if (iter != NULL)
+ g_return_val_if_fail (wxtree_model->stamp == iter->stamp, 0);
+
return wxtree_model->internal->iter_n_children( iter );
}
wxRect renderrect( rect.x, rect.y, rect.width, rect.height );
wxWindowDC* dc = (wxWindowDC*) cell->GetDC();
wxWindowDCImpl *impl = (wxWindowDCImpl *) dc->GetImpl();
- if (impl->m_gdkwindow == NULL)
- {
- impl->m_gdkwindow = window;
- impl->SetUpDC();
- }
+ // Reinitilise GDK window everytime as drawing can also
+ // be done into DnD drop window.
+ impl->m_gdkwindow = window;
+ impl->SetUpDC();
int state = 0;
if (flags & GTK_CELL_RENDERER_SELECTED)
wxGtkTreeModelChildren temp;
WX_APPEND_ARRAY( temp, m_children );
- g_internal = m_internal;
+ gs_internal = m_internal;
m_children.Sort( &wxGtkTreeModelChildCmp );
gint *new_order = new gint[child_count];
m_sort_order = GTK_SORT_ASCENDING;
m_sort_column = -1;
m_dataview_sort_column = NULL;
-
+
m_dragDataObject = NULL;
m_dropDataObject = NULL;
wxDataViewCtrlInternal::~wxDataViewCtrlInternal()
{
g_object_unref( m_gtk_model );
-
+
delete m_dragDataObject;
delete m_dropDataObject;
}
{
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;
}
{
wxGtkString atom_str( gdk_atom_name( format ) );
m_dropTargetTargetEntryTarget = wxCharBuffer( atom_str );
-
- m_dropTargetTargetEntry.target = m_dragSourceTargetEntryTarget.data();
+
+ m_dropTargetTargetEntry.target = m_dropTargetTargetEntryTarget.data();
m_dropTargetTargetEntry.flags = 0;
m_dropTargetTargetEntry.info = static_cast<guint>(-1);
-
+
gtk_tree_view_enable_model_drag_dest( GTK_TREE_VIEW(m_owner->GtkGetTreeView() ),
&m_dropTargetTargetEntry, 1, (GdkDragAction) GDK_ACTION_COPY );
-
+
return true;
}
GtkTreePath *path )
{
delete m_dragDataObject;
-
+
GtkTreeIter iter;
if (!get_iter( &iter, path )) return FALSE;
wxDataViewItem item( (void*) iter.user_data );
event.SetModel( m_wx_model );
if (!m_owner->HandleWindowEvent( event ))
return FALSE;
-
+
if (!event.IsAllowed())
return FALSE;
-
+
wxDataObject *obj = event.GetDataObject();
if (!obj)
return FALSE;
-
+
m_dragDataObject = obj;
-
+
return TRUE;
}
size_t size = m_dragDataObject->GetDataSize( selection_data->target );
if (size == 0)
return FALSE;
-
+
void *buf = malloc( size );
-
+
gboolean res = FALSE;
if (m_dragDataObject->GetDataHere( selection_data->target, buf ))
{
res = TRUE;
-
+
gtk_selection_data_set( selection_data, selection_data->target,
8, (const guchar*) buf, size );
}
GtkTreeIter iter;
if (!get_iter( &iter, path )) return FALSE;
wxDataViewItem item( (void*) iter.user_data );
-
+
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DROP, m_owner->GetId() );
event.SetEventObject( m_owner );
event.SetItem( item );
event.SetDataBuffer( selection_data->data );
if (!m_owner->HandleWindowEvent( event ))
return FALSE;
-
+
if (!event.IsAllowed())
return FALSE;
GtkTreeIter iter;
if (!get_iter( &iter, path )) return FALSE;
wxDataViewItem item( (void*) iter.user_data );
-
+
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE, m_owner->GetId() );
event.SetEventObject( m_owner );
event.SetItem( item );
event.SetDataFormat( selection_data->target );
if (!m_owner->HandleWindowEvent( event ))
return FALSE;
-
+
if (!event.IsAllowed())
return FALSE;
-
+
return TRUE;
}
}
else
{
+ if (iter == NULL)
+ return m_root->GetChildCount();
+
wxDataViewItem item( (void*) iter->user_data );
if (!m_wx_model->IsContainer( item ))
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;
}