]> git.sur5r.net Git - glabels/blob - src/wdgt-merge-menu.c
Organized master branch to be top-level directory for glabels, instead of
[glabels] / src / wdgt-merge-menu.c
1 /*
2  *  wdgt-merge-menu.c
3  *  Copyright (C) 2008-2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
7  *  gLabels is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  gLabels is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22
23 #include "wdgt-merge-menu.h"
24
25 #include <string.h>
26 #include <gtk/gtk.h>
27
28 #include "marshal.h"
29
30 #include "debug.h"
31
32
33 /*===========================================*/
34 /* Private types                             */
35 /*===========================================*/
36
37
38 struct _glWdgtMergeMenuPrivate {
39
40         GList *menu_items;
41 };
42
43 enum {
44         FIELD_SELECTED,
45         LAST_SIGNAL
46 };
47
48 typedef void (*glWdgtMergeMenuSignal) (GObject * object, gpointer data);
49
50
51 /*===========================================*/
52 /* Private globals                           */
53 /*===========================================*/
54
55 static gint signals[LAST_SIGNAL] = { 0 };
56
57
58 /*===========================================*/
59 /* Local function prototypes                 */
60 /*===========================================*/
61
62 static void gl_wdgt_merge_menu_finalize      (GObject              *object);
63
64
65 /****************************************************************************/
66 /* Boilerplate Object stuff.                                                */
67 /****************************************************************************/
68 G_DEFINE_TYPE (glWdgtMergeMenu, gl_wdgt_merge_menu, GTK_TYPE_MENU);
69
70
71 static void
72 gl_wdgt_merge_menu_class_init (glWdgtMergeMenuClass *class)
73 {
74         GObjectClass *object_class = G_OBJECT_CLASS (class);
75
76         gl_debug (DEBUG_MERGE_MENU, "START");
77
78         gl_wdgt_merge_menu_parent_class = g_type_class_peek_parent (class);
79
80         object_class->finalize = gl_wdgt_merge_menu_finalize;
81
82         signals[FIELD_SELECTED] =
83             g_signal_new ("field_selected",
84                           G_OBJECT_CLASS_TYPE(object_class),
85                           G_SIGNAL_RUN_LAST,
86                           G_STRUCT_OFFSET (glWdgtMergeMenuClass, field_selected),
87                           NULL, NULL,
88                           gl_marshal_VOID__STRING,
89                           G_TYPE_NONE, 1, G_TYPE_STRING);
90
91         gl_debug (DEBUG_MERGE_MENU, "END");
92 }
93
94
95 static void
96 gl_wdgt_merge_menu_init (glWdgtMergeMenu *merge_menu)
97 {
98         gl_debug (DEBUG_MERGE_MENU, "START");
99
100         merge_menu->priv = g_new0 (glWdgtMergeMenuPrivate, 1);
101
102         gl_debug (DEBUG_MERGE_MENU, "END");
103 }
104
105
106 static void
107 gl_wdgt_merge_menu_finalize (GObject *object)
108 {
109         glWdgtMergeMenu *merge_menu = GL_WDGT_MERGE_MENU (object);
110         GList           *p;
111         GtkWidget       *menu_item;
112         gchar           *field;
113
114         gl_debug (DEBUG_MERGE_MENU, "START");
115
116         g_return_if_fail (object != NULL);
117         g_return_if_fail (GL_IS_WDGT_MERGE_MENU (object));
118
119         for ( p = merge_menu->priv->menu_items; p != NULL; p = p->next )
120         {
121                 menu_item = GTK_WIDGET (p->data);
122                 field = g_object_get_data (G_OBJECT (menu_item), "field");
123                 g_free (field);
124         }
125         g_list_free (merge_menu->priv->menu_items);
126         g_free (merge_menu->priv);
127
128         G_OBJECT_CLASS (gl_wdgt_merge_menu_parent_class)->finalize (object);
129
130         gl_debug (DEBUG_MERGE_MENU, "END");
131 }
132
133
134 GtkWidget *
135 gl_wdgt_merge_menu_new (void)
136 {
137         glWdgtMergeMenu *merge_menu;
138
139         gl_debug (DEBUG_MERGE_MENU, "START");
140
141         merge_menu = g_object_new (gl_wdgt_merge_menu_get_type (), NULL);
142
143         gl_debug (DEBUG_MERGE_MENU, "END");
144
145         return GTK_WIDGET (merge_menu);
146 }
147
148
149 /*--------------------------------------------------------------------------*/
150 /* PRIVATE.  Menu item activation callback.                                 */
151 /*--------------------------------------------------------------------------*/
152 static void
153 activate_cb (GtkMenuItem     *menu_item,
154              glWdgtMergeMenu *merge_menu)
155 {
156         gchar *field;
157
158         gl_debug (DEBUG_MERGE_MENU, "START");
159
160         field = g_object_get_data (G_OBJECT (menu_item), "field");
161         gl_debug (DEBUG_MERGE_MENU, "Field activated: \"%s\"\n", field );
162
163         g_signal_emit (G_OBJECT (merge_menu), signals[FIELD_SELECTED], 0, field);
164
165         gl_debug (DEBUG_MERGE_MENU, "END");
166 }
167
168
169 /****************************************************************************/
170 /* set field names.                                                         */
171 /****************************************************************************/
172 void
173 gl_wdgt_merge_menu_set_fields (glWdgtMergeMenu *merge_menu,
174                                GList           *field_list)
175 {
176         GList     *p;
177         GtkWidget *menu_item;
178         gchar     *field;
179
180         gl_debug (DEBUG_MERGE_MENU, "START");
181
182         /*
183          * Remove all old menu items.
184          */
185         for ( p = merge_menu->priv->menu_items; p != NULL; p = p->next )
186         {
187                 menu_item = GTK_WIDGET (p->data);
188                 field = g_object_get_data (G_OBJECT (menu_item), "field");
189                 g_free (field);
190                 gtk_widget_destroy (menu_item);
191         }
192         g_list_free (merge_menu->priv->menu_items);
193         merge_menu->priv->menu_items = NULL;
194
195         /*
196          * Add new menu items.
197          */
198         for ( p = field_list; p != NULL; p = p->next )
199         {
200                 menu_item = gtk_menu_item_new_with_label (p->data);
201                 g_object_set_data (G_OBJECT (menu_item), "field", g_strdup (p->data));
202                 g_signal_connect (G_OBJECT (menu_item), "activate", 
203                                   G_CALLBACK (activate_cb), merge_menu);
204                 gtk_menu_shell_append (GTK_MENU_SHELL (merge_menu), menu_item);
205                 merge_menu->priv->menu_items =
206                         g_list_append (merge_menu->priv->menu_items, menu_item);
207         }
208
209         gl_debug (DEBUG_MERGE_MENU, "END");
210 }
211
212
213
214 /*
215  * Local Variables:       -- emacs
216  * mode: C                -- emacs
217  * c-basic-offset: 8      -- emacs
218  * tab-width: 8           -- emacs
219  * indent-tabs-mode: nil  -- emacs
220  * End:                   -- emacs
221  */