]> git.saurik.com Git - wxWidgets.git/blame - src/gtk/treeentry_gtk.c
Correct bounding box calculation in wxGTK wxDC::DrawText().
[wxWidgets.git] / src / gtk / treeentry_gtk.c
CommitLineData
4a46cbe8
RR
1/* ///////////////////////////////////////////////////////////////////////////
2// Name: src/gtk/treeentry_gtk.c
3// Purpose: GtkTreeEntry implementation
4// Author: Ryan Norton
5// Id: $Id$
6// Copyright: (c) 2006 Ryan Norton
7// Licence: wxWindows licence
8/////////////////////////////////////////////////////////////////////////// */
9
76c32e7b
JJ
10#ifdef __VMS
11#include <types.h>
12typedef pid_t GPid;
13#define G_GNUC_INTERNAL
06b4070d 14#define GSEAL(x) x
76c32e7b
JJ
15#endif
16
4a46cbe8
RR
17#include "wx/gtk/treeentry_gtk.h"
18
19/*
20 GtkTreeEntry
21
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.
24
25 This is transformable to a string for the Gtk implementations,
26 and the string passed in is duplicated and freed upon destruction.
27
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
31 own model etc..
32*/
33
34/* forwards */
35static void gtk_tree_entry_class_init(GtkTreeEntryClass* klass);
36static void gtk_tree_entry_init (GTypeInstance* instance, gpointer g_class);
37static void gtk_tree_entry_string_transform_func(const GValue *src_value,
38 GValue *dest_value);
39static void gtk_tree_entry_dispose(GObject* obj);
40
41
42/* public */
9d655692 43GtkTreeEntry*
4a46cbe8
RR
44gtk_tree_entry_new()
45{
46 return GTK_TREE_ENTRY(g_object_new(GTK_TYPE_TREE_ENTRY, NULL));
47}
48
49GtkType
50gtk_tree_entry_get_type ()
51{
52 static GtkType tree_entry_type = 0;
53
54 if (!tree_entry_type)
55 {
de4a74e2 56 const GTypeInfo tree_entry_info =
4a46cbe8
RR
57 {
58 sizeof (GtkTreeEntryClass),
59 NULL, /* base_init */
60 NULL, /* base_finalize */
61 (GClassInitFunc) gtk_tree_entry_class_init, /* class_init */
62 NULL, /* class_finalize */
63 NULL, /* class_data */
64 sizeof (GtkTreeEntry),
65 16, /* n_preallocs */
4eb8ef2d
MR
66 (GInstanceInitFunc) gtk_tree_entry_init, /*instance_init*/
67 NULL /* value_table */
4a46cbe8 68 };
9d655692
MR
69 tree_entry_type = g_type_register_static (G_TYPE_OBJECT, "GtkTreeEntry",
70 &tree_entry_info,
4a46cbe8
RR
71 (GTypeFlags)0);
72 g_value_register_transform_func(tree_entry_type, G_TYPE_STRING,
73 gtk_tree_entry_string_transform_func);
74 }
75
76 return tree_entry_type;
77}
78
79gchar* gtk_tree_entry_get_collate_key (GtkTreeEntry* entry)
80{
81 return entry->collate_key;
82}
83
84gchar* gtk_tree_entry_get_label (GtkTreeEntry* entry)
85{
86 g_assert(GTK_IS_TREE_ENTRY(entry));
87 return entry->label;
88}
89
90gpointer gtk_tree_entry_get_userdata (GtkTreeEntry* entry)
91{
92 g_assert(GTK_IS_TREE_ENTRY(entry));
93 return entry->userdata;
94}
95
96void gtk_tree_entry_set_label (GtkTreeEntry* entry, const gchar* label)
97{
98 g_assert(GTK_IS_TREE_ENTRY(entry));
99
100 /* free previous if it exists */
101 if(entry->label)
102 {
103 g_free(entry->label);
104 g_free(entry->collate_key);
105 }
106
107 entry->label = g_strdup(label);
108 entry->collate_key = g_utf8_collate_key(label, -1); /* -1 == null terminated */
109}
110
111void gtk_tree_entry_set_userdata (GtkTreeEntry* entry, gpointer userdata)
112{
113 g_assert(GTK_IS_TREE_ENTRY(entry));
114 entry->userdata = userdata;
115}
116
9d655692 117void gtk_tree_entry_set_destroy_func (GtkTreeEntry* entry,
4a46cbe8
RR
118 GtkTreeEntryDestroy destroy_func,
119 gpointer destroy_func_data)
120{
121 g_assert(GTK_IS_TREE_ENTRY(entry));
9d655692
MR
122 entry->destroy_func = destroy_func;
123 entry->destroy_func_data = destroy_func_data;
4a46cbe8
RR
124}
125
126/* private */
127static void gtk_tree_entry_class_init(GtkTreeEntryClass* klass)
128{
129 GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
130 gobject_class->dispose = gtk_tree_entry_dispose;
131}
132
133static void gtk_tree_entry_init (GTypeInstance* instance, gpointer g_class)
134{
135 GtkTreeEntry* entry = (GtkTreeEntry*) instance;
136
137 /* clear */
138 entry->label = NULL;
139 entry->collate_key = NULL;
140 entry->userdata = NULL;
141 entry->destroy_func_data = NULL;
142 entry->destroy_func = NULL;
143}
144
145static void gtk_tree_entry_string_transform_func(const GValue *src_value,
146 GValue *dest_value)
147{
cdff92b9
VZ
148 GtkTreeEntry *entry;
149
4a46cbe8
RR
150 /* Make sure src is a treeentry and dest can hold a string */
151 g_assert(GTK_IS_TREE_ENTRY(src_value->data[0].v_pointer));
152 g_assert(G_VALUE_HOLDS(dest_value, G_TYPE_STRING));
153
154 /* TODO: Use strdup here or just pass it? */
cdff92b9 155 entry = GTK_TREE_ENTRY(src_value->data[0].v_pointer);
4a46cbe8 156
9d655692 157 g_value_set_string(dest_value, entry->label);
4a46cbe8
RR
158}
159
160static void gtk_tree_entry_dispose(GObject* obj)
161{
cdff92b9
VZ
162 GtkTreeEntry *entry;
163
4a46cbe8
RR
164 g_assert(GTK_IS_TREE_ENTRY(obj));
165
cdff92b9 166 entry = GTK_TREE_ENTRY(obj);
4a46cbe8
RR
167
168 /* free label if it exists */
169 if(entry->label)
170 {
171 g_free(entry->label);
172 g_free(entry->collate_key);
173 entry->label = NULL;
174 entry->collate_key = NULL;
175 }
176
177 /* call destroy callback if it exists */
178 if(entry->destroy_func)
179 {
180 (*entry->destroy_func) (entry, entry->destroy_func_data);
181 entry->destroy_func = NULL;
182 entry->destroy_func_data = NULL;
183 }
184
185 /* clear userdata */
186 entry->userdata = NULL;
187}