Index: app/commands.c =================================================================== --- app/commands.c (revision 3687) +++ app/commands.c (working copy) @@ -867,28 +867,12 @@ if (!ddisp) return; if (!gtk_toggle_action_get_active (action)) { - if (GTK_WIDGET_VISIBLE (ddisp->origin)) { - gtk_widget_unmap (ddisp->origin); - gtk_widget_unmap (ddisp->hrule); - gtk_widget_unmap (ddisp->vrule); - - GTK_WIDGET_UNSET_FLAGS (ddisp->origin, GTK_VISIBLE); - GTK_WIDGET_UNSET_FLAGS (ddisp->hrule, GTK_VISIBLE); - GTK_WIDGET_UNSET_FLAGS (ddisp->vrule, GTK_VISIBLE); - - gtk_widget_queue_resize (GTK_WIDGET (ddisp->origin->parent)); + if (ddisp->rulers_are_showing) { + display_rulers_hide (ddisp); } } else { - if (!GTK_WIDGET_VISIBLE (ddisp->origin)) { - GTK_WIDGET_SET_FLAGS (ddisp->origin, GTK_VISIBLE); - GTK_WIDGET_SET_FLAGS (ddisp->hrule, GTK_VISIBLE); - GTK_WIDGET_SET_FLAGS (ddisp->vrule, GTK_VISIBLE); - - gtk_widget_map (ddisp->origin); - gtk_widget_map (ddisp->hrule); - gtk_widget_map (ddisp->vrule); - - gtk_widget_queue_resize (GTK_WIDGET (ddisp->origin->parent)); + if (!ddisp->rulers_are_showing) { + display_rulers_show (ddisp); } } } Index: app/display.c =================================================================== --- app/display.c (revision 3687) +++ app/display.c (working copy) @@ -210,7 +210,7 @@ } create_display_shell(ddisp, prefs.new_view.width, prefs.new_view.height, filename, prefs.new_view.use_menu_bar, !app_is_embedded()); - + ddisplay_update_statusbar (ddisp); ddisplay_set_origo(ddisp, ddisp->visible.left, ddisp->visible.top); @@ -808,18 +808,13 @@ GtkToggleAction *snap_to_grid; ddisp->grid.snap = snap; - 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")); + if (is_integrated_ui ()) + integrated_ui_toolbar_grid_snap_synchronize_to_display (ddisp); } 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); @@ -844,6 +839,8 @@ if (ddisp->menu_bar == NULL) { mainpoint_magnetism = GTK_TOGGLE_ACTION (menus_get_action ("ViewSnaptoobjects")); + if (is_integrated_ui ()) + integrated_ui_toolbar_object_snap_synchronize_to_display (ddisp); } else { mainpoint_magnetism = GTK_TOGGLE_ACTION (gtk_action_group_get_action (ddisp->actions, "ViewSnaptoobjects")); } @@ -1099,8 +1096,10 @@ /* This calls ddisplay_really_destroy */ if (ddisp->is_standalone_window) gtk_widget_destroy (ddisp->shell); - else + else { gtk_widget_destroy (ddisp->container); + ddisplay_really_destroy (ddisp); + } } static void @@ -1220,9 +1219,9 @@ ddisplay_do_update_menu_sensitivity (ddisp); - + gtk_toggle_action_set_active (rulers, - GTK_WIDGET_VISIBLE (ddisp->hrule) ? 1 : 0); + ddisp->rulers_are_showing); gtk_toggle_action_set_active (visible_grid, ddisp->grid.visible); gtk_toggle_action_set_active (snap_to_grid, @@ -1340,6 +1339,54 @@ gdk_window_set_cursor(ddisp->canvas->window, cursor); } +/** + * Shows the rulers and sets flag ddisp->rulers_are_showing. This + * is needed to detect whether a show() has been issued. There is a + * delay between the time that gtk_widget_show() is called and the time + * when GTK_WIDGET_IS_VISIBLE(w) will indicate true. + * @param ddisp The display to show the rulers on. + */ +void display_rulers_show (DDisplay *ddisp) +{ + if (ddisp) + { + GtkWidget *parent = GTK_WIDGET (ddisp->origin->parent); + + gtk_widget_show (ddisp->origin); + gtk_widget_show (ddisp->hrule); + gtk_widget_show (ddisp->vrule); + + if (GTK_WIDGET_VISIBLE (parent)) + gtk_widget_queue_resize (parent); + + ddisp->rulers_are_showing = TRUE; + } +} + +/** + * Hides the rulers and resets the flag ddisp->rulers_are_showing. This + * is needed to detect whether a hide() has been issued. There is a + * delay between the time that gtk_widget_hide() is called and the time + * when GTK_WIDGET_IS_VISIBLE(w) will indicate false. + * @param ddisp The display to hide the rulers on. + */ +void display_rulers_hide (DDisplay *ddisp) +{ + if (ddisp) + { + GtkWidget *parent = GTK_WIDGET (ddisp->origin->parent); + + gtk_widget_hide (ddisp->origin); + gtk_widget_hide (ddisp->hrule); + gtk_widget_hide (ddisp->vrule); + + if (GTK_WIDGET_VISIBLE (parent)) + gtk_widget_queue_resize (parent); + + ddisp->rulers_are_showing = FALSE; + } +} + void ddisplay_update_statusbar(DDisplay *ddisp) { @@ -1393,12 +1440,12 @@ /* 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); + display_update_menu_state (ddisp); + } } else { /* TODO: Prevent gtk_window_set_transient_for() in Integrated UI case */ Index: app/display.h =================================================================== --- app/display.h (revision 3687) +++ app/display.h (working copy) @@ -102,6 +102,8 @@ /* Points to widget containing the diagram if not standalone window */ GtkWidget *container; + + gboolean rulers_are_showing; }; extern GdkCursor *default_cursor; @@ -154,6 +156,9 @@ void ddisplay_set_cursor(DDisplay *ddisp, GdkCursor *cursor); void ddisplay_set_all_cursor(GdkCursor *cursor); +void display_rulers_show (DDisplay *ddisp); +void display_rulers_hide (DDisplay *ddisp); + gboolean ddisplay_scroll(DDisplay *ddisp, Point *delta); gboolean ddisplay_autoscroll(DDisplay *ddisp, int x, int y); void ddisplay_scroll_up(DDisplay *ddisp); Index: app/app_procs.c =================================================================== --- app/app_procs.c (revision 3687) +++ app/app_procs.c (working copy) @@ -99,6 +99,10 @@ extern DiaExportFilter png_export_filter; #endif +static void +integrated_ui_create_initial_diagrams_callback (GtkWidget *widget, + gpointer user_data); + static gboolean handle_initial_diagram(const char *input_file_name, const char *export_file_name, @@ -950,17 +954,13 @@ if (dia_is_interactive && files == NULL && !nonew) { 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; - } + /* Add Diagram after window is shown */ + GtkWidget *ui = interface_get_toolbox_shell(); + + g_signal_connect (G_OBJECT (ui), + "window-state-event", + integrated_ui_create_initial_diagrams_callback, + NULL); } else { @@ -984,6 +984,26 @@ dynobj_refresh_init(); } +static void +integrated_ui_create_initial_diagrams_callback (GtkWidget *widget, + gpointer user_data) +{ + GList * list; + + file_new_callback(NULL); + list = dia_open_diagrams(); + if (list) + { + Diagram * diagram = list->data; + diagram_update_extents(diagram); + diagram->is_default = TRUE; + } + + g_signal_handler_disconnect (widget, + integrated_ui_create_initial_diagrams_callback); +} + + #if 0 /* app_procs.c: warning: `set_true_callback' defined but not used */ static void Index: app/dia_embedd.c =================================================================== --- app/dia_embedd.c (revision 3687) +++ app/dia_embedd.c (working copy) @@ -64,6 +64,7 @@ gtk_widget_show(ddisp->origin); gtk_widget_show(ddisp->hrule); gtk_widget_show(ddisp->vrule); + ddisp->rulers_are_showing = TRUE; gtk_widget_show(ddisp->hsb); gtk_widget_show(ddisp->vsb); gtk_widget_show(ddisp->zoom_status->parent); @@ -74,6 +75,7 @@ gtk_widget_hide(ddisp->origin); gtk_widget_hide(ddisp->hrule); gtk_widget_hide(ddisp->vrule); + ddisp->rulers_are_showing = FALSE; gtk_widget_hide(ddisp->hsb); gtk_widget_hide(ddisp->vsb); gtk_widget_hide(ddisp->zoom_status->parent); Index: app/interface.c =================================================================== --- app/interface.c (revision 3687) +++ app/interface.c (working copy) @@ -423,41 +423,18 @@ } /** - * Updates toolbar and menu items to reflect the active display + * @param button The notebook close button. + * @param user_data Container widget (e.g. VBox). */ -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"); - + + /* When the page widget is destroyed it removes itself from the notebook */ ddisplay_close (ddisp); - /*gtk_notebook_remove_page (notebook, page_num);*/ - /* gtk_widget_destroy( GTK_WIDGET (page)); */ } /** @@ -482,9 +459,17 @@ ddisp->is_standalone_window = FALSE; ddisp->shell = GTK_WIDGET (ui.main_window); + + /* Statusbar */ + ddisp->modified_status = GTK_WIDGET (ui.statusbar); /* Create a new tab page */ ddisp->container = gtk_vbox_new(FALSE, 0); + gtk_widget_set_events (ddisp->container, + GDK_POINTER_MOTION_MASK | + GDK_POINTER_MOTION_HINT_MASK | + GDK_FOCUS_CHANGE_MASK); + tab_label_container = gtk_hbox_new(FALSE,3); label = gtk_label_new( title ); @@ -515,19 +500,10 @@ gtk_widget_show (close_button); gtk_widget_show (image); - gtk_notebook_append_page (GTK_NOTEBOOK(ui.diagram_notebook), - ddisp->container, - tab_label_container); - 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 (ddisp->container, - GDK_POINTER_MOTION_MASK | - GDK_POINTER_MOTION_HINT_MASK | - GDK_FOCUS_CHANGE_MASK); - /* the table containing all widgets */ table = gtk_table_new (3, 3, FALSE); gtk_table_set_col_spacing (GTK_TABLE (table), 0, 1); @@ -618,34 +594,18 @@ gtk_table_attach (GTK_TABLE (table), navigation_button, 2, 3, 2, 3, GTK_FILL, GTK_FILL, 0, 0); - /* the statusbars */ - status_hbox = gtk_hbox_new (FALSE, 2); - ddisp->common_toolbar = ui.toolbar; - /* TODO: Migrate Zoom, Grid Status to main window toolbar */ + ddisp->menu_bar = NULL; + /* Zoom status pseudo-optionmenu */ 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, - FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX(zoom_hbox), ddisp->zoom_status, - FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (status_hbox), zoom_hbox, FALSE, FALSE, 0); -*/ - /* Grid on/off button */ ddisp->grid_status = NULL; -/* - g_signal_connect(G_OBJECT(ddisp->grid_status), "toggled", - G_CALLBACK (grid_toggle_snap), ddisp); -*/ ddisp->mainpoint_status = dia_toggle_button_new_with_icons(dia_mainpoints_on_icon, dia_mainpoints_off_icon); - + g_signal_connect(G_OBJECT(ddisp->mainpoint_status), "toggled", G_CALLBACK (interface_toggle_mainpoint_magnetism), ddisp); gtk_tooltips_set_tip(tool_tips, ddisp->mainpoint_status, @@ -653,41 +613,29 @@ gtk_box_pack_start (GTK_BOX (status_hbox), ddisp->mainpoint_status, FALSE, FALSE, 0); - /* Statusbar */ - ddisp->modified_status = GTK_WIDGET (ui.statusbar); -/* - gtk_box_pack_start (GTK_BOX (status_hbox), ddisp->modified_status, - TRUE, TRUE, 0); - - gtk_table_attach (GTK_TABLE (table), status_hbox, 0, 3, 3, 4, - GTK_FILL, GTK_FILL, 0, 0); -*/ - gtk_widget_show (ddisp->hsb); gtk_widget_show (ddisp->vsb); - gtk_widget_show (ddisp->origin); - gtk_widget_show (ddisp->hrule); - gtk_widget_show (ddisp->vrule); -/* Zoom-status not migrated yet */ -/* - gtk_widget_show (ddisp->zoom_status); - gtk_widget_show (zoom_hbox); - gtk_widget_show (zoom_label); -*/ - gtk_widget_show (status_hbox); + display_rulers_show (ddisp); gtk_widget_show (table); 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); - + if (gtk_notebook_get_n_pages (ui.diagram_notebook) > 1) + { + 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); + gtk_notebook_append_page (GTK_NOTEBOOK(ui.diagram_notebook), + ddisp->container, + tab_label_container); + /* 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 @@ -963,9 +911,7 @@ gtk_widget_show (ddisp->hsb); gtk_widget_show (ddisp->vsb); - gtk_widget_show (ddisp->origin); - gtk_widget_show (ddisp->hrule); - gtk_widget_show (ddisp->vrule); + display_rulers_show (ddisp); gtk_widget_show (ddisp->zoom_status); gtk_widget_show (zoom_hbox); gtk_widget_show (zoom_label); Index: app/menus.c =================================================================== --- app/menus.c (revision 3687) +++ app/menus.c (working copy) @@ -61,6 +61,9 @@ static void add_toolbox_plugin_actions (GtkUIManager *ui_manager); +static gchar* +build_ui_filename (const gchar* name); + /* Actions common to toolbox and diagram window */ static const GtkActionEntry common_entries[] = { @@ -329,22 +332,6 @@ 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) { @@ -360,7 +347,7 @@ * @param param Display to synchronize to. */ void -integrated_ui_toolbar_object_snap_synchronize_to_display(gpointer *param) +integrated_ui_toolbar_object_snap_synchronize_to_display(gpointer param) { DDisplay *ddisp = param; if (ddisp && ddisp->common_toolbar) @@ -392,7 +379,7 @@ * @param param Display to synchronize to. */ void -integrated_ui_toolbar_grid_snap_synchronize_to_display(gpointer *param) +integrated_ui_toolbar_grid_snap_synchronize_to_display(gpointer param) { DDisplay *ddisp = param; if (ddisp && ddisp->common_toolbar) @@ -445,40 +432,20 @@ GtkWidget *w; GtkAction *action; int i; + GError *error = NULL; + const gchar *uifile; - 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)); - } + uifile = build_ui_filename ("ui/toolbar-ui.xml"); + if (!gtk_ui_manager_add_ui_from_file (integrated_ui_manager, uifile, &error)) { + g_warning ("building menus failed: %s", error->message); + g_error_free (error); + error = NULL; + toolbar = GTK_TOOLBAR (gtk_toolbar_new ()); } + else { + toolbar = gtk_ui_manager_get_widget (integrated_ui_manager, "/Toolbar"); + } + g_free (uifile); tool_item = gtk_tool_item_new (); w = gtk_label_new ("100%"); Index: app/menus.h =================================================================== --- app/menus.h (revision 3687) +++ app/menus.h (working copy) @@ -73,10 +73,10 @@ integrated_ui_toolbar_set_zoom_text (GtkToolbar *toolbar, const gchar * text); void -integrated_ui_toolbar_grid_snap_synchronize_to_display (gpointer *ddisp); +integrated_ui_toolbar_grid_snap_synchronize_to_display (gpointer ddisp); void -integrated_ui_toolbar_object_snap_synchronize_to_display (gpointer *ddisp); +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, Index: lib/diainteractiverenderer.c =================================================================== --- lib/diainteractiverenderer.c (revision 3687) +++ lib/diainteractiverenderer.c (working copy) @@ -74,6 +74,8 @@ g_return_if_fail (irenderer != NULL); g_return_if_fail (irenderer->set_size != NULL); +printf(__FILE__": dia_renderer_set_size()---> %d <--------------\n", __LINE__); irenderer->set_size (renderer, window, width, height); +printf(__FILE__": dia_renderer_set_size()---> %d <--------------\n", __LINE__); } Index: data/toolbar.xml =================================================================== --- data/toolbar.xml (revision 3687) +++ data/toolbar.xml (working copy) @@ -1,6 +0,0 @@ - - - - - - Index: data/toolbar-ui.xml =================================================================== --- data/toolbar-ui.xml (revision 3687) +++ data/toolbar-ui.xml (working copy) @@ -1,6 +1,11 @@ - - + + + + + + +