Index: ChangeLog =================================================================== RCS file: /cvs/gnome/evince/ChangeLog,v retrieving revision 1.699 diff -u -u -r1.699 ChangeLog --- ChangeLog 27 Sep 2005 10:35:42 -0000 1.699 +++ ChangeLog 27 Sep 2005 12:34:45 -0000 @@ -1,5 +1,10 @@ 2005-09-27 Carlos Garcia Campos + * shell/ev-view.[ch], shell/ev-window.c: Disable copy action when + there isn't text selected. + +2005-09-27 Carlos Garcia Campos + * shell/ev-view.c: Allow drag and drop of text. Fixes #316772 2005-09-27 Christian Persch Index: shell/ev-view.c =================================================================== RCS file: /cvs/gnome/evince/shell/ev-view.c,v retrieving revision 1.171 diff -u -u -r1.171 ev-view.c --- shell/ev-view.c 27 Sep 2005 10:35:42 -0000 1.171 +++ shell/ev-view.c 27 Sep 2005 12:34:45 -0000 @@ -56,6 +56,7 @@ PROP_SIZING_MODE, PROP_ZOOM, PROP_ROTATION, + PROP_HAS_SELECTION, }; enum { @@ -1117,7 +1118,8 @@ if (page != selection->page) continue; - if (gdk_region_point_in (selection->covered_region, x_offset, y_offset)) + if (selection->covered_region && + gdk_region_point_in (selection->covered_region, x_offset, y_offset)) return TRUE; } @@ -2328,6 +2330,10 @@ case PROP_ROTATION: g_value_set_int (value, view->rotation); break; + case PROP_HAS_SELECTION: + g_value_set_boolean (value, + view->selection_info.selections != NULL); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -2474,6 +2480,13 @@ 360, 0, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_HAS_SELECTION, + g_param_spec_boolean ("has-selection", + "Has selection", + "The view has selections", + FALSE, + G_PARAM_READABLE)); binding_set = gtk_binding_set_by_class (class); @@ -2494,6 +2507,7 @@ view->pressed_button = -1; view->cursor = EV_VIEW_CURSOR_NORMAL; view->drag_info.in_drag = FALSE; + view->selection_info.selections = NULL; view->selection_info.in_selection = FALSE; view->selection_info.in_drag = FALSE; view->selection_mode = EV_VIEW_SELECTION_TEXT; @@ -3527,6 +3541,7 @@ g_list_foreach (view->selection_info.selections, (GFunc)selection_free, NULL); view->selection_info.selections = new_list; ev_pixbuf_cache_set_selection_list (view->pixbuf_cache, new_list); + g_object_notify (G_OBJECT (view), "has-selection"); new_list_ptr = new_list; old_list_ptr = old_list; @@ -3657,6 +3672,7 @@ g_list_foreach (view->selection_info.selections, (GFunc)selection_free, NULL); view->selection_info.selections = NULL; view->selection_info.in_selection = FALSE; + g_object_notify (G_OBJECT (view), "has-selection"); } @@ -3691,7 +3707,14 @@ } ev_pixbuf_cache_set_selection_list (view->pixbuf_cache, view->selection_info.selections); + g_object_notify (G_OBJECT (view), "has-selection"); gtk_widget_queue_draw (GTK_WIDGET (view)); +} + +gboolean +ev_view_get_has_selection (EvView *view) +{ + return view->selection_info.selections != NULL; } static char * Index: shell/ev-view.h =================================================================== RCS file: /cvs/gnome/evince/shell/ev-view.h,v retrieving revision 1.41 diff -u -u -r1.41 ev-view.h --- shell/ev-view.h 24 Sep 2005 14:18:42 -0000 1.41 +++ shell/ev-view.h 27 Sep 2005 12:34:45 -0000 @@ -63,6 +63,7 @@ /* Clipboard */ void ev_view_copy (EvView *view); void ev_view_select_all (EvView *view); +gboolean ev_view_get_has_selection (EvView *view); /* sizing and behavior */ /* These are all orthoganal to each other, except 'presentation' trumps all Index: shell/ev-window.c =================================================================== RCS file: /cvs/gnome/evince/shell/ev-window.c,v retrieving revision 1.237 diff -u -u -r1.237 ev-window.c --- shell/ev-window.c 26 Sep 2005 10:41:12 -0000 1.237 +++ shell/ev-window.c 27 Sep 2005 12:34:46 -0000 @@ -219,6 +219,8 @@ gboolean ok_to_copy = TRUE; gboolean has_properties = TRUE; gboolean override_restrictions = FALSE; + gboolean can_get_text = FALSE; + gboolean ok_to_copy_text = FALSE; GConfClient *client; view = EV_VIEW (ev_window->priv->view); @@ -263,6 +265,11 @@ g_object_unref (client); + if (has_document && ev_document_can_get_text (document)) { + can_get_text = TRUE; + ok_to_copy_text = ev_view_get_has_selection (view); + } + /* File menu */ /* "FileOpen": always sensitive */ set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy); @@ -272,8 +279,8 @@ /* Edit menu */ sensitive = has_pages && ev_document_can_get_text (document); - set_action_sensitive (ev_window, "EditCopy", sensitive && ok_to_copy); - set_action_sensitive (ev_window, "EditSelectAll", sensitive && ok_to_copy); + set_action_sensitive (ev_window, "EditCopy", sensitive && ok_to_copy_text); + set_action_sensitive (ev_window, "EditSelectAll", sensitive && can_get_text); set_action_sensitive (ev_window, "EditFind", has_pages && EV_IS_DOCUMENT_FIND (document)); set_action_sensitive (ev_window, "Slash", @@ -2423,6 +2430,12 @@ rotation); } +static void +ev_window_has_selection_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *window) +{ + update_action_sensitivity (window); +} + static void ev_window_dual_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) { @@ -3458,6 +3471,10 @@ g_signal_connect (ev_window->priv->view, "notify::rotation", G_CALLBACK (ev_window_rotation_changed_cb), + ev_window); + g_signal_connect (ev_window->priv->view, + "notify::has-selection", + G_CALLBACK (ev_window_has_selection_changed_cb), ev_window); ev_window->priv->find_bar = egg_find_bar_new ();