summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-13 03:17:31 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-13 03:17:31 +0000
commiteabecbe43e7f5f238503383d481a01d39e4380cf (patch)
treefff501860f1c033f4c426e886dabd83aae764c16 /chrome/browser/gtk
parentc4789ead19306b64518910ad8be4ff6b835cf509 (diff)
downloadchromium_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.cc72
-rw-r--r--chrome/browser/gtk/bookmark_editor_gtk.h5
-rw-r--r--chrome/browser/gtk/bookmark_manager_gtk.cc4
-rw-r--r--chrome/browser/gtk/bookmark_tree_model.cc13
-rw-r--r--chrome/browser/gtk/bookmark_tree_model.h9
-rwxr-xr-xchrome/browser/gtk/browser_window_gtk.cc2
-rw-r--r--chrome/browser/gtk/tabs/tab_gtk.cc9
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 },
};