Index: app/display.c =================================================================== --- app/display.c (revision 3796) +++ app/display.c (working copy) @@ -68,25 +68,21 @@ static void update_zoom_status(DDisplay *ddisp) { + GtkWidget *combo_entry; + GtkWidget *entry; gchar* zoom_text; + + gchar *format = is_integrated_ui ()? "%.0f%%" : "%.1f%%"; - if (is_integrated_ui ()) - { - zoom_text = g_strdup_printf("%.0f%%", - ddisp->zoom_factor * 100.0 / DDISPLAY_NORMAL_ZOOM); + zoom_text = g_strdup_printf (format, ddisp->zoom_factor * 100.0 / DDISPLAY_NORMAL_ZOOM); - 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); - } + /* Just for clarity */ + combo_entry = ddisp->zoom_status; + entry = gtk_bin_get_child (GTK_BIN (combo_entry)); + + gtk_entry_set_text (GTK_ENTRY (entry), zoom_text); + g_free(zoom_text); /* Copied by gtk_entry_set_text */ } @@ -785,6 +781,8 @@ Rectangle *visible; real width, height; + if (ddisp == NULL) return; + visible = &ddisp->visible; width = (visible->right - visible->left)/magnify; Index: app/interface.c =================================================================== --- app/interface.c (revision 3796) +++ app/interface.c (working copy) @@ -47,6 +47,9 @@ #include "pixmaps/missing.xpm" +/* Zoom Constants */ +#define DIA_ZOOM_FIT _("Fit") + /* HB: file dnd stuff lent by The Gimp, not fully understood but working ... */ enum @@ -292,117 +295,114 @@ return FALSE; } -void -view_zoom_set (float factor) +/** + * Sets zoom for text entered in the zoom combo entry + * @param Zoom combo's GtkEntry. + * @param user_data Unused optional data. + */ +static void +dia_zoom_combo_activate (GtkWidget *entry, + gpointer user_data) { - DDisplay *ddisp; - real scale; - Point middle; - Rectangle *visible; + const gchar *text = gtk_entry_get_text (GTK_ENTRY (entry)); + float zoom_percent; - ddisp = ddisplay_active(); - if (!ddisp) return; + if (sscanf (text, "%f", &zoom_percent) == 1) + { + view_zoom_set (10.0 * zoom_percent); - visible = &ddisp->visible; - middle.x = visible->left*0.5 + visible->right*0.5; - middle.y = visible->top*0.5 + visible->bottom*0.5; - - scale = ((real) factor)/1000.0 * DDISPLAY_NORMAL_ZOOM; - - ddisplay_zoom(ddisp, &middle, scale / ddisp->zoom_factor); + /* TODO Decide if the focus should be put back on the canvas after a manual zoom entry */ + } } static void -zoom_activate_callback(GtkWidget *item, gpointer user_data) { - DDisplay *ddisp = (DDisplay *)user_data; - const gchar *zoom_text = - gtk_entry_get_text(GTK_ENTRY(gtk_object_get_user_data(GTK_OBJECT(ddisp->zoom_status)))); - float zoom_amount, magnify; - gchar *zoomamount = g_object_get_data(G_OBJECT(item), "zoomamount"); - if (zoomamount != NULL) { - zoom_text = zoomamount; - } +dia_zoom_combo_selection_changed (GtkComboBox *combo, + gpointer user_data) +{ + /* + * We call gtk_combo_get_get_active() so that typing in the combo entry + * doesn't get handled as a selection change + */ + if (gtk_combo_box_get_active (combo) != -1) + { + DDisplay *ddisp; + float zoom_percent; + gchar * text = gtk_combo_box_get_active_text (combo); - if (sscanf(zoom_text, "%f", &zoom_amount) == 1) { - Point middle; - Rectangle *visible; + if (sscanf (text, "%f", &zoom_percent) == 1) + { + view_zoom_set (zoom_percent * 10.0); + } + else if (g_strcasecmp (text, DIA_ZOOM_FIT) == 0) + { + view_show_all_callback (NULL); + } + + g_free (text); - magnify = (zoom_amount*DDISPLAY_NORMAL_ZOOM/100.0)/ddisp->zoom_factor; - if (fabs(magnify - 1.0) > 0.000001) { - visible = &ddisp->visible; - middle.x = visible->left*0.5 + visible->right*0.5; - middle.y = visible->top*0.5 + visible->bottom*0.5; - ddisplay_zoom(ddisp, &middle, magnify); + /* Force focus back to the canvas */ + ddisp = ddisplay_active (); + if (ddisp) + { + gtk_widget_grab_focus (ddisp->canvas); + } } - } } -static void -zoom_add_zoom_amount(GtkWidget *menu, gchar *text, DDisplay *ddisp) { - GtkWidget *menuitem = gtk_menu_item_new_with_label(text); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - g_signal_connect(GTK_OBJECT(menuitem), - "activate", G_CALLBACK(zoom_activate_callback), - ddisp); - g_object_set_data(G_OBJECT(menuitem), "zoomamount", text); -} +GtkWidget *create_zoom_combo (void) +{ + GtkWidget *combo_entry; + GtkWidget *entry; -static void -zoom_popup_menu(GtkWidget *button, GdkEventButton *event, gpointer user_data) { - /* display_set_active(ddisp); */ - /* ddisplay_popup_menu(ddisp, event); */ + combo_entry = GTK_WIDGET (gtk_combo_box_entry_new_text ()); - GtkMenu *menu = GTK_MENU(user_data); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), DIA_ZOOM_FIT); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("800%")); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("400%")); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("300%")); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("200%")); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("150%")); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("100%")); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("75%")); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("50%")); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("25%")); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("10%")); - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, - event->button, event->time); - /* stop the signal emission so the button doesn't grab the - * pointer from us */ - gtk_signal_emit_stop_by_name(GTK_OBJECT(button), "button_press_event"); -} + GTK_WIDGET_UNSET_FLAGS(combo_entry, GTK_CAN_FOCUS); -static GtkWidget* -create_zoom_widget(DDisplay *ddisp) { - GtkWidget *combo; - GtkWidget *entry; - GtkWidget *menu; - GtkWidget *button; - GtkWidget *arrow; + g_signal_connect (G_OBJECT (combo_entry), + "changed", + G_CALLBACK (dia_zoom_combo_selection_changed), + NULL); - combo = gtk_hbox_new(FALSE, 0); - entry = gtk_entry_new(); + /* Get the combo_entry's GtkEntry child to set the width for the widget */ + entry = gtk_bin_get_child (GTK_BIN (combo_entry)); + gtk_entry_set_width_chars (GTK_ENTRY (entry), 6); + g_signal_connect (GTK_OBJECT (entry), "activate", - G_CALLBACK(zoom_activate_callback), - ddisp); - gtk_box_pack_start_defaults(GTK_BOX(combo), entry); - gtk_object_set_user_data(GTK_OBJECT(combo), entry); - gtk_entry_set_width_chars(GTK_ENTRY(entry), 8); - gtk_widget_show(entry); + G_CALLBACK(dia_zoom_combo_activate), + NULL); + return combo_entry; +} - button = gtk_button_new(); - GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); - arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT); - gtk_container_add(GTK_CONTAINER(button), arrow); - gtk_box_pack_start_defaults(GTK_BOX(combo), button); - gtk_object_set_user_data(GTK_OBJECT(combo), entry); - gtk_widget_show_all(button); +void +view_zoom_set (float factor) +{ + DDisplay *ddisp; + real scale; + Point middle; + Rectangle *visible; - menu = gtk_menu_new(); - zoom_add_zoom_amount(menu, "800%", ddisp); - zoom_add_zoom_amount(menu, "400%", ddisp); - zoom_add_zoom_amount(menu, "200%", ddisp); - zoom_add_zoom_amount(menu, "100%", ddisp); - zoom_add_zoom_amount(menu, "50%", ddisp); - zoom_add_zoom_amount(menu, "25%", ddisp); - zoom_add_zoom_amount(menu, "12%", ddisp); + ddisp = ddisplay_active(); + if (!ddisp) return; - gtk_widget_show_all(menu); + visible = &ddisp->visible; + middle.x = visible->left*0.5 + visible->right*0.5; + middle.y = visible->top*0.5 + visible->bottom*0.5; - g_signal_connect (GTK_OBJECT (button), "button_press_event", - G_CALLBACK(zoom_popup_menu), - menu); + scale = ((real) factor)/1000.0 * DDISPLAY_NORMAL_ZOOM; - return combo; + ddisplay_zoom(ddisp, &middle, scale / ddisp->zoom_factor); } static gboolean @@ -655,7 +655,8 @@ ddisp->menu_bar = NULL; /* Stand-alone window Zoom status/menu */ - ddisp->zoom_status = NULL; + ddisp->zoom_status = g_object_get_data (G_OBJECT (ui.toolbar), + DIA_INTEGRATED_UI_MAIN_TOOLBAR_ZOOM_COMBO); /* Stand-alone window Grid on/off button */ ddisp->grid_status = NULL; @@ -908,7 +909,8 @@ */ /* Zoom status pseudo-optionmenu */ - ddisp->zoom_status = create_zoom_widget(ddisp); + ddisp->zoom_status = create_zoom_combo (); + zoom_hbox = gtk_hbox_new(FALSE, 0); zoom_label = gtk_label_new(_("Zoom")); gtk_box_pack_start (GTK_BOX(zoom_hbox), zoom_label, Index: app/interface.h =================================================================== --- app/interface.h (revision 3796) +++ app/interface.h (working copy) @@ -67,6 +67,8 @@ GtkWidget *interface_get_toolbox_shell(void); +GtkWidget *create_zoom_combo (void); + void tool_select_callback(GtkWidget *widget, gpointer data); void create_integrated_ui (void); void create_tree_window(void); Index: app/menus.c =================================================================== --- app/menus.c (revision 3796) +++ app/menus.c (working copy) @@ -49,12 +49,9 @@ #define DIA_SHOW_TEAROFFS TRUE /* Integrated UI Toolbar Constants */ -#define DIA_INTEGRATED_TOOLBAR_ZOOM_COMBO "dia-integrated-toolbar-zoom-combo_entry" #define DIA_INTEGRATED_TOOLBAR_SNAP_GRID "dia-integrated-toolbar-snap-grid" #define DIA_INTEGRATED_TOOLBAR_OBJECT_SNAP "dia-integrated-toolbar-object-snap" -#define ZOOM_FIT _("Fit") - static void plugin_callback (GtkWidget *widget, gpointer data); static GtkWidget * @@ -408,27 +405,6 @@ } } -/** - * 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) - { - GtkComboBoxEntry *combo_entry = g_object_get_data (G_OBJECT (toolbar), - DIA_INTEGRATED_TOOLBAR_ZOOM_COMBO); - - if (combo_entry) - { - GtkWidget * entry = gtk_bin_get_child (GTK_BIN (combo_entry)); - - gtk_entry_set_text (GTK_ENTRY (entry), text); - } - } -} - /** * Adds a widget to the toolbar making sure that it doesn't take any excess space, and * vertically centers it. @@ -451,45 +427,6 @@ gtk_widget_show (w); } -static void -integrated_ui_toolbar_zoom_activate (GtkWidget *item, - gpointer user_data) -{ - const gchar *text = gtk_entry_get_text (GTK_ENTRY (item)); - float zoom_percent; - - if (sscanf (text, "%f", &zoom_percent) == 1) - { - view_zoom_set (10.0 * zoom_percent); - } -} - -static void -integrated_ui_toolbar_zoom_combo_selection_changed (GtkComboBox *combo, - gpointer user_data) -{ - /* - * We call gtk_combo_get_get_active() so that typing in the combo entry - * doesn't get handled as a selection change - */ - if (gtk_combo_box_get_active (combo) != -1) - { - float zoom_percent; - gchar * text = gtk_combo_box_get_active_text (combo); - - if (sscanf (text, "%f", &zoom_percent) == 1) - { - view_zoom_set (zoom_percent * 10.0); - } - else if (g_strcasecmp (text, ZOOM_FIT) == 0) - { - view_show_all_callback (NULL); - } - - g_free (text); - } -} - /** * Create the toolbar for the integrated UI * @return Main toolbar (GtkToolbar*) for the integrated UI main window @@ -516,38 +453,12 @@ g_free (uifile); /* Zoom Combo Box Entry */ - w = gtk_combo_box_entry_new_text (); - + w = create_zoom_combo (); + integrated_ui_toolbar_add_custom_item (toolbar, w); g_object_set_data (G_OBJECT (toolbar), - DIA_INTEGRATED_TOOLBAR_ZOOM_COMBO, + DIA_INTEGRATED_UI_MAIN_TOOLBAR_ZOOM_COMBO, w); - integrated_ui_toolbar_add_custom_item (toolbar, w); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), ZOOM_FIT); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("800%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("400%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("300%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("200%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("150%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("100%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("75%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("50%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("25%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("10%")); - - g_signal_connect (G_OBJECT (w), - "changed", - G_CALLBACK (integrated_ui_toolbar_zoom_combo_selection_changed), - NULL); - - /* Get the combo's GtkEntry child to set the width for the widget */ - w = gtk_bin_get_child (GTK_BIN (w)); - gtk_entry_set_width_chars (GTK_ENTRY (w), 6); - - g_signal_connect (GTK_OBJECT (w), "activate", - G_CALLBACK(integrated_ui_toolbar_zoom_activate), - NULL); - /* Seperator */ sep = gtk_separator_tool_item_new (); gtk_toolbar_insert (toolbar, sep, -1); Index: app/menus.h =================================================================== --- app/menus.h (revision 3796) +++ app/menus.h (working copy) @@ -97,5 +97,11 @@ #define VIEW_MAIN_TOOLBAR_ACTION "ViewMainToolbar" #define VIEW_MAIN_STATUSBAR_ACTION "ViewMainStatusbar" +/* + * Used for retrieving the zoom combo widget from the integrated UI's toolbar. + * This is not applicable to the distributed UI. + */ +#define DIA_INTEGRATED_UI_MAIN_TOOLBAR_ZOOM_COMBO "main-toolbar-zoom-combo" + #endif /* MENUS_H */ Index: autogen.sh =================================================================== --- autogen.sh (revision 3796) +++ autogen.sh (working copy) @@ -88,7 +88,7 @@ echo "$@" >&2 } -conf_flags="--enable-maintainer-mode --enable-db2html" +conf_flags="--enable-maintainer-mode --enable-debug=yes" if test x$NOCONFIGURE = x; then if [ "$#" = 0 ]; then printerr "**Warning**: I am going to run \`configure' with no arguments."