--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// Name: wx/gtk/private/list.h
+// Purpose: wxGtkList class.
+// Author: Vadim Zeitlin
+// Created: 2011-08-21
+// RCS-ID: $Id$
+// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_GTK_PRIVATE_LIST_H_
+#define _WX_GTK_PRIVATE_LIST_H_
+
+// ----------------------------------------------------------------------------
+// Convenience class for calling g_list_free() automatically
+// ----------------------------------------------------------------------------
+
+class wxGtkList
+{
+public:
+ explicit wxGtkList(GList* list) : m_list(list) { }
+ ~wxGtkList() { g_list_free(m_list); }
+
+ operator GList *() const { return m_list; }
+ GList * operator->() const { return m_list; }
+
+protected:
+ GList* const m_list;
+
+ wxDECLARE_NO_COPY_CLASS(wxGtkList);
+};
+
+#endif // _WX_GTK_PRIVATE_LIST_H_
#include "wx/stockitem.h"
#include "wx/gtk/private.h"
+#include "wx/gtk/private/list.h"
// ----------------------------------------------------------------------------
// GTK callbacks
{
GtkWidget* box = gtk_bin_get_child(GTK_BIN(child));
GtkLabel* label = NULL;
- GList* list = gtk_container_get_children(GTK_CONTAINER(box));
+ wxGtkList list(gtk_container_get_children(GTK_CONTAINER(box)));
for (GList* item = list; item; item = item->next)
{
if (GTK_IS_LABEL(item->data))
label = GTK_LABEL(item->data);
}
- g_list_free(list);
return label;
}
GtkWidget* box = gtk_bin_get_child(GTK_BIN(child));
if ( GTK_IS_BOX(box) )
{
- GList* list = gtk_container_get_children(GTK_CONTAINER(box));
+ wxGtkList list(gtk_container_get_children(GTK_CONTAINER(box)));
for (GList* item = list; item; item = item->next)
{
gtk_widget_modify_style(GTK_WIDGET(item->data), style);
}
- g_list_free(list);
}
}
}
#include "wx/gtk/dcclient.h"
#include "wx/gtk/private/gdkconv.h"
+#include "wx/gtk/private/list.h"
using namespace wxGTKImpl;
class wxGtkDataViewModelNotifier;
wxDECLARE_NO_COPY_CLASS(wxGtkTreePath);
};
+// ----------------------------------------------------------------------------
+// wxGtkTreePathList: self-destroying list of GtkTreePath objects.
+// ----------------------------------------------------------------------------
+
+class wxGtkTreePathList : public wxGtkList
+{
+public:
+ // Ctor takes ownership of the list.
+ explicit wxGtkTreePathList(GList* list)
+ : wxGtkList(list)
+ {
+ }
+
+ ~wxGtkTreePathList()
+ {
+ // Delete the list contents, wxGtkList will delete the list itself.
+ g_list_foreach(m_list, (GFunc)gtk_tree_path_free, NULL);
+ }
+};
+
// ----------------------------------------------------------------------------
// wxGtkTreeSelectionLock: prevent selection from changing during the
// lifetime of this object
{
GtkTreeViewColumn *gtk_column = GTK_TREE_VIEW_COLUMN(column->GetGtkHandle());
- GList *list = gtk_tree_view_get_columns( GTK_TREE_VIEW(m_treeview) );
-
- gint pos = g_list_index( list, (gconstpointer) gtk_column );
+ wxGtkList list(gtk_tree_view_get_columns(GTK_TREE_VIEW(m_treeview)));
- g_list_free( list );
-
- return pos;
+ return g_list_index( list, (gconstpointer) gtk_column );
}
wxDataViewColumn *wxDataViewCtrl::GetSortingColumn() const
if (HasFlag(wxDV_MULTIPLE))
{
GtkTreeModel *model;
- GList *list = gtk_tree_selection_get_selected_rows( selection, &model );
+ wxGtkTreePathList list(gtk_tree_selection_get_selected_rows(selection, &model));
int count = 0;
- while (list)
+ for ( GList* current = list; current; current = g_list_next(current) )
{
GtkTreePath *path = (GtkTreePath*) list->data;
sel.Add(GTKPathToItem(path));
-
- list = g_list_next( list );
count++;
}
- // delete list
- g_list_foreach( list, (GFunc) gtk_tree_path_free, NULL );
- g_list_free( list );
-
return count;
}
else