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 "field-button-menu.h"
32 #define MAX_MENU_ROWS 25
34 /*===========================================*/
36 /*===========================================*/
39 struct _glFieldButtonMenuPrivate {
49 typedef void (*glFieldButtonMenuSignal) (GObject * object, gpointer data);
52 /*===========================================*/
54 /*===========================================*/
56 static gint signals[LAST_SIGNAL] = { 0 };
59 /*===========================================*/
60 /* Local function prototypes */
61 /*===========================================*/
63 static void gl_field_button_menu_finalize (GObject *object);
66 /****************************************************************************/
67 /* Boilerplate Object stuff. */
68 /****************************************************************************/
69 G_DEFINE_TYPE (glFieldButtonMenu, gl_field_button_menu, GTK_TYPE_MENU)
73 gl_field_button_menu_class_init (glFieldButtonMenuClass *class)
75 GObjectClass *object_class = G_OBJECT_CLASS (class);
77 gl_debug (DEBUG_FIELD_BUTTON, "START");
79 gl_field_button_menu_parent_class = g_type_class_peek_parent (class);
81 object_class->finalize = gl_field_button_menu_finalize;
83 signals[KEY_SELECTED] =
84 g_signal_new ("key_selected",
85 G_OBJECT_CLASS_TYPE(object_class),
87 G_STRUCT_OFFSET (glFieldButtonMenuClass, key_selected),
89 gl_marshal_VOID__STRING,
90 G_TYPE_NONE, 1, G_TYPE_STRING);
92 gl_debug (DEBUG_FIELD_BUTTON, "END");
97 gl_field_button_menu_init (glFieldButtonMenu *this)
99 gl_debug (DEBUG_FIELD_BUTTON, "START");
101 this->priv = g_new0 (glFieldButtonMenuPrivate, 1);
103 gl_debug (DEBUG_FIELD_BUTTON, "END");
108 gl_field_button_menu_finalize (GObject *object)
110 glFieldButtonMenu *this = GL_FIELD_BUTTON_MENU (object);
112 GtkWidget *menu_item;
115 gl_debug (DEBUG_FIELD_BUTTON, "START");
117 g_return_if_fail (object != NULL);
118 g_return_if_fail (GL_IS_FIELD_BUTTON_MENU (object));
120 for ( p = this->priv->menu_items; p != NULL; p = p->next )
122 menu_item = GTK_WIDGET (p->data);
123 key = g_object_get_data (G_OBJECT (menu_item), "key");
126 g_list_free (this->priv->menu_items);
129 G_OBJECT_CLASS (gl_field_button_menu_parent_class)->finalize (object);
131 gl_debug (DEBUG_FIELD_BUTTON, "END");
136 gl_field_button_menu_new (void)
138 glFieldButtonMenu *this;
140 gl_debug (DEBUG_FIELD_BUTTON, "START");
142 this = g_object_new (gl_field_button_menu_get_type (), NULL);
144 gl_debug (DEBUG_FIELD_BUTTON, "END");
146 return GTK_WIDGET (this);
150 /*--------------------------------------------------------------------------*/
151 /* PRIVATE. Menu item activation callback. */
152 /*--------------------------------------------------------------------------*/
154 activate_cb (GtkMenuItem *menu_item,
155 glFieldButtonMenu *this)
159 gl_debug (DEBUG_FIELD_BUTTON, "START");
161 key = g_object_get_data (G_OBJECT (menu_item), "key");
162 gl_debug (DEBUG_FIELD_BUTTON, "Key activated: \"%s\"\n", key );
164 g_signal_emit (G_OBJECT (this), signals[KEY_SELECTED], 0, key);
166 gl_debug (DEBUG_FIELD_BUTTON, "END");
170 /****************************************************************************/
172 /****************************************************************************/
174 gl_field_button_menu_set_keys (glFieldButtonMenu *this,
178 GtkWidget *menu_item;
180 gint i, i_row, i_col;
182 gl_debug (DEBUG_FIELD_BUTTON, "START");
185 * Remove all old menu items.
187 for ( p = this->priv->menu_items; p != NULL; p = p->next )
189 menu_item = GTK_WIDGET (p->data);
190 key = g_object_get_data (G_OBJECT (menu_item), "key");
192 gtk_container_remove (GTK_CONTAINER (this), menu_item);
194 g_list_free (this->priv->menu_items);
195 this->priv->menu_items = NULL;
196 gtk_widget_unrealize (GTK_WIDGET (this)); /* Start over with new Gdk resources. */
199 * Add new menu items.
201 for ( p = key_list, i = 0; p != NULL; p = p->next, i++ )
203 if ( p->data && strlen (p->data) )
206 gl_debug (DEBUG_FIELD_BUTTON, "Adding key: %s", p->data);
208 menu_item = gtk_menu_item_new_with_label (p->data);
209 gtk_widget_show (menu_item);
210 g_object_set_data (G_OBJECT (menu_item), "key", g_strdup (p->data));
211 g_signal_connect (G_OBJECT (menu_item), "activate",
212 G_CALLBACK (activate_cb), this);
213 this->priv->menu_items =
214 g_list_append (this->priv->menu_items, menu_item);
216 i_row = i % MAX_MENU_ROWS;
217 i_col = i / MAX_MENU_ROWS;
218 gtk_menu_attach (GTK_MENU (this), menu_item, i_col, i_col+1, i_row, i_row+1);
222 gl_debug (DEBUG_FIELD_BUTTON, "END");
228 * Local Variables: -- emacs
230 * c-basic-offset: 8 -- emacs
231 * tab-width: 8 -- emacs
232 * indent-tabs-mode: nil -- emacs