3 * Copyright (C) 2008-2009 Jim Evins <evins@snaught.com>.
5 * This file is part of gLabels.
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.
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.
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/>.
23 #include "wdgt-merge-menu.h"
33 /*===========================================*/
35 /*===========================================*/
38 struct _glWdgtMergeMenuPrivate {
48 typedef void (*glWdgtMergeMenuSignal) (GObject * object, gpointer data);
51 /*===========================================*/
53 /*===========================================*/
55 static gint signals[LAST_SIGNAL] = { 0 };
58 /*===========================================*/
59 /* Local function prototypes */
60 /*===========================================*/
62 static void gl_wdgt_merge_menu_finalize (GObject *object);
65 /****************************************************************************/
66 /* Boilerplate Object stuff. */
67 /****************************************************************************/
68 G_DEFINE_TYPE (glWdgtMergeMenu, gl_wdgt_merge_menu, GTK_TYPE_MENU);
72 gl_wdgt_merge_menu_class_init (glWdgtMergeMenuClass *class)
74 GObjectClass *object_class = G_OBJECT_CLASS (class);
76 gl_debug (DEBUG_MERGE_MENU, "START");
78 gl_wdgt_merge_menu_parent_class = g_type_class_peek_parent (class);
80 object_class->finalize = gl_wdgt_merge_menu_finalize;
82 signals[FIELD_SELECTED] =
83 g_signal_new ("field_selected",
84 G_OBJECT_CLASS_TYPE(object_class),
86 G_STRUCT_OFFSET (glWdgtMergeMenuClass, field_selected),
88 gl_marshal_VOID__STRING,
89 G_TYPE_NONE, 1, G_TYPE_STRING);
91 gl_debug (DEBUG_MERGE_MENU, "END");
96 gl_wdgt_merge_menu_init (glWdgtMergeMenu *merge_menu)
98 gl_debug (DEBUG_MERGE_MENU, "START");
100 merge_menu->priv = g_new0 (glWdgtMergeMenuPrivate, 1);
102 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");
135 gl_wdgt_merge_menu_new (void)
137 glWdgtMergeMenu *merge_menu;
139 gl_debug (DEBUG_MERGE_MENU, "START");
141 merge_menu = g_object_new (gl_wdgt_merge_menu_get_type (), NULL);
143 gl_debug (DEBUG_MERGE_MENU, "END");
145 return GTK_WIDGET (merge_menu);
149 /*--------------------------------------------------------------------------*/
150 /* PRIVATE. Menu item activation callback. */
151 /*--------------------------------------------------------------------------*/
153 activate_cb (GtkMenuItem *menu_item,
154 glWdgtMergeMenu *merge_menu)
158 gl_debug (DEBUG_MERGE_MENU, "START");
160 field = g_object_get_data (G_OBJECT (menu_item), "field");
161 gl_debug (DEBUG_MERGE_MENU, "Field activated: \"%s\"\n", field );
163 g_signal_emit (G_OBJECT (merge_menu), signals[FIELD_SELECTED], 0, field);
165 gl_debug (DEBUG_MERGE_MENU, "END");
169 /****************************************************************************/
170 /* set field names. */
171 /****************************************************************************/
173 gl_wdgt_merge_menu_set_fields (glWdgtMergeMenu *merge_menu,
177 GtkWidget *menu_item;
180 gl_debug (DEBUG_MERGE_MENU, "START");
183 * Remove all old menu items.
185 for ( p = merge_menu->priv->menu_items; p != NULL; p = p->next )
187 menu_item = GTK_WIDGET (p->data);
188 field = g_object_get_data (G_OBJECT (menu_item), "field");
190 gtk_widget_destroy (menu_item);
192 g_list_free (merge_menu->priv->menu_items);
193 merge_menu->priv->menu_items = NULL;
196 * Add new menu items.
198 for ( p = field_list; p != NULL; p = p->next )
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);
209 gl_debug (DEBUG_MERGE_MENU, "END");
215 * Local Variables: -- emacs
217 * c-basic-offset: 8 -- emacs
218 * tab-width: 8 -- emacs
219 * indent-tabs-mode: nil -- emacs