diff options
author | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-03 23:14:01 +0000 |
---|---|---|
committer | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-03 23:14:01 +0000 |
commit | 3ec1a3af311b95b325a3302679be1eb68e89e58e (patch) | |
tree | 61049c73993b824ce537cf62cea8acfb74cbf14a /chrome/browser/views/bookmark_manager_view.cc | |
parent | 32f720c5a051885d45b79533522c06870e7037ff (diff) | |
download | chromium_src-3ec1a3af311b95b325a3302679be1eb68e89e58e.zip chromium_src-3ec1a3af311b95b325a3302679be1eb68e89e58e.tar.gz chromium_src-3ec1a3af311b95b325a3302679be1eb68e89e58e.tar.bz2 |
Miscellaneous bookmark manager polish:
. Adds a menu button on the bookmark manager. If I finish up import
I'll add a second one for importing.
. Creating new page/folder from menu items selects new item in table.
. I changed around the FolderBookmarkTableModel to copy the contents
into a vector (now extends VectorBackedTabledModel). This is
necessitated by TableView not providing a moved notification. The
problem with previous approach is that I sent out ModelChanged on
any change, which loses selection and causes things to snap around.
I considered adding a moved method to TableView, but it's too much
work at this time.
. Added persisting of divider location in bookmark manager.
. When focus is on table pressing enter on a folder descends into the
folder, and pressing backspace goes back up a folder.
BUG=674
TEST=none
Review URL: http://codereview.chromium.org/8967
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@4512 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/views/bookmark_manager_view.cc')
-rw-r--r-- | chrome/browser/views/bookmark_manager_view.cc | 139 |
1 files changed, 105 insertions, 34 deletions
diff --git a/chrome/browser/views/bookmark_manager_view.cc b/chrome/browser/views/bookmark_manager_view.cc index 050323a..cccf012 100644 --- a/chrome/browser/views/bookmark_manager_view.cc +++ b/chrome/browser/views/bookmark_manager_view.cc @@ -8,7 +8,6 @@ #include "base/gfx/skia_utils.h" #include "chrome/app/locales/locale_settings.h" -#include "chrome/browser/bookmarks/bookmark_context_menu.h" #include "chrome/browser/bookmarks/bookmark_folder_tree_model.h" #include "chrome/browser/bookmarks/bookmark_model.h" #include "chrome/browser/bookmarks/bookmark_table_model.h" @@ -26,6 +25,7 @@ #include "chrome/common/pref_service.h" #include "chrome/views/container_win.h" #include "chrome/views/grid_layout.h" +#include "chrome/views/menu_button.h" #include "chrome/views/single_split_view.h" #include "chrome/views/window.h" @@ -56,15 +56,21 @@ BookmarkManagerView::BookmarkManagerView(Profile* profile) tree_view_->SetController(this); tree_view_->SetContextMenuController(this); - views::SingleSplitView* split_view = - new views::SingleSplitView(tree_view_, table_view_); + views::MenuButton* organize_menu_button = new views::MenuButton( + l10n_util::GetString(IDS_BOOKMARK_MANAGER_ORGANIZE_MENU), + this, true); + + split_view_ = new views::SingleSplitView(tree_view_, table_view_); views::GridLayout* layout = new views::GridLayout(this); SetLayoutManager(layout); - const int search_cs_id = 1; + const int top_id = 1; const int split_cs_id = 2; layout->SetInsets(kPanelVertMargin, 0, 0, 0); - views::ColumnSet* column_set = layout->AddColumnSet(search_cs_id); + views::ColumnSet* column_set = layout->AddColumnSet(top_id); + column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, + 1, views::GridLayout::USE_PREF, 0, 0); + column_set->AddPaddingColumn(1, kUnrelatedControlHorizontalSpacing); column_set->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 1, views::GridLayout::USE_PREF, 0, 0); column_set->AddPaddingColumn(0, kButtonHEdgeMargin); @@ -73,13 +79,14 @@ BookmarkManagerView::BookmarkManagerView(Profile* profile) column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, views::GridLayout::USE_PREF, 0, 0); - layout->StartRow(0, search_cs_id); + layout->StartRow(0, top_id); + layout->AddView(organize_menu_button); layout->AddView(search_tf_); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); layout->StartRow(1, split_cs_id); - layout->AddView(split_view); + layout->AddView(split_view_); BookmarkModel* bookmark_model = profile_->GetBookmarkModel(); if (!bookmark_model->IsLoaded()) @@ -103,6 +110,7 @@ BookmarkManagerView::~BookmarkManagerView() { // static void BookmarkManagerView::RegisterPrefs(PrefService* prefs) { prefs->RegisterDictionaryPref(prefs::kBookmarkManagerPlacement); + prefs->RegisterIntegerPref(prefs::kBookmarkManagerSplitLocation, -1); } // static @@ -148,9 +156,14 @@ void BookmarkManagerView::SelectInTree(BookmarkNode* node) { int index = table_model_->IndexOfNode(node); if (index != -1) table_view_->Select(index); + // TODO(sky): this doesn't work when invoked from add page. + table_view_->RequestFocus(); } } +BookmarkNode* BookmarkManagerView::GetSelectedFolder() { + return tree_view_->GetSelectedBookmarkNode(); +} std::vector<BookmarkNode*> BookmarkManagerView::GetSelectedTableNodes() { std::vector<BookmarkNode*> nodes; @@ -196,6 +209,11 @@ bool BookmarkManagerView::RestoreWindowPosition(CRect* bounds, bounds, maximized, always_on_top); } +void BookmarkManagerView::WindowClosing() { + g_browser_process->local_state()->SetInteger( + prefs::kBookmarkManagerSplitLocation, split_view_->divider_x()); +} + void BookmarkManagerView::OnDoubleClick() { std::vector<BookmarkNode*> nodes = GetSelectedTableNodes(); if (nodes.empty()) @@ -222,6 +240,26 @@ void BookmarkManagerView::OnTableViewDelete(views::TableView* table) { } } +void BookmarkManagerView::OnKeyDown(unsigned short virtual_keycode) { + switch (virtual_keycode) { + case VK_RETURN: { + std::vector<BookmarkNode*> selected_nodes = GetSelectedTableNodes(); + if (selected_nodes.size() == 1 && selected_nodes[0]->is_folder()) + SelectInTree(selected_nodes[0]); + break; + } + + case VK_BACK: { + BookmarkNode* selected_folder = GetSelectedFolder(); + if (selected_folder != NULL && + selected_folder->GetParent() != GetBookmarkModel()->root_node()) { + SelectInTree(selected_folder->GetParent()); + } + break; + } + } +} + void BookmarkManagerView::OnTreeViewSelectionChanged( views::TreeView* tree_view) { views::TreeModelNode* node = tree_view_->GetSelectedNode(); @@ -285,30 +323,21 @@ void BookmarkManagerView::ShowContextMenu(views::View* source, int x, int y, bool is_mouse_gesture) { - if (!GetBookmarkModel()->IsLoaded()) - return; - - if (source == table_view_) { - std::vector<BookmarkNode*> nodes = GetSelectedTableNodes(); - if (nodes.empty()) - return; + DCHECK(source == table_view_ || source == tree_view_); + bool is_table = (source == table_view_); + ShowMenu(GetContainer()->GetHWND(), x, y, + is_table ? BookmarkContextMenu::BOOKMARK_MANAGER_TABLE : + BookmarkContextMenu::BOOKMARK_MANAGER_TREE); +} - BookmarkNode* parent = tree_view_->GetSelectedBookmarkNode(); - BookmarkContextMenu menu(GetContainer()->GetHWND(), profile_, NULL, NULL, - parent, nodes, - BookmarkContextMenu::BOOKMARK_MANAGER_TABLE); - menu.RunMenuAt(x, y); - } else if (source == tree_view_) { - BookmarkNode* node = tree_view_->GetSelectedBookmarkNode(); - if (!node) - return; - std::vector<BookmarkNode*> nodes; - nodes.push_back(node); - BookmarkContextMenu menu(GetContainer()->GetHWND(), profile_, NULL, NULL, - node, nodes, - BookmarkContextMenu::BOOKMARK_MANAGER_TREE); - menu.RunMenuAt(x, y); - } +void BookmarkManagerView::RunMenu(views::View* source, + const CPoint& pt, + HWND hwnd) { + // TODO(glen): when you change the buttons around and what not, futz with + // this to make it look good. If you end up keeping padding numbers make them + // constants. + ShowMenu(hwnd, pt.x - source->width() + 5, pt.y + 2, + BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU); } BookmarkTableModel* BookmarkManagerView::CreateSearchTableModel() { @@ -342,10 +371,20 @@ void BookmarkManagerView::PerformSearch() { } void BookmarkManagerView::PrepareForShow() { - views::SingleSplitView* split_view = - static_cast<views::SingleSplitView*>(table_view_->GetParent()); - // Give a third of the space to the tree. - split_view->set_divider_x(split_view->width() / 3); + // Restore the split location, but don't let it get too small (or big), + // otherwise users might inadvertently not see the divider. + int split_x = g_browser_process->local_state()->GetInteger( + prefs::kBookmarkManagerSplitLocation); + if (split_x == -1) { + // First time running the bookmark manager, give a third of the width to + // the tree. + split_x = split_view_->width() / 3; + } + int min_split_size = split_view_->width() / 8; + // Make sure the user can see both the tree/table. + split_x = std::min(split_view_->width() - min_split_size, + std::max(min_split_size, split_x)); + split_view_->set_divider_x(split_x); if (!GetBookmarkModel()->IsLoaded()) { search_tf_->SetReadOnly(true); return; @@ -381,3 +420,35 @@ void BookmarkManagerView::LoadedImpl() { BookmarkModel* BookmarkManagerView::GetBookmarkModel() const { return profile_->GetBookmarkModel(); } + +void BookmarkManagerView::ShowMenu( + HWND host, + int x, + int y, + BookmarkContextMenu::ConfigurationType config) { + if (!GetBookmarkModel()->IsLoaded()) + return; + + if (config == BookmarkContextMenu::BOOKMARK_MANAGER_TABLE || + (config == BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU && + table_view_->HasFocus())) { + std::vector<BookmarkNode*> nodes = GetSelectedTableNodes(); + if (nodes.empty()) + return; + + BookmarkNode* parent = GetSelectedFolder(); + BookmarkContextMenu menu(host, profile_, NULL, NULL, parent, nodes, + config); + menu.RunMenuAt(x, y); + } else { + BookmarkNode* node = GetSelectedFolder(); + if (!node) + return; + + std::vector<BookmarkNode*> nodes; + nodes.push_back(node); + BookmarkContextMenu menu(GetContainer()->GetHWND(), profile_, NULL, NULL, + node, nodes, config); + menu.RunMenuAt(x, y); + } +} |