3 * Copyright (C) 2001-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/>.
25 #include <glib/gi18n.h>
30 #include "ui-commands.h"
39 /*==========================================================================*/
40 /* Private macros and constants. */
41 /*==========================================================================*/
44 /*==========================================================================*/
46 /*==========================================================================*/
49 /*==========================================================================*/
50 /* Local function prototypes */
51 /*==========================================================================*/
53 static void view_ui_item_toggled_cb (GtkToggleAction *action,
56 static void set_app_main_toolbar_style (GtkUIManager *ui);
58 static void set_app_drawing_toolbar_style (GtkUIManager *ui);
60 static void set_view_style (GtkUIManager *ui);
62 static void descend_menu_set_always_show_image (GtkMenu *menu);
64 static void set_additional_properties (GtkUIManager *ui);
67 static void connect_proxy_cb (GtkUIManager *ui,
72 static void disconnect_proxy_cb (GtkUIManager *ui,
77 static void menu_item_select_cb (GtkMenuItem *proxy,
80 static void menu_item_deselect_cb (GtkMenuItem *proxy,
84 /*==========================================================================*/
86 /*==========================================================================*/
88 static GtkActionEntry entries[] = {
91 { "FileMenu", NULL, N_("_File") },
92 { "FileRecentsMenu", NULL, N_("Open Recent _Files") },
93 { "EditMenu", NULL, N_("_Edit") },
94 { "ViewMenu", NULL, N_("_View") },
95 { "ViewMainToolBarMenu", NULL, N_("Customize Main Toolbar") },
96 { "ViewDrawingToolBarMenu", NULL, N_("Customize Drawing Toolbar") },
97 { "ViewPropertyToolBarMenu", NULL, N_("Customize Properties Toolbar") },
98 { "ObjectsMenu", NULL, N_("_Objects") },
99 { "ObjectsCreateMenu", NULL, N_("_Create") },
100 { "ObjectsOrderMenu", NULL, N_("_Order") },
101 { "ObjectsRotateFlipMenu", NULL, N_("_Rotate/Flip") },
102 { "ObjectsAlignMenu", NULL, N_("_Alignment") },
103 { "ObjectsCenterMenu", NULL, N_("C_enter") },
104 { "HelpMenu", NULL, N_("_Help") },
107 { "ContextMenu", NULL, N_("Context Menu") },
108 { "EmptySelectionContextMenu", NULL, N_("Context Menu") },
110 /* File action entries. */
115 N_("Create a new file"),
116 G_CALLBACK (gl_ui_cmd_file_new) },
123 G_CALLBACK (gl_ui_cmd_file_open) },
129 N_("Save current file"),
130 G_CALLBACK (gl_ui_cmd_file_save) },
136 N_("Save the current file to a different name"),
137 G_CALLBACK (gl_ui_cmd_file_save_as) },
143 N_("Print the current file"),
144 G_CALLBACK (gl_ui_cmd_file_print) },
147 GTK_STOCK_PROPERTIES,
150 N_("Modify document properties"),
151 G_CALLBACK (gl_ui_cmd_file_properties) },
153 { "FileTemplateDesigner",
155 N_("Template _Designer..."),
157 N_("Create a custom template"),
158 G_CALLBACK (gl_ui_cmd_file_template_designer) },
164 N_("Close the current file"),
165 G_CALLBACK (gl_ui_cmd_file_close) },
171 N_("Quit the program"),
172 G_CALLBACK (gl_ui_cmd_file_quit) },
175 /* Edit action entries. */
181 G_CALLBACK (gl_ui_cmd_edit_undo) },
188 G_CALLBACK (gl_ui_cmd_edit_redo) },
194 N_("Cut the selection"),
195 G_CALLBACK (gl_ui_cmd_edit_cut) },
201 N_("Copy the selection"),
202 G_CALLBACK (gl_ui_cmd_edit_copy) },
208 N_("Paste the clipboard"),
209 G_CALLBACK (gl_ui_cmd_edit_paste) },
215 N_("Delete the selected objects"),
216 G_CALLBACK (gl_ui_cmd_edit_delete) },
222 N_("Select all objects"),
223 G_CALLBACK (gl_ui_cmd_edit_select_all) },
229 N_("Remove all selections"),
230 G_CALLBACK (gl_ui_cmd_edit_unselect_all) },
233 GTK_STOCK_PREFERENCES,
236 N_("Configure the application"),
237 G_CALLBACK (gl_ui_cmd_edit_preferences) },
240 /* View action entries. */
245 N_("Increase magnification"),
246 G_CALLBACK (gl_ui_cmd_view_zoomin) },
252 N_("Decrease magnification"),
253 G_CALLBACK (gl_ui_cmd_view_zoomout) },
259 N_("Restore scale to 100%"),
260 G_CALLBACK (gl_ui_cmd_view_zoom1to1) },
266 N_("Set scale to fit window"),
267 G_CALLBACK (gl_ui_cmd_view_zoom_to_fit) },
270 /* Objects action entries. */
271 { "ObjectsArrowMode",
275 N_("Select, move and modify objects"),
276 G_CALLBACK (gl_ui_cmd_objects_arrow_mode) },
278 { "ObjectsCreateText",
282 N_("Create text object"),
283 G_CALLBACK (gl_ui_cmd_objects_create_text) },
285 { "ObjectsCreateBox",
289 N_("Create box/rectangle object"),
290 G_CALLBACK (gl_ui_cmd_objects_create_box) },
292 { "ObjectsCreateLine",
296 N_("Create line object"),
297 G_CALLBACK (gl_ui_cmd_objects_create_line) },
299 { "ObjectsCreateEllipse",
303 N_("Create ellipse/circle object"),
304 G_CALLBACK (gl_ui_cmd_objects_create_ellipse) },
306 { "ObjectsCreateImage",
310 N_("Create image object"),
311 G_CALLBACK (gl_ui_cmd_objects_create_image) },
313 { "ObjectsCreateBarcode",
317 N_("Create barcode object"),
318 G_CALLBACK (gl_ui_cmd_objects_create_barcode) },
322 N_("Bring to front"),
324 N_("Raise object to top"),
325 G_CALLBACK (gl_ui_cmd_objects_raise) },
328 "glabels-order-bottom",
331 N_("Lower object to bottom"),
332 G_CALLBACK (gl_ui_cmd_objects_lower) },
334 { "ObjectsRotateLeft",
335 "glabels-rotate-left",
338 N_("Rotate object 90 degrees counter-clockwise"),
339 G_CALLBACK (gl_ui_cmd_objects_rotate_left) },
341 { "ObjectsRotateRight",
342 "glabels-rotate-right",
345 N_("Rotate object 90 degrees clockwise"),
346 G_CALLBACK (gl_ui_cmd_objects_rotate_right) },
348 { "ObjectsFlipHorizontal",
349 "glabels-flip-horiz",
350 N_("Flip horizontally"),
352 N_("Flip object horizontally"),
353 G_CALLBACK (gl_ui_cmd_objects_flip_horiz) },
355 { "ObjectsFlipVertical",
357 N_("Flip vertically"),
359 N_("Flip object vertically"),
360 G_CALLBACK (gl_ui_cmd_objects_flip_vert) },
362 { "ObjectsAlignLeft",
363 "glabels-align-left",
366 N_("Align objects to left edges"),
367 G_CALLBACK (gl_ui_cmd_objects_align_left) },
369 { "ObjectsAlignHCenter",
370 "glabels-align-hcenter",
373 N_("Align objects to horizontal centers"),
374 G_CALLBACK (gl_ui_cmd_objects_align_hcenter) },
376 { "ObjectsAlignRight",
377 "glabels-align-right",
380 N_("Align objects to right edges"),
381 G_CALLBACK (gl_ui_cmd_objects_align_right) },
387 N_("Align objects to top edges"),
388 G_CALLBACK (gl_ui_cmd_objects_align_top) },
390 { "ObjectsAlignVCenter",
391 "glabels-align-vcenter",
394 N_("Align objects to vertical centers"),
395 G_CALLBACK (gl_ui_cmd_objects_align_vcenter) },
397 { "ObjectsAlignBottom",
398 "glabels-align-bottom",
401 N_("Align objects to bottom edges"),
402 G_CALLBACK (gl_ui_cmd_objects_align_bottom) },
404 { "ObjectsCenterHorizontal",
405 "glabels-center-horiz",
406 N_("Center horizontally"),
408 N_("Center objects to horizontal label center"),
409 G_CALLBACK (gl_ui_cmd_objects_center_horiz) },
411 { "ObjectsCenterVertical",
412 "glabels-center-vert",
413 N_("Center vertically"),
415 N_("Center objects to vertical label center"),
416 G_CALLBACK (gl_ui_cmd_objects_center_vert) },
418 { "ObjectsMergeProperties",
420 N_("Merge properties"),
422 N_("Edit merge properties"),
423 G_CALLBACK (gl_ui_cmd_objects_merge_properties) },
426 /* Help actions entries. */
431 N_("Open glabels manual"),
432 G_CALLBACK (gl_ui_cmd_help_contents) },
439 G_CALLBACK (gl_ui_cmd_help_about) },
442 static guint n_entries = G_N_ELEMENTS (entries);
444 static GtkToggleActionEntry toggle_entries[] = {
446 { "ViewPropertyToolBar",
448 N_("Property toolbar"),
450 N_("Change the visibility of the property toolbar in the current window"),
451 G_CALLBACK (gl_ui_cmd_view_property_bar_toggle),
458 N_("Change the visibility of the grid in the current window"),
459 G_CALLBACK (gl_ui_cmd_view_grid_toggle),
466 N_("Change the visibility of markup lines in the current window"),
467 G_CALLBACK (gl_ui_cmd_view_markup_toggle),
471 static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries);
473 static GtkToggleActionEntry ui_toggle_entries[] = {
479 N_("Change the visibility of the main toolbar in the current window"),
480 G_CALLBACK (view_ui_item_toggled_cb),
483 { "ViewDrawingToolBar",
485 N_("Drawing toolbar"),
487 N_("Change the visibility of the drawing toolbar in the current window"),
488 G_CALLBACK (view_ui_item_toggled_cb),
492 static guint n_ui_toggle_entries = G_N_ELEMENTS (ui_toggle_entries);
494 static const gchar *ui_info =
497 " <menubar name='MenuBar'>"
498 " <menu action='FileMenu'>"
499 " <menuitem action='FileNew' />"
500 " <menuitem action='FileOpen' />"
501 " <menuitem action='FileRecentsMenu' />"
503 " <menuitem action='FileSave' />"
504 " <menuitem action='FileSaveAs' />"
506 " <menuitem action='FilePrint' />"
508 " <menuitem action='FileProperties' />"
509 " <menuitem action='FileTemplateDesigner' />"
511 " <menuitem action='FileClose' />"
512 " <menuitem action='FileQuit' />"
514 " <menu action='EditMenu'>"
515 " <menuitem action='EditUndo' />"
516 " <menuitem action='EditRedo' />"
518 " <menuitem action='EditCut' />"
519 " <menuitem action='EditCopy' />"
520 " <menuitem action='EditPaste' />"
521 " <menuitem action='EditDelete' />"
523 " <menuitem action='EditSelectAll' />"
524 " <menuitem action='EditUnSelectAll' />"
526 " <menuitem action='EditPreferences' />"
528 " <menu action='ViewMenu'>"
529 " <menuitem action='ViewMainToolBar' />"
530 " <menuitem action='ViewDrawingToolBar' />"
531 " <menuitem action='ViewPropertyToolBar' />"
533 " <menuitem action='ViewGrid' />"
534 " <menuitem action='ViewMarkup' />"
536 " <menuitem action='ViewZoomIn' />"
537 " <menuitem action='ViewZoomOut' />"
538 " <menuitem action='ViewZoom1to1' />"
539 " <menuitem action='ViewZoomToFit' />"
541 " <menu action='ObjectsMenu'>"
542 " <menuitem action='ObjectsArrowMode' />"
543 " <menu action='ObjectsCreateMenu'>"
544 " <menuitem action='ObjectsCreateText' />"
545 " <menuitem action='ObjectsCreateBox' />"
546 " <menuitem action='ObjectsCreateLine' />"
547 " <menuitem action='ObjectsCreateEllipse' />"
548 " <menuitem action='ObjectsCreateImage' />"
549 " <menuitem action='ObjectsCreateBarcode' />"
552 " <menu action='ObjectsOrderMenu'>"
553 " <menuitem action='ObjectsRaise' />"
554 " <menuitem action='ObjectsLower' />"
556 " <menu action='ObjectsRotateFlipMenu'>"
557 " <menuitem action='ObjectsRotateLeft' />"
558 " <menuitem action='ObjectsRotateRight' />"
559 " <menuitem action='ObjectsFlipHorizontal' />"
560 " <menuitem action='ObjectsFlipVertical' />"
562 " <menu action='ObjectsAlignMenu'>"
563 " <menuitem action='ObjectsAlignLeft' />"
564 " <menuitem action='ObjectsAlignHCenter' />"
565 " <menuitem action='ObjectsAlignRight' />"
567 " <menuitem action='ObjectsAlignTop' />"
568 " <menuitem action='ObjectsAlignVCenter' />"
569 " <menuitem action='ObjectsAlignBottom' />"
571 " <menu action='ObjectsCenterMenu'>"
572 " <menuitem action='ObjectsCenterHorizontal' />"
573 " <menuitem action='ObjectsCenterVertical' />"
576 " <menuitem action='ObjectsMergeProperties' />"
578 " <menu action='HelpMenu'>"
579 " <menuitem action='HelpContents' />"
580 " <menuitem action='HelpAbout' />"
584 " <toolbar name='MainToolBar'>"
585 " <toolitem action='FileNew' />"
586 " <toolitem action='FileOpen' />"
587 " <toolitem action='FileSave' />"
589 " <toolitem action='FilePrint' />"
591 " <toolitem action='EditCut' />"
592 " <toolitem action='EditCopy' />"
593 " <toolitem action='EditPaste' />"
596 " <toolbar name='DrawingToolBar'>"
597 " <toolitem action='ObjectsArrowMode' />"
599 " <toolitem action='ObjectsCreateText' />"
600 " <toolitem action='ObjectsCreateBox' />"
601 " <toolitem action='ObjectsCreateLine' />"
602 " <toolitem action='ObjectsCreateEllipse' />"
603 " <toolitem action='ObjectsCreateImage' />"
604 " <toolitem action='ObjectsCreateBarcode' />"
606 " <toolitem action='ViewZoomIn' />"
607 " <toolitem action='ViewZoomOut' />"
608 " <toolitem action='ViewZoom1to1' />"
609 " <toolitem action='ViewZoomToFit' />"
611 " <toolitem action='ObjectsMergeProperties' />"
614 " <popup action='ContextMenu'>"
615 " <menu action='ObjectsOrderMenu'>"
616 " <menuitem action='ObjectsRaise' />"
617 " <menuitem action='ObjectsLower' />"
619 " <menu action='ObjectsRotateFlipMenu'>"
620 " <menuitem action='ObjectsRotateLeft' />"
621 " <menuitem action='ObjectsRotateRight' />"
622 " <menuitem action='ObjectsFlipHorizontal' />"
623 " <menuitem action='ObjectsFlipVertical' />"
625 " <menu action='ObjectsAlignMenu'>"
626 " <menuitem action='ObjectsAlignLeft' />"
627 " <menuitem action='ObjectsAlignHCenter' />"
628 " <menuitem action='ObjectsAlignRight' />"
630 " <menuitem action='ObjectsAlignTop' />"
631 " <menuitem action='ObjectsAlignVCenter' />"
632 " <menuitem action='ObjectsAlignBottom' />"
634 " <menu action='ObjectsCenterMenu'>"
635 " <menuitem action='ObjectsCenterHorizontal' />"
636 " <menuitem action='ObjectsCenterVertical' />"
639 " <menuitem action='EditCut' />"
640 " <menuitem action='EditCopy' />"
641 " <menuitem action='EditPaste' />"
642 " <menuitem action='EditDelete' />"
645 " <popup action='EmptySelectionContextMenu'>"
646 " <menuitem action='EditPaste' />"
652 static gchar* doc_verbs [] = {
653 "/ui/MenuBar/FileMenu/FileProperties",
654 "/ui/MenuBar/FileMenu/FileSave",
655 "/ui/MenuBar/FileMenu/FileSaveAs",
656 "/ui/MenuBar/FileMenu/FilePrint",
657 "/ui/MenuBar/FileMenu/FileClose",
658 "/ui/MenuBar/EditMenu/EditUndo",
659 "/ui/MenuBar/EditMenu/EditRedo",
660 "/ui/MenuBar/EditMenu/EditCut",
661 "/ui/MenuBar/EditMenu/EditCopy",
662 "/ui/MenuBar/EditMenu/EditDelete",
663 "/ui/MenuBar/EditMenu/EditSelectAll",
664 "/ui/MenuBar/EditMenu/EditUnSelectAll",
665 "/ui/MenuBar/ViewMenu/ViewZoomIn",
666 "/ui/MenuBar/ViewMenu/ViewZoomOut",
667 "/ui/MenuBar/ViewMenu/ViewZoom1to1",
668 "/ui/MenuBar/ViewMenu/ViewZoomToFit",
669 "/ui/MenuBar/ViewMenu/ViewGrid",
670 "/ui/MenuBar/ViewMenu/ViewMarkup",
671 "/ui/MenuBar/ObjectsMenu/ObjectsArrowMode",
672 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu",
673 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateText",
674 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateLine",
675 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBox",
676 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateEllipse",
677 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateImage",
678 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBarcode",
679 "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu",
680 "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise",
681 "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower",
682 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu",
683 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft",
684 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight",
685 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal",
686 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical",
687 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu",
688 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignLeft",
689 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignRight",
690 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignHCenter",
691 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignTop",
692 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignBottom",
693 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignVCenter",
694 "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu",
695 "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu/ObjectsCenterHorizontal",
696 "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu/ObjectsCenterVertical",
697 "/ui/MenuBar/ObjectsMenu/ObjectsMergeProperties",
702 static gchar* doc_modified_verbs [] = {
703 "/ui/MenuBar/FileMenu/FileSave",
708 static gchar* paste_verbs [] = {
709 "/ui/MenuBar/EditMenu/EditPaste",
714 static gchar* selection_verbs [] = {
715 "/ui/MenuBar/EditMenu/EditCut",
716 "/ui/MenuBar/EditMenu/EditCopy",
717 "/ui/MenuBar/EditMenu/EditDelete",
718 "/ui/MenuBar/EditMenu/EditUnSelectAll",
719 "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu",
720 "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise",
721 "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower",
722 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu",
723 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft",
724 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight",
725 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal",
726 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical",
727 "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu",
728 "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu/ObjectsCenterHorizontal",
729 "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu/ObjectsCenterVertical",
734 static gchar* atomic_selection_verbs [] = {
739 static gchar* multi_selection_verbs [] = {
740 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu",
741 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignLeft",
742 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignRight",
743 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignHCenter",
744 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignTop",
745 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignBottom",
746 "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignVCenter",
752 /*****************************************************************************/
753 /** Initialize UI component for given window. */
754 /*****************************************************************************/
756 gl_ui_new (glWindow *window)
759 GtkActionGroup *actions;
760 GError *error = NULL;
761 GtkWidget *recent_menu;
763 gl_debug (DEBUG_UI, "START");
765 g_return_val_if_fail (window && GL_IS_WINDOW (window), NULL);
767 gl_debug (DEBUG_UI, "window = %p", window);
769 ui = gtk_ui_manager_new ();
771 g_signal_connect (ui, "connect_proxy",
772 G_CALLBACK (connect_proxy_cb), window);
773 g_signal_connect (ui, "disconnect_proxy",
774 G_CALLBACK (disconnect_proxy_cb), window);
776 actions = gtk_action_group_new ("Actions");
777 gtk_action_group_set_translation_domain (actions, NULL);
778 gtk_action_group_add_actions (actions, entries, n_entries, GTK_WINDOW (window));
779 gtk_action_group_add_toggle_actions (actions,
780 toggle_entries, n_toggle_entries,
782 gtk_action_group_add_toggle_actions (actions,
783 ui_toggle_entries, n_ui_toggle_entries,
786 gtk_ui_manager_insert_action_group (ui, actions, 0);
787 gtk_window_add_accel_group (GTK_WINDOW (window), gtk_ui_manager_get_accel_group (ui));
789 gl_debug (DEBUG_UI, "Creating ui from string");
790 if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, strlen (ui_info), &error)) {
791 g_message ("building menus failed: %s", error->message);
792 g_error_free (error);
795 /* Set the toolbar styles according to prefs */
796 set_app_main_toolbar_style (ui);
797 set_app_drawing_toolbar_style (ui);
799 /* Set view grid and markup visibility according to prefs */
802 /* add an Open Recents Submenu */
803 recent_menu = gl_recent_create_menu ();
804 g_signal_connect (G_OBJECT (recent_menu), "item-activated",
805 G_CALLBACK (gl_ui_cmd_file_open_recent), window);
806 gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget (ui, "/MenuBar/FileMenu/FileRecentsMenu")),
810 set_additional_properties (ui);
812 gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, FALSE);
813 gl_ui_util_set_verb_list_sensitive (ui, paste_verbs, FALSE);
815 gl_debug (DEBUG_UI, "END");
821 /*****************************************************************************/
822 /** Unref wrapper. */
823 /*****************************************************************************/
825 gl_ui_unref (GtkUIManager *ui)
827 gl_debug (DEBUG_UI, "START");
831 gl_debug (DEBUG_UI, "END");
835 /*****************************************************************************/
836 /** Update all verbs of given UI component. */
837 /*****************************************************************************/
839 gl_ui_update_all (GtkUIManager *ui,
844 gl_debug (DEBUG_UI, "START");
846 gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, TRUE);
849 g_return_if_fail (label != NULL);
851 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo",
852 gl_label_can_undo (label));
853 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo",
854 gl_label_can_redo (label));
856 gl_ui_util_set_verb_list_sensitive (ui, doc_modified_verbs,
857 gl_label_is_modified (label));
859 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn",
860 !gl_view_is_zoom_max (view));
861 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut",
862 !gl_view_is_zoom_min (view));
864 gl_ui_util_set_verb_list_sensitive (ui, selection_verbs,
865 !gl_label_is_selection_empty (label));
867 gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs,
868 gl_label_is_selection_atomic (label));
870 gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs,
871 !gl_label_is_selection_empty (label)
872 && !gl_label_is_selection_atomic (label));
874 gl_debug (DEBUG_UI, "END");
878 /*****************************************************************************/
879 /** Update label modified verbs of given UI component. */
880 /*****************************************************************************/
882 gl_ui_update_modified_verbs (GtkUIManager *ui,
885 gl_debug (DEBUG_UI, "START");
887 gl_ui_util_set_verb_list_sensitive (ui,
889 gl_label_is_modified (label));
891 gl_debug (DEBUG_UI, "END");
895 /*****************************************************************************/
896 /** Update verbs associated with selection state of given UI component. */
897 /*****************************************************************************/
899 gl_ui_update_selection_verbs (GtkUIManager *ui,
903 gl_debug (DEBUG_UI, "START");
907 gl_ui_util_set_verb_list_sensitive (ui, selection_verbs,
908 !gl_label_is_selection_empty (view->label));
910 gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs,
911 gl_label_is_selection_atomic (view->label));
913 gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs,
914 !gl_label_is_selection_empty (view->label)
915 && !gl_label_is_selection_atomic (view->label));
919 gl_ui_util_set_verb_list_sensitive (ui, selection_verbs, FALSE);
920 gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs, FALSE);
921 gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs, FALSE);
924 gl_debug (DEBUG_UI, "END");
928 /*****************************************************************************/
929 /** Update verbs associated with zoom level of given UI component. */
930 /*****************************************************************************/
932 gl_ui_update_zoom_verbs (GtkUIManager *ui,
935 gl_debug (DEBUG_UI, "START");
937 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn",
938 !gl_view_is_zoom_max (view));
939 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut",
940 !gl_view_is_zoom_min (view));
942 gl_debug (DEBUG_UI, "END");
946 /*****************************************************************************/
947 /** Update paste verbs of given UI component. */
948 /*****************************************************************************/
950 gl_ui_update_paste_verbs (GtkUIManager *ui,
953 gl_debug (DEBUG_UI, "START");
955 gl_ui_util_set_verb_list_sensitive (ui, paste_verbs, can_paste);
957 gl_debug (DEBUG_UI, "END");
961 /*****************************************************************************/
962 /** Update undo/redo verbs of given UI component. */
963 /*****************************************************************************/
965 gl_ui_update_undo_redo_verbs (GtkUIManager *ui,
968 GtkWidget *menu_item;
972 gl_debug (DEBUG_UI, "START");
974 menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/EditMenu/EditUndo");
975 description = gl_label_get_undo_description (label);
976 menu_label = g_strdup_printf ("%s: %s", _("Undo"), description);
977 gtk_menu_item_set_label (GTK_MENU_ITEM (menu_item), menu_label);
979 g_free (description);
981 menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/EditMenu/EditRedo");
982 description = gl_label_get_redo_description (label);
983 menu_label = g_strdup_printf ("%s: %s", _("Redo"), description);
984 gtk_menu_item_set_label (GTK_MENU_ITEM (menu_item), menu_label);
986 g_free (description);
988 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo",
989 gl_label_can_undo (label));
991 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo",
992 gl_label_can_redo (label));
994 gl_debug (DEBUG_UI, "END");
998 /*---------------------------------------------------------------------------*/
999 /** PRIVATE. View menu item toggled callback. */
1000 /*---------------------------------------------------------------------------*/
1002 view_ui_item_toggled_cb (GtkToggleAction *action,
1008 gl_debug (DEBUG_UI, "START");
1010 g_return_if_fail (action && GTK_IS_TOGGLE_ACTION (action));
1012 name = gtk_action_get_name (GTK_ACTION (action));
1013 state = gtk_toggle_action_get_active (action);
1015 gl_debug (DEBUG_UI, "Action = %s, State = %d", name, state);
1017 if (strcmp (name, "ViewMainToolBar") == 0)
1019 gl_prefs_model_set_main_toolbar_visible (gl_prefs, state);
1020 set_app_main_toolbar_style (ui);
1023 if (strcmp (name, "ViewDrawingToolBar") == 0)
1025 gl_prefs_model_set_drawing_toolbar_visible (gl_prefs, state);
1026 set_app_drawing_toolbar_style (ui);
1029 gl_debug (DEBUG_UI, "");
1033 /*---------------------------------------------------------------------------*/
1034 /** PRIVATE. Set main toolbar style. */
1035 /*---------------------------------------------------------------------------*/
1037 set_app_main_toolbar_style (GtkUIManager *ui)
1041 gl_debug (DEBUG_UI, "START");
1043 g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui));
1045 /* Updated view menu */
1046 gl_ui_util_set_verb_state (ui, "/ui/ViewMenu/ViewMainToolBar",
1047 gl_prefs_model_get_main_toolbar_visible (gl_prefs));
1049 toolbar = gtk_ui_manager_get_widget (ui, "/MainToolBar");
1051 if (gl_prefs_model_get_main_toolbar_visible (gl_prefs)) {
1052 gtk_widget_show_all (toolbar);
1054 gtk_widget_hide (toolbar);
1057 gl_debug (DEBUG_UI, "END");
1061 /*---------------------------------------------------------------------------*/
1062 /** PRIVATE. Set drawing toolbar style. */
1063 /*---------------------------------------------------------------------------*/
1065 set_app_drawing_toolbar_style (GtkUIManager *ui)
1069 gl_debug (DEBUG_UI, "START");
1071 g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui));
1073 /* Updated view menu */
1074 gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewDrawingToolBar",
1075 gl_prefs_model_get_drawing_toolbar_visible (gl_prefs));
1077 toolbar = gtk_ui_manager_get_widget (ui, "/DrawingToolBar");
1079 gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
1081 if (gl_prefs_model_get_drawing_toolbar_visible (gl_prefs)) {
1082 gtk_widget_show_all (toolbar);
1084 gtk_widget_hide (toolbar);
1087 gl_debug (DEBUG_UI, "END");
1091 /*---------------------------------------------------------------------------*/
1092 /** PRIVATE. Set visibility of grid and markup. */
1093 /*---------------------------------------------------------------------------*/
1095 set_view_style (GtkUIManager *ui)
1097 gl_debug (DEBUG_UI, "START");
1099 g_return_if_fail (ui && GTK_IS_UI_MANAGER(ui));
1101 gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewGrid",
1102 gl_prefs_model_get_grid_visible (gl_prefs));
1104 gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewMarkup",
1105 gl_prefs_model_get_markup_visible (gl_prefs));
1107 gl_debug (DEBUG_UI, "END");
1111 /*---------------------------------------------------------------------------*/
1112 /** PRIVATE. Descend menu, set "always-show-image" for all image menu items.*/
1113 /*---------------------------------------------------------------------------*/
1115 descend_menu_set_always_show_image (GtkMenu *menu)
1117 GList *children, *p;
1119 GtkWidget *menu_item;
1121 children = gtk_container_get_children (GTK_CONTAINER (menu));
1123 for ( p = children; p != NULL; p = p->next )
1125 menu_item = GTK_WIDGET (p->data);
1127 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1130 descend_menu_set_always_show_image (GTK_MENU (submenu));
1132 else if ( GTK_IS_IMAGE_MENU_ITEM (menu_item) )
1134 g_object_set (menu_item, "always-show-image", TRUE, NULL);
1140 /*---------------------------------------------------------------------------*/
1141 /** PRIVATE. Set additional properties. */
1142 /*---------------------------------------------------------------------------*/
1144 set_additional_properties (GtkUIManager *ui)
1147 GtkWidget *menu_item;
1150 * Set "always-show-image" property for all Object menuitems. This is
1151 * necessary because, as of Gtk-2.18, images are not shown by default
1152 * and you really need these visual cues for these menu items.
1154 menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/ObjectsMenu/");
1155 menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1156 descend_menu_set_always_show_image (GTK_MENU (menu));
1158 menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/ObjectsMenu/ObjectsMergeProperties");
1159 g_object_set (menu_item, "always-show-image", FALSE, NULL); /* Leave this one out. */
1161 menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsOrderMenu/");
1162 menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1163 descend_menu_set_always_show_image (GTK_MENU (menu));
1165 menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsRotateFlipMenu/");
1166 menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1167 descend_menu_set_always_show_image (GTK_MENU (menu));
1169 menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsAlignMenu/");
1170 menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1171 descend_menu_set_always_show_image (GTK_MENU (menu));
1173 menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsCenterMenu/");
1174 menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1175 descend_menu_set_always_show_image (GTK_MENU (menu));
1179 /*---------------------------------------------------------------------------*/
1180 /** PRIVATE. Connect proxy callback. */
1181 /*---------------------------------------------------------------------------*/
1183 connect_proxy_cb (GtkUIManager *ui,
1188 if (GTK_IS_MENU_ITEM (proxy))
1190 g_signal_connect (proxy, "select",
1191 G_CALLBACK (menu_item_select_cb), window);
1192 g_signal_connect (proxy, "deselect",
1193 G_CALLBACK (menu_item_deselect_cb), window);
1198 /*---------------------------------------------------------------------------*/
1199 /** PRIVATE. Disconnect proxy callback. */
1200 /*---------------------------------------------------------------------------*/
1202 disconnect_proxy_cb (GtkUIManager *ui,
1207 if (GTK_IS_MENU_ITEM (proxy))
1209 g_signal_handlers_disconnect_by_func
1210 (proxy, G_CALLBACK (menu_item_select_cb), window);
1211 g_signal_handlers_disconnect_by_func
1212 (proxy, G_CALLBACK (menu_item_deselect_cb), window);
1217 /*---------------------------------------------------------------------------*/
1218 /** PRIVATE. Menu item select callback. */
1219 /*---------------------------------------------------------------------------*/
1221 menu_item_select_cb (GtkMenuItem *proxy,
1227 g_return_if_fail (window && GL_IS_WINDOW (window));
1228 g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar));
1230 action = g_object_get_data (G_OBJECT (proxy), "gtk-action");
1231 g_return_if_fail (action != NULL);
1233 g_object_get (G_OBJECT (action), "tooltip", &message, NULL);
1236 gtk_statusbar_push (GTK_STATUSBAR (window->status_bar),
1237 window->menu_tips_context_id, message);
1243 /*---------------------------------------------------------------------------*/
1244 /** PRIVATE. Menu item deselect callback. */
1245 /*---------------------------------------------------------------------------*/
1247 menu_item_deselect_cb (GtkMenuItem *proxy,
1250 g_return_if_fail (window && GL_IS_WINDOW (window));
1251 g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar));
1253 gtk_statusbar_pop (GTK_STATUSBAR (window->status_bar),
1254 window->menu_tips_context_id);
1260 * Local Variables: -- emacs
1262 * c-basic-offset: 8 -- emacs
1263 * tab-width: 8 -- emacs
1264 * indent-tabs-mode: nil -- emacs