On Sat, 2007-04-28 at 01:48 -0500, Patrick Hallinan wrote:
> Hi,
>
> I have made some progress toward a tabbed interface for dia. It's
> optional, controlled by a "use integrated ui" option in the
> preferences dialog. I don't know how to send a patch. I've attached
> a diff of my changes synch'd to the latest svn checkin.
>
> It's in a half broken state. Maybe mostly broken. I think the next
> thing that I'm going to do is to synch the tab label to the diagram
> filename. I just want to make sure that there is interest in this.
> I'm excited to do this if it is really going to be picked up by the
> project. I'm also happy to accept criticism/advice for the code.
> BTW: I don't know how else to show the code unless I zip the files
> (which I'd be happy to do).
I've committed your patch to SVN, I think it looks nice. I think we can
take out the "use menubar" option when this is complete; I think there
is significant overlap between those who use menubar at the top and
those who want the integrated UI. Getting the zoom box and snap widgets
back would be nice:)
Attachment:
dia.gif
Description: GIF image
Index: app/preferences.c
===================================================================
--- app/preferences.c (revision 3682)
+++ app/preferences.c (working copy)
@@ -77,6 +77,7 @@
static void update_floating_toolbox(DiaPrefData *pref, char *ptr);
static void update_internal_prefs(DiaPrefData *pref, char *ptr);
+static void update_ui_type_prefs(DiaPrefData *pref, char *ptr);
static int default_true = 1;
static int default_false = 0;
@@ -150,8 +151,9 @@
get_units_name_list, update_internal_prefs },
{ "use_integrated_ui", PREF_BOOLEAN, PREF_OFFSET(use_integrated_ui),
- &default_false, 0, N_("Integrated UI") },
+ &default_false, 0, N_("Integrated UI"), NULL, FALSE, NULL, update_ui_type_prefs },
+
{ NULL, PREF_NONE, 0, NULL, 1, N_("New diagram:") },
{ "is_portrait", PREF_BOOLEAN, PREF_OFFSET(new_diagram.is_portrait), &default_true, 1, N_("Portrait") },
{ "new_diagram_papertype", PREF_CHOICE, PREF_OFFSET(new_diagram.papertype),
@@ -705,3 +707,9 @@
NULL);
}
}
+
+static void
+update_ui_type_prefs(DiaPrefData *pref, char *ptr)
+{
+ message_notice(_("User Interface type settings change will take after restart"));
+}
Index: app/display.c
===================================================================
--- app/display.c (revision 3682)
+++ app/display.c (working copy)
@@ -68,14 +68,25 @@
static void
update_zoom_status(DDisplay *ddisp)
{
- GtkWidget *zoomcombo;
gchar* zoom_text;
- zoomcombo = ddisp->zoom_status;
- zoom_text = g_strdup_printf("%.1f%%",
+ if (is_integrated_ui ())
+ {
+ zoom_text = g_strdup_printf("%.0f%%",
ddisp->zoom_factor * 100.0 / DDISPLAY_NORMAL_ZOOM);
- gtk_entry_set_text(GTK_ENTRY(gtk_object_get_user_data(GTK_OBJECT(zoomcombo))),
- zoom_text);
+
+ integrated_ui_toolbar_set_zoom_text (ddisp->common_toolbar, zoom_text);
+ }
+ else
+ {
+ GtkWidget *zoomcombo;
+ zoom_text = g_strdup_printf("%.1f%%",
+ ddisp->zoom_factor * 100.0 / DDISPLAY_NORMAL_ZOOM);
+ zoomcombo = ddisp->zoom_status;
+ gtk_entry_set_text(GTK_ENTRY(gtk_object_get_user_data(GTK_OBJECT(zoomcombo))),
+ zoom_text);
+ }
+
g_free(zoom_text); /* Copied by gtk_entry_set_text */
}
@@ -797,12 +808,18 @@
GtkToggleAction *snap_to_grid;
ddisp->grid.snap = snap;
- if (ddisp->menu_bar == NULL) {
- snap_to_grid = GTK_TOGGLE_ACTION (menus_get_action ("ViewSnaptogrid"));
- } else {
- snap_to_grid = GTK_TOGGLE_ACTION (gtk_action_group_get_action (ddisp->actions, "ViewSnaptogrid"));
+ if (is_integrated_ui ())
+ {
+ snap_to_grid = GTK_TOGGLE_ACTION (menus_get_action ("ViewSnaptogrid"));
}
-
+ else
+ {
+ if (ddisp->menu_bar == NULL) {
+ snap_to_grid = GTK_TOGGLE_ACTION (menus_get_action ("ViewSnaptogrid"));
+ } else {
+ snap_to_grid = GTK_TOGGLE_ACTION (gtk_action_group_get_action (ddisp->actions, "ViewSnaptogrid"));
+ }
+ }
/* Currently, this can cause double emit, but that's a small problem.
*/
gtk_toggle_action_set_active (snap_to_grid, ddisp->grid.snap);
@@ -1000,6 +1017,7 @@
p.x = (r.left+r.right)/2;
p.y = (r.top+r.bottom)/2;
+ display_set_active(ddisp);
return ddisplay_scroll_center_point(ddisp, &p);
}
@@ -1079,7 +1097,10 @@
ddisplay_im_context_preedit_reset(ddisp, active_focus());
/* This calls ddisplay_really_destroy */
- gtk_widget_destroy (ddisp->shell);
+ if (ddisp->is_standalone_window)
+ gtk_widget_destroy (ddisp->shell);
+ else
+ gtk_widget_destroy (ddisp->container);
}
static void
@@ -1263,7 +1284,27 @@
void
ddisplay_set_title(DDisplay *ddisp, char *title)
{
- gtk_window_set_title (GTK_WINDOW (ddisp->shell), title);
+ if (ddisp->is_standalone_window)
+ gtk_window_set_title (GTK_WINDOW (ddisp->shell), title);
+ else
+ {
+ GtkNotebook *notebook = g_object_get_data (G_OBJECT (ddisp->shell),
+ DIA_MAIN_NOTEBOOK);
+ /* Find the page with ddisp then set the label on the tab */
+ gint num_pages = gtk_notebook_get_n_pages (notebook);
+ gint num;
+ GtkWidget *page;
+ for (num = 0 ; num < num_pages ; num++)
+ {
+ page = gtk_notebook_get_nth_page (notebook,num);
+ if (g_object_get_data (G_OBJECT (page), "DDisplay") == ddisp)
+ {
+ GtkLabel *label = g_object_get_data (G_OBJECT (page), "tab-label");
+ gtk_label_set_text(label,title);
+ break;
+ }
+ }
+ }
}
void
@@ -1319,16 +1360,48 @@
diagram_properties_set_diagram(ddisp ? ddisp->diagram : NULL);
if (ddisp) {
- display_update_menu_state(ddisp);
+ if (ddisp->is_standalone_window)
+ {
+ display_update_menu_state(ddisp);
- if (prefs.toolbox_on_top) {
- gtk_window_set_transient_for(GTK_WINDOW(interface_get_toolbox_shell()),
- GTK_WINDOW(ddisp->shell));
+ if (prefs.toolbox_on_top) {
+ gtk_window_set_transient_for(GTK_WINDOW(interface_get_toolbox_shell()),
+ GTK_WINDOW(ddisp->shell));
+ } else {
+ gtk_window_set_transient_for(GTK_WINDOW(interface_get_toolbox_shell()),
+ NULL);
+ }
} else {
- gtk_window_set_transient_for(GTK_WINDOW(interface_get_toolbox_shell()),
- NULL);
+ GtkNotebook *notebook = g_object_get_data (G_OBJECT (ddisp->shell),
+ DIA_MAIN_NOTEBOOK);
+ /* Find the page with ddisp then set the label on the tab */
+ gint num_pages = gtk_notebook_get_n_pages (notebook);
+ gint num;
+ GtkWidget *page;
+ for (num = 0 ; num < num_pages ; num++)
+ {
+ page = gtk_notebook_get_nth_page (notebook,num);
+ if (g_object_get_data (G_OBJECT (page), "DDisplay") == ddisp)
+ {
+ gtk_notebook_set_current_page (notebook,num);
+ break;
+ }
+ }
+ /* synchronize_ui_to_active_display (ddisp); */
+ /* ZOOM */
+ update_zoom_status (ddisp);
+
+ /* Snap to grid */
+ ddisplay_set_snap_to_grid (ddisp, ddisp->grid.snap); /* menus */
+ integrated_ui_toolbar_grid_snap_synchronize_to_display (ddisp);
+
+ /* Object snapping */
+ ddisplay_set_snap_to_objects (ddisp, ddisp->mainpoint_magnetism);
+ integrated_ui_toolbar_object_snap_synchronize_to_display (ddisp);
+
}
} else {
+ /* TODO: Prevent gtk_window_set_transient_for() in Integrated UI case */
gtk_window_set_transient_for(GTK_WINDOW(interface_get_toolbox_shell()),
NULL);
}
Index: app/display.h
===================================================================
--- app/display.h (revision 3682)
+++ app/display.h (working copy)
@@ -92,6 +92,16 @@
/* Preedit String */
gchar *preedit_string;
PangoAttrList *preedit_attrs;
+
+ /* Is there another case? Like I see embedded-dia modules, do these do something
+ * in addition??? */
+ gboolean is_standalone_window;
+
+ /* Points to Integrated UI Toolbar */
+ GtkToolbar *common_toolbar;
+
+ /* Points to widget containing the diagram if not standalone window */
+ GtkWidget *container;
};
extern GdkCursor *default_cursor;
Index: app/app_procs.c
===================================================================
--- app/app_procs.c (revision 3682)
+++ app/app_procs.c (working copy)
@@ -934,6 +934,7 @@
/* Set up autosave to check every 5 minutes */
gtk_timeout_add(5*60*1000, autosave_check_autosave, NULL);
+ /* Create Diagram Tree Window */
create_tree_window();
persistence_register_window_create("sheets_main_dialog",
@@ -947,15 +948,34 @@
made_conversions = handle_all_diagrams(files, export_file_name,
export_file_format, size, show_layers);
if (dia_is_interactive && files == NULL && !nonew) {
- gchar *filename = g_filename_from_utf8(_("Diagram1.dia"), -1, NULL, NULL, NULL);
- Diagram *diagram = new_diagram (filename);
- g_free(filename);
+ if (prefs.use_integrated_ui)
+ {
+ /* Use the same function call to create a new diagram as that used by
+ * the menu and toolbar */
+ GList * list;
+ file_new_callback(NULL);
+ list = dia_open_diagrams();
+ if (list)
+ {
+ Diagram * diagram = list->data;
+ diagram_update_extents(diagram);
+ diagram->is_default = TRUE;
+ }
+ }
+ else
+ {
+ gchar *filename = g_filename_from_utf8(_("Diagram1.dia"), -1, NULL, NULL, NULL);
+ Diagram *diagram = new_diagram (filename);
+ g_free(filename);
- if (diagram != NULL) {
- diagram_update_extents(diagram);
- diagram->is_default = TRUE;
- layer_dialog_set_diagram(diagram);
- new_display(diagram);
+ if (diagram != NULL) {
+ diagram_update_extents(diagram);
+ diagram->is_default = TRUE;
+ /* I think this is done in diagram_init() with a call to
+ * layer_dialog_update_diagram_list() */
+ layer_dialog_set_diagram(diagram);
+ new_display(diagram);
+ }
}
}
g_slist_free(files);
Index: app/filedlg.c
===================================================================
--- app/filedlg.c (revision 3682)
+++ app/filedlg.c (working copy)
@@ -145,7 +145,7 @@
}
/**
- * Respond to the user finishing the Save Dialog either accept or cancel/destroy
+ * Respond to the user finishing the Open Dialog either accept or cancel/destroy
*/
static void
file_open_response_callback(GtkWidget *fs,
@@ -267,17 +267,17 @@
gtk_widget_show(options);
g_signal_connect(GTK_OBJECT(opendlg), "response",
G_CALLBACK(file_open_response_callback), omenu);
- /* set up file filters */
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("All Files"));
- gtk_file_filter_add_pattern (filter, "*");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (opendlg), filter);
/* match the other selections extension */
filter = gtk_file_filter_new ();
gtk_file_filter_set_name (filter, _("Supported Formats"));
gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME,
matching_extensions_filter, filter_guess_import_filter, NULL);
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (opendlg), filter);
+ /* set up file filters */
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, _("All Files"));
+ gtk_file_filter_add_pattern (filter, "*");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (opendlg), filter);
/* candidate for user prefs */
gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), persistence_get_integer ("import-filter"));
Index: app/interface.c
===================================================================
--- app/interface.c (revision 3682)
+++ app/interface.c (working copy)
@@ -248,6 +248,17 @@
GtkWidget *modify_tool_button;
+/**
+ * Used to determine if the current user interface is the integrated interface or
+ * the distributed interface. This cannot presently be determined by the preferences
+ * setting because changing that setting at run time does not change the interface.
+ * @return Non-zero if the integrated interface is present, else zero.
+ */
+int is_integrated_ui (void)
+{
+ return ui.main_window == NULL? 0 : 1;
+}
+
static void
grid_toggle_snap(GtkWidget *widget, gpointer data)
{
@@ -412,7 +423,45 @@
}
/**
+ * Updates toolbar and menu items to reflect the active display
+ */
+void synchronize_ui_to_active_display (DDisplay *ddisp)
+{
+ /* TOOLBAR ITEM */
+
+ /* Zoom */
+
+ /* Snap-to-grid */
+
+ /* Object Snapping */
+
+}
+
+
+/**
* @param ddisp The diagram display object that a window is created for
+ * @param width Diagram widgth
+ * @param height Diagram Height
+ * @param title Window title
+ * @param use_mbar Flag to indicate whether to add a menubar to the window
+ * @param top_level_window
+ */
+void
+close_notebook_page_callback (GtkButton *button,
+ gpointer user_data)
+{
+ GtkBox *page = user_data;
+ GtkNotebook *notebook = g_object_get_data (G_OBJECT (page), "GtkNotebook");
+ gint page_num = gtk_notebook_page_num (notebook, GTK_WIDGET(page));
+ DDisplay *ddisp = g_object_get_data (G_OBJECT (page), "DDisplay");
+
+ ddisplay_close (ddisp);
+ /*gtk_notebook_remove_page (notebook, page_num);*/
+ /* gtk_widget_destroy( GTK_WIDGET (page)); */
+}
+
+/**
+ * @param ddisp The diagram display object that a window is created for
* @param title
*/
static void
@@ -425,23 +474,17 @@
GtkWidget *label; /* Text label for the notebook page */
GtkWidget *tab_label_container; /* Container to hold text label & close button */
int width, height; /* Width/Heigth of the diagram */
- GtkWidget *page; /* Container to hold the diagram */
GtkWidget *image;
GtkWidget *close_button; /* Close button for the notebook page */
GtkWidget *widget;
GtkRcStyle *rcstyle;
- /* I think this is purposeless but I don't want to bother to figure it out at the moment */
- if (!tool_tips) /* needed here if we dont create_toolbox() */
- tool_tips = gtk_tooltips_new ();
-
- /* ddisp->shell = page; */
- /* ddisp->shell = gtk_event_box_new (); */
- /* ddisp->shell = gtk_window_new (GTK_WINDOW_TOPLEVEL); */
+ ddisp->is_standalone_window = FALSE;
+
ddisp->shell = GTK_WIDGET (ui.main_window);
/* Create a new tab page */
- page = gtk_vbox_new(FALSE, 0);
+ ddisp->container = gtk_vbox_new(FALSE, 0);
tab_label_container = gtk_hbox_new(FALSE,3);
label = gtk_label_new( title );
@@ -464,22 +507,23 @@
GTK_ICON_SIZE_MENU);
gtk_container_add (GTK_CONTAINER(close_button), image);
+ gtk_signal_connect (GTK_OBJECT (close_button), "clicked",
+ GTK_SIGNAL_FUNC (close_notebook_page_callback), ddisp->container);
/* <from GEdit/> */
gtk_box_pack_start( GTK_BOX(tab_label_container), close_button, FALSE, FALSE, 0 );
gtk_widget_show (close_button);
gtk_widget_show (image);
- /* TODO: Add close button to notebook label (and create close function) */
-
gtk_notebook_append_page (GTK_NOTEBOOK(ui.diagram_notebook),
- page,
+ ddisp->container,
tab_label_container);
- gtk_object_set_user_data (GTK_OBJECT (page), (gpointer) ddisp);
- g_object_set_data (G_OBJECT (page), "window", ui.main_window);
+ g_object_set_data (G_OBJECT (ddisp->container), "DDisplay", ddisp);
+ g_object_set_data (G_OBJECT (ddisp->container), "tab-label", label);
+ g_object_set_data (G_OBJECT (ddisp->container), "window", ui.main_window);
- gtk_widget_set_events (page,
+ gtk_widget_set_events (ddisp->container,
GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK |
GDK_FOCUS_CHANGE_MASK);
@@ -492,22 +536,19 @@
gtk_table_set_row_spacing (GTK_TABLE (table), 1, 2);
gtk_container_set_border_width (GTK_CONTAINER (table), 2);
- /* TODO:Maybe assign ddisp->shell to page???
- gtk_container_add (GTK_CONTAINER (ddisp->shell), table); */
- gtk_box_pack_start( GTK_BOX(page), table, TRUE, TRUE, 0 );
- /*gtk_container_add (GTK_CONTAINER (ddisp->shell), table); */
+ gtk_box_pack_start( GTK_BOX(ddisp->container), table, TRUE, TRUE, 0 );
/* scrollbars, rulers, canvas, menu popup button */
ddisp->origin = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (ddisp->origin), GTK_SHADOW_OUT);
ddisp->hrule = gtk_hruler_new ();
- g_signal_connect_swapped (GTK_OBJECT (page), "motion_notify_event",
+ g_signal_connect_swapped (GTK_OBJECT (ddisp->container), "motion_notify_event",
G_CALLBACK(GTK_WIDGET_GET_CLASS (ddisp->hrule)->motion_notify_event),
GTK_OBJECT (ddisp->hrule));
ddisp->vrule = gtk_vruler_new ();
- g_signal_connect_swapped (GTK_OBJECT (page), "motion_notify_event",
+ g_signal_connect_swapped (GTK_OBJECT (ddisp->container), "motion_notify_event",
G_CALLBACK(GTK_WIDGET_GET_CLASS (ddisp->vrule)->motion_notify_event),
GTK_OBJECT (ddisp->vrule));
@@ -577,18 +618,15 @@
gtk_table_attach (GTK_TABLE (table), navigation_button, 2, 3, 2, 3,
GTK_FILL, GTK_FILL, 0, 0);
- /* TODO rob use per window accel */
- ddisp->accel_group = menus_get_display_accels ();
-
- /* TODO: Do this once! */
- gtk_window_add_accel_group(GTK_WINDOW(page), ddisp->accel_group);
-
/* the statusbars */
status_hbox = gtk_hbox_new (FALSE, 2);
+ ddisp->common_toolbar = ui.toolbar;
+
/* TODO: Migrate Zoom, Grid Status to main window toolbar */
/* Zoom status pseudo-optionmenu */
- ddisp->zoom_status = create_zoom_widget(ddisp);
+ ddisp->zoom_status = NULL;
+/*create_zoom_widget(ddisp);
zoom_hbox = gtk_hbox_new(FALSE, 0);
zoom_label = gtk_label_new(_("Zoom"));
gtk_box_pack_start (GTK_BOX(zoom_hbox), zoom_label,
@@ -597,18 +635,14 @@
FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (status_hbox), zoom_hbox, FALSE, FALSE, 0);
+*/
/* Grid on/off button */
- ddisp->grid_status = dia_toggle_button_new_with_icons(dia_on_grid_icon,
- dia_off_grid_icon);
-
+ ddisp->grid_status = NULL;
+/*
g_signal_connect(G_OBJECT(ddisp->grid_status), "toggled",
G_CALLBACK (grid_toggle_snap), ddisp);
- gtk_tooltips_set_tip(tool_tips, ddisp->grid_status,
- _("Toggles snap-to-grid for this window."), NULL);
- gtk_box_pack_start (GTK_BOX (status_hbox), ddisp->grid_status,
- FALSE, FALSE, 0);
-
+*/
ddisp->mainpoint_status = dia_toggle_button_new_with_icons(dia_mainpoints_on_icon,
dia_mainpoints_off_icon);
@@ -620,7 +654,7 @@
FALSE, FALSE, 0);
/* Statusbar */
- ddisp->modified_status = GTK_WIDGET( ui.statusbar );
+ ddisp->modified_status = GTK_WIDGET (ui.statusbar);
/*
gtk_box_pack_start (GTK_BOX (status_hbox), ddisp->modified_status,
TRUE, TRUE, 0);
@@ -637,15 +671,20 @@
gtk_widget_show (ddisp->zoom_status);
gtk_widget_show (zoom_hbox);
gtk_widget_show (zoom_label);
- gtk_widget_show (ddisp->grid_status);
- gtk_widget_show (ddisp->mainpoint_status);
- /*gtk_widget_show (ddisp->modified_status);*/
gtk_widget_show (status_hbox);
gtk_widget_show (table);
- gtk_widget_show (page);
+ gtk_widget_show (ddisp->container);
gtk_widget_show (ddisp->canvas);
+ /* Ensure that the the new page is showing */
+ gtk_notebook_set_current_page (ui.diagram_notebook,
+ gtk_notebook_get_n_pages (ui.diagram_notebook)-1);
+
+ integrated_ui_toolbar_grid_snap_synchronize_to_display (ddisp);
+
+ integrated_ui_toolbar_object_snap_synchronize_to_display (ddisp);
+
/* TODO: Figure out how to detect if anti-aliased renderer was set */
/** For the distributed display this is called when the ddisp->canvas is shown.
* The show causes a GDK_CONFIGURE event but this is not happening here. If this
@@ -677,12 +716,16 @@
GtkWidget *zoom_hbox, *zoom_label;
int s_width, s_height;
- if (prefs.use_integrated_ui)
+ if (app_is_interactive() && is_integrated_ui())
{
use_integrated_ui_for_display_shell(ddisp, title);
return;
}
+
+ ddisp->is_standalone_window = TRUE;
+ ddisp->container = NULL;
+
if (!tool_tips) /* needed here if we dont create_toolbox() */
tool_tips = gtk_tooltips_new ();
@@ -1542,66 +1585,6 @@
}
/**
- *
- */
-static gboolean
-toolbar_callback (GtkWidget *toolbar, gpointer data)
-{
- /* TODO: Implement Integrated UI Toolbar callback */
- return FALSE;
-}
-
-static GtkWidget *
-create_integrated_ui_toolbar (void)
-{
- GtkToolbar *toolbar;
- GtkToolItem *button;
- GtkToolItem *sep;
- GtkToolItem *tool_item;
- GtkWidget *w;
-
- toolbar = GTK_TOOLBAR (gtk_toolbar_new ());
-
- button = gtk_tool_button_new_from_stock (GTK_STOCK_NEW);
- gtk_toolbar_insert (toolbar, button, -1);
- gtk_widget_show (GTK_WIDGET (button));
-
- button = gtk_tool_button_new_from_stock (GTK_STOCK_OPEN);
- gtk_toolbar_insert (toolbar, button, -1);
- gtk_widget_show (GTK_WIDGET (button));
-
- button = gtk_tool_button_new_from_stock (GTK_STOCK_SAVE);
- gtk_toolbar_insert (toolbar, button, -1);
- gtk_widget_show (GTK_WIDGET (button));
-
- sep = gtk_separator_tool_item_new ();
- gtk_toolbar_insert (toolbar, sep, -1);
- gtk_widget_show (GTK_WIDGET (sep));
-
- button = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_OUT);
- gtk_toolbar_insert (toolbar, button, -1);
- gtk_widget_show (GTK_WIDGET (button));
-
- button = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_IN);
- gtk_toolbar_insert (toolbar, button, -1);
- gtk_widget_show (GTK_WIDGET (button));
-
- tool_item = gtk_tool_item_new ();
- /* TODO: Create a Zoom Indicator for the toolbar */
- w = gtk_label_new ("100%");
- gtk_container_add (GTK_CONTAINER (tool_item), w);
- gtk_toolbar_insert (toolbar, tool_item, -1);
- gtk_widget_show (GTK_WIDGET (tool_item));
- gtk_widget_show (w);
-
- sep = gtk_separator_tool_item_new ();
- gtk_toolbar_insert (toolbar, sep, -1);
- gtk_widget_show (GTK_WIDGET (sep));
-
- return GTK_WIDGET (toolbar);
-}
-
-/**
* Create integrated user interface
*/
void create_integrated_ui (void)
@@ -1624,9 +1607,13 @@
gtk_widget_ref (window);
gtk_window_set_title (GTK_WINDOW (window), "Dia v" VERSION);
#endif
- gtk_window_set_role (GTK_WINDOW (window), "main_window");
- gtk_window_set_default_size(GTK_WINDOW(window), 146, 349);
+ /* hint to window manager on X so the wm can put the window in the same
+ as it was when the application shut down */
+ gtk_window_set_role (GTK_WINDOW (window), DIA_MAIN_WINDOW);
+
+ gtk_window_set_default_size (GTK_WINDOW (window), 146, 349);
+
pixbuf = gdk_pixbuf_new_from_inline (-1, dia_app_icon, FALSE, NULL);
if (pixbuf) {
gtk_window_set_icon (GTK_WINDOW (window), pixbuf);
@@ -1694,19 +1681,19 @@
/* menus -- initialised afterwards, because initing the display menus
* uses the tool buttons*/
- menus_get_toolbox_menubar(&menubar, &accel_group);
+ menus_get_integrated_ui_menubar(&menubar, &toolbar, &accel_group);
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
#ifdef GNOME
gnome_app_set_menus (GNOME_APP (window), GTK_MENU_BAR (menubar));
#else
gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0);
+ /* TODO: integrated-UI --> Figure out how to deal with updateable menu items!!!
+ menus_initialize_updatable_items (&ddisp->updatable_menu_items, ddisp->actions); */
gtk_widget_show (menubar);
#endif
/* Toolbar */
- toolbar = create_integrated_ui_toolbar ();
-
- /* TODO: delete set_style */
+ /* TODO: maybe delete set_style(toolbar,ICONS) */
gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
gtk_box_pack_start (GTK_BOX (main_vbox), toolbar, FALSE, TRUE, 0);
gtk_widget_show (toolbar);
@@ -1718,6 +1705,9 @@
ui.diagram_notebook = GTK_NOTEBOOK (notebook);
ui.statusbar = GTK_STATUSBAR (statusbar);
+ /* For access outside here: */
+ g_object_set_data (G_OBJECT (ui.main_window), DIA_MAIN_NOTEBOOK, notebook);
+
/* TODO: Figure out what to do about toolbox_shell for integrated UI */
toolbox_shell = window;
}
@@ -1837,5 +1827,8 @@
GtkWidget *
interface_get_toolbox_shell(void)
{
+ if (is_integrated_ui ())
+ return ui.main_window;
+
return toolbox_shell;
}
Index: app/interface.h
===================================================================
--- app/interface.h (revision 3682)
+++ app/interface.h (working copy)
@@ -36,6 +36,19 @@
#include "linewidth_area.h"
#include "attributes.h"
+/* Integrated UI Constants */
+#define DIA_MAIN_WINDOW "dia-main-window"
+#define DIA_MAIN_NOTEBOOK "dia-main-notebook"
+
+/* Distributed UI Constants */
+#define DIA_TOOLBOX "dia-toolbox"
+
+void create_integrated_ui (void);
+
+void synchronize_ui_to_active_display (DDisplay *ddisp);
+
+int is_integrated_ui (void);
+
void create_display_shell(DDisplay *ddisp,
int width, int height,
char *title, int use_mbar, int top_level_window);
Index: app/diagram.c
===================================================================
--- app/diagram.c (revision 3682)
+++ app/diagram.c (working copy)
@@ -297,6 +297,8 @@
if (diagram != NULL && was_default) {
diagram_update_for_filename(diagram);
diagram->is_default = FALSE;
+ if ( g_slist_length(diagram->displays) == 1 )
+ display_set_active (diagram->displays->data);
}
return diagram;
Index: app/menus.c
===================================================================
--- app/menus.c (revision 3682)
+++ app/menus.c (working copy)
@@ -40,14 +40,27 @@
#include "object_ops.h"
#include "sheets.h"
#include "dia-app-icons.h"
+#include "widgets.h"
+#include "preferences.h"
#define DIA_STOCK_GROUP "dia-stock-group"
#define DIA_STOCK_UNGROUP "dia-stock-ungroup"
#define DIA_SHOW_TEAROFFS TRUE
+/* Integrated UI Toolbar Constants */
+#define DIA_INTEGRATED_TOOLBAR_ZOOM_TEXT "dia-integrated-toolbar-zoom_text"
+#define DIA_INTEGRATED_TOOLBAR_SNAP_GRID "dia-integrated-toolbar-snap-grid"
+#define DIA_INTEGRATED_TOOLBAR_OBJECT_SNAP "dia-integrated-toolbar-object-snap"
+
static void plugin_callback (GtkWidget *widget, gpointer data);
+static GtkWidget *
+create_integrated_ui_toolbar (void);
+
+static void
+add_toolbox_plugin_actions (GtkUIManager *ui_manager);
+
/* Actions common to toolbox and diagram window */
static const GtkActionEntry common_entries[] =
{
@@ -238,6 +251,14 @@
/* need initialisation? */
static gboolean initialise = TRUE;
+/* integrated ui */
+static GtkUIManager *integrated_ui_manager = NULL;
+static GtkActionGroup *integrated_ui_actions = NULL;
+static GtkActionGroup *integrated_ui_tool_actions = NULL;
+static GtkAccelGroup *integrated_ui_accels = NULL;
+static GtkWidget *integrated_ui_menubar = NULL;
+static GtkWidget *integrated_ui_toolbar = NULL;
+
/* toolbox */
static GtkUIManager *toolbox_ui_manager = NULL;
static GtkActionGroup *toolbox_actions = NULL;
@@ -257,7 +278,7 @@
static gchar*
_dia_translate (const gchar* term, gpointer data)
{
- gchar* trans = term;
+ gchar* trans = (gchar*) term;
if (term && *term) {
/* first try our own ... */
@@ -308,6 +329,212 @@
return TRUE;
}
+/**
+ * Temporary hack
+ */
+static gboolean
+toolbar_callback (GtkWidget *toolbar, gpointer data)
+{
+ if (data)
+ {
+ void (*callback)(GtkAction *action);
+
+ callback = data;
+ callback(NULL);
+ }
+ return FALSE;
+}
+
+static void
+integrated_ui_toolbar_grid_snap_set_state(int state)
+{
+ DDisplay *ddisp = ddisplay_active ();
+ if (ddisp)
+ {
+ ;/* Get the current state */
+ }
+}
+
+/**
+ * Synchronized the Object snap property button with the display.
+ * @param param Display to synchronize to.
+ */
+void
+integrated_ui_toolbar_object_snap_synchronize_to_display(gpointer *param)
+{
+ DDisplay *ddisp = param;
+ if (ddisp && ddisp->common_toolbar)
+ {
+ GtkToggleButton *b = g_object_get_data (G_OBJECT (ddisp->common_toolbar),
+ DIA_INTEGRATED_TOOLBAR_OBJECT_SNAP);
+ gboolean active = ddisp->mainpoint_magnetism? TRUE : FALSE;
+ gtk_toggle_button_set_active (b, active);
+ }
+}
+
+/**
+ * Sets the Object-snap property for the active display.
+ * @param b Object snap toggle button.
+ * @param not_used
+ */
+static void
+integrated_ui_toolbar_object_snap_toggle(GtkToggleButton *b, gpointer *not_used)
+{
+ DDisplay *ddisp = ddisplay_active ();
+ if (ddisp)
+ {
+ ddisplay_set_snap_to_objects (ddisp, gtk_toggle_button_get_active (b));
+ }
+}
+
+/**
+ * Synchronizes the Snap-to-grid property button with the display.
+ * @param param Display to synchronize to.
+ */
+void
+integrated_ui_toolbar_grid_snap_synchronize_to_display(gpointer *param)
+{
+ DDisplay *ddisp = param;
+ if (ddisp && ddisp->common_toolbar)
+ {
+ GtkToggleButton *b = g_object_get_data (G_OBJECT (ddisp->common_toolbar),
+ DIA_INTEGRATED_TOOLBAR_SNAP_GRID);
+ gboolean active = ddisp->grid.snap? TRUE : FALSE;
+ gtk_toggle_button_set_active (b, active);
+ }
+}
+
+/**
+ * Sets the Snap-to-grid property for the active display.
+ * @param b Snap to grid toggle button.
+ * @param not_used
+ */
+static void
+integrated_ui_toolbar_grid_snap_toggle(GtkToggleButton *b, gpointer *not_used)
+{
+ DDisplay *ddisp = ddisplay_active ();
+ if (ddisp)
+ {
+ ddisplay_set_snap_to_grid (ddisp, gtk_toggle_button_get_active (b));
+ }
+}
+
+/**
+ * Sets the zoom text for the toolbar
+ * @param toolbar Integrated UI toolbar.
+ * @param text Current zoom percentage for the active window
+ */
+void integrated_ui_toolbar_set_zoom_text (GtkToolbar *toolbar, const gchar * text)
+{
+ if (toolbar)
+ {
+ GtkLabel *label = g_object_get_data (G_OBJECT (toolbar),
+ DIA_INTEGRATED_TOOLBAR_ZOOM_TEXT);
+ gtk_label_set_text (label, text);
+ }
+}
+
+/* Create the toolbar for the integrated UI */
+static GtkWidget *
+create_integrated_ui_toolbar (void)
+{
+ GtkToolbar *toolbar;
+ GtkToolItem *button;
+ GtkToolItem *sep;
+ GtkToolItem *tool_item;
+ GtkWidget *w;
+ GtkAction *action;
+ int i;
+
+ struct item_t {
+ const gchar * stock_id;
+ void (*callback)(GtkAction *);
+ } item[] = {
+ { GTK_STOCK_NEW, file_new_callback },
+ { GTK_STOCK_OPEN, file_open_callback },
+ { GTK_STOCK_SAVE, file_save_callback },
+ { GTK_STOCK_SAVE_AS, file_save_as_callback },
+ { 0 },
+ { GTK_STOCK_ZOOM_IN, view_zoom_in_callback },
+ { GTK_STOCK_ZOOM_OUT, view_zoom_out_callback },
+ };
+ size_t num_items = sizeof(item)/sizeof(struct item_t);
+
+ toolbar = GTK_TOOLBAR (gtk_toolbar_new ());
+
+ for(i = 0 ; i < num_items ; i++)
+ {
+ if (item[i].stock_id)
+ {
+ button = gtk_tool_button_new_from_stock (item[i].stock_id);
+ gtk_toolbar_insert (toolbar, button, -1);
+ gtk_signal_connect (GTK_OBJECT (button),"clicked",
+ GTK_SIGNAL_FUNC (toolbar_callback), item[i].callback);
+ gtk_widget_show (GTK_WIDGET (button));
+ }
+ else
+ {
+ sep = gtk_separator_tool_item_new ();
+ gtk_toolbar_insert (toolbar, sep, -1);
+ gtk_widget_show (GTK_WIDGET (sep));
+ }
+ }
+
+ tool_item = gtk_tool_item_new ();
+ w = gtk_label_new ("100%");
+ gtk_container_add (GTK_CONTAINER (tool_item), w);
+ gtk_toolbar_insert (toolbar, tool_item, -1);
+ gtk_widget_show (GTK_WIDGET (tool_item));
+ gtk_widget_show (w);
+ g_object_set_data (G_OBJECT (toolbar),
+ DIA_INTEGRATED_TOOLBAR_ZOOM_TEXT,
+ w);
+
+ sep = gtk_separator_tool_item_new ();
+ gtk_toolbar_insert (toolbar, sep, -1);
+ gtk_widget_show (GTK_WIDGET (sep));
+
+ /* Snap to grid */
+ /*action = menus_get_action ("ViewSnaptogrid");
+ tool_item = gtk_action_create_tool_item (action);*/
+ tool_item = gtk_tool_item_new ();
+ w = dia_toggle_button_new_with_icons (dia_on_grid_icon,
+ dia_off_grid_icon);
+ g_signal_connect (G_OBJECT (w), "toggled",
+ G_CALLBACK (integrated_ui_toolbar_grid_snap_toggle), toolbar);
+ gtk_tooltips_set_tip (tool_tips, w,
+ _("Toggles snap-to-grid."), NULL);
+ gtk_container_add (GTK_CONTAINER (tool_item), w);
+ gtk_toolbar_insert (toolbar, tool_item, -1);
+ gtk_widget_show (GTK_WIDGET (tool_item));
+ gtk_widget_show (w);
+ g_object_set_data (G_OBJECT (toolbar),
+ DIA_INTEGRATED_TOOLBAR_SNAP_GRID,
+ w);
+
+ /* Object Snapping */
+ tool_item = gtk_tool_item_new ();
+ w = dia_toggle_button_new_with_icons (dia_mainpoints_on_icon,
+ dia_mainpoints_off_icon);
+ g_signal_connect (G_OBJECT (w), "toggled",
+ G_CALLBACK (integrated_ui_toolbar_object_snap_toggle), toolbar);
+ gtk_tooltips_set_tip (tool_tips, w,
+ _("Toggles object snapping."), NULL);
+ gtk_container_add (GTK_CONTAINER (tool_item), w);
+ gtk_toolbar_insert (toolbar, tool_item, -1);
+ gtk_widget_show (GTK_WIDGET (tool_item));
+ gtk_widget_show (w);
+ g_object_set_data (G_OBJECT (toolbar),
+ DIA_INTEGRATED_TOOLBAR_OBJECT_SNAP,
+ w);
+
+ sep = gtk_separator_tool_item_new ();
+ gtk_toolbar_insert (toolbar, sep, -1);
+ gtk_widget_show (GTK_WIDGET (sep));
+
+ return GTK_WIDGET (toolbar);
+}
+
/*
* Initialise tool actions.
* The caller owns the return value.
@@ -463,12 +690,7 @@
static void
menus_init(void)
{
- DiaCallbackFilter *cbf;
- GtkActionGroup *plugin_actions;
- GtkAction *action;
- gchar *accelfilename;
- GList *cblist;
- guint id;
+ gchar *accelfilename;
GError *error = NULL;
gchar *uifile;
@@ -545,11 +767,37 @@
g_assert (display_menubar);
+ add_toolbox_plugin_actions (toolbox_ui_manager);
+
+ add_plugin_actions (display_ui_manager);
+
+ /* load accelerators and prepare to later save them */
+ accelfilename = dia_config_filename("menurc");
+
+ if (accelfilename) {
+ gtk_accel_map_load(accelfilename);
+ g_free(accelfilename);
+ }
+ gtk_quit_add(1, save_accels, NULL);
+}
+
+static void
+add_toolbox_plugin_actions (GtkUIManager *ui_manager)
+{
+ GtkActionGroup *plugin_actions;
+ GtkActionGroup *actions;
+ GtkAction *action;
+ GList *cblist;
+ DiaCallbackFilter *cbf = NULL;
+ gchar *name;
+ guint id;
+ static guint cnt = 0;
+
/* plugin menu hooks */
plugin_actions = gtk_action_group_new ("toolbox-plugin-actions");
gtk_action_group_set_translation_domain (plugin_actions, NULL);
gtk_action_group_set_translate_func (plugin_actions, _dia_translate, NULL, NULL);
- gtk_ui_manager_insert_action_group (toolbox_ui_manager,
+ gtk_ui_manager_insert_action_group (ui_manager,
plugin_actions, 5 /* "back" */);
g_object_unref (plugin_actions);
@@ -568,11 +816,6 @@
continue;
}
- if (0 != strncmp (cbf->menupath, TOOLBOX_MENU, strlen (TOOLBOX_MENU))) {
- /* hook for display, skip */
- continue;
- }
-
action = gtk_action_new (cbf->action, cbf->description,
NULL, NULL);
g_signal_connect (G_OBJECT (action), "activate",
@@ -583,24 +826,77 @@
g_object_unref (G_OBJECT (action));
id = gtk_ui_manager_new_merge_id (toolbox_ui_manager);
- gtk_ui_manager_add_ui (toolbox_ui_manager, id,
+ gtk_ui_manager_add_ui (ui_manager, id,
cbf->menupath,
cbf->description,
cbf->action,
GTK_UI_MANAGER_AUTO,
FALSE);
}
+}
- add_plugin_actions (display_ui_manager);
+void
+menus_get_integrated_ui_menubar (GtkWidget **menubar,
+ GtkWidget **toolbar,
+ GtkAccelGroup **accel_group)
+{
+ GError *error = NULL;
+ gchar *uifile;
- /* load accelerators and prepare to later save them */
- accelfilename = dia_config_filename("menurc");
-
- if (accelfilename) {
- gtk_accel_map_load(accelfilename);
- g_free(accelfilename);
+ if (initialise)
+ menus_init();
+
+ /* the integrated ui menu */
+ integrated_ui_actions = gtk_action_group_new ("integrated-ui-actions");
+ gtk_action_group_set_translation_domain (integrated_ui_actions, NULL);
+ gtk_action_group_set_translate_func (integrated_ui_actions, _dia_translate, NULL, NULL);
+ gtk_action_group_add_actions (integrated_ui_actions, common_entries,
+ G_N_ELEMENTS (common_entries), NULL);
+ gtk_action_group_add_actions (integrated_ui_actions, toolbox_entries,
+ G_N_ELEMENTS (toolbox_entries), NULL);
+ gtk_action_group_add_actions (integrated_ui_actions, display_entries,
+ G_N_ELEMENTS (display_entries), NULL);
+ gtk_action_group_add_toggle_actions (integrated_ui_actions, toolbox_toggle_entries,
+ G_N_ELEMENTS (toolbox_toggle_entries),
+ NULL);
+ gtk_action_group_add_toggle_actions (integrated_ui_actions, display_toggle_entries,
+ G_N_ELEMENTS (display_toggle_entries),
+ NULL);
+ gtk_action_group_add_radio_actions (integrated_ui_actions,
+ display_select_radio_entries,
+ G_N_ELEMENTS (display_select_radio_entries),
+ 1,
+ G_CALLBACK (select_style_callback),
+ NULL);
+
+ integrated_ui_tool_actions = create_tool_actions ();
+
+ integrated_ui_manager = gtk_ui_manager_new ();
+ gtk_ui_manager_set_add_tearoffs (integrated_ui_manager, DIA_SHOW_TEAROFFS);
+ gtk_ui_manager_insert_action_group (integrated_ui_manager, integrated_ui_actions, 0);
+ gtk_ui_manager_insert_action_group (integrated_ui_manager, integrated_ui_tool_actions, 0);
+
+ uifile = build_ui_filename ("ui/integrated-ui.xml");
+ if (!gtk_ui_manager_add_ui_from_file (integrated_ui_manager, uifile, &error)) {
+ g_warning ("building integrated ui menus failed: %s", error->message);
+ g_error_free (error);
+ error = NULL;
}
- gtk_quit_add(1, save_accels, NULL);
+ g_free (uifile);
+
+ add_toolbox_plugin_actions (integrated_ui_manager);
+ add_plugin_actions (integrated_ui_manager);
+
+ integrated_ui_accels = gtk_ui_manager_get_accel_group (integrated_ui_manager);
+ integrated_ui_menubar = gtk_ui_manager_get_widget (integrated_ui_manager, "/IntegratedUIMenu");
+ integrated_ui_toolbar = create_integrated_ui_toolbar ();
+
+ if (menubar)
+ *menubar = integrated_ui_menubar;
+ if (toolbar)
+ *toolbar = integrated_ui_toolbar;
+ if (accel_group)
+ *accel_group = integrated_ui_accels;
}
void
@@ -631,6 +927,9 @@
if (initialise)
menus_init();
+ if (is_integrated_ui ())
+ return integrated_ui_accels;
+
return display_accels;
}
@@ -687,13 +986,13 @@
GtkAccelGroup *
menus_get_accel_group ()
{
- return toolbox_accels;
+ return is_integrated_ui ()? integrated_ui_accels : toolbox_accels;
}
GtkActionGroup *
menus_get_action_group ()
{
- return toolbox_actions;
+ return is_integrated_ui ()? integrated_ui_actions : toolbox_actions;
}
GtkAction *
@@ -701,10 +1000,17 @@
{
GtkAction *action;
- action = gtk_action_group_get_action (toolbox_actions, name);
- if (action == NULL) {
- action = gtk_action_group_get_action (display_actions, name);
+ if (is_integrated_ui ())
+ {
+ action = gtk_action_group_get_action (integrated_ui_actions, name);
}
+ else
+ {
+ action = gtk_action_group_get_action (toolbox_actions, name);
+ if (action == NULL) {
+ action = gtk_action_group_get_action (display_actions, name);
+ }
+ }
return action;
}
@@ -714,7 +1020,20 @@
{
GList *list;
guint id;
+ GtkUIManager *ui_manager;
+ const char *recent_path;
+ if (is_integrated_ui ())
+ {
+ ui_manager = integrated_ui_manager;
+ recent_path = "/IntegratedUIMenu/File/FileRecentEnd";
+ }
+ else
+ {
+ ui_manager = toolbox_ui_manager;
+ recent_path = "/ToolboxMenu/File/FileRecentEnd";
+ }
+
if (recent_actions) {
menus_clear_recent ();
}
@@ -724,16 +1043,16 @@
recent_actions = actions;
g_object_ref (G_OBJECT (recent_actions));
- gtk_ui_manager_insert_action_group (toolbox_ui_manager,
+ gtk_ui_manager_insert_action_group (ui_manager,
recent_actions,
10 /* insert at back */ );
do {
- id = gtk_ui_manager_new_merge_id (toolbox_ui_manager);
+ id = gtk_ui_manager_new_merge_id (ui_manager);
recent_merge_ids = g_slist_prepend (recent_merge_ids, (gpointer) id);
- gtk_ui_manager_add_ui (toolbox_ui_manager, id,
- "/ToolboxMenu/File/FileRecentEnd",
+ gtk_ui_manager_add_ui (ui_manager, id,
+ recent_path,
gtk_action_get_name (GTK_ACTION (list->data)),
gtk_action_get_name (GTK_ACTION (list->data)),
GTK_UI_MANAGER_AUTO,
@@ -746,19 +1065,25 @@
menus_clear_recent (void)
{
GSList *id;
+ GtkUIManager *ui_manager;
+ if (is_integrated_ui ())
+ ui_manager = integrated_ui_manager;
+ else
+ ui_manager = toolbox_ui_manager;
+
g_return_if_fail (recent_merge_ids);
id = recent_merge_ids;
do {
- gtk_ui_manager_remove_ui (toolbox_ui_manager, (guint) id->data);
+ gtk_ui_manager_remove_ui (ui_manager, (guint) id->data);
} while (NULL != (id = id->next));
g_slist_free (recent_merge_ids);
recent_merge_ids = NULL;
- gtk_ui_manager_remove_action_group (toolbox_ui_manager, recent_actions);
+ gtk_ui_manager_remove_action_group (ui_manager, recent_actions);
g_object_unref (G_OBJECT (recent_actions));
recent_actions = NULL;
}
Index: app/menus.h
===================================================================
--- app/menus.h (revision 3682)
+++ app/menus.h (working copy)
@@ -69,6 +69,18 @@
typedef struct _UpdatableMenuItems UpdatableMenuItems;
+void
+integrated_ui_toolbar_set_zoom_text (GtkToolbar *toolbar, const gchar * text);
+
+void
+integrated_ui_toolbar_grid_snap_synchronize_to_display (gpointer *ddisp);
+
+void
+integrated_ui_toolbar_object_snap_synchronize_to_display (gpointer *ddisp);
+
+/* TODO: rename: menus_get_integrated_ui_menubar() */
+void menus_get_integrated_ui_menubar (GtkWidget **menubar, GtkWidget **toolbar,
+ GtkAccelGroup **accel);
void menus_get_toolbox_menubar (GtkWidget **menubar, GtkAccelGroup **accel);
GtkWidget * menus_get_display_popup (void);
GtkAccelGroup * menus_get_display_accels (void);
Index: data/integrated-ui.xml
===================================================================
--- data/integrated-ui.xml (revision 0)
+++ data/integrated-ui.xml (revision 0)
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ui>
+ <menubar name="IntegratedUIMenu">
+ <menu name="File" action="File">
+ <menuitem name="FileNew" action="FileNew" />
+ <menuitem name="FileOpen" action="FileOpen" />
+ <separator name="FileSep1" />
+
+ <menuitem name="FileSave" action="FileSave" />
+ <menuitem name="FileSaveas" action="FileSaveas" />
+ <menuitem name="FileExport" action="FileExport" />
+ <separator name="FileSep2" />
+
+ <menuitem name="FileTree" action="FileTree" />
+ <menuitem name="FileSheets" action="FileSheets" />
+ <separator name="FileSep3 "/>
+
+ <menuitem name="FilePagesetup" action="FilePagesetup" />
+ <menuitem name="FilePrint" action="FilePrint" />
+ <separator name="FileSep4 "/>
+
+ <menuitem name="FileClose" action="FileClose" />
+ <separator/>
+
+ <menuitem name="FilePrefs" action="FilePrefs" />
+ <menuitem name="FilePlugins" action="FilePlugins" />
+
+ <separator name="FileRecentStart"/>
+
+ <separator name="FileRecentEnd" />
+
+ <menuitem name="FileQuit" action="FileQuit" />
+ </menu>
+ <menu name="Edit" action="Edit">
+ <menuitem name="EditUndo" action="EditUndo" />
+ <menuitem name="EditRedo" action="EditRedo" />
+ <separator name="EditSep1" />
+ <menuitem name="EditCopy" action="EditCopy" />
+ <menuitem name="EditCut" action="EditCut" />
+ <menuitem name="EditPaste" action="EditPaste" />
+ <menuitem name="EditDuplicate" action="EditDuplicate" />
+ <menuitem name="EditDelete" action="EditDelete" />
+ <separator name="EditSep2" />
+ <menuitem name="EditCopytext" action="EditCopytext" />
+ <menuitem name="EditCuttext" action="EditCuttext" />
+ <menuitem name="EditPastetext" action="EditPastetext" />
+ <separator name="EditSep3" />
+ <menuitem name="DiagramProperties" action="DiagramProperties" />
+ <menuitem name="DiagramLayers" action="DiagramLayers" />
+ </menu>
+ <menu name="View" action="View">
+ <menuitem name="ViewZoomin" action="ViewZoomin" />
+ <menuitem name="ViewZoomout" action="ViewZoomout" />
+ <menu name="ViewZoom" action="ViewZoom">
+ <menuitem name="ViewZoom16000" action="ViewZoom16000" />
+ <menuitem name="ViewZoom8000" action="ViewZoom8000" />
+ <menuitem name="ViewZoom4000" action="ViewZoom4000" />
+ <menuitem name="ViewZoom2830" action="ViewZoom2830" />
+ <menuitem name="ViewZoom2000" action="ViewZoom2000" />
+ <menuitem name="ViewZoom1410" action="ViewZoom1410" />
+ <menuitem name="ViewZoom1000" action="ViewZoom1000" />
+ <menuitem name="ViewZoom850" action="ViewZoom850" />
+ <menuitem name="ViewZoom707" action="ViewZoom707" />
+ <menuitem name="ViewZoom500" action="ViewZoom500" />
+ <menuitem name="ViewZoom354" action="ViewZoom354" />
+ <menuitem name="ViewZoom250" action="ViewZoom250" />
+ </menu>
+ <separator name="ViewSep1" />
+ <menuitem name="ViewFullscreen" action="ViewFullscreen" />
+ <menuitem name="ViewAntialiased" action="ViewAntialiased" />
+ <menuitem name="ViewShowgrid" action="ViewShowgrid" />
+ <menuitem name="ViewSnaptogrid" action="ViewSnaptogrid" />
+ <menuitem name="ViewSnaptoobjects" action="ViewSnaptoobjects" />
+ <menuitem name="ViewShowrulers" action="ViewShowrulers" />
+ <menuitem name="ViewShowconnectionpoints" action="ViewShowconnectionpoints" />
+ <separator name="ViewSep2" />
+ <menuitem name="ViewNewview" action="ViewNewview" />
+ <menuitem name="ViewCloneview" action="ViewCloneview" />
+ <menuitem name="ViewShowall" action="ViewShowall" />
+ <menuitem name="ViewRedraw" action="ViewRedraw" />
+ </menu>
+
+ <menu name="Objects" action="Objects">
+ <menuitem name="ObjectsSendtoback" action="ObjectsSendtoback" />
+ <menuitem name="ObjectsBringtofront" action="ObjectsBringtofront" />
+ <menuitem name="ObjectsSendbackwards" action="ObjectsSendbackwards" />
+ <menuitem name="ObjectsBringforwards" action="ObjectsBringforwards" />
+ <separator name="ObjectsSep1" />
+ <menuitem name="ObjectsGroup" action="ObjectsGroup" />
+ <menuitem name="ObjectsUngroup" action="ObjectsUngroup" />
+ <separator name="ObjectsSep2" />
+ <menuitem name="ObjectsParent" action="ObjectsParent" />
+ <menuitem name="ObjectsUnparent" action="ObjectsUnparent" />
+ <menuitem name="ObjectsUnparentchildren" action="ObjectsUnparentchildren" />
+ <separator name="ObjectsSep3" />
+ <menu name="ObjectsAlign" action="ObjectsAlign">
+ <menuitem name="ObjectsAlignLeft" action="ObjectsAlignLeft" />
+ <menuitem name="ObjectsAlignCenter" action="ObjectsAlignCenter" />
+ <menuitem name="ObjectsAlignRight" action="ObjectsAlignRight" />
+ <separator name="ObjectsAlignSep1" />
+ <menuitem name="ObjectsAlignTop" action="ObjectsAlignTop" />
+ <menuitem name="ObjectsAlignMiddle" action="ObjectsAlignMiddle" />
+ <menuitem name="ObjectsAlignBottom" action="ObjectsAlignBottom" />
+ <separator name="ObjectsAlignSep2" />
+ <menuitem name="ObjectsAlignSpreadouthorizontally" action="ObjectsAlignSpreadouthorizontally" />
+ <menuitem name="ObjectsAlignSpreadoutvertically" action="ObjectsAlignSpreadoutvertically" />
+ <menuitem name="ObjectsAlignAdjacent" action="ObjectsAlignAdjacent" />
+ <menuitem name="ObjectsAlignStacked" action="ObjectsAlignStacked" />
+ </menu>
+ <separator name="ObjectsSep4" />
+ <menuitem name="ObjectsProperties" action="ObjectsProperties" />
+ <separator name="ObjectsExtensionStart" />
+ </menu>
+ <menu name="Select" action="Select">
+ <menuitem name="SelectAll" action="SelectAll" />
+ <menuitem name="SelectNone" action="SelectNone" />
+ <menuitem name="SelectInvert" action="SelectInvert" />
+ <separator name="SelectSep1" />
+ <menuitem name="SelectTransitive" action="SelectTransitive" />
+ <menuitem name="SelectConnected" action="SelectConnected" />
+ <menuitem name="SelectSametype" action="SelectSametype" />
+ <separator name="SelectSep2" />
+ <menuitem name="SelectReplace" action="SelectReplace" />
+ <menuitem name="SelectUnion" action="SelectUnion" />
+ <menuitem name="SelectIntersection" action="SelectIntersection" />
+ <menuitem name="SelectRemove" action="SelectRemove" />
+ <menuitem name="SelectInverse" action="SelectInverse" />
+ <separator name="SelectSep3" />
+ <menu name="SelectBy" action="SelectBy">
+ <separator name="SelectByExtensionStart" />
+ </menu>
+ </menu>
+ <menu name="Tools" action="Tools">
+ <menuitem name="ToolsModify" action="ToolsModify" />
+ <menuitem name="ToolsMagnify" action="ToolsMagnify" />
+ <menuitem name="ToolsScroll" action="ToolsScroll" />
+ <menuitem name="ToolsText" action="ToolsText" />
+ <menuitem name="ToolsBox" action="ToolsBox" />
+ <menuitem name="ToolsEllipse" action="ToolsEllipse" />
+ <menuitem name="ToolsPolygon" action="ToolsPolygon" />
+ <menuitem name="ToolsBeziergon" action="ToolsBeziergon" />
+ <separator name="ToolsSep1" />
+ <menuitem name="ToolsLine" action="ToolsLine" />
+ <menuitem name="ToolsArc" action="ToolsArc" />
+ <menuitem name="ToolsZigzagline" action="ToolsZigzagline" />
+ <menuitem name="ToolsPolyline" action="ToolsPolyline" />
+ <menuitem name="ToolsBezierline" action="ToolsBezierline" />
+ <separator name="ToolsSep1" />
+ <menuitem name="ToolsImage" action="ToolsImage" />
+ </menu>
+ <menuitem name="InputMethods" action="InputMethods" />
+ <menu name="Dialogs" action="Dialogs">
+ <separator name="DialogsExtensionStart" />
+ </menu>
+ <menu name="Debug" action="Debug">
+ <separator name="DebugExtensionStart" />
+ </menu>
+
+ <menu name="Help" action="Help">
+ <menuitem name="HelpContents" action="HelpContents" />
+ <separator name="HelpExtensionStart" />
+ <separator name="HelpExtensionEnd" />
+ <menuitem name="HelpAbout" action="HelpAbout" />
+ </menu>
+ </menubar>
+</ui>
Index: data/toolbar.xml
===================================================================
--- data/toolbar.xml (revision 0)
+++ data/toolbar.xml (revision 0)
@@ -0,0 +1,6 @@
+<ui>
+ <toolbar name="Toolbar">
+ <toolitem name="" action=""/>
+ <separator/>
+ </toolbar>
+</ui>