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>
26 #include <gconf/gconf-client.h>
31 #include "ui-commands.h"
41 /*==========================================================================*/
42 /* Private macros and constants. */
43 /*==========================================================================*/
46 /*==========================================================================*/
48 /*==========================================================================*/
51 /*==========================================================================*/
52 /* Local function prototypes */
53 /*==========================================================================*/
55 static void view_ui_item_toggled_cb (GtkToggleAction *action,
58 static void set_app_main_toolbar_style (GtkUIManager *ui);
60 static void set_app_drawing_toolbar_style (GtkUIManager *ui);
62 static void set_view_style (GtkUIManager *ui);
64 static void descend_menu_set_always_show_image (GtkMenu *menu);
66 static void set_additional_properties (GtkUIManager *ui);
69 static void connect_proxy_cb (GtkUIManager *ui,
74 static void disconnect_proxy_cb (GtkUIManager *ui,
79 static void menu_item_select_cb (GtkMenuItem *proxy,
82 static void menu_item_deselect_cb (GtkMenuItem *proxy,
86 /*==========================================================================*/
88 /*==========================================================================*/
90 static GtkActionEntry entries[] = {
93 { "FileMenu", NULL, N_("_File") },
94 { "FileRecentsMenu", NULL, N_("Open Recent _Files") },
95 { "EditMenu", NULL, N_("_Edit") },
96 { "ViewMenu", NULL, N_("_View") },
97 { "ViewMainToolBarMenu", NULL, N_("Customize Main Toolbar") },
98 { "ViewDrawingToolBarMenu", NULL, N_("Customize Drawing Toolbar") },
99 { "ViewPropertyToolBarMenu", NULL, N_("Customize Properties Toolbar") },
100 { "ObjectsMenu", NULL, N_("_Objects") },
101 { "ObjectsCreateMenu", NULL, N_("_Create") },
102 { "ObjectsOrderMenu", NULL, N_("_Order") },
103 { "ObjectsRotateFlipMenu", NULL, N_("_Rotate/Flip") },
104 { "ObjectsAlignHorizMenu", NULL, N_("Align _Horizontal") },
105 { "ObjectsAlignVertMenu", NULL, N_("Align _Vertical") },
106 { "HelpMenu", NULL, N_("_Help") },
109 { "ContextMenu", NULL, N_("Context Menu") },
110 { "EmptySelectionContextMenu", NULL, N_("Context Menu") },
112 /* File action entries. */
117 N_("Create a new file"),
118 G_CALLBACK (gl_ui_cmd_file_new) },
125 G_CALLBACK (gl_ui_cmd_file_open) },
131 N_("Save current file"),
132 G_CALLBACK (gl_ui_cmd_file_save) },
138 N_("Save the current file to a different name"),
139 G_CALLBACK (gl_ui_cmd_file_save_as) },
145 N_("Print the current file"),
146 G_CALLBACK (gl_ui_cmd_file_print) },
149 GTK_STOCK_PROPERTIES,
152 N_("Modify document properties"),
153 G_CALLBACK (gl_ui_cmd_file_properties) },
155 { "FileTemplateDesigner",
157 N_("Template _Designer..."),
159 N_("Create a custom template"),
160 G_CALLBACK (gl_ui_cmd_file_template_designer) },
166 N_("Close the current file"),
167 G_CALLBACK (gl_ui_cmd_file_close) },
173 N_("Quit the program"),
174 G_CALLBACK (gl_ui_cmd_file_quit) },
177 /* Edit action entries. */
183 G_CALLBACK (gl_ui_cmd_edit_undo) },
190 G_CALLBACK (gl_ui_cmd_edit_redo) },
196 N_("Cut the selection"),
197 G_CALLBACK (gl_ui_cmd_edit_cut) },
203 N_("Copy the selection"),
204 G_CALLBACK (gl_ui_cmd_edit_copy) },
210 N_("Paste the clipboard"),
211 G_CALLBACK (gl_ui_cmd_edit_paste) },
217 N_("Delete the selected objects"),
218 G_CALLBACK (gl_ui_cmd_edit_delete) },
224 N_("Select all objects"),
225 G_CALLBACK (gl_ui_cmd_edit_select_all) },
231 N_("Remove all selections"),
232 G_CALLBACK (gl_ui_cmd_edit_unselect_all) },
235 GTK_STOCK_PREFERENCES,
238 N_("Configure the application"),
239 G_CALLBACK (gl_ui_cmd_edit_preferences) },
242 /* View action entries. */
247 N_("Increase magnification"),
248 G_CALLBACK (gl_ui_cmd_view_zoomin) },
254 N_("Decrease magnification"),
255 G_CALLBACK (gl_ui_cmd_view_zoomout) },
261 N_("Restore scale to 100%"),
262 G_CALLBACK (gl_ui_cmd_view_zoom1to1) },
268 N_("Set scale to fit window"),
269 G_CALLBACK (gl_ui_cmd_view_zoom_to_fit) },
272 /* Objects action entries. */
273 { "ObjectsArrowMode",
277 N_("Select, move and modify objects"),
278 G_CALLBACK (gl_ui_cmd_objects_arrow_mode) },
280 { "ObjectsCreateText",
284 N_("Create text object"),
285 G_CALLBACK (gl_ui_cmd_objects_create_text) },
287 { "ObjectsCreateBox",
291 N_("Create box/rectangle object"),
292 G_CALLBACK (gl_ui_cmd_objects_create_box) },
294 { "ObjectsCreateLine",
298 N_("Create line object"),
299 G_CALLBACK (gl_ui_cmd_objects_create_line) },
301 { "ObjectsCreateEllipse",
305 N_("Create ellipse/circle object"),
306 G_CALLBACK (gl_ui_cmd_objects_create_ellipse) },
308 { "ObjectsCreateImage",
312 N_("Create image object"),
313 G_CALLBACK (gl_ui_cmd_objects_create_image) },
315 { "ObjectsCreateBarcode",
319 N_("Create barcode object"),
320 G_CALLBACK (gl_ui_cmd_objects_create_barcode) },
324 N_("Bring to front"),
326 N_("Raise object to top"),
327 G_CALLBACK (gl_ui_cmd_objects_raise) },
330 GL_STOCK_ORDER_BOTTOM,
333 N_("Lower object to bottom"),
334 G_CALLBACK (gl_ui_cmd_objects_lower) },
336 { "ObjectsRotateLeft",
337 GL_STOCK_ROTATE_LEFT,
340 N_("Rotate object 90 degrees counter-clockwise"),
341 G_CALLBACK (gl_ui_cmd_objects_rotate_left) },
343 { "ObjectsRotateRight",
344 GL_STOCK_ROTATE_RIGHT,
347 N_("Rotate object 90 degrees clockwise"),
348 G_CALLBACK (gl_ui_cmd_objects_rotate_right) },
350 { "ObjectsFlipHorizontal",
352 N_("Flip horizontally"),
354 N_("Flip object horizontally"),
355 G_CALLBACK (gl_ui_cmd_objects_flip_horiz) },
357 { "ObjectsFlipVertical",
359 N_("Flip vertically"),
361 N_("Flip object vertically"),
362 G_CALLBACK (gl_ui_cmd_objects_flip_vert) },
364 { "ObjectsAlignLeft",
368 N_("Align objects to left edges"),
369 G_CALLBACK (gl_ui_cmd_objects_align_left) },
371 { "ObjectsAlignRight",
372 GL_STOCK_ALIGN_RIGHT,
375 N_("Align objects to right edges"),
376 G_CALLBACK (gl_ui_cmd_objects_align_right) },
378 { "ObjectsAlignHCenter",
379 GL_STOCK_ALIGN_HCENTER,
380 N_("Align horizontal center"),
382 N_("Align objects to horizontal centers"),
383 G_CALLBACK (gl_ui_cmd_objects_align_hcenter) },
389 N_("Align objects to top edges"),
390 G_CALLBACK (gl_ui_cmd_objects_align_top) },
392 { "ObjectsAlignBottom",
393 GL_STOCK_ALIGN_BOTTOM,
396 N_("Align objects to bottom edges"),
397 G_CALLBACK (gl_ui_cmd_objects_align_bottom) },
399 { "ObjectsAlignVCenter",
400 GL_STOCK_ALIGN_VCENTER,
401 N_("Align vertical center"),
403 N_("Align objects to vertical centers"),
404 G_CALLBACK (gl_ui_cmd_objects_align_vcenter) },
406 { "ObjectsCenterHorizontal",
407 GL_STOCK_CENTER_HORIZ,
408 N_("Center horizontally"),
410 N_("Center objects to horizontal label center"),
411 G_CALLBACK (gl_ui_cmd_objects_center_horiz) },
413 { "ObjectsCenterVertical",
414 GL_STOCK_CENTER_VERT,
415 N_("Center vertically"),
417 N_("Center objects to vertical label center"),
418 G_CALLBACK (gl_ui_cmd_objects_center_vert) },
420 { "ObjectsMergeProperties",
422 N_("Merge properties"),
424 N_("Edit merge properties"),
425 G_CALLBACK (gl_ui_cmd_objects_merge_properties) },
428 /* Help actions entries. */
433 N_("Open glabels manual"),
434 G_CALLBACK (gl_ui_cmd_help_contents) },
441 G_CALLBACK (gl_ui_cmd_help_about) },
444 static guint n_entries = G_N_ELEMENTS (entries);
446 static GtkToggleActionEntry toggle_entries[] = {
448 { "ViewPropertyToolBar",
450 N_("Property toolbar"),
452 N_("Change the visibility of the property toolbar in the current window"),
453 G_CALLBACK (gl_ui_cmd_view_property_bar_toggle),
460 N_("Change the visibility of the grid in the current window"),
461 G_CALLBACK (gl_ui_cmd_view_grid_toggle),
468 N_("Change the visibility of markup lines in the current window"),
469 G_CALLBACK (gl_ui_cmd_view_markup_toggle),
473 static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries);
475 static GtkToggleActionEntry ui_toggle_entries[] = {
481 N_("Change the visibility of the main toolbar in the current window"),
482 G_CALLBACK (view_ui_item_toggled_cb),
485 { "ViewDrawingToolBar",
487 N_("Drawing toolbar"),
489 N_("Change the visibility of the drawing toolbar in the current window"),
490 G_CALLBACK (view_ui_item_toggled_cb),
494 static guint n_ui_toggle_entries = G_N_ELEMENTS (ui_toggle_entries);
496 static const gchar *ui_info =
499 " <menubar name='MenuBar'>"
500 " <menu action='FileMenu'>"
501 " <menuitem action='FileNew' />"
502 " <menuitem action='FileOpen' />"
503 " <menuitem action='FileRecentsMenu' />"
505 " <menuitem action='FileSave' />"
506 " <menuitem action='FileSaveAs' />"
508 " <menuitem action='FilePrint' />"
510 " <menuitem action='FileProperties' />"
511 " <menuitem action='FileTemplateDesigner' />"
513 " <menuitem action='FileClose' />"
514 " <menuitem action='FileQuit' />"
516 " <menu action='EditMenu'>"
517 " <menuitem action='EditUndo' />"
518 " <menuitem action='EditRedo' />"
520 " <menuitem action='EditCut' />"
521 " <menuitem action='EditCopy' />"
522 " <menuitem action='EditPaste' />"
523 " <menuitem action='EditDelete' />"
525 " <menuitem action='EditSelectAll' />"
526 " <menuitem action='EditUnSelectAll' />"
528 " <menuitem action='EditPreferences' />"
530 " <menu action='ViewMenu'>"
531 " <menuitem action='ViewMainToolBar' />"
532 " <menuitem action='ViewDrawingToolBar' />"
533 " <menuitem action='ViewPropertyToolBar' />"
535 " <menuitem action='ViewGrid' />"
536 " <menuitem action='ViewMarkup' />"
538 " <menuitem action='ViewZoomIn' />"
539 " <menuitem action='ViewZoomOut' />"
540 " <menuitem action='ViewZoom1to1' />"
541 " <menuitem action='ViewZoomToFit' />"
543 " <menu action='ObjectsMenu'>"
544 " <menuitem action='ObjectsArrowMode' />"
545 " <menu action='ObjectsCreateMenu'>"
546 " <menuitem action='ObjectsCreateText' />"
547 " <menuitem action='ObjectsCreateBox' />"
548 " <menuitem action='ObjectsCreateLine' />"
549 " <menuitem action='ObjectsCreateEllipse' />"
550 " <menuitem action='ObjectsCreateImage' />"
551 " <menuitem action='ObjectsCreateBarcode' />"
554 " <menu action='ObjectsOrderMenu'>"
555 " <menuitem action='ObjectsRaise' />"
556 " <menuitem action='ObjectsLower' />"
558 " <menu action='ObjectsRotateFlipMenu'>"
559 " <menuitem action='ObjectsRotateLeft' />"
560 " <menuitem action='ObjectsRotateRight' />"
561 " <menuitem action='ObjectsFlipHorizontal' />"
562 " <menuitem action='ObjectsFlipVertical' />"
564 " <menu action='ObjectsAlignHorizMenu'>"
565 " <menuitem action='ObjectsAlignLeft' />"
566 " <menuitem action='ObjectsAlignHCenter' />"
567 " <menuitem action='ObjectsAlignRight' />"
568 " <menuitem action='ObjectsCenterHorizontal' />"
570 " <menu action='ObjectsAlignVertMenu'>"
571 " <menuitem action='ObjectsAlignTop' />"
572 " <menuitem action='ObjectsAlignVCenter' />"
573 " <menuitem action='ObjectsAlignBottom' />"
574 " <menuitem action='ObjectsCenterVertical' />"
577 " <menuitem action='ObjectsMergeProperties' />"
579 " <menu action='HelpMenu'>"
580 " <menuitem action='HelpContents' />"
581 " <menuitem action='HelpAbout' />"
585 " <toolbar name='MainToolBar'>"
586 " <toolitem action='FileNew' />"
587 " <toolitem action='FileOpen' />"
588 " <toolitem action='FileSave' />"
590 " <toolitem action='FilePrint' />"
592 " <toolitem action='EditCut' />"
593 " <toolitem action='EditCopy' />"
594 " <toolitem action='EditPaste' />"
597 " <toolbar name='DrawingToolBar'>"
598 " <toolitem action='ObjectsArrowMode' />"
600 " <toolitem action='ObjectsCreateText' />"
601 " <toolitem action='ObjectsCreateBox' />"
602 " <toolitem action='ObjectsCreateLine' />"
603 " <toolitem action='ObjectsCreateEllipse' />"
604 " <toolitem action='ObjectsCreateImage' />"
605 " <toolitem action='ObjectsCreateBarcode' />"
607 " <toolitem action='ViewZoomIn' />"
608 " <toolitem action='ViewZoomOut' />"
609 " <toolitem action='ViewZoom1to1' />"
610 " <toolitem action='ViewZoomToFit' />"
612 " <toolitem action='ObjectsMergeProperties' />"
615 " <popup action='ContextMenu'>"
616 " <menu action='ObjectsOrderMenu'>"
617 " <menuitem action='ObjectsRaise' />"
618 " <menuitem action='ObjectsLower' />"
620 " <menu action='ObjectsRotateFlipMenu'>"
621 " <menuitem action='ObjectsRotateLeft' />"
622 " <menuitem action='ObjectsRotateRight' />"
623 " <menuitem action='ObjectsFlipHorizontal' />"
624 " <menuitem action='ObjectsFlipVertical' />"
626 " <menu action='ObjectsAlignHorizMenu'>"
627 " <menuitem action='ObjectsAlignLeft' />"
628 " <menuitem action='ObjectsAlignHCenter' />"
629 " <menuitem action='ObjectsAlignRight' />"
630 " <menuitem action='ObjectsCenterHorizontal' />"
632 " <menu action='ObjectsAlignVertMenu'>"
633 " <menuitem action='ObjectsAlignTop' />"
634 " <menuitem action='ObjectsAlignVCenter' />"
635 " <menuitem action='ObjectsAlignBottom' />"
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/ObjectsCreateText",
673 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateLine",
674 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBox",
675 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateEllipse",
676 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateImage",
677 "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBarcode",
678 "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise",
679 "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower",
680 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft",
681 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight",
682 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal",
683 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical",
684 "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignLeft",
685 "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignRight",
686 "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignHCenter",
687 "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsCenterHorizontal",
688 "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignTop",
689 "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignBottom",
690 "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignVCenter",
691 "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsCenterVertical",
692 "/ui/MenuBar/ObjectsMenu/ObjectsMergeProperties",
697 static gchar* doc_modified_verbs [] = {
698 "/ui/MenuBar/FileMenu/FileSave",
703 static gchar* paste_verbs [] = {
704 "/ui/MenuBar/EditMenu/EditPaste",
709 static gchar* selection_verbs [] = {
710 "/ui/MenuBar/EditMenu/EditCut",
711 "/ui/MenuBar/EditMenu/EditCopy",
712 "/ui/MenuBar/EditMenu/EditDelete",
713 "/ui/MenuBar/EditMenu/EditUnSelectAll",
714 "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise",
715 "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower",
716 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft",
717 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight",
718 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal",
719 "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical",
720 "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsCenterHorizontal",
721 "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsCenterVertical",
726 static gchar* atomic_selection_verbs [] = {
731 static gchar* multi_selection_verbs [] = {
732 "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignLeft",
733 "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignRight",
734 "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignHCenter",
735 "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignTop",
736 "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignBottom",
737 "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignVCenter",
743 /*****************************************************************************/
744 /** Initialize UI component for given window. */
745 /*****************************************************************************/
747 gl_ui_new (glWindow *window)
750 GtkActionGroup *actions;
751 GError *error = NULL;
752 GtkWidget *recent_menu;
754 gl_debug (DEBUG_UI, "START");
756 g_return_val_if_fail (window && GL_IS_WINDOW (window), NULL);
758 gl_debug (DEBUG_UI, "window = %p", window);
760 ui = gtk_ui_manager_new ();
762 g_signal_connect (ui, "connect_proxy",
763 G_CALLBACK (connect_proxy_cb), window);
764 g_signal_connect (ui, "disconnect_proxy",
765 G_CALLBACK (disconnect_proxy_cb), window);
767 actions = gtk_action_group_new ("Actions");
768 gtk_action_group_set_translation_domain (actions, NULL);
769 gtk_action_group_add_actions (actions, entries, n_entries, GTK_WINDOW (window));
770 gtk_action_group_add_toggle_actions (actions,
771 toggle_entries, n_toggle_entries,
773 gtk_action_group_add_toggle_actions (actions,
774 ui_toggle_entries, n_ui_toggle_entries,
777 gtk_ui_manager_insert_action_group (ui, actions, 0);
778 gtk_window_add_accel_group (GTK_WINDOW (window), gtk_ui_manager_get_accel_group (ui));
780 gl_debug (DEBUG_UI, "Creating ui from string");
781 if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, strlen (ui_info), &error)) {
782 g_message ("building menus failed: %s", error->message);
783 g_error_free (error);
786 /* Set the toolbar styles according to prefs */
787 set_app_main_toolbar_style (ui);
788 set_app_drawing_toolbar_style (ui);
790 /* Set view grid and markup visibility according to prefs */
793 /* add an Open Recents Submenu */
794 recent_menu = gl_recent_create_menu ();
795 g_signal_connect (G_OBJECT (recent_menu), "item-activated",
796 G_CALLBACK (gl_ui_cmd_file_open_recent), window);
797 gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget (ui, "/MenuBar/FileMenu/FileRecentsMenu")),
801 set_additional_properties (ui);
803 gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, FALSE);
804 gl_ui_util_set_verb_list_sensitive (ui, paste_verbs, FALSE);
806 gl_debug (DEBUG_UI, "END");
812 /*****************************************************************************/
813 /** Unref wrapper. */
814 /*****************************************************************************/
816 gl_ui_unref (GtkUIManager *ui)
818 gl_debug (DEBUG_UI, "START");
822 gl_debug (DEBUG_UI, "END");
826 /*****************************************************************************/
827 /** Update all verbs of given UI component. */
828 /*****************************************************************************/
830 gl_ui_update_all (GtkUIManager *ui,
835 gl_debug (DEBUG_UI, "START");
837 gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, TRUE);
840 g_return_if_fail (label != NULL);
842 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo",
843 gl_label_can_undo (label));
844 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo",
845 gl_label_can_redo (label));
847 gl_ui_util_set_verb_list_sensitive (ui, doc_modified_verbs,
848 gl_label_is_modified (label));
850 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn",
851 !gl_view_is_zoom_max (view));
852 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut",
853 !gl_view_is_zoom_min (view));
855 gl_ui_util_set_verb_list_sensitive (ui, selection_verbs,
856 !gl_label_is_selection_empty (label));
858 gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs,
859 gl_label_is_selection_atomic (label));
861 gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs,
862 !gl_label_is_selection_empty (label)
863 && !gl_label_is_selection_atomic (label));
865 gl_debug (DEBUG_UI, "END");
869 /*****************************************************************************/
870 /** Update label modified verbs of given UI component. */
871 /*****************************************************************************/
873 gl_ui_update_modified_verbs (GtkUIManager *ui,
876 gl_debug (DEBUG_UI, "START");
878 gl_ui_util_set_verb_list_sensitive (ui,
880 gl_label_is_modified (label));
882 gl_debug (DEBUG_UI, "END");
886 /*****************************************************************************/
887 /** Update verbs associated with selection state of given UI component. */
888 /*****************************************************************************/
890 gl_ui_update_selection_verbs (GtkUIManager *ui,
894 gl_debug (DEBUG_UI, "START");
898 gl_ui_util_set_verb_list_sensitive (ui, selection_verbs,
899 !gl_label_is_selection_empty (view->label));
901 gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs,
902 gl_label_is_selection_atomic (view->label));
904 gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs,
905 !gl_label_is_selection_empty (view->label)
906 && !gl_label_is_selection_atomic (view->label));
910 gl_ui_util_set_verb_list_sensitive (ui, selection_verbs, FALSE);
911 gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs, FALSE);
912 gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs, FALSE);
915 gl_debug (DEBUG_UI, "END");
919 /*****************************************************************************/
920 /** Update verbs associated with zoom level of given UI component. */
921 /*****************************************************************************/
923 gl_ui_update_zoom_verbs (GtkUIManager *ui,
926 gl_debug (DEBUG_UI, "START");
928 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn",
929 !gl_view_is_zoom_max (view));
930 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut",
931 !gl_view_is_zoom_min (view));
933 gl_debug (DEBUG_UI, "END");
937 /*****************************************************************************/
938 /** Update paste verbs of given UI component. */
939 /*****************************************************************************/
941 gl_ui_update_paste_verbs (GtkUIManager *ui,
944 gl_debug (DEBUG_UI, "START");
946 gl_ui_util_set_verb_list_sensitive (ui, paste_verbs, can_paste);
948 gl_debug (DEBUG_UI, "END");
952 /*****************************************************************************/
953 /** Update undo/redo verbs of given UI component. */
954 /*****************************************************************************/
956 gl_ui_update_undo_redo_verbs (GtkUIManager *ui,
959 GtkWidget *menu_item;
963 gl_debug (DEBUG_UI, "START");
965 menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/EditMenu/EditUndo");
966 description = gl_label_get_undo_description (label);
967 menu_label = g_strdup_printf ("%s: %s", _("Undo"), description);
968 gtk_menu_item_set_label (GTK_MENU_ITEM (menu_item), menu_label);
970 g_free (description);
972 menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/EditMenu/EditRedo");
973 description = gl_label_get_redo_description (label);
974 menu_label = g_strdup_printf ("%s: %s", _("Redo"), description);
975 gtk_menu_item_set_label (GTK_MENU_ITEM (menu_item), menu_label);
977 g_free (description);
979 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo",
980 gl_label_can_undo (label));
982 gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo",
983 gl_label_can_redo (label));
985 gl_debug (DEBUG_UI, "END");
989 /*---------------------------------------------------------------------------*/
990 /** PRIVATE. View menu item toggled callback. */
991 /*---------------------------------------------------------------------------*/
993 view_ui_item_toggled_cb (GtkToggleAction *action,
999 gl_debug (DEBUG_UI, "START");
1001 g_return_if_fail (action && GTK_IS_TOGGLE_ACTION (action));
1003 name = gtk_action_get_name (GTK_ACTION (action));
1004 state = gtk_toggle_action_get_active (action);
1006 gl_debug (DEBUG_UI, "Action = %s, State = %d", name, state);
1008 if (strcmp (name, "ViewMainToolBar") == 0)
1010 gl_prefs_model_set_main_toolbar_visible (gl_prefs, state);
1011 set_app_main_toolbar_style (ui);
1014 if (strcmp (name, "ViewDrawingToolBar") == 0)
1016 gl_prefs_model_set_drawing_toolbar_visible (gl_prefs, state);
1017 set_app_drawing_toolbar_style (ui);
1020 gl_debug (DEBUG_UI, "");
1024 /*---------------------------------------------------------------------------*/
1025 /** PRIVATE. Set main toolbar style. */
1026 /*---------------------------------------------------------------------------*/
1028 set_app_main_toolbar_style (GtkUIManager *ui)
1032 gl_debug (DEBUG_UI, "START");
1034 g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui));
1036 /* Updated view menu */
1037 gl_ui_util_set_verb_state (ui, "/ui/ViewMenu/ViewMainToolBar",
1038 gl_prefs_model_get_main_toolbar_visible (gl_prefs));
1040 toolbar = gtk_ui_manager_get_widget (ui, "/MainToolBar");
1042 if (gl_prefs_model_get_main_toolbar_visible (gl_prefs)) {
1043 gtk_widget_show_all (toolbar);
1045 gtk_widget_hide (toolbar);
1048 gl_debug (DEBUG_UI, "END");
1052 /*---------------------------------------------------------------------------*/
1053 /** PRIVATE. Set drawing toolbar style. */
1054 /*---------------------------------------------------------------------------*/
1056 set_app_drawing_toolbar_style (GtkUIManager *ui)
1060 gl_debug (DEBUG_UI, "START");
1062 g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui));
1064 /* Updated view menu */
1065 gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewDrawingToolBar",
1066 gl_prefs_model_get_drawing_toolbar_visible (gl_prefs));
1068 toolbar = gtk_ui_manager_get_widget (ui, "/DrawingToolBar");
1070 gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
1072 if (gl_prefs_model_get_drawing_toolbar_visible (gl_prefs)) {
1073 gtk_widget_show_all (toolbar);
1075 gtk_widget_hide (toolbar);
1078 gl_debug (DEBUG_UI, "END");
1082 /*---------------------------------------------------------------------------*/
1083 /** PRIVATE. Set visibility of grid and markup. */
1084 /*---------------------------------------------------------------------------*/
1086 set_view_style (GtkUIManager *ui)
1088 gl_debug (DEBUG_UI, "START");
1090 g_return_if_fail (ui && GTK_IS_UI_MANAGER(ui));
1092 gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewGrid",
1093 gl_prefs_model_get_grid_visible (gl_prefs));
1095 gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewMarkup",
1096 gl_prefs_model_get_markup_visible (gl_prefs));
1098 gl_debug (DEBUG_UI, "END");
1102 /*---------------------------------------------------------------------------*/
1103 /** PRIVATE. Descend menu, set "always-show-image" for all image menu items.*/
1104 /*---------------------------------------------------------------------------*/
1106 descend_menu_set_always_show_image (GtkMenu *menu)
1108 GList *children, *p;
1110 GtkWidget *menu_item;
1112 children = gtk_container_get_children (GTK_CONTAINER (menu));
1114 for ( p = children; p != NULL; p = p->next )
1116 menu_item = GTK_WIDGET (p->data);
1118 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1121 descend_menu_set_always_show_image (GTK_MENU (submenu));
1123 else if ( GTK_IS_IMAGE_MENU_ITEM (menu_item) )
1125 g_object_set (menu_item, "always-show-image", TRUE, NULL);
1131 /*---------------------------------------------------------------------------*/
1132 /** PRIVATE. Set additional properties. */
1133 /*---------------------------------------------------------------------------*/
1135 set_additional_properties (GtkUIManager *ui)
1138 GtkWidget *menu_item;
1141 * Set "always-show-image" property for all Object menuitems. This is
1142 * necessary because, as of Gtk-2.18, images are not shown by default
1143 * and you really need these visual cues for these menu items.
1145 menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/ObjectsMenu/");
1146 menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1147 descend_menu_set_always_show_image (GTK_MENU (menu));
1149 menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/ObjectsMenu/ObjectsMergeProperties");
1150 g_object_set (menu_item, "always-show-image", FALSE, NULL); /* Leave this one out. */
1152 menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsOrderMenu/");
1153 menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1154 descend_menu_set_always_show_image (GTK_MENU (menu));
1156 menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsRotateFlipMenu/");
1157 menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1158 descend_menu_set_always_show_image (GTK_MENU (menu));
1160 menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsAlignHorizMenu/");
1161 menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1162 descend_menu_set_always_show_image (GTK_MENU (menu));
1164 menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsAlignVertMenu/");
1165 menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1166 descend_menu_set_always_show_image (GTK_MENU (menu));
1170 /*---------------------------------------------------------------------------*/
1171 /** PRIVATE. Connect proxy callback. */
1172 /*---------------------------------------------------------------------------*/
1174 connect_proxy_cb (GtkUIManager *ui,
1179 if (GTK_IS_MENU_ITEM (proxy))
1181 g_signal_connect (proxy, "select",
1182 G_CALLBACK (menu_item_select_cb), window);
1183 g_signal_connect (proxy, "deselect",
1184 G_CALLBACK (menu_item_deselect_cb), window);
1189 /*---------------------------------------------------------------------------*/
1190 /** PRIVATE. Disconnect proxy callback. */
1191 /*---------------------------------------------------------------------------*/
1193 disconnect_proxy_cb (GtkUIManager *ui,
1198 if (GTK_IS_MENU_ITEM (proxy))
1200 g_signal_handlers_disconnect_by_func
1201 (proxy, G_CALLBACK (menu_item_select_cb), window);
1202 g_signal_handlers_disconnect_by_func
1203 (proxy, G_CALLBACK (menu_item_deselect_cb), window);
1208 /*---------------------------------------------------------------------------*/
1209 /** PRIVATE. Menu item select callback. */
1210 /*---------------------------------------------------------------------------*/
1212 menu_item_select_cb (GtkMenuItem *proxy,
1218 g_return_if_fail (window && GL_IS_WINDOW (window));
1219 g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar));
1221 action = g_object_get_data (G_OBJECT (proxy), "gtk-action");
1222 g_return_if_fail (action != NULL);
1224 g_object_get (G_OBJECT (action), "tooltip", &message, NULL);
1227 gtk_statusbar_push (GTK_STATUSBAR (window->status_bar),
1228 window->menu_tips_context_id, message);
1234 /*---------------------------------------------------------------------------*/
1235 /** PRIVATE. Menu item deselect callback. */
1236 /*---------------------------------------------------------------------------*/
1238 menu_item_deselect_cb (GtkMenuItem *proxy,
1241 g_return_if_fail (window && GL_IS_WINDOW (window));
1242 g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar));
1244 gtk_statusbar_pop (GTK_STATUSBAR (window->status_bar),
1245 window->menu_tips_context_id);
1251 * Local Variables: -- emacs
1253 * c-basic-offset: 8 -- emacs
1254 * tab-width: 8 -- emacs
1255 * indent-tabs-mode: nil -- emacs