X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e4de825ee6f3f991e2aa86159d6e3457afb6a8e0..78e788120814699ab0a0d2fab1131285f5e0fd7a:/src/gtk/dataview.cpp diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 5c9c64c115..4e7fc719a4 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -20,10 +20,7 @@ #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 @@ -39,9 +36,7 @@ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -class wxDataViewCtrlInternal; - -wxDataViewCtrlInternal *g_internal = NULL; +static wxDataViewCtrlInternal *gs_internal = NULL; class wxGtkTreeModelNode; @@ -56,7 +51,7 @@ typedef struct _GtkWxTreeModel GtkWxTreeModel; 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 ); @@ -74,10 +69,10 @@ public: 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, @@ -128,11 +123,11 @@ private: 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; @@ -143,10 +138,11 @@ private: // 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; } @@ -186,7 +182,7 @@ public: 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 ); } @@ -200,7 +196,7 @@ public: 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 ); } @@ -645,8 +641,10 @@ wxgtk_tree_model_iter_n_children (GtkTreeModel *tree_model, { 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 ); } @@ -1107,11 +1105,10 @@ gtk_wx_cell_renderer_render (GtkCellRenderer *renderer, 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) @@ -1831,7 +1828,7 @@ public: m_window = window; - m_context = window->GtkGetPangoDefaultContext(); + m_context = window->GTKGetPangoDefaultContext(); m_layout = pango_layout_new( m_context ); m_fontdesc = pango_font_description_copy( widget->style->font_desc ); @@ -2051,9 +2048,12 @@ wxDataViewChoiceRenderer::wxDataViewChoiceRenderer( const wxArrayString &choices m_renderer = (GtkCellRenderer*) gtk_cell_renderer_combo_new(); GtkListStore *store = gtk_list_store_new( 1, G_TYPE_STRING ); - size_t n; - for (n = 0; n < m_choices.GetCount(); n++) - gtk_list_store_insert_with_values( store, NULL, n, 0, m_choices[n].utf8_str(), -1 ); + for (size_t n = 0; n < m_choices.GetCount(); n++) + { + gtk_list_store_insert_with_values( + store, NULL, n, 0, + static_cast(m_choices[n].utf8_str()), -1 ); + } g_object_set (m_renderer, "model", store, @@ -2116,7 +2116,8 @@ bool wxDataViewChoiceRenderer::GetValue( wxVariant &value ) const GValue gvalue = { 0, }; g_value_init( &gvalue, G_TYPE_STRING ); g_object_get_property( G_OBJECT(m_renderer), "text", &gvalue ); - wxString temp = wxGTK_CONV_BACK_FONT( g_value_get_string( &gvalue ), const_cast(this)->GetOwner()->GetOwner()->GetFont() ); + wxString temp = wxGTK_CONV_BACK_FONT( g_value_get_string( &gvalue ), + const_cast(this)->GetOwner()->GetOwner()->GetFont() ); g_value_unset( &gvalue ); value = temp; wxPrintf( "temp %s\n", temp ); @@ -2836,7 +2837,7 @@ void wxGtkTreeModelNode::Resort() 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]; @@ -2884,7 +2885,7 @@ wxDataViewCtrlInternal::wxDataViewCtrlInternal( wxDataViewCtrl *owner, m_sort_order = GTK_SORT_ASCENDING; m_sort_column = -1; m_dataview_sort_column = NULL; - + m_dragDataObject = NULL; m_dropDataObject = NULL; @@ -2895,7 +2896,7 @@ wxDataViewCtrlInternal::wxDataViewCtrlInternal( wxDataViewCtrl *owner, wxDataViewCtrlInternal::~wxDataViewCtrlInternal() { g_object_unref( m_gtk_model ); - + delete m_dragDataObject; delete m_dropDataObject; } @@ -2935,14 +2936,14 @@ 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(-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; } @@ -2950,14 +2951,14 @@ bool wxDataViewCtrlInternal::EnableDropTarget( const wxDataFormat &format ) { 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(-1); - + gtk_tree_view_enable_model_drag_dest( GTK_TREE_VIEW(m_owner->GtkGetTreeView() ), &m_dropTargetTargetEntry, 1, (GdkDragAction) GDK_ACTION_COPY ); - + return true; } @@ -2965,7 +2966,7 @@ gboolean wxDataViewCtrlInternal::row_draggable( GtkTreeDragSource *WXUNUSED(drag GtkTreePath *path ) { delete m_dragDataObject; - + GtkTreeIter iter; if (!get_iter( &iter, path )) return FALSE; wxDataViewItem item( (void*) iter.user_data ); @@ -2976,16 +2977,16 @@ gboolean wxDataViewCtrlInternal::row_draggable( GtkTreeDragSource *WXUNUSED(drag 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; } @@ -3009,14 +3010,14 @@ gboolean wxDataViewCtrlInternal::drag_data_get( GtkTreeDragSource *WXUNUSED(drag 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 ); } @@ -3034,7 +3035,7 @@ wxDataViewCtrlInternal::drag_data_received(GtkTreeDragDest *WXUNUSED(drag_dest), 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 ); @@ -3044,7 +3045,7 @@ wxDataViewCtrlInternal::drag_data_received(GtkTreeDragDest *WXUNUSED(drag_dest), event.SetDataBuffer( selection_data->data ); if (!m_owner->HandleWindowEvent( event )) return FALSE; - + if (!event.IsAllowed()) return FALSE; @@ -3059,7 +3060,7 @@ wxDataViewCtrlInternal::row_drop_possible(GtkTreeDragDest *WXUNUSED(drag_dest), 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 ); @@ -3067,10 +3068,10 @@ wxDataViewCtrlInternal::row_drop_possible(GtkTreeDragDest *WXUNUSED(drag_dest), event.SetDataFormat( selection_data->target ); if (!m_owner->HandleWindowEvent( event )) return FALSE; - + if (!event.IsAllowed()) return FALSE; - + return TRUE; } @@ -3347,6 +3348,9 @@ gint wxDataViewCtrlInternal::iter_n_children( GtkTreeIter *iter ) } else { + if (iter == NULL) + return m_root->GetChildCount(); + wxDataViewItem item( (void*) iter->user_data ); if (!m_wx_model->IsContainer( item )) @@ -3829,7 +3833,7 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, m_widget = gtk_scrolled_window_new (NULL, NULL); g_object_ref(m_widget); - GtkScrolledWindowSetBorder(m_widget, style); + GTKScrolledWindowSetBorder(m_widget, style); m_treeview = gtk_tree_view_new(); gtk_container_add (GTK_CONTAINER (m_widget), m_treeview); @@ -3874,7 +3878,7 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, gtk_tree_view_set_rules_hint( GTK_TREE_VIEW(m_treeview), (style & wxDV_ROW_LINES) != 0 ); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (m_widget), - GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show (m_treeview); m_parent->DoAddChild( this ); @@ -4126,7 +4130,7 @@ bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const 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; }