diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-13 03:17:31 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-13 03:17:31 +0000 |
commit | eabecbe43e7f5f238503383d481a01d39e4380cf (patch) | |
tree | fff501860f1c033f4c426e886dabd83aae764c16 /chrome/browser/gtk | |
parent | c4789ead19306b64518910ad8be4ff6b835cf509 (diff) | |
download | chromium_src-eabecbe43e7f5f238503383d481a01d39e4380cf.zip chromium_src-eabecbe43e7f5f238503383d481a01d39e4380cf.tar.gz chromium_src-eabecbe43e7f5f238503383d481a01d39e4380cf.tar.bz2 |
Wires up bookmark all tabs on linux.
BUG=2935
TEST=Create two tabs, press control-shift-d. You should be presented
with a dialog that lets you give a name to a folder. Change the name,
press enter and make sure you get a bookmark folder populated with the
urls of any open tabs.
Review URL: http://codereview.chromium.org/268038
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@28788 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk')
-rw-r--r-- | chrome/browser/gtk/bookmark_editor_gtk.cc | 72 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_editor_gtk.h | 5 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_manager_gtk.cc | 4 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_tree_model.cc | 13 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_tree_model.h | 9 | ||||
-rwxr-xr-x | chrome/browser/gtk/browser_window_gtk.cc | 2 | ||||
-rw-r--r-- | chrome/browser/gtk/tabs/tab_gtk.cc | 9 |
7 files changed, 77 insertions, 37 deletions
diff --git a/chrome/browser/gtk/bookmark_editor_gtk.cc b/chrome/browser/gtk/bookmark_editor_gtk.cc index 7b08648..9b95b66 100644 --- a/chrome/browser/gtk/bookmark_editor_gtk.cc +++ b/chrome/browser/gtk/bookmark_editor_gtk.cc @@ -109,7 +109,7 @@ void BookmarkEditorGtk::Init(GtkWindow* parent_window) { // ||+- GtkLabel ------+ +- GtkEntry |name_entry_| --------------+|| // ||| | | ||| // ||+-----------------+ +---------------------------------------+|| - // ||+- GtkLabel ------+ +- GtkEntry |url_entry_| ---------------+|| + // ||+- GtkLabel ------+ +- GtkEntry |url_entry_| ---------------+|| * // ||| | | ||| // ||+-----------------+ +---------------------------------------+|| // |+-------------------------------------------------------------+| @@ -124,6 +124,8 @@ void BookmarkEditorGtk::Init(GtkWindow* parent_window) { // ||+-----------------------------------------------------------+|| // |+-------------------------------------------------------------+| // +---------------------------------------------------------------+ + // + // * The url and corresponding label are not shown if node_ is a folder. GtkWidget* content_area = GTK_DIALOG(dialog_)->vbox; gtk_box_set_spacing(GTK_BOX(content_area), gtk_util::kContentAreaSpacing); @@ -136,27 +138,37 @@ void BookmarkEditorGtk::Init(GtkWindow* parent_window) { G_CALLBACK(OnEntryChanged), this); gtk_entry_set_activates_default(GTK_ENTRY(name_entry_), TRUE); - url_entry_ = gtk_entry_new(); - gtk_entry_set_text(GTK_ENTRY(url_entry_), - node_ ? node_->GetURL().spec().c_str() : ""); - g_signal_connect(G_OBJECT(url_entry_), "changed", - G_CALLBACK(OnEntryChanged), this); - gtk_entry_set_activates_default(GTK_ENTRY(url_entry_), TRUE); + GtkWidget* table; + if (!IsEditingFolder()) { + url_entry_ = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(url_entry_), + node_ ? node_->GetURL().spec().c_str() : ""); + g_signal_connect(G_OBJECT(url_entry_), "changed", + G_CALLBACK(OnEntryChanged), this); + gtk_entry_set_activates_default(GTK_ENTRY(url_entry_), TRUE); + table = gtk_util::CreateLabeledControlsGroup(NULL, + l10n_util::GetStringUTF8(IDS_BOOMARK_EDITOR_NAME_LABEL).c_str(), + name_entry_, + l10n_util::GetStringUTF8(IDS_BOOMARK_EDITOR_URL_LABEL).c_str(), + url_entry_, + NULL); - GtkWidget* table = gtk_util::CreateLabeledControlsGroup(NULL, - l10n_util::GetStringUTF8(IDS_BOOMARK_EDITOR_NAME_LABEL).c_str(), - name_entry_, - l10n_util::GetStringUTF8(IDS_BOOMARK_EDITOR_URL_LABEL).c_str(), - url_entry_, - NULL); + } else { + url_entry_ = NULL; + table = gtk_util::CreateLabeledControlsGroup(NULL, + l10n_util::GetStringUTF8(IDS_BOOMARK_EDITOR_NAME_LABEL).c_str(), + name_entry_, + NULL); + } gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); if (show_tree_) { GtkTreeIter selected_iter; int64 selected_id = parent_ ? parent_->id() : 0; + const BookmarkNode* node_to_ignore = IsEditingFolder() ? node_ : NULL; tree_store_ = bookmark_utils::MakeFolderTreeStore(); - bookmark_utils::AddToTreeStore(bb_model_, selected_id, + bookmark_utils::AddToTreeStore(bb_model_, selected_id, node_to_ignore, tree_store_, &selected_iter); tree_view_ = bookmark_utils::MakeTreeViewForStore(tree_store_); gtk_widget_set_size_request(tree_view_, kTreeWidth, kTreeHeight); @@ -255,6 +267,9 @@ void BookmarkEditorGtk::Reset() { } GURL BookmarkEditorGtk::GetInputURL() const { + if (!url_entry_) + return GURL(); // Happens when we're editing a folder. + std::wstring input = URLFixerUpper::FixupURL( UTF8ToWide(gtk_entry_get_text(GTK_ENTRY(url_entry_))), L""); return GURL(WideToUTF8(input)); @@ -321,6 +336,10 @@ void BookmarkEditorGtk::AddNewGroup(GtkTreeIter* parent, GtkTreeIter* child) { -1); } +bool BookmarkEditorGtk::IsEditingFolder() const { + return node_ && node_->is_folder(); +} + // static void BookmarkEditorGtk::OnSelectionChanged(GtkTreeSelection* selection, BookmarkEditorGtk* dialog) { @@ -362,16 +381,25 @@ void BookmarkEditorGtk::OnWindowDestroy(GtkWidget* widget, // static void BookmarkEditorGtk::OnEntryChanged(GtkEditable* entry, BookmarkEditorGtk* dialog) { - const GURL url(dialog->GetInputURL()); - if (!url.is_valid()) { - gtk_widget_modify_base(dialog->url_entry_, GTK_STATE_NORMAL, &kErrorColor); - gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog->dialog_), - GTK_RESPONSE_ACCEPT, FALSE); + gboolean can_close = TRUE; + if (dialog->IsEditingFolder()) { + if (dialog->GetInputTitle().empty()) { + gtk_widget_modify_base(dialog->name_entry_, GTK_STATE_NORMAL, &kErrorColor); + can_close = FALSE; + } else { + gtk_widget_modify_base(dialog->name_entry_, GTK_STATE_NORMAL, NULL); + } } else { - gtk_widget_modify_base(dialog->url_entry_, GTK_STATE_NORMAL, NULL); - gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog->dialog_), - GTK_RESPONSE_ACCEPT, TRUE); + GURL url(dialog->GetInputURL()); + if (!url.is_valid()) { + gtk_widget_modify_base(dialog->url_entry_, GTK_STATE_NORMAL, &kErrorColor); + can_close = FALSE; + } else { + gtk_widget_modify_base(dialog->url_entry_, GTK_STATE_NORMAL, NULL); + } } + gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog->dialog_), + GTK_RESPONSE_ACCEPT, can_close); } // static diff --git a/chrome/browser/gtk/bookmark_editor_gtk.h b/chrome/browser/gtk/bookmark_editor_gtk.h index 42db2a4..8d6efd9 100644 --- a/chrome/browser/gtk/bookmark_editor_gtk.h +++ b/chrome/browser/gtk/bookmark_editor_gtk.h @@ -90,6 +90,9 @@ class BookmarkEditorGtk : public BookmarkEditor, // new group. void AddNewGroup(GtkTreeIter* parent, GtkTreeIter* child); + // Returns true if editing a folder. + bool IsEditingFolder() const; + static void OnSelectionChanged(GtkTreeSelection* treeselection, BookmarkEditorGtk* dialog); @@ -111,7 +114,7 @@ class BookmarkEditorGtk : public BookmarkEditor, // The dialog to display on screen. GtkWidget* dialog_; GtkWidget* name_entry_; - GtkWidget* url_entry_; + GtkWidget* url_entry_; // This is NULL if IsEditingFolder. GtkWidget* tree_view_; GtkWidget* new_folder_button_; diff --git a/chrome/browser/gtk/bookmark_manager_gtk.cc b/chrome/browser/gtk/bookmark_manager_gtk.cc index 0ffb725..11cc191 100644 --- a/chrome/browser/gtk/bookmark_manager_gtk.cc +++ b/chrome/browser/gtk/bookmark_manager_gtk.cc @@ -224,7 +224,7 @@ void BookmarkManagerGtk::BookmarkNodeAdded(BookmarkModel* model, if (node->is_folder()) { GtkTreeIter iter = { 0, }; if (RecursiveFind(GTK_TREE_MODEL(left_store_), &iter, parent->id())) - bookmark_utils::AddToTreeStoreAt(node, 0, left_store_, NULL, &iter); + bookmark_utils::AddToTreeStoreAt(node, 0, NULL, left_store_, NULL, &iter); } } @@ -615,7 +615,7 @@ void BookmarkManagerGtk::ResetOrganizeMenu(bool left) { void BookmarkManagerGtk::BuildLeftStore() { GtkTreeIter select_iter; bookmark_utils::AddToTreeStore(model_, - model_->GetBookmarkBarNode()->id(), left_store_, &select_iter); + model_->GetBookmarkBarNode()->id(), NULL, left_store_, &select_iter); gtk_tree_selection_select_iter(left_selection(), &select_iter); // TODO(estade): is there a decent stock icon we can use here? diff --git a/chrome/browser/gtk/bookmark_tree_model.cc b/chrome/browser/gtk/bookmark_tree_model.cc index 2d59a18..e8e52ca 100644 --- a/chrome/browser/gtk/bookmark_tree_model.cc +++ b/chrome/browser/gtk/bookmark_tree_model.cc @@ -98,10 +98,11 @@ GtkTreeStore* MakeFolderTreeStore() { } void AddToTreeStore(BookmarkModel* model, int64 selected_id, - GtkTreeStore* store, GtkTreeIter* selected_iter) { + const BookmarkNode* node_to_ignore, GtkTreeStore* store, + GtkTreeIter* selected_iter) { const BookmarkNode* root_node = model->root_node(); for (int i = 0; i < root_node->GetChildCount(); ++i) { - AddToTreeStoreAt(root_node->GetChild(i), selected_id, store, + AddToTreeStoreAt(root_node->GetChild(i), selected_id, node_to_ignore, store, selected_iter, NULL); } } @@ -137,9 +138,9 @@ GtkCellRenderer* GetCellRendererText(GtkTreeView* tree_view) { } void AddToTreeStoreAt(const BookmarkNode* node, int64 selected_id, - GtkTreeStore* store, GtkTreeIter* selected_iter, - GtkTreeIter* parent) { - if (!node->is_folder()) + const BookmarkNode* node_to_ignore, GtkTreeStore* store, + GtkTreeIter* selected_iter, GtkTreeIter* parent) { + if (!node->is_folder() || node == node_to_ignore) return; GtkTreeIter iter; @@ -152,7 +153,7 @@ void AddToTreeStoreAt(const BookmarkNode* node, int64 selected_id, } for (int i = 0; i < node->GetChildCount(); ++i) { - AddToTreeStoreAt(node->GetChild(i), selected_id, store, + AddToTreeStoreAt(node->GetChild(i), selected_id, node_to_ignore, store, selected_iter, &iter); } } diff --git a/chrome/browser/gtk/bookmark_tree_model.h b/chrome/browser/gtk/bookmark_tree_model.h index 80b1984..01da71f 100644 --- a/chrome/browser/gtk/bookmark_tree_model.h +++ b/chrome/browser/gtk/bookmark_tree_model.h @@ -41,14 +41,17 @@ GtkTreeStore* MakeFolderTreeStore(); // |recursive| indicates whether to recurse into sub-directories (if false, // the tree store will effectively be a list). |only_folders| indicates whether // to include bookmarks in the tree, or to only show folders. +// If |node_to_ignore| is non-null, a node in the tree store is not created for +// it. void AddToTreeStore(BookmarkModel* model, int64 selected_id, - GtkTreeStore* store, GtkTreeIter* selected_iter); + const BookmarkNode* node_to_ignore, GtkTreeStore* store, + GtkTreeIter* selected_iter); // As above, but inserts just the tree rooted at |node| as a child of |parent|. // If |parent| is NULL, add it at the top level. void AddToTreeStoreAt(const BookmarkNode* node, int64 selected_id, - GtkTreeStore* store, GtkTreeIter* selected_iter, - GtkTreeIter* parent); + const BookmarkNode* node_to_ignore, GtkTreeStore* store, + GtkTreeIter* selected_iter, GtkTreeIter* parent); // Makes a tree view for the store. This will take ownership of |store| and the // returned widget has a floating reference. diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc index 33b959e..fc9b887 100755 --- a/chrome/browser/gtk/browser_window_gtk.cc +++ b/chrome/browser/gtk/browser_window_gtk.cc @@ -286,6 +286,8 @@ const struct AcceleratorMapping { { XF86XK_Refresh, IDC_RELOAD, GdkModifierType(0) }, // Miscellany. + { GDK_d, IDC_BOOKMARK_ALL_TABS, + GdkModifierType(GDK_CONTROL_MASK | GDK_SHIFT_MASK) }, { GDK_d, IDC_BOOKMARK_PAGE, GDK_CONTROL_MASK }, { XF86XK_AddFavorite, IDC_BOOKMARK_PAGE, GdkModifierType(0) }, { XF86XK_Favorites, IDC_SHOW_BOOKMARK_BAR, GdkModifierType(0) }, diff --git a/chrome/browser/gtk/tabs/tab_gtk.cc b/chrome/browser/gtk/tabs/tab_gtk.cc index 904edc3..f9a12e8 100644 --- a/chrome/browser/gtk/tabs/tab_gtk.cc +++ b/chrome/browser/gtk/tabs/tab_gtk.cc @@ -40,6 +40,8 @@ class TabGtk::ContextMenuController : public MenuGtk::Delegate { 0, NULL, GDK_r, GDK_CONTROL_MASK, true }, { MENU_NORMAL, TabStripModel::CommandDuplicate, IDS_TAB_CXMENU_DUPLICATE }, + { MENU_CHECKBOX, TabStripModel::CommandTogglePinned, + IDS_TAB_CXMENU_PIN_TAB }, { MENU_SEPARATOR }, { MENU_NORMAL, TabStripModel::CommandCloseTab, IDS_TAB_CXMENU_CLOSETAB, 0, NULL, GDK_w, GDK_CONTROL_MASK, true }, @@ -49,11 +51,12 @@ class TabGtk::ContextMenuController : public MenuGtk::Delegate { IDS_TAB_CXMENU_CLOSETABSTORIGHT }, { MENU_NORMAL, TabStripModel::CommandCloseTabsOpenedBy, IDS_TAB_CXMENU_CLOSETABSOPENEDBY }, + { MENU_SEPARATOR }, { MENU_NORMAL, TabStripModel::CommandRestoreTab, IDS_RESTORE_TAB, 0, NULL, GDK_t, GDK_CONTROL_MASK | GDK_SHIFT_MASK, true }, - { MENU_SEPARATOR }, - { MENU_CHECKBOX, TabStripModel::CommandTogglePinned, - IDS_TAB_CXMENU_PIN_TAB }, + { MENU_NORMAL, TabStripModel::CommandBookmarkAllTabs, + IDS_TAB_CXMENU_BOOKMARK_ALL_TABS, 0, NULL, GDK_d, + GDK_CONTROL_MASK | GDK_SHIFT_MASK, true }, { MENU_END }, }; |