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/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(GtkTreeEntryClass
* klass
); 
  36 static void gtk_tree_entry_init (GTypeInstance
* instance
, gpointer g_class
); 
  37 static void gtk_tree_entry_string_transform_func(const GValue 
*src_value
, 
  39 static void gtk_tree_entry_dispose(GObject
* obj
); 
  46     return GTK_TREE_ENTRY(g_object_new(GTK_TYPE_TREE_ENTRY
, NULL
)); 
  50 gtk_tree_entry_get_type () 
  52     static GtkType tree_entry_type 
= 0; 
  56         const GTypeInfo tree_entry_info 
= 
  58             sizeof (GtkTreeEntryClass
), 
  60             NULL
,           /* base_finalize */ 
  61             (GClassInitFunc
) gtk_tree_entry_class_init
,  /* class_init */ 
  62             NULL
,           /* class_finalize */ 
  63             NULL
,           /* class_data */ 
  64             sizeof (GtkTreeEntry
), 
  66             (GInstanceInitFunc
) gtk_tree_entry_init
, /*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     return entry
->collate_key
; 
  84 gchar
*     gtk_tree_entry_get_label     (GtkTreeEntry
* entry
) 
  86     g_assert(GTK_IS_TREE_ENTRY(entry
)); 
  90 gpointer   
gtk_tree_entry_get_userdata  (GtkTreeEntry
* entry
) 
  92     g_assert(GTK_IS_TREE_ENTRY(entry
)); 
  93     return entry
->userdata
; 
  96 void     gtk_tree_entry_set_label       (GtkTreeEntry
* entry
, const gchar
* label
) 
  98     g_assert(GTK_IS_TREE_ENTRY(entry
)); 
 101     /* free previous if it exists */ 
 104         g_free(entry
->label
); 
 105         g_free(entry
->collate_key
); 
 108     entry
->label 
= g_strdup(label
); 
 109     temp 
= g_utf8_casefold(label
, -1); /* -1 == null terminated */ 
 110     entry
->collate_key 
= g_utf8_collate_key(temp
, -1); /* -1 == null terminated */ 
 114 void   gtk_tree_entry_set_userdata      (GtkTreeEntry
* entry
, gpointer userdata
) 
 116     g_assert(GTK_IS_TREE_ENTRY(entry
)); 
 117     entry
->userdata 
= userdata
; 
 120 void   gtk_tree_entry_set_destroy_func  (GtkTreeEntry
* entry
, 
 121                                          GtkTreeEntryDestroy destroy_func
, 
 122                                          gpointer destroy_func_data
) 
 124     g_assert(GTK_IS_TREE_ENTRY(entry
)); 
 125     entry
->destroy_func 
= destroy_func
; 
 126     entry
->destroy_func_data 
= destroy_func_data
; 
 130 static void gtk_tree_entry_class_init(GtkTreeEntryClass
* klass
) 
 132     GObjectClass
* gobject_class 
= G_OBJECT_CLASS(klass
); 
 133     gobject_class
->dispose 
= gtk_tree_entry_dispose
; 
 136 static void gtk_tree_entry_init (GTypeInstance
* instance
, gpointer g_class
) 
 138     GtkTreeEntry
* entry 
= (GtkTreeEntry
*) instance
; 
 142     entry
->collate_key 
= NULL
; 
 143     entry
->userdata 
= NULL
; 
 144     entry
->destroy_func_data 
= NULL
; 
 145     entry
->destroy_func 
= NULL
; 
 148 static void gtk_tree_entry_string_transform_func(const GValue 
*src_value
, 
 153     /* Make sure src is a treeentry and dest can hold a string */ 
 154     g_assert(GTK_IS_TREE_ENTRY(src_value
->data
[0].v_pointer
)); 
 155     g_assert(G_VALUE_HOLDS(dest_value
, G_TYPE_STRING
)); 
 157     /* TODO: Use strdup here or just pass it? */ 
 158     entry 
= GTK_TREE_ENTRY(src_value
->data
[0].v_pointer
); 
 160     g_value_set_string(dest_value
, entry
->label
); 
 163 static void gtk_tree_entry_dispose(GObject
* obj
) 
 167     g_assert(GTK_IS_TREE_ENTRY(obj
)); 
 169     entry 
= GTK_TREE_ENTRY(obj
); 
 171     /* free label if it exists */ 
 174         g_free(entry
->label
); 
 175         g_free(entry
->collate_key
); 
 177         entry
->collate_key 
= NULL
; 
 180     /* call destroy callback if it exists */ 
 181     if(entry
->destroy_func
) 
 183         (*entry
->destroy_func
) (entry
, entry
->destroy_func_data
); 
 184         entry
->destroy_func 
= NULL
; 
 185         entry
->destroy_func_data 
= NULL
; 
 189     entry
->userdata 
= NULL
;