3 * Copyright (C) 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 "font-combo.h"
25 #include "font-combo-menu.h"
26 #include "font-util.h"
27 #include <glib/gi18n.h>
28 #include <gtk/gtkhbox.h>
29 #include <gtk/gtklabel.h>
30 #include <gtk/gtkarrow.h>
35 /*========================================================*/
37 /*========================================================*/
39 /** GL_FONT_COMBO Private fields */
40 struct _glFontComboPrivate {
55 /*========================================================*/
56 /* Private globals. */
57 /*========================================================*/
59 static guint signals[LAST_SIGNAL] = {0};
62 /*========================================================*/
63 /* Private function prototypes. */
64 /*========================================================*/
66 static void gl_font_combo_finalize (GObject *object);
69 button_press_event_cb (GtkWidget *widget,
70 GdkEventButton *event,
74 menu_font_changed_cb (glFontComboMenu *menu,
78 menu_selection_done_cb (GtkMenuShell *object,
82 /*****************************************************************************/
83 /* Object infrastructure. */
84 /*****************************************************************************/
85 G_DEFINE_TYPE (glFontCombo, gl_font_combo, GTK_TYPE_TOGGLE_BUTTON);
88 /*****************************************************************************/
89 /* Class Init Function. */
90 /*****************************************************************************/
92 gl_font_combo_class_init (glFontComboClass *class)
94 GObjectClass *gobject_class = (GObjectClass *) class;
96 gl_font_combo_parent_class = g_type_class_peek_parent (class);
98 gobject_class->finalize = gl_font_combo_finalize;
101 g_signal_new ("changed",
102 G_OBJECT_CLASS_TYPE (gobject_class),
104 G_STRUCT_OFFSET (glFontComboClass, changed),
106 gl_marshal_VOID__VOID,
111 /*****************************************************************************/
112 /* Object Instance Init Function. */
113 /*****************************************************************************/
115 gl_font_combo_init (glFontCombo *this)
120 this->priv = g_new0 (glFontComboPrivate, 1);
122 hbox = gtk_hbox_new (FALSE, 3);
123 gtk_container_add (GTK_CONTAINER (this), hbox);
125 this->priv->label = gtk_label_new ("");
126 gtk_misc_set_alignment (GTK_MISC (this->priv->label), 0.0, 0.5);
127 gtk_widget_set_size_request (this->priv->label, 180, -1);
128 gtk_box_pack_start (GTK_BOX (hbox), this->priv->label, TRUE, TRUE, 0);
130 arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_IN);
131 gtk_box_pack_end (GTK_BOX (hbox), arrow, FALSE, FALSE, 0);
133 g_signal_connect (this, "button_press_event",
134 G_CALLBACK(button_press_event_cb), this);
138 /*****************************************************************************/
139 /* Finalize Method. */
140 /*****************************************************************************/
142 gl_font_combo_finalize (GObject *object)
146 g_return_if_fail (object && IS_GL_FONT_COMBO (object));
147 this = GL_FONT_COMBO (object);
149 g_free (this->priv->font_family);
150 g_object_ref_sink (this->priv->menu);
153 G_OBJECT_CLASS (gl_font_combo_parent_class)->finalize (object);
157 /*****************************************************************************/
158 /** New Object Generator. */
159 /*****************************************************************************/
161 gl_font_combo_new (const gchar *font_family)
165 this = g_object_new (TYPE_GL_FONT_COMBO, NULL);
167 this->priv->font_family = gl_font_util_validate_family (font_family);
169 gtk_label_set_text (GTK_LABEL (this->priv->label), this->priv->font_family);
171 this->priv->menu = gl_font_combo_menu_new ();
173 gtk_widget_show_all (this->priv->menu);
175 g_signal_connect (this->priv->menu, "font_changed",
176 G_CALLBACK (menu_font_changed_cb), this);
177 g_signal_connect (this->priv->menu, "selection_done",
178 G_CALLBACK (menu_selection_done_cb), this);
180 return GTK_WIDGET (this);
184 /*****************************************************************************/
185 /** Set relief style. */
186 /*****************************************************************************/
188 gl_font_combo_set_relief( glFontCombo *this,
189 GtkReliefStyle relief )
191 gtk_button_set_relief (GTK_BUTTON (this), relief);
195 /*****************************************************************************/
196 /* Set font family. */
197 /*****************************************************************************/
199 gl_font_combo_set_family (glFontCombo *this,
200 const gchar *font_family)
203 this->priv->font_family = gl_font_util_validate_family (font_family);
205 gtk_label_set_text (GTK_LABEL (this->priv->label), this->priv->font_family);
209 /*****************************************************************************/
210 /* Get font family. */
211 /*****************************************************************************/
213 gl_font_combo_get_family (glFontCombo *this)
215 return g_strdup (this->priv->font_family);
219 /*****************************************************************************/
220 /* Menu positioning function. */
221 /*****************************************************************************/
223 menu_position_function (GtkMenu *menu,
229 glFontCombo *this = GL_FONT_COMBO (user_data);
233 gdk_window_get_origin (GTK_WIDGET (this)->window, &x1, &y1);
234 *x = x1 + GTK_WIDGET (this)->allocation.x;
235 *y = y1 + GTK_WIDGET (this)->allocation.y +
236 GTK_WIDGET (this)->allocation.height;
238 menu_h = this->priv->menu->allocation.height;
239 menu_w = this->priv->menu->allocation.width;
241 if ((*y + menu_h) > gdk_screen_height ())
243 *y = y1 + GTK_WIDGET (this)->allocation.y - menu_h;
246 *y = gdk_screen_height () - menu_h;
250 if ((*x + menu_w) > gdk_screen_width ())
252 *x = gdk_screen_width () - menu_w;
259 /*****************************************************************************/
260 /* Button "button_press_event" callback. */
261 /*****************************************************************************/
263 button_press_event_cb (GtkWidget *widget,
264 GdkEventButton *event,
267 switch (event->button)
271 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (this), TRUE);
273 gtk_menu_popup (GTK_MENU (this->priv->menu),
275 menu_position_function, this,
276 event->button, event->time);
288 /*****************************************************************************/
289 /* Menu "font changed" callback. */
290 /*****************************************************************************/
292 menu_font_changed_cb (glFontComboMenu *menu,
295 this->priv->font_family = gl_font_combo_menu_get_family (menu);
297 gtk_label_set_text (GTK_LABEL (this->priv->label), this->priv->font_family);
299 g_signal_emit (this, signals[CHANGED], 0);
303 /*****************************************************************************/
304 /* Menu "selection done" callback. */
305 /*****************************************************************************/
307 menu_selection_done_cb (GtkMenuShell *object,
310 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (this), FALSE);
316 * Local Variables: -- emacs
318 * c-basic-offset: 8 -- emacs
319 * tab-width: 8 -- emacs
320 * indent-tabs-mode: nil -- emacs