1 /* /////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/gtk/treeentry_gtk.c 
   3 // Purpose:     GtkTreeEntry implementation 
   6 // Copyright:   (c) 2006 Ryan Norton 
   7 // Licence:     wxWindows licence 
   8 /////////////////////////////////////////////////////////////////////////// */ 
  13 #define G_GNUC_INTERNAL  
  17 #include "wx/gtk/private/treeentry_gtk.h" 
  22         The main reason for this class is to have a holder for both a string 
  23         and userdata for us to use in wxListXXX classes. 
  25         This is transformable to a string for the Gtk implementations, 
  26         and the string passed in is duplicated and freed upon destruction. 
  28         As mentioned the real magic here is the transforming it to a string 
  29         which lets us use it as a entry in a GtkTreeView/GtkListStore 
  30         and still display it. Otherwise we would need to implement our 
  35 static void gtk_tree_entry_class_init(void* g_class
, void* class_data
); 
  36 static void gtk_tree_entry_string_transform_func(const GValue 
*src_value
, 
  38 static void gtk_tree_entry_dispose(GObject
* obj
); 
  40 static GObjectClass
* parent_class
; 
  46     return GTK_TREE_ENTRY(g_object_new(GTK_TYPE_TREE_ENTRY
, NULL
)); 
  50 gtk_tree_entry_get_type () 
  52     static GType tree_entry_type 
= 0; 
  56         const GTypeInfo tree_entry_info 
= 
  58             sizeof (GtkTreeEntryClass
), 
  60             NULL
,           /* base_finalize */ 
  61             gtk_tree_entry_class_init
, 
  62             NULL
,           /* class_finalize */ 
  63             NULL
,           /* class_data */ 
  64             sizeof (GtkTreeEntry
), 
  66             NULL
,           /* instance_init */ 
  67             NULL            
/* value_table */ 
  69         tree_entry_type 
= g_type_register_static (G_TYPE_OBJECT
, "GtkTreeEntry", 
  72         g_value_register_transform_func(tree_entry_type
, G_TYPE_STRING
, 
  73                                         gtk_tree_entry_string_transform_func
); 
  76     return tree_entry_type
; 
  79 gchar
*     gtk_tree_entry_get_collate_key (GtkTreeEntry
* entry
) 
  81     if (entry
->collate_key 
== NULL
) 
  83         char* temp 
= g_utf8_casefold(entry
->label
, -1); 
  84         entry
->collate_key 
= g_utf8_collate_key(temp
, -1); 
  87     return entry
->collate_key
; 
  90 gchar
*     gtk_tree_entry_get_label     (GtkTreeEntry
* entry
) 
  92     g_assert(GTK_IS_TREE_ENTRY(entry
)); 
  96 gpointer   
gtk_tree_entry_get_userdata  (GtkTreeEntry
* entry
) 
  98     g_assert(GTK_IS_TREE_ENTRY(entry
)); 
  99     return entry
->userdata
; 
 102 void     gtk_tree_entry_set_label       (GtkTreeEntry
* entry
, const gchar
* label
) 
 104     g_assert(GTK_IS_TREE_ENTRY(entry
)); 
 106     /* free previous if it exists */ 
 109         g_free(entry
->label
); 
 110         g_free(entry
->collate_key
); 
 113     entry
->label 
= g_strdup(label
); 
 114     entry
->collate_key 
= NULL
; 
 117 void   gtk_tree_entry_set_userdata      (GtkTreeEntry
* entry
, gpointer userdata
) 
 119     g_assert(GTK_IS_TREE_ENTRY(entry
)); 
 120     entry
->userdata 
= userdata
; 
 123 void   gtk_tree_entry_set_destroy_func  (GtkTreeEntry
* entry
, 
 124                                          GtkTreeEntryDestroy destroy_func
, 
 125                                          gpointer destroy_func_data
) 
 127     g_assert(GTK_IS_TREE_ENTRY(entry
)); 
 128     entry
->destroy_func 
= destroy_func
; 
 129     entry
->destroy_func_data 
= destroy_func_data
; 
 133 static void gtk_tree_entry_class_init(void* g_class
, void* class_data
) 
 135     GObjectClass
* gobject_class 
= G_OBJECT_CLASS(g_class
); 
 136     gobject_class
->dispose 
= gtk_tree_entry_dispose
; 
 137     parent_class 
= G_OBJECT_CLASS(g_type_class_peek_parent(g_class
)); 
 140 static void gtk_tree_entry_string_transform_func(const GValue 
*src_value
, 
 144     void* src_ptr 
= g_value_peek_pointer(src_value
); 
 146     /* Make sure src is a treeentry and dest can hold a string */ 
 147     g_assert(GTK_IS_TREE_ENTRY(src_ptr
)); 
 148     g_assert(G_VALUE_HOLDS(dest_value
, G_TYPE_STRING
)); 
 150     entry 
= GTK_TREE_ENTRY(src_ptr
); 
 151     g_value_set_string(dest_value
, entry
->label
); 
 154 static void gtk_tree_entry_dispose(GObject
* obj
) 
 158     g_assert(GTK_IS_TREE_ENTRY(obj
)); 
 160     entry 
= GTK_TREE_ENTRY(obj
); 
 162     /* free label if it exists */ 
 165         g_free(entry
->label
); 
 166         g_free(entry
->collate_key
); 
 168         entry
->collate_key 
= NULL
; 
 171     /* call destroy callback if it exists */ 
 172     if(entry
->destroy_func
) 
 174         (*entry
->destroy_func
) (entry
, entry
->destroy_func_data
); 
 175         entry
->destroy_func 
= NULL
; 
 176         entry
->destroy_func_data 
= NULL
; 
 180     entry
->userdata 
= NULL
; 
 182     parent_class
->dispose(obj
);