diff options
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | src/bookmarks/ephy-bookmarks.c | 33 | ||||
-rw-r--r-- | src/bookmarks/ephy-bookmarks.h | 2 | ||||
-rw-r--r-- | src/bookmarks/ephy-new-bookmark.c | 72 | ||||
-rw-r--r-- | src/bookmarks/ephy-new-bookmark.h | 4 | ||||
-rw-r--r-- | src/ephy-history-window.c | 20 | ||||
-rw-r--r-- | src/popup-commands.c | 24 | ||||
-rw-r--r-- | src/window-commands.c | 24 |
8 files changed, 149 insertions, 47 deletions
@@ -1,3 +1,20 @@ +2003-05-12 Xan Lopez <xan@masilla.org> + + * src/bookmarks/ephy-bookmarks.c: (ephy_bookmarks_init_defaults), + (history_site_visited_cb), (ephy_bookmarks_find_bookmark), + (ephy_bookmarks_set_icon), (ephy_bookmarks_remove_keyword): + * src/bookmarks/ephy-bookmarks.h: + * src/bookmarks/ephy-new-bookmark.c: (duplicate_dialog_construct), + (ephy_new_bookmark_is_unique), (ephy_new_bookmark_new): + * src/bookmarks/ephy-new-bookmark.h: + * src/ephy-history-window.c: (cmd_bookmark_page): + * src/popup-commands.c: (popup_cmd_bookmark_link): + * src/window-commands.c: (window_cmd_file_bookmark_page): + + Don't allow to have more than one bookmark with the same + URL^H^H^Haddress, warn the user with a nice dialog. + Fixes #110854. + 2003-05-12 Marco Pesenti Gritti <marco@it.gnome.org> * embed/mozilla/ExternalProtocolService.cpp: diff --git a/src/bookmarks/ephy-bookmarks.c b/src/bookmarks/ephy-bookmarks.c index 529ad0d5d..730caf91e 100644 --- a/src/bookmarks/ephy-bookmarks.c +++ b/src/bookmarks/ephy-bookmarks.c @@ -229,8 +229,8 @@ ephy_bookmarks_class_init (EphyBookmarksClass *klass) static void ephy_bookmarks_init_defaults (EphyBookmarks *eb) { - int i; - int id; + int i, id; + EphyNode *node; EphyToolbarsModel *model; model = ephy_shell_get_toolbars_model (ephy_shell); @@ -246,7 +246,9 @@ ephy_bookmarks_init_defaults (EphyBookmarks *eb) default_bookmarks[i].location, default_bookmarks[i].smart_url); - id = ephy_bookmarks_get_bookmark_id (eb, default_bookmarks[i].location); + node = ephy_bookmarks_find_bookmark (eb, default_bookmarks[i].location); + if (node == NULL) break; + id = ephy_node_get_id (node); ephy_toolbars_model_add_bookmark (model, FALSE, id); } @@ -441,10 +443,8 @@ history_site_visited_cb (EphyHistory *gh, const char *url, EphyBookmarks *eb) EphyNode *node; guint id; - id = ephy_bookmarks_get_bookmark_id (eb, url); - if (id == 0) return; - - node = ephy_node_get_from_id (id); + node = ephy_bookmarks_find_bookmark (eb, url); + if (node == NULL) return; if (add_to_favorites (eb, node, gh)) { @@ -738,9 +738,9 @@ ephy_bookmarks_add (EphyBookmarks *eb, return bm; } -guint -ephy_bookmarks_get_bookmark_id (EphyBookmarks *eb, - const char *url) +EphyNode* +ephy_bookmarks_find_bookmark (EphyBookmarks *eb, + const char *url) { GPtrArray *children; int i; @@ -757,12 +757,12 @@ ephy_bookmarks_get_bookmark_id (EphyBookmarks *eb, if (strcmp (url, location) == 0) { ephy_node_thaw (eb->priv->bookmarks); - return ephy_node_get_id (kid); + return kid; } } ephy_node_thaw (eb->priv->bookmarks); - return 0; + return NULL; } void @@ -776,10 +776,8 @@ ephy_bookmarks_set_icon (EphyBookmarks *eb, g_return_if_fail (icon != NULL); - id = ephy_bookmarks_get_bookmark_id (eb, url); - if (id == 0) return; - - node = ephy_node_get_from_id (id); + node = ephy_bookmarks_find_bookmark (eb, url); + if (node == NULL) return; g_value_init (&value, G_TYPE_STRING); g_value_set_string (&value, icon); @@ -969,7 +967,8 @@ ephy_bookmarks_add_keyword (EphyBookmarks *eb, return key; } -void ephy_bookmarks_remove_keyword (EphyBookmarks *eb, +void +ephy_bookmarks_remove_keyword (EphyBookmarks *eb, EphyNode *keyword) { ephy_node_remove_child (eb->priv->keywords, keyword); diff --git a/src/bookmarks/ephy-bookmarks.h b/src/bookmarks/ephy-bookmarks.h index 162937c61..8cf8a4bf9 100644 --- a/src/bookmarks/ephy-bookmarks.h +++ b/src/bookmarks/ephy-bookmarks.h @@ -76,7 +76,7 @@ EphyNode *ephy_bookmarks_add (EphyBookmarks *eb, const char *url, const char *smart_url); -guint ephy_bookmarks_get_bookmark_id (EphyBookmarks *eb, +EphyNode* ephy_bookmarks_find_bookmark (EphyBookmarks *eb, const char *url); void ephy_bookmarks_set_icon (EphyBookmarks *eb, diff --git a/src/bookmarks/ephy-new-bookmark.c b/src/bookmarks/ephy-new-bookmark.c index 3e12ec602..db69e4ee7 100644 --- a/src/bookmarks/ephy-new-bookmark.c +++ b/src/bookmarks/ephy-new-bookmark.c @@ -288,6 +288,77 @@ ephy_new_bookmark_construct (EphyNewBookmark *editor) gtk_dialog_set_default_response (GTK_DIALOG (editor), GTK_RESPONSE_OK); } +static GtkWidget* +duplicate_dialog_construct (GtkWindow *parent, + const char *title) +{ + GtkWidget *dialog; + GtkWidget *hbox, *vbox, *label, *image; + char *str; + + dialog = gtk_dialog_new_with_buttons (_("Duplicated bookmark"), + GTK_WINDOW (parent), + GTK_DIALOG_NO_SEPARATOR, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + + gtk_container_set_border_width (GTK_CONTAINER (dialog), 6); + gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 12); + + hbox = gtk_hbox_new (FALSE, 6); + gtk_widget_show (hbox); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, + TRUE, TRUE, 0); + + image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, + GTK_ICON_SIZE_DIALOG); + gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0); + gtk_widget_show (image); + gtk_box_pack_start (GTK_BOX (hbox), image, TRUE, TRUE, 0); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_widget_show (vbox); + gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); + + label = gtk_label_new (NULL); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + str = g_strconcat ("<big>",_("A bookmark titled "), "<b>", title, "</b>", + _(" already exists for this address."), "</big>",NULL); + gtk_label_set_markup (GTK_LABEL (label), str); + g_free (str); + gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + return dialog; +} + +gboolean +ephy_new_bookmark_is_unique (EphyBookmarks *bookmarks, + GtkWindow *parent, + const char *address) +{ + EphyNode *node; + + node = ephy_bookmarks_find_bookmark (bookmarks, address); + if (node) + { + GtkWidget *dialog; + const char *title; + + title = ephy_node_get_property_string (node, EPHY_NODE_BMK_PROP_TITLE); + dialog = duplicate_dialog_construct (parent, title); + gtk_window_set_transient_for (GTK_WINDOW (dialog), parent); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + + return FALSE; + } + + return TRUE; +} + GtkWidget * ephy_new_bookmark_new (EphyBookmarks *bookmarks, GtkWindow *parent, @@ -302,7 +373,6 @@ ephy_new_bookmark_new (EphyBookmarks *bookmarks, "bookmarks", bookmarks, "location", location, NULL)); - if (parent) { gtk_window_set_transient_for (GTK_WINDOW (editor), parent); diff --git a/src/bookmarks/ephy-new-bookmark.h b/src/bookmarks/ephy-new-bookmark.h index 39c1f2f4a..fae8e3b7c 100644 --- a/src/bookmarks/ephy-new-bookmark.h +++ b/src/bookmarks/ephy-new-bookmark.h @@ -54,6 +54,10 @@ GtkWidget *ephy_new_bookmark_new (EphyBookmarks *bookmarks, GtkWindow *parent, const char *location); +gboolean ephy_new_bookmark_is_unique (EphyBookmarks *bookmarks, + GtkWindow *parent, + const char *location); + void ephy_new_bookmark_set_title (EphyNewBookmark *bookmark, const char *title); diff --git a/src/ephy-history-window.c b/src/ephy-history-window.c index 6d1be0f7b..5de92482b 100644 --- a/src/ephy-history-window.c +++ b/src/ephy-history-window.c @@ -462,14 +462,18 @@ cmd_bookmark_page (EggAction *action, node = EPHY_NODE (selection->data); location = ephy_node_get_property_string (node, EPHY_NODE_PAGE_PROP_LOCATION); title = ephy_node_get_property_string (node, EPHY_NODE_PAGE_PROP_TITLE); - new_bookmark = ephy_new_bookmark_new - (bookmarks, window, location); - ephy_new_bookmark_set_title - (EPHY_NEW_BOOKMARK (new_bookmark), title); - g_signal_connect (G_OBJECT (new_bookmark), "response", - G_CALLBACK (ephy_new_bookmark_response_cb), - NULL); - gtk_widget_show (new_bookmark); + if (ephy_new_bookmark_is_unique (bookmarks, GTK_WINDOW (window), + location)) + { + new_bookmark = ephy_new_bookmark_new + (bookmarks, window, location); + ephy_new_bookmark_set_title + (EPHY_NEW_BOOKMARK (new_bookmark), title); + g_signal_connect (G_OBJECT (new_bookmark), "response", + G_CALLBACK (ephy_new_bookmark_response_cb), + NULL); + gtk_widget_show (new_bookmark); + } } g_list_free (selection); } diff --git a/src/popup-commands.c b/src/popup-commands.c index a32a33618..78c335c55 100644 --- a/src/popup-commands.c +++ b/src/popup-commands.c @@ -156,16 +156,20 @@ popup_cmd_bookmark_link (EggAction *action, } bookmarks = ephy_shell_get_bookmarks (ephy_shell); - new_bookmark = ephy_new_bookmark_new - (bookmarks, GTK_WINDOW (window), location); - ephy_new_bookmark_set_title - (EPHY_NEW_BOOKMARK (new_bookmark), title); - ephy_new_bookmark_set_smarturl - (EPHY_NEW_BOOKMARK (new_bookmark), rel); - g_signal_connect (G_OBJECT (new_bookmark), "response", - G_CALLBACK (ephy_new_bookmark_response_cb), - NULL); - gtk_widget_show (new_bookmark); + if (ephy_new_bookmark_is_unique (bookmarks, GTK_WINDOW (window), + location)) + { + new_bookmark = ephy_new_bookmark_new + (bookmarks, GTK_WINDOW (window), location); + ephy_new_bookmark_set_title + (EPHY_NEW_BOOKMARK (new_bookmark), title); + ephy_new_bookmark_set_smarturl + (EPHY_NEW_BOOKMARK (new_bookmark), rel); + g_signal_connect (G_OBJECT (new_bookmark), "response", + G_CALLBACK (ephy_new_bookmark_response_cb), + NULL); + gtk_widget_show (new_bookmark); + } } void diff --git a/src/window-commands.c b/src/window-commands.c index 5d50f6e05..a4f1ef004 100644 --- a/src/window-commands.c +++ b/src/window-commands.c @@ -276,16 +276,20 @@ window_cmd_file_bookmark_page (EggAction *action, icon = ephy_tab_get_favicon_url (tab); bookmarks = ephy_shell_get_bookmarks (ephy_shell); - new_bookmark = ephy_new_bookmark_new - (bookmarks, GTK_WINDOW (window), location); - ephy_new_bookmark_set_title - (EPHY_NEW_BOOKMARK (new_bookmark), title); - ephy_new_bookmark_set_icon - (EPHY_NEW_BOOKMARK (new_bookmark), icon); - g_signal_connect (G_OBJECT (new_bookmark), "response", - G_CALLBACK (ephy_new_bookmark_response_cb), - NULL); - gtk_widget_show (new_bookmark); + if (ephy_new_bookmark_is_unique (bookmarks, GTK_WINDOW (window), + location)) + { + new_bookmark = ephy_new_bookmark_new + (bookmarks, GTK_WINDOW (window), location); + ephy_new_bookmark_set_title + (EPHY_NEW_BOOKMARK (new_bookmark), title); + ephy_new_bookmark_set_icon + (EPHY_NEW_BOOKMARK (new_bookmark), icon); + g_signal_connect (G_OBJECT (new_bookmark), "response", + G_CALLBACK (ephy_new_bookmark_response_cb), + NULL); + gtk_widget_show (new_bookmark); + } } void |