1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
4 * (GLABELS) Label and Business Card Creation program for GNOME
6 * wdgt_merge_menu.c: merge menu widget module
8 * Copyright (C) 2008 Jim Evins <evins@snaught.com>.
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.
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.
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
27 #include "wdgt-merge-menu.h"
30 #include <gtk/gtkmenuitem.h>
36 /*===========================================*/
38 /*===========================================*/
41 struct _glWdgtMergeMenuPrivate {
51 typedef void (*glWdgtMergeMenuSignal) (GObject * object, gpointer data);
53 /*===========================================*/
55 /*===========================================*/
57 static gint signals[LAST_SIGNAL] = { 0 };
59 /*===========================================*/
60 /* Local function prototypes */
61 /*===========================================*/
63 static void gl_wdgt_merge_menu_finalize (GObject *object);
67 /****************************************************************************/
68 /* Boilerplate Object stuff. */
69 /****************************************************************************/
70 G_DEFINE_TYPE (glWdgtMergeMenu, gl_wdgt_merge_menu, GTK_TYPE_MENU);
74 gl_wdgt_merge_menu_class_init (glWdgtMergeMenuClass *class)
76 GObjectClass *object_class = G_OBJECT_CLASS (class);
78 gl_debug (DEBUG_MERGE_MENU, "START");
80 gl_wdgt_merge_menu_parent_class = g_type_class_peek_parent (class);
82 object_class->finalize = gl_wdgt_merge_menu_finalize;
84 signals[FIELD_SELECTED] =
85 g_signal_new ("field_selected",
86 G_OBJECT_CLASS_TYPE(object_class),
88 G_STRUCT_OFFSET (glWdgtMergeMenuClass, field_selected),
90 gl_marshal_VOID__STRING,
91 G_TYPE_NONE, 1, G_TYPE_STRING);
93 gl_debug (DEBUG_MERGE_MENU, "END");
97 gl_wdgt_merge_menu_init (glWdgtMergeMenu *merge_menu)
99 gl_debug (DEBUG_MERGE_MENU, "START");
101 merge_menu->priv = g_new0 (glWdgtMergeMenuPrivate, 1);
103 gl_debug (DEBUG_MERGE_MENU, "END");
107 gl_wdgt_merge_menu_finalize (GObject *object)
109 glWdgtMergeMenu *merge_menu = GL_WDGT_MERGE_MENU (object);
111 GtkWidget *menu_item;
114 gl_debug (DEBUG_MERGE_MENU, "START");
116 g_return_if_fail (object != NULL);
117 g_return_if_fail (GL_IS_WDGT_MERGE_MENU (object));
119 for ( p = merge_menu->priv->menu_items; p != NULL; p = p->next )
121 menu_item = GTK_WIDGET (p->data);
122 field = g_object_get_data (G_OBJECT (menu_item), "field");
125 g_list_free (merge_menu->priv->menu_items);
126 g_free (merge_menu->priv);
128 G_OBJECT_CLASS (gl_wdgt_merge_menu_parent_class)->finalize (object);
130 gl_debug (DEBUG_MERGE_MENU, "END");
134 gl_wdgt_merge_menu_new (void)
136 glWdgtMergeMenu *merge_menu;
138 gl_debug (DEBUG_MERGE_MENU, "START");
140 merge_menu = g_object_new (gl_wdgt_merge_menu_get_type (), NULL);
142 gl_debug (DEBUG_MERGE_MENU, "END");
144 return GTK_WIDGET (merge_menu);
148 /*--------------------------------------------------------------------------*/
149 /* PRIVATE. Menu item activation callback. */
150 /*--------------------------------------------------------------------------*/
152 activate_cb (GtkMenuItem *menu_item,
153 glWdgtMergeMenu *merge_menu)
157 gl_debug (DEBUG_MERGE_MENU, "START");
159 field = g_object_get_data (G_OBJECT (menu_item), "field");
160 gl_debug (DEBUG_MERGE_MENU, "Field activated: \"%s\"\n", field );
162 g_signal_emit (G_OBJECT (merge_menu), signals[FIELD_SELECTED], 0, field);
164 gl_debug (DEBUG_MERGE_MENU, "END");
167 /****************************************************************************/
168 /* set field names. */
169 /****************************************************************************/
171 gl_wdgt_merge_menu_set_fields (glWdgtMergeMenu *merge_menu,
175 GtkWidget *menu_item;
178 gl_debug (DEBUG_MERGE_MENU, "START");
181 * Remove all old menu items.
183 for ( p = merge_menu->priv->menu_items; p != NULL; p = p->next )
185 menu_item = GTK_WIDGET (p->data);
186 field = g_object_get_data (G_OBJECT (menu_item), "field");
188 gtk_widget_destroy (menu_item);
190 g_list_free (merge_menu->priv->menu_items);
191 merge_menu->priv->menu_items = NULL;
194 * Add new menu items.
196 for ( p = field_list; p != NULL; p = p->next )
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);
207 gl_debug (DEBUG_MERGE_MENU, "END");