]> git.sur5r.net Git - glabels/blob - glabels2/src/ui.c
2005-05-10 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / ui.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
3 /**
4  *  (GLABELS) Label and Business Card Creation program for GNOME
5  *
6  *  ui.c:  GLabels ui module
7  *
8  *  Copyright (C) 2001-2002  Jim Evins <evins@snaught.com>.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  */
24 #include <config.h>
25
26 #include "ui.h"
27
28 #include <glib/gi18n.h>
29 #include <gconf/gconf-client.h>
30
31 #include "ui-util.h"
32 #include "ui-commands.h"
33 #include "file.h"
34 #include "prefs.h"
35 #include "stock.h"
36 #include "window.h"
37
38 #include "debug.h"
39
40 /*==========================================================================*/
41 /* Private macros and constants.                                            */
42 /*==========================================================================*/
43
44 /*==========================================================================*/
45 /* Private types.                                                           */
46 /*==========================================================================*/
47
48
49 /*==========================================================================*/
50 /* Local function prototypes                                                */
51 /*==========================================================================*/
52
53 static void view_ui_item_toggled_cb        (GtkToggleAction *action,
54                                             GtkUIManager    *ui);
55
56 static void set_app_main_toolbar_style     (GtkUIManager    *ui);
57
58 static void set_app_drawing_toolbar_style  (GtkUIManager    *ui);
59
60 static void set_view_style                 (GtkUIManager    *ui);
61
62 static void connect_proxy_cb               (GtkUIManager    *ui,
63                                             GtkAction       *action,
64                                             GtkWidget       *proxy,
65                                             glWindow        *window);
66
67 static void disconnect_proxy_cb            (GtkUIManager    *ui,
68                                             GtkAction       *action,
69                                             GtkWidget       *proxy,
70                                             glWindow        *window);
71
72 static void menu_item_select_cb            (GtkMenuItem     *proxy,
73                                             glWindow        *window);
74
75 static void menu_item_deselect_cb          (GtkMenuItem     *proxy,
76                                             glWindow        *window);
77
78
79
80 /*==========================================================================*/
81 /* Private globals                                                          */
82 /*==========================================================================*/
83
84 static GtkActionEntry entries[] = {
85
86         /* Menu entries. */
87         { "FileMenu",                NULL, N_("_File") },
88         { "FileRecentsMenu",         NULL, N_("Recent _Files") },
89         { "EditMenu",                NULL, N_("_Edit") },
90         { "ViewMenu",                NULL, N_("_View") },
91         { "ViewMainToolBarMenu",     NULL, N_("Customize Main Toolbar") },
92         { "ViewDrawingToolBarMenu",  NULL, N_("Customize Drawing Toolbar") },
93         { "ViewPropertyToolBarMenu", NULL, N_("Customize Properties Toolbar") },
94         { "ObjectsMenu",             NULL, N_("_Objects") },
95         { "ObjectsCreateMenu",       NULL, N_("_Create") },
96         { "ObjectsOrderMenu",        NULL, N_("_Order") },
97         { "ObjectsRotateFlipMenu",   NULL, N_("_Rotate/Flip") },
98         { "ObjectsAlignHorizMenu",   NULL, N_("Align _Horizontal") },
99         { "ObjectsAlignVertMenu",    NULL, N_("Align _Vertical") },
100         { "HelpMenu",                NULL, N_("_Help") },
101
102
103         /* File action entries. */
104         { "FileNew",
105           GTK_STOCK_NEW,
106           N_("_New"),
107           "<control>N",
108           N_("Create a new file"),
109           G_CALLBACK (gl_ui_cmd_file_new) },
110
111         { "FileOpen",
112           GTK_STOCK_OPEN,
113           N_("_Open..."),
114           "<control>O",
115           N_("Open a file"),
116           G_CALLBACK (gl_ui_cmd_file_open) },
117
118         { "FileSave",
119           GTK_STOCK_SAVE,
120           N_("_Save"),
121           "<control>S",
122           N_("Save current file"),
123           G_CALLBACK (gl_ui_cmd_file_save) },
124
125         { "FileSaveAs",
126           GTK_STOCK_SAVE,
127           N_("Save _As..."),
128           "<shift><control>S",
129           N_("Save the current file to a different name"),
130           G_CALLBACK (gl_ui_cmd_file_save_as) },
131
132         { "FilePrint",
133           GTK_STOCK_PRINT,
134           N_("_Print..."),
135           "<control>P",
136           N_("Print the current file"),
137           G_CALLBACK (gl_ui_cmd_file_print) },
138
139         { "FileProperties",
140           GTK_STOCK_PROPERTIES,
141           N_("Properties..."),
142           NULL,
143           N_("Modify document properties"),
144           G_CALLBACK (gl_ui_cmd_file_properties) },
145
146         { "FileTemplateDesigner",
147           NULL,
148           N_("Template _Designer..."),
149           NULL,
150           N_("Create a custom template"),
151           G_CALLBACK (gl_ui_cmd_file_template_designer) },
152
153         { "FileClose",
154           GTK_STOCK_CLOSE,
155           N_("_Close"),
156           "<alt>F4",
157           N_("Close the current file"),
158           G_CALLBACK (gl_ui_cmd_file_close) },
159
160         { "FileQuit",
161           GTK_STOCK_QUIT,
162           N_("_Quit"),
163           "<control>Q",
164           N_("Quit the program"),
165           G_CALLBACK (gl_ui_cmd_file_quit) },
166
167
168         /* Edit action entries. */
169         { "EditCut",
170           GTK_STOCK_CUT,
171           N_("Cut"),
172           "<control>X",
173           N_("Cut the selection"),
174           G_CALLBACK (gl_ui_cmd_edit_cut) },
175
176         { "EditCopy",
177           GTK_STOCK_COPY,
178           N_("Copy"),
179           "<control>C",
180           N_("Copy the selection"),
181           G_CALLBACK (gl_ui_cmd_edit_copy) },
182
183         { "EditPaste",
184           GTK_STOCK_PASTE,
185           N_("Paste"),
186           "<control>V",
187           N_("Paste the clipboard"),
188           G_CALLBACK (gl_ui_cmd_edit_paste) },
189
190         { "EditDelete",
191           NULL,
192           N_("Delete"),
193           NULL,
194           N_("Delete the selected objects"),
195           G_CALLBACK (gl_ui_cmd_edit_delete) },
196
197         { "EditSelectAll",
198           NULL,
199           N_("Select All"),
200           "<control>A",
201           N_("Select all objects"),
202           G_CALLBACK (gl_ui_cmd_edit_select_all) },
203
204         { "EditUnSelectAll",
205           NULL,
206           N_("Un-select All"),
207           NULL,
208           N_("Remove all selections"),
209           G_CALLBACK (gl_ui_cmd_edit_unselect_all) },
210
211         { "EditPreferences",
212           GTK_STOCK_PREFERENCES,
213           N_("Preferences"),
214           NULL,
215           N_("Configure the application"),
216           G_CALLBACK (gl_ui_cmd_edit_preferences) },
217
218
219         /* View action entries. */
220         { "ViewZoomIn",
221           GTK_STOCK_ZOOM_IN,
222           N_("Zoom in"),
223           NULL,
224           N_("Increase magnification"),
225           G_CALLBACK (gl_ui_cmd_view_zoomin) },
226
227         { "ViewZoomOut",
228           GTK_STOCK_ZOOM_OUT,
229           N_("Zoom out"),
230           NULL,
231           N_("Decrease magnification"),
232           G_CALLBACK (gl_ui_cmd_view_zoomout) },
233
234         { "ViewZoom1to1",
235           GTK_STOCK_ZOOM_100,
236           N_("Zoom 1 to 1"),
237           NULL,
238           N_("Restore scale to 100%"),
239           G_CALLBACK (gl_ui_cmd_view_zoom1to1) },
240
241         { "ViewZoomToFit",
242           GTK_STOCK_ZOOM_FIT,
243           N_("Zoom to fit"),
244           NULL,
245           N_("Set scale to fit window"),
246           G_CALLBACK (gl_ui_cmd_view_zoom_to_fit) },
247
248
249         /* Objects action entries. */
250         { "ObjectsArrowMode",
251           GL_STOCK_ARROW,
252           N_("Select Mode"),
253           NULL,
254           N_("Select, move and modify objects"),
255           G_CALLBACK (gl_ui_cmd_objects_arrow_mode) },
256
257         { "ObjectsCreateText",
258           GL_STOCK_TEXT,
259           N_("Text"),
260           NULL,
261           N_("Create text object"),
262           G_CALLBACK (gl_ui_cmd_objects_create_text) },
263
264         { "ObjectsCreateBox",
265           GL_STOCK_BOX,
266           N_("Box"),
267           NULL,
268           N_("Create box/rectangle object"),
269           G_CALLBACK (gl_ui_cmd_objects_create_box) },
270
271         { "ObjectsCreateLine",
272           GL_STOCK_LINE,
273           N_("Line"),
274           NULL,
275           N_("Create line object"),
276           G_CALLBACK (gl_ui_cmd_objects_create_line) },
277
278         { "ObjectsCreateEllipse",
279           GL_STOCK_ELLIPSE,
280           N_("Ellipse"),
281           NULL,
282           N_("Create ellipse/circle object"),
283           G_CALLBACK (gl_ui_cmd_objects_create_ellipse) },
284
285         { "ObjectsCreateImage",
286           GL_STOCK_IMAGE,
287           N_("Image"),
288           NULL,
289           N_("Create image object"),
290           G_CALLBACK (gl_ui_cmd_objects_create_image) },
291
292         { "ObjectsCreateBarcode",
293           GL_STOCK_BARCODE,
294           N_("Barcode"),
295           NULL,
296           N_("Create barcode object"),
297           G_CALLBACK (gl_ui_cmd_objects_create_barcode) },
298         
299         { "ObjectsRaise",
300           GL_STOCK_ORDER_TOP,
301           N_("Bring to front"),
302           NULL,
303           N_("Raise object to top"),
304           G_CALLBACK (gl_ui_cmd_objects_raise) },
305
306         { "ObjectsLower",
307           GL_STOCK_ORDER_BOTTOM,
308           N_("Send to back"),
309           NULL,
310           N_("Lower object to bottom"),
311           G_CALLBACK (gl_ui_cmd_objects_lower) },
312
313         { "ObjectsRotateLeft",
314           GL_STOCK_ROTATE_LEFT,
315           N_("Rotate left"),
316           NULL,
317           N_("Rotate object 90 degrees counter-clockwise"),
318           G_CALLBACK (gl_ui_cmd_objects_rotate_left) },
319
320         { "ObjectsRotateRight",
321           GL_STOCK_ROTATE_RIGHT,
322           N_("Rotate right"),
323           NULL,
324           N_("Rotate object 90 degrees clockwise"),
325           G_CALLBACK (gl_ui_cmd_objects_rotate_right) },
326
327         { "ObjectsFlipHorizontal",
328           GL_STOCK_FLIP_HORIZ,
329           N_("Flip horizontally"),
330           NULL,
331           N_("Flip object horizontally"),
332           G_CALLBACK (gl_ui_cmd_objects_flip_horiz) },
333
334         { "ObjectsFlipVertical",
335           GL_STOCK_FLIP_VERT,
336           N_("Flip vertically"),
337           NULL,
338           N_("Flip object vertically"),
339           G_CALLBACK (gl_ui_cmd_objects_flip_vert) },
340
341         { "ObjectsAlignLeft",
342           GL_STOCK_ALIGN_LEFT,
343           N_("Align left"),
344           NULL,
345           N_("Align objects to left edges"),
346           G_CALLBACK (gl_ui_cmd_objects_align_left) },
347
348         { "ObjectsAlignRight",
349           GL_STOCK_ALIGN_RIGHT,
350           N_("Align right"),
351           NULL,
352           N_("Align objects to right edges"),
353           G_CALLBACK (gl_ui_cmd_objects_align_right) },
354
355         { "ObjectsAlignHCenter",
356           GL_STOCK_ALIGN_HCENTER,
357           N_("Align horizontal center"),
358           NULL,
359           N_("Align objects to horizontal centers"),
360           G_CALLBACK (gl_ui_cmd_objects_align_hcenter) },
361
362         { "ObjectsAlignTop",
363           GL_STOCK_ALIGN_TOP,
364           N_("Align tops"),
365           NULL,
366           N_("Align objects to top edges"),
367           G_CALLBACK (gl_ui_cmd_objects_align_top) },
368
369         { "ObjectsAlignBottom",
370           GL_STOCK_ALIGN_BOTTOM,
371           N_("Align bottoms"),
372           NULL,
373           N_("Align objects to bottom edges"),
374           G_CALLBACK (gl_ui_cmd_objects_align_bottom) },
375
376         { "ObjectsAlignVCenter",
377           GL_STOCK_ALIGN_VCENTER,
378           N_("Align vertical center"),
379           NULL,
380           N_("Align objects to vertical centers"),
381           G_CALLBACK (gl_ui_cmd_objects_align_vcenter) },
382
383         { "ObjectsCenterHorizontal",
384           GL_STOCK_CENTER_HORIZ,
385           N_("Center horizontally"),
386           NULL,
387           N_("Center objects to horizontal label center"),
388           G_CALLBACK (gl_ui_cmd_objects_center_horiz) },
389
390         { "ObjectsCenterVertical",
391           GL_STOCK_CENTER_VERT,
392           N_("Center vertically"),
393           NULL,
394           N_("Center objects to vertical label center"),
395           G_CALLBACK (gl_ui_cmd_objects_center_vert) },
396
397         { "ObjectsMergeProperties",
398           GL_STOCK_MERGE,
399           N_("Merge properties"),
400           NULL,
401           N_("Edit merge properties"),
402           G_CALLBACK (gl_ui_cmd_objects_merge_properties) },
403
404
405         /* Help actions entries. */
406         { "HelpContents",
407           GTK_STOCK_HELP,
408           N_("Contents"),
409           "F1",
410           N_("Open glabels manual"),
411           G_CALLBACK (gl_ui_cmd_help_contents) },
412
413         { "HelpAbout",
414           GTK_STOCK_ABOUT,
415           N_("About..."),
416           NULL,
417           N_("About glabels"),
418           G_CALLBACK (gl_ui_cmd_help_about) },
419
420 };
421 static guint n_entries = G_N_ELEMENTS (entries);
422
423 static GtkToggleActionEntry toggle_entries[] = {
424
425         { "ViewPropertyToolBar",
426           NULL,
427           N_("Property toolbar"),
428           NULL,
429           N_("Change the visibility of the property toolbar in the current window"),
430           G_CALLBACK (gl_ui_cmd_view_property_bar_toggle),
431           TRUE },
432
433         { "ViewPropertyToolBarToolTips",
434           NULL,
435           N_("Show tooltips"),
436           NULL,
437           N_("Show tooltips for property toolbar"),
438           G_CALLBACK (gl_ui_cmd_view_property_bar_tips_toggle),
439           TRUE },
440
441         { "ViewGrid",
442           NULL,
443           N_("Grid"),
444           NULL,
445           N_("Change the visibility of the grid in the current window"),
446           G_CALLBACK (gl_ui_cmd_view_grid_toggle),
447           TRUE },
448
449         { "ViewMarkup",
450           NULL,
451           N_("Markup"),
452           NULL,
453           N_("Change the visibility of markup lines in the current window"),
454           G_CALLBACK (gl_ui_cmd_view_markup_toggle),
455           TRUE },
456
457 };
458 static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries);
459
460 static GtkToggleActionEntry ui_toggle_entries[] = {
461
462         { "ViewMainToolBar",
463           NULL,
464           N_("Main toolbar"),
465           NULL,
466           N_("Change the visibility of the main toolbar in the current window"),
467           G_CALLBACK (view_ui_item_toggled_cb),
468           TRUE },
469
470         { "ViewDrawingToolBar",
471           NULL,
472           N_("Drawing toolbar"),
473           NULL,
474           N_("Change the visibility of the drawing toolbar in the current window"),
475           G_CALLBACK (view_ui_item_toggled_cb),
476           TRUE },
477
478         { "ViewMainToolBarToolTips",
479           NULL,
480           N_("Show tooltips"),
481           NULL,
482           N_("Show tooltips for main toolbar"),
483           G_CALLBACK (view_ui_item_toggled_cb),
484           TRUE },
485
486         { "ViewDrawingToolBarToolTips",
487           NULL,
488           N_("Show tooltips"),
489           NULL,
490           N_("Show tooltips for drawing toolbar"),
491           G_CALLBACK (view_ui_item_toggled_cb),
492           TRUE },
493
494 };
495 static guint n_ui_toggle_entries = G_N_ELEMENTS (ui_toggle_entries);
496
497 static const gchar *ui_info = 
498 "<ui>"
499 ""
500 "       <menubar name='MenuBar'>"
501 "               <menu action='FileMenu'>"
502 "                       <menuitem action='FileNew' />"
503 "                       <menuitem action='FileOpen' />"
504 "                       <menu action='FileRecentsMenu'>"
505 "                               <placeholder name='FileRecentsPlaceHolder' />"
506 "                       </menu>"
507 "                       <separator />"
508 "                       <menuitem action='FileSave' />"
509 "                       <menuitem action='FileSaveAs' />"
510 "                       <separator />"
511 "                       <menuitem action='FilePrint' />"
512 "                       <separator />"
513 "                       <menuitem action='FileProperties' />"
514 "                       <menuitem action='FileTemplateDesigner' />"
515 "                       <separator />"
516 "                       <menuitem action='FileClose' />"
517 "                       <menuitem action='FileQuit' />"
518 "               </menu>"
519 "               <menu action='EditMenu'>"
520 "                       <menuitem action='EditCut' />"
521 "                       <menuitem action='EditCopy' />"
522 "                       <menuitem action='EditPaste' />"
523 "                       <menuitem action='EditDelete' />"
524 "                       <separator />"
525 "                       <menuitem action='EditSelectAll' />"
526 "                       <menuitem action='EditUnSelectAll' />"
527 "                       <separator />"
528 "                       <menuitem action='EditPreferences' />"
529 "               </menu>"
530 "               <menu action='ViewMenu'>"
531 "                       <menuitem action='ViewMainToolBar' />"
532 "                       <menuitem action='ViewDrawingToolBar' />"
533 "                       <menuitem action='ViewPropertyToolBar' />"
534 "                       <separator />"
535 "                       <menu action='ViewMainToolBarMenu'>"
536 "                               <menuitem action='ViewMainToolBarToolTips' />"
537 "                       </menu>"
538 "                       <menu action='ViewDrawingToolBarMenu'>"
539 "                               <menuitem action='ViewDrawingToolBarToolTips' />"
540 "                       </menu>"
541 "                       <menu action='ViewPropertyToolBarMenu'>"
542 "                               <menuitem action='ViewPropertyToolBarToolTips' />"
543 "                       </menu>"
544 "                       <separator />"
545 "                       <menuitem action='ViewGrid' />"
546 "                       <menuitem action='ViewMarkup' />"
547 "                       <separator />"
548 "                       <menuitem action='ViewZoomIn' />"
549 "                       <menuitem action='ViewZoomOut' />"
550 "                       <menuitem action='ViewZoom1to1' />"
551 "                       <menuitem action='ViewZoomToFit' />"
552 "               </menu>"
553 "               <menu action='ObjectsMenu'>"
554 "                       <menuitem action='ObjectsArrowMode' />"
555 "                       <menu action='ObjectsCreateMenu'>"
556 "                               <menuitem action='ObjectsCreateText' />"
557 "                               <menuitem action='ObjectsCreateBox' />"
558 "                               <menuitem action='ObjectsCreateLine' />"
559 "                               <menuitem action='ObjectsCreateEllipse' />"
560 "                               <menuitem action='ObjectsCreateImage' />"
561 "                               <menuitem action='ObjectsCreateBarcode' />"
562 "                       </menu>"
563 "                       <separator />"
564 "                       <menu action='ObjectsOrderMenu'>"
565 "                               <menuitem action='ObjectsRaise' />"
566 "                               <menuitem action='ObjectsLower' />"
567 "                       </menu>"
568 "                       <menu action='ObjectsRotateFlipMenu'>"
569 "                               <menuitem action='ObjectsRotateLeft' />"
570 "                               <menuitem action='ObjectsRotateRight' />"
571 "                               <menuitem action='ObjectsFlipHorizontal' />"
572 "                               <menuitem action='ObjectsFlipVertical' />"
573 "                       </menu>"
574 "                       <menu action='ObjectsAlignHorizMenu'>"
575 "                               <menuitem action='ObjectsAlignLeft' />"
576 "                               <menuitem action='ObjectsAlignHCenter' />"
577 "                               <menuitem action='ObjectsAlignRight' />"
578 "                               <menuitem action='ObjectsCenterHorizontal' />"
579 "                       </menu>"
580 "                       <menu action='ObjectsAlignVertMenu'>"
581 "                               <menuitem action='ObjectsAlignTop' />"
582 "                               <menuitem action='ObjectsAlignVCenter' />"
583 "                               <menuitem action='ObjectsAlignBottom' />"
584 "                               <menuitem action='ObjectsCenterVertical' />"
585 "                       </menu>"
586 "                       <separator />"
587 "                       <menuitem action='ObjectsMergeProperties' />"
588 "               </menu>"
589 "               <menu action='HelpMenu'>"
590 "                       <menuitem action='HelpContents' />"
591 "                       <menuitem action='HelpAbout' />"
592 "               </menu>"
593 "       </menubar>"
594 ""
595 "       <toolbar name='MainToolBar'>"
596 "               <toolitem action='FileNew' />"
597 "               <toolitem action='FileOpen' />"
598 "               <toolitem action='FileSave' />"
599 "               <separator />"
600 "               <toolitem action='FilePrint' />"
601 "               <separator />"
602 "               <toolitem action='EditCut' />"
603 "               <toolitem action='EditCopy' />"
604 "               <toolitem action='EditPaste' />"
605 "       </toolbar>"
606 ""
607 "       <toolbar name='DrawingToolBar'>"
608 "               <toolitem action='ObjectsArrowMode' />"
609 "               <separator />"
610 "               <toolitem action='ObjectsCreateText' />"
611 "               <toolitem action='ObjectsCreateBox' />"
612 "               <toolitem action='ObjectsCreateLine' />"
613 "               <toolitem action='ObjectsCreateEllipse' />"
614 "               <toolitem action='ObjectsCreateImage' />"
615 "               <toolitem action='ObjectsCreateBarcode' />"
616 "               <separator />"
617 "               <toolitem action='ViewZoomIn' />"
618 "               <toolitem action='ViewZoomOut' />"
619 "               <toolitem action='ViewZoom1to1' />"
620 "               <toolitem action='ViewZoomToFit' />"
621 "               <separator />"
622 "               <toolitem action='ObjectsMergeProperties' />"
623 "       </toolbar>"
624 ""
625 "</ui>";
626
627
628 static gchar* doc_verbs [] = {
629         "/ui/MenuBar/FileMenu/FileProperties",
630         "/ui/MenuBar/FileMenu/FileSave",
631         "/ui/MenuBar/FileMenu/FileSaveAs",
632         "/ui/MenuBar/FileMenu/FilePrint",
633         "/ui/MenuBar/FileMenu/FileClose",
634         "/ui/MenuBar/EditMenu/EditCut",
635         "/ui/MenuBar/EditMenu/EditCopy",
636         "/ui/MenuBar/EditMenu/EditPaste",
637         "/ui/MenuBar/EditMenu/EditDelete",
638         "/ui/MenuBar/EditMenu/EditSelectAll",
639         "/ui/MenuBar/EditMenu/EditUnSelectAll",
640         "/ui/MenuBar/ViewMenu/ViewZoomIn",
641         "/ui/MenuBar/ViewMenu/ViewZoomOut",
642         "/ui/MenuBar/ViewMenu/ViewZoom1to1",
643         "/ui/MenuBar/ViewMenu/ViewZoomToFit",
644         "/ui/MenuBar/ViewMenu/ViewGrid",
645         "/ui/MenuBar/ViewMenu/ViewMarkup",
646         "/ui/MenuBar/ObjectsMenu/ObjectsArrowMode",
647         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateText",
648         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateLine",
649         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBox",
650         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateEllipse",
651         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateImage",
652         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBarcode",
653         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise",
654         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower",
655         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft",
656         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight",
657         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal",
658         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical",
659         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignLeft",
660         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignRight",
661         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignHCenter",
662         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsCenterHorizontal",
663         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignTop",
664         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignBottom",
665         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignVCenter",
666         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsCenterVertical",
667         "/ui/MenuBar/ObjectsMenu/ObjectsMergeProperties",
668
669         NULL
670 };
671
672 static gchar* doc_modified_verbs [] = {
673         "/ui/MenuBar/FileMenu/Save",
674
675         NULL
676 };
677
678 static gchar* selection_verbs [] = {
679         "/ui/MenuBar/EditMenu/EditCut",
680         "/ui/MenuBar/EditMenu/EditCopy",
681         "/ui/MenuBar/EditMenu/EditDelete",
682         "/ui/MenuBar/EditMenu/EditUnSelectAll",
683         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise",
684         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower",
685         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft",
686         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight",
687         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal",
688         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical",
689         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsCenterHorizontal",
690         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsCenterVertical",
691
692         NULL
693 };
694
695 static gchar* atomic_selection_verbs [] = {
696
697         NULL
698 };
699
700 static gchar* multi_selection_verbs [] = {
701         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignLeft",
702         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignRight",
703         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignHCenter",
704         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignTop",
705         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignBottom",
706         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignVCenter",
707
708         NULL
709 };
710
711
712 /*****************************************************************************/
713 /** Initialize UI component for given window.                                */
714 /*****************************************************************************/
715 GtkUIManager *
716 gl_ui_new (glWindow *window)
717 {
718         GtkUIManager            *ui;
719         GtkActionGroup          *actions;
720         GError                  *error = NULL;
721
722         gl_debug (DEBUG_UI, "START");
723
724         g_return_val_if_fail (window && GL_IS_WINDOW (window), NULL);
725
726         gl_debug (DEBUG_UI, "window = %p", window);
727
728         ui = gtk_ui_manager_new ();
729
730         g_signal_connect (ui, "connect_proxy",
731                           G_CALLBACK (connect_proxy_cb), window);
732         g_signal_connect (ui, "disconnect_proxy",
733                           G_CALLBACK (disconnect_proxy_cb), window);
734
735         actions = gtk_action_group_new ("Actions");
736         gtk_action_group_add_actions (actions, entries, n_entries, GTK_WINDOW (window));
737         gtk_action_group_add_toggle_actions (actions, 
738                                              toggle_entries, n_toggle_entries, 
739                                              window);
740         gtk_action_group_add_toggle_actions (actions, 
741                                              ui_toggle_entries, n_ui_toggle_entries, 
742                                              ui);
743
744         gtk_ui_manager_insert_action_group (ui, actions, 0);
745         gtk_window_add_accel_group (GTK_WINDOW (window), gtk_ui_manager_get_accel_group (ui));
746
747         if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, strlen (ui_info), &error)) {
748                 g_message ("building menus failed: %s", error->message);
749                 g_error_free (error);
750         }
751
752         /* Set the toolbar styles according to prefs */
753         set_app_main_toolbar_style (ui);
754         set_app_drawing_toolbar_style (ui);
755                 
756         /* Set view grid and markup visibility according to prefs */
757         set_view_style (ui);
758                 
759         gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, FALSE);
760
761         gl_debug (DEBUG_UI, "END");
762
763         return ui;
764 }
765
766 /*****************************************************************************/
767 /** Unref wrapper.                                                           */
768 /*****************************************************************************/
769 void
770 gl_ui_unref (GtkUIManager *ui)
771 {
772         gl_debug (DEBUG_UI, "START");
773
774         g_object_unref(ui);
775
776         gl_debug (DEBUG_UI, "END");
777 }
778
779 /*****************************************************************************/
780 /* Update all verbs of given UI component.                                   */
781 /*****************************************************************************/
782 void
783 gl_ui_update_all (GtkUIManager *ui,
784                   glView       *view)
785 {
786         glLabel *label;
787
788         gl_debug (DEBUG_UI, "START");
789
790         gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, TRUE);
791
792         label = view->label;
793         g_return_if_fail (label != NULL);
794
795         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo",
796                                        gl_label_can_undo (label));
797         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo",
798                                        gl_label_can_redo (label));
799
800         gl_ui_util_set_verb_list_sensitive (ui, doc_modified_verbs,
801                                             gl_label_is_modified (label));
802
803         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn",
804                                        !gl_view_is_zoom_max (view));
805         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut",
806                                        !gl_view_is_zoom_min (view));
807
808         gl_ui_util_set_verb_list_sensitive (ui, selection_verbs,
809                                             !gl_view_is_selection_empty (view));
810
811         gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs,
812                                             gl_view_is_selection_atomic (view));
813
814         gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs,
815                                             !gl_view_is_selection_empty (view)
816                                             && !gl_view_is_selection_atomic (view));
817
818         gl_debug (DEBUG_UI, "END");
819 }
820
821 /*****************************************************************************/
822 /* Update all verbs of given UI component to "no document" state.            */
823 /*****************************************************************************/
824 void
825 gl_ui_update_nodoc (GtkUIManager *ui)
826 {
827         gl_debug (DEBUG_UI, "START");
828
829         gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, FALSE);
830
831         gl_debug (DEBUG_UI, "END");
832 }
833
834 /*****************************************************************************/
835 /* Update label modified verbs of given UI component.                        */
836 /*****************************************************************************/
837 void
838 gl_ui_update_modified_verbs (GtkUIManager *ui,
839                              glLabel      *label)
840 {
841         gl_debug (DEBUG_UI, "START");
842
843         gl_ui_util_set_verb_list_sensitive (ui, 
844                                             doc_modified_verbs,
845                                             gl_label_is_modified (label));
846
847         gl_debug (DEBUG_UI, "END");
848 }
849
850 /*****************************************************************************/
851 /* Update verbs associated with selection state of given UI component.       */
852 /*****************************************************************************/
853 void
854 gl_ui_update_selection_verbs (GtkUIManager *ui,
855                               glView       *view)
856 {
857         gl_debug (DEBUG_UI, "START");
858
859         gl_ui_util_set_verb_list_sensitive (ui, selection_verbs,
860                                             !gl_view_is_selection_empty (view));
861
862         gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs,
863                                             gl_view_is_selection_atomic (view));
864
865         gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs,
866                                             !gl_view_is_selection_empty (view)
867                                             && !gl_view_is_selection_atomic (view));
868
869         gl_debug (DEBUG_UI, "END");
870 }
871
872 /*****************************************************************************/
873 /* Update verbs associated with zoom level of given UI component.            */
874 /*****************************************************************************/
875 void
876 gl_ui_update_zoom_verbs (GtkUIManager *ui,
877                          glView       *view)
878 {
879         gl_debug (DEBUG_UI, "START");
880
881         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn",
882                                        !gl_view_is_zoom_max (view));
883         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut",
884                                        !gl_view_is_zoom_min (view));
885
886         gl_debug (DEBUG_UI, "END");
887 }
888
889 /*****************************************************************************/
890 /* Update undo/redo verbs of given UI component.                             */
891 /*****************************************************************************/
892 void
893 gl_ui_update_undo_redo_verbs (GtkUIManager *ui,
894                               glLabel      *label)
895 {
896         gl_debug (DEBUG_UI, "START");
897
898         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo",
899                                        gl_label_can_undo (label));
900
901         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo",
902                                        gl_label_can_redo (label));
903
904         gl_debug (DEBUG_UI, "END");
905 }
906
907 /*---------------------------------------------------------------------------*/
908 /* PRIVATE.  View menu item toggled callback.                                */
909 /*---------------------------------------------------------------------------*/
910 static void
911 view_ui_item_toggled_cb (GtkToggleAction *action,
912                          GtkUIManager    *ui)
913 {
914         const gchar *name;
915         gboolean     state;
916
917         gl_debug (DEBUG_UI, "START");
918
919         g_return_if_fail (action && GTK_IS_TOGGLE_ACTION (action));
920
921         name  = gtk_action_get_name (GTK_ACTION (action));
922         state = gtk_toggle_action_get_active (action);
923
924         gl_debug (DEBUG_UI, "Action = %s, State = %d", name, state);
925
926         if (strcmp (name, "ViewMainToolBar") == 0)
927         {
928                 gl_prefs->main_toolbar_visible = state;
929                 set_app_main_toolbar_style (ui);
930                 gl_prefs_model_save_settings (gl_prefs);
931         }
932
933         if (strcmp (name, "ViewMainToolBarToolTips") == 0)
934         {
935                 gl_prefs->main_toolbar_view_tooltips = state;
936                 set_app_main_toolbar_style (ui);
937                 gl_prefs_model_save_settings (gl_prefs);
938         }
939
940         if (strcmp (name, "ViewDrawingToolBar") == 0)
941         {
942                 gl_prefs->drawing_toolbar_visible = state;
943                 set_app_drawing_toolbar_style (ui);
944                 gl_prefs_model_save_settings (gl_prefs);
945         }
946
947         if (strcmp (name, "ViewDrawingToolBarToolTips") == 0)
948         {
949                 gl_prefs->drawing_toolbar_view_tooltips = state;
950                 set_app_drawing_toolbar_style (ui);
951                 gl_prefs_model_save_settings (gl_prefs);
952         }
953
954         gl_debug (DEBUG_UI, "");
955 }
956
957 /*---------------------------------------------------------------------------*/
958 /* PRIVATE.  Set main toolbar style.                                         */
959 /*---------------------------------------------------------------------------*/
960 static void
961 set_app_main_toolbar_style (GtkUIManager *ui)
962 {
963         GtkWidget *toolbar;
964
965         gl_debug (DEBUG_UI, "START");
966
967         g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui));
968                         
969         /* Updated view menu */
970         gl_ui_util_set_verb_state (ui, "/ui/ViewMenu/ViewMainToolBar",
971                                    gl_prefs->main_toolbar_visible);
972
973         gl_ui_util_set_verb_sensitive (ui, "/ui/ViewMenu/ViewMainToolBarToolTips",
974                                        gl_prefs->main_toolbar_visible);
975
976         gl_ui_util_set_verb_state (ui, "/ui/ViewMenu/ViewMainToolBarToolTips",
977                                    gl_prefs->main_toolbar_view_tooltips);
978
979         
980         toolbar = gtk_ui_manager_get_widget (ui, "/MainToolBar");
981
982         gtk_toolbar_set_tooltips (GTK_TOOLBAR (toolbar),
983                                   gl_prefs->main_toolbar_view_tooltips);
984
985         if (gl_prefs->main_toolbar_visible) {
986                 gtk_widget_show_all (toolbar);
987         } else {
988                 gtk_widget_hide (toolbar);
989         }
990         
991         gl_debug (DEBUG_UI, "END");
992 }
993
994
995 /*---------------------------------------------------------------------------*/
996 /* PRIVATE.  Set drawing toolbar style.                                      */
997 /*---------------------------------------------------------------------------*/
998 static void
999 set_app_drawing_toolbar_style (GtkUIManager *ui)
1000 {
1001         GtkWidget *toolbar;
1002
1003         gl_debug (DEBUG_UI, "START");
1004
1005         g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui));
1006                         
1007         /* Updated view menu */
1008         gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewDrawingToolBar",
1009                                    gl_prefs->drawing_toolbar_visible);
1010
1011         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewDrawingToolBarToolTips",
1012                                        gl_prefs->drawing_toolbar_visible);
1013
1014         gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenuDrawingToolBarToolTips",
1015                                    gl_prefs->drawing_toolbar_view_tooltips);
1016
1017         
1018         toolbar = gtk_ui_manager_get_widget (ui, "/DrawingToolBar");
1019
1020         gtk_toolbar_set_tooltips (GTK_TOOLBAR (toolbar),
1021                                   gl_prefs->drawing_toolbar_view_tooltips);
1022
1023         gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
1024
1025         if (gl_prefs->drawing_toolbar_visible) {
1026                 gtk_widget_show_all (toolbar);
1027         } else {
1028                 gtk_widget_hide (toolbar);
1029         }
1030         
1031         gl_debug (DEBUG_UI, "END");
1032 }
1033
1034 /*---------------------------------------------------------------------------*/
1035 /* PRIVATE.  Set visibility of grid and markup.                              */
1036 /*---------------------------------------------------------------------------*/
1037 static void
1038 set_view_style (GtkUIManager *ui)
1039 {
1040         gl_debug (DEBUG_UI, "START");
1041
1042         g_return_if_fail (ui && GTK_IS_UI_MANAGER(ui));
1043                         
1044         gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewGrid",
1045                                    gl_prefs->grid_visible);
1046
1047         gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewMarkup",
1048                                    gl_prefs->markup_visible);
1049
1050         gl_debug (DEBUG_UI, "END");
1051 }
1052
1053 /*---------------------------------------------------------------------------*/
1054 /* PRIVATE.  Connect proxy callback.                                         */
1055 /*---------------------------------------------------------------------------*/
1056 static void
1057 connect_proxy_cb (GtkUIManager *ui,
1058                   GtkAction    *action,
1059                   GtkWidget    *proxy,
1060                   glWindow     *window)
1061 {
1062         if (GTK_IS_MENU_ITEM (proxy))
1063         {
1064                 g_signal_connect (proxy, "select",
1065                                   G_CALLBACK (menu_item_select_cb), window);
1066                 g_signal_connect (proxy, "deselect",
1067                                   G_CALLBACK (menu_item_deselect_cb), window);
1068         }
1069 }
1070
1071 /*---------------------------------------------------------------------------*/
1072 /* PRIVATE.  Disconnect proxy callback.                                      */
1073 /*---------------------------------------------------------------------------*/
1074 static void
1075 disconnect_proxy_cb (GtkUIManager *ui,
1076                      GtkAction    *action,
1077                      GtkWidget    *proxy,
1078                      glWindow     *window)
1079 {
1080         if (GTK_IS_MENU_ITEM (proxy))
1081         {
1082                 g_signal_handlers_disconnect_by_func
1083                         (proxy, G_CALLBACK (menu_item_select_cb), window);
1084                 g_signal_handlers_disconnect_by_func
1085                         (proxy, G_CALLBACK (menu_item_deselect_cb), window);
1086         }
1087 }
1088
1089 /*---------------------------------------------------------------------------*/
1090 /* PRIVATE.  Menu item select callback.                                      */
1091 /*---------------------------------------------------------------------------*/
1092 static void
1093 menu_item_select_cb (GtkMenuItem *proxy,
1094                      glWindow    *window)
1095 {
1096         GtkAction *action;
1097         char      *message;
1098
1099         g_return_if_fail (window && GL_IS_WINDOW (window));
1100         g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar));
1101
1102         action = g_object_get_data (G_OBJECT (proxy),  "gtk-action");
1103         g_return_if_fail (action != NULL);
1104         
1105         g_object_get (G_OBJECT (action), "tooltip", &message, NULL);
1106         if (message)
1107         {
1108                 gtk_statusbar_push (GTK_STATUSBAR (window->status_bar),
1109                                     window->menu_tips_context_id, message);
1110                 g_free (message);
1111         }
1112 }
1113
1114 /*---------------------------------------------------------------------------*/
1115 /* PRIVATE.  Menu item deselect callback.                                    */
1116 /*---------------------------------------------------------------------------*/
1117 static void
1118 menu_item_deselect_cb (GtkMenuItem *proxy,
1119                        glWindow    *window)
1120 {
1121         g_return_if_fail (window && GL_IS_WINDOW (window));
1122         g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar));
1123
1124         gtk_statusbar_pop (GTK_STATUSBAR (window->status_bar),
1125                            window->menu_tips_context_id);
1126 }
1127