/* LibAbi * Copyright (C) 2005 Robert Staudinger * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include #include "abi-topaz-toolbar.h" #include "abi-topaz-toolbar-actions.h" #include "insert.png.h" #include "list.png.h" #include "style.png.h" #include "table.png.h" #define ABI_STOCK_STYLE "abi-stock-style" #define ABI_STOCK_LIST "abi-stock-list" #define ABI_STOCK_INSERT "abi-stock-insert" #define ABI_STOCK_TABLE "abi-stock-table" static GtkStockItem stock_items[] = { { "ABI_STOCK_STYLE", "Styles", 0, 0, 0 }, }; enum { _PROP_0, NUM_PROPS }; enum { ACTIVATE, ACTIVATE_FONT, ACTIVATE_STYLE, _LAST_SIGNAL }; struct _AbiTopazToolbar { GtkHBox parent; GtkWidget *font_menu; GtkWidget *style_menu; GSList *styles; gboolean is_disposed; }; struct _AbiTopazToolbarClass { GtkHBoxClass parent_class; void (* activate) (AbiTopazToolbar *self, const gchar *method, gpointer user_data); void (* activate_font) (AbiTopazToolbar *self, const gchar *family, gpointer user_data); void (* activate_style) (AbiTopazToolbar *self, const gchar *style, gpointer user_data); }; static guint abi_topaz_toolbar_signals[_LAST_SIGNAL] = { 0 }; static GtkHBoxClass *abi_topaz_toolbar_parent_class = NULL; static void activate_cb (GtkAction *action, AbiTopazToolbar *self); static GtkActionEntry action_items[] = { { "fileNew", GTK_STOCK_FILE, "New", "", "New", G_CALLBACK (activate_cb) }, { "dlgMetaData", NULL,"Properties", "", "New", G_CALLBACK (activate_cb) }, { "closeWindow", NULL, "Close", "", "New", G_CALLBACK (activate_cb) }, { "print", GTK_STOCK_PRINT, "Print", "", "New", G_CALLBACK (activate_cb) }, { "pageSetup", NULL, "Page Setup ...", "", "New", G_CALLBACK (activate_cb) }, { "printPreview", NULL, "Preview ...", "", "New", G_CALLBACK (activate_cb) }, { "dlgStylist", ABI_STOCK_STYLE, "Styles ...", "", "New", G_CALLBACK (activate_cb) }, { "list-bullet", NULL, "Bullets", "", "New", G_CALLBACK (activate_cb) }, { "list-dash", NULL, "Dashes", "", "New", G_CALLBACK (activate_cb) }, { "list-tick", NULL, "Ticks", "", "New", G_CALLBACK (activate_cb) }, { "list-numbered", NULL, "Numbered List", "", "New", G_CALLBACK (activate_cb) }, { "list-lower", NULL, "Lowercase List", "", "New", G_CALLBACK (activate_cb) }, { "list-roman", NULL, "Roman numbers", "", "New", G_CALLBACK (activate_cb) }, { "dlgBullets", ABI_STOCK_LIST, "More ...", "", "New", G_CALLBACK (activate_cb) }, { "fileInsertGraphic", ABI_STOCK_INSERT, "Picture ...", "", "New", G_CALLBACK (activate_cb) }, { "insert-symbol", NULL, "Symbol ...", "", "New", G_CALLBACK (activate_cb) }, { "insPageNo", NULL, "Page Numbers", "", "New", G_CALLBACK (activate_cb) }, { "insFootnote", NULL, "Footnote", "", "New", G_CALLBACK (activate_cb) }, { "insEndnote", NULL, "Endnote", "", "New", G_CALLBACK (activate_cb) }, { "editHeader", NULL, "Page Header", "", "New", G_CALLBACK (activate_cb) }, { "editFooter", NULL, "Page Footer", "", "New", G_CALLBACK (activate_cb) }, { "insertTable", ABI_STOCK_TABLE, "Insert Table", "", "New", G_CALLBACK (activate_cb) }, { "insertRowsAfter", NULL, "Insert Row", "", "New", G_CALLBACK (activate_cb) }, { "insertColsAfter", NULL, "Insert Column", "", "New", G_CALLBACK (activate_cb) }, { "deleteRows", NULL, "Delete Row", "", "New", G_CALLBACK (activate_cb) }, { "deleteColumns", NULL, "Delete Column", "", "New", G_CALLBACK (activate_cb) }, { "formatTable", NULL, "Format Table ...", "", "New", G_CALLBACK (activate_cb) }, { "dlgSpell", GTK_STOCK_SPELL_CHECK, "Spelling ...", "", "New", G_CALLBACK (activate_cb) }, { "proof-grammar", NULL, "Grammar ...", "", "New", G_CALLBACK (activate_cb) }, { "colour-text", GTK_STOCK_SELECT_COLOR, "Text Color ...", "", "New", G_CALLBACK (activate_cb) }, { "colour-background", NULL, "Background Color ...", "", "New", G_CALLBACK (activate_cb) }, { "dlgFont", GTK_STOCK_SELECT_FONT, "Fonts", "", "New", G_CALLBACK (activate_cb) }, }; static guint n_action_items = G_N_ELEMENTS (action_items); static void activate_cb (GtkAction *action, AbiTopazToolbar *self) { g_signal_emit (self, abi_topaz_toolbar_signals [ACTIVATE], 0, gtk_action_get_name (action)); } static void activate_font_cb (GtkAction *action, AbiTopazToolbar *self) { g_signal_emit (self, abi_topaz_toolbar_signals [ACTIVATE_FONT], 0, gtk_action_get_name (action)); } static void activate_style_cb (GtkAction *action, AbiTopazToolbar *self) { g_signal_emit (self, abi_topaz_toolbar_signals [ACTIVATE_STYLE], 0, gtk_action_get_name (action)); } static void menu_pos_func (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, GtkWidget *button) { GtkAllocation alloc = GTK_WIDGET (button)->allocation; gdk_window_get_origin (button->window, x, y); *y = *y + alloc.height; *push_in = FALSE; } static gboolean popup_cb (GtkWidget *widget, GdkEventButton *event, GtkMenu *menu) { if (menu) { gtk_menu_popup (menu, NULL, NULL, (GtkMenuPositionFunc) menu_pos_func, (gpointer) widget, 1, gtk_get_current_event_time()); } return TRUE; } static GtkWidget* create_button (const gchar *caption, GtkAction *action, GtkWidget *popup, GtkWidget *item) { GtkWidget *toolbutton; GtkWidget *button; GtkWidget *image; GtkWidget *evbox; GtkWidget *label; GtkWidget *arrow; GtkWidget *menu; /* button */ toolbutton = gtk_table_new (2, 2, FALSE); button = gtk_action_create_tool_item (action); gtk_table_attach_defaults (GTK_TABLE (toolbutton), button, 0, 2, 0, 1); evbox = gtk_event_box_new (); gtk_table_attach_defaults (GTK_TABLE (toolbutton), evbox, 0, 1, 1, 2); label = gtk_label_new (""); caption = g_strdup_printf ("%s", caption); gtk_label_set_markup (GTK_LABEL (label), caption); gtk_container_add (GTK_CONTAINER (evbox), label); arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT); gtk_misc_set_padding (GTK_MISC (arrow), 1, 0); gtk_table_attach_defaults (GTK_TABLE (toolbutton), arrow, 1, 2, 1, 2); /* menu */ if (popup) { g_signal_connect (G_OBJECT (evbox), "button-press-event", G_CALLBACK (popup_cb), (gpointer) popup); } if (item) { GtkWidget *label = gtk_bin_get_child (GTK_BIN (item)); if (GTK_IS_LABEL (label)) { const gchar *text = gtk_label_get_label (GTK_LABEL (label)); gchar *bold_text = g_strdup_printf ("%s", text); gtk_label_set_markup (GTK_LABEL (label), bold_text); g_free (bold_text); } } return toolbutton; } static void instance_init (AbiTopazToolbar *self) { GtkIconFactory *factory; GtkIconSet *set; GdkPixbuf *pixbuf; GtkUIManager *uim; GtkActionGroup *ag; GtkWidget *toolbox; GtkWidget *toolbutton; GtkWidget *label; GError *err = NULL; self->styles = NULL; self->is_disposed = FALSE; factory = gtk_icon_factory_new (); /* pixbuf = gdk_pixbuf_new_from_file ("style.png", NULL); */ pixbuf = gdk_pixbuf_new_from_inline (-1, abi_topaz_toolbar_icon_style, FALSE, NULL); set = gtk_icon_set_new_from_pixbuf (pixbuf); gtk_icon_factory_add (factory, ABI_STOCK_STYLE, set); /* pixbuf = gdk_pixbuf_new_from_file ("list.png", NULL); */ pixbuf = gdk_pixbuf_new_from_inline (-1, abi_topaz_toolbar_icon_list, FALSE, NULL); set = gtk_icon_set_new_from_pixbuf (pixbuf); gtk_icon_factory_add (factory, ABI_STOCK_LIST, set); /* pixbuf = gdk_pixbuf_new_from_file ("insert.png", NULL); */ pixbuf = gdk_pixbuf_new_from_inline (-1, abi_topaz_toolbar_icon_insert, FALSE, NULL); set = gtk_icon_set_new_from_pixbuf (pixbuf); gtk_icon_factory_add (factory, ABI_STOCK_INSERT, set); /* pixbuf = gdk_pixbuf_new_from_file ("table.png", NULL); */ pixbuf = gdk_pixbuf_new_from_inline (-1, abi_topaz_toolbar_icon_table, FALSE, NULL); set = gtk_icon_set_new_from_pixbuf (pixbuf); gtk_icon_factory_add (factory, ABI_STOCK_TABLE, set); gtk_icon_factory_add_default (factory); uim = gtk_ui_manager_new (); ag = gtk_action_group_new ("default"); gtk_action_group_add_actions (ag, action_items, n_action_items, (gpointer) self); gtk_ui_manager_insert_action_group (uim, ag, 0); if (0 == gtk_ui_manager_add_ui_from_string (uim, abi_topaz_toolbar_actions, -1, &err)) { g_printf ("loading failed '%s'\n", err->message); } label = gtk_label_new (" "); gtk_box_pack_start (GTK_BOX (self), label, FALSE, FALSE, 5); toolbox = gtk_hbox_new (FALSE, 3); gtk_box_pack_start (GTK_BOX (self), toolbox, FALSE, FALSE, 0); toolbutton = create_button ("File", gtk_action_group_get_action (ag, "fileNew"), gtk_ui_manager_get_widget (uim, "/ui/file"), gtk_ui_manager_get_widget (uim, "/ui/file/first")); gtk_box_pack_start (GTK_BOX (toolbox), toolbutton, FALSE, FALSE, 0); toolbutton = create_button ("Print", gtk_action_group_get_action (ag, "print"), gtk_ui_manager_get_widget (uim, "/ui/print"), gtk_ui_manager_get_widget (uim, "/ui/print/first")); gtk_box_pack_start (GTK_BOX (toolbox), toolbutton, FALSE, FALSE, 0); label = gtk_label_new (""); gtk_box_pack_start (GTK_BOX (self), label, TRUE, TRUE, 0); toolbox = gtk_hbox_new (FALSE, 3); gtk_box_pack_start (GTK_BOX (self), toolbox, FALSE, FALSE, 0); self->style_menu = gtk_ui_manager_get_widget (uim, "/ui/style"); toolbutton = create_button ("Style", gtk_action_group_get_action (ag, "dlgStylist"), self->style_menu, gtk_ui_manager_get_widget (uim, "/ui/style/first")); gtk_box_pack_start (GTK_BOX (toolbox), toolbutton, FALSE, FALSE, 0); toolbutton = create_button ("List", gtk_action_group_get_action (ag, "dlgBullets"), gtk_ui_manager_get_widget (uim, "/ui/list"), gtk_ui_manager_get_widget (uim, "/ui/list/first")); gtk_box_pack_start (GTK_BOX (toolbox), toolbutton, FALSE, FALSE, 0); label = gtk_label_new (""); gtk_box_pack_start (GTK_BOX (self), label, TRUE, TRUE, 0); toolbox = gtk_hbox_new (FALSE, 3); gtk_box_pack_start (GTK_BOX (self), toolbox, FALSE, FALSE, 0); toolbutton = create_button ("Insert", gtk_action_group_get_action (ag, "fileInsertGraphic"), gtk_ui_manager_get_widget (uim, "/ui/insert"), gtk_ui_manager_get_widget (uim, "/ui/insert/first")); gtk_box_pack_start (GTK_BOX (toolbox), toolbutton, FALSE, FALSE, 0); toolbutton = create_button ("Table", gtk_action_group_get_action (ag, "insertTable"), gtk_ui_manager_get_widget (uim, "/ui/table"), gtk_ui_manager_get_widget (uim, "/ui/table/first")); gtk_box_pack_start (GTK_BOX (toolbox), toolbutton, FALSE, FALSE, 0); label = gtk_label_new (""); gtk_box_pack_start (GTK_BOX (self), label, TRUE, TRUE, 0); toolbox = gtk_hbox_new (FALSE, 3); gtk_box_pack_start (GTK_BOX (self), toolbox, FALSE, FALSE, 0); toolbutton = create_button ("Proof", gtk_action_group_get_action (ag, "dlgSpell"), gtk_ui_manager_get_widget (uim, "/ui/proof"), gtk_ui_manager_get_widget (uim, "/ui/proof/first")); gtk_box_pack_start (GTK_BOX (toolbox), toolbutton, FALSE, FALSE, 0); toolbutton = create_button ("Colours", gtk_action_group_get_action (ag, "colour-text"), gtk_ui_manager_get_widget (uim, "/ui/colour"), gtk_ui_manager_get_widget (uim, "/ui/colour/first")); gtk_box_pack_start (GTK_BOX (toolbox), toolbutton, FALSE, FALSE, 0); self->font_menu = gtk_ui_manager_get_widget (uim, "/ui/font"); toolbutton = create_button ("Fonts", gtk_action_group_get_action (ag, "dlgFont"), self->font_menu, gtk_ui_manager_get_widget (uim, "/ui/font/first")); gtk_box_pack_start (GTK_BOX (toolbox), toolbutton, FALSE, FALSE, 0); label = gtk_label_new (" "); gtk_box_pack_start (GTK_BOX (self), label, FALSE, FALSE, 5); } static void set_property (GObject *obj, guint prop_id, const GValue *val, GParamSpec *pspec) { AbiTopazToolbar *self; self = ABI_TOPAZ_TOOLBAR (obj); /* switch (prop_id) { case PROP_SHOW_RULERS: self->priv->show_rulers = g_value_get_int (val); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); break; } */ } static void get_property (GObject *obj, guint prop_id, GValue *val, GParamSpec *pspec) { AbiTopazToolbar *self; self = ABI_TOPAZ_TOOLBAR (obj); /* switch (prop_id) { case PROP_SHOW_RULERS: g_value_set_boolean (val, self->priv->show_rulers); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); break; } */ } static void instance_dispose (GObject *obj) { AbiTopazToolbar *self; self = ABI_TOPAZ_TOOLBAR (obj); if (self->is_disposed) return; self->is_disposed = TRUE; /* TODO use destroy() G_OBJECT_CLASS (abi_topaz_toolbar_parent_class)->dispose (obj); */ } static void instance_finalize (GObject *obj) { AbiTopazToolbar *self; self = ABI_TOPAZ_TOOLBAR (obj); /* TODO use destroy() G_OBJECT_CLASS (abi_topaz_toolbar_parent_class)->finalize (obj); */ } static void class_init (AbiTopazToolbarClass *klass) { GObjectClass *gobject_class; gobject_class = G_OBJECT_CLASS (klass); abi_topaz_toolbar_parent_class = GTK_HBOX_CLASS (g_type_class_peek_parent (klass)); gobject_class->set_property = set_property; gobject_class->get_property = get_property; /* TODO use destroy() gobject_class->dispose = instance_dispose; gobject_class->finalize = instance_finalize; */ abi_topaz_toolbar_signals [ACTIVATE] = g_signal_new ( "activate", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AbiTopazToolbarClass, activate), NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); abi_topaz_toolbar_signals [ACTIVATE_FONT] = g_signal_new ( "activate-font", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AbiTopazToolbarClass, activate_font), NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); abi_topaz_toolbar_signals [ACTIVATE_STYLE] = g_signal_new ( "activate-style", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AbiTopazToolbarClass, activate_style), NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); /* g_object_class_install_property (gobject_class, PROP_SHOW_RULERS, g_param_spec_string ("show-rulers", P_("show rulers"), P_("Show or hide rulers"), FALSE, (GParamFlags)(G_PARAM_READABLE | G_PARAM_WRITABLE))); */ } GType abi_topaz_toolbar_get_type (void) { static GType type = 0; if (!type) { static const GTypeInfo info = { sizeof (AbiTopazToolbarClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AbiTopazToolbar), 0, /* n_preallocs */ (GInstanceInitFunc) instance_init, }; type = g_type_register_static (GTK_TYPE_HBOX, "AbiTopazToolbar", &info, (GTypeFlags)0); } return type; } GtkWidget* abi_topaz_toolbar_new (void) { return GTK_WIDGET (g_object_new (ABI_TYPE_TOPAZ_TOOLBAR, NULL)); } void abi_topaz_toolbar_add_font (AbiTopazToolbar *self, const gchar *family) { GtkAction *action = gtk_action_new (family, family, "", NULL); GtkWidget *item = gtk_action_create_menu_item (action); g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (activate_font_cb), (gpointer) self); gtk_menu_append (self->font_menu, item); gtk_widget_show_all (item); } void abi_topaz_toolbar_add_style (AbiTopazToolbar *self, const gchar *style) { GtkAction *action = gtk_action_new (style, style, "", NULL); GtkWidget *item = gtk_action_create_menu_item (action); g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (activate_style_cb), (gpointer) self); gtk_menu_append (self->style_menu, item); gtk_widget_show_all (item); self->styles = g_slist_prepend (self->styles, item); } void abi_topaz_toolbar_clear_styles (AbiTopazToolbar *self) { if (self->styles) { GSList *next; do { gtk_widget_destroy (GTK_WIDGET (self->styles->data)); next = self->styles->next; g_slist_free_1 (self->styles); self->styles = next; } while (self->styles); } }