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