diff options
author | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-07 17:53:09 +0000 |
---|---|---|
committer | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-07 17:53:09 +0000 |
commit | fafc8a4203d4308251f17fc18a61cfec71a9a27c (patch) | |
tree | dfee81ebce10c148f4dfa13b4621bc8fd40473fb /chrome/browser/views | |
parent | 8bc886faa6a178f51bf094efe491ab1da9595d14 (diff) | |
download | chromium_src-fafc8a4203d4308251f17fc18a61cfec71a9a27c.zip chromium_src-fafc8a4203d4308251f17fc18a61cfec71a9a27c.tar.gz chromium_src-fafc8a4203d4308251f17fc18a61cfec71a9a27c.tar.bz2 |
Adds cut/copy/paste support to the bookmark manager tree/table and
context menus.
BUG=4186
TEST=try cut/copy/paste from table/tree in the bookmark manager as
well as context menus in bookmark manager.
Review URL: http://codereview.chromium.org/9481
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@4993 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/views')
-rw-r--r-- | chrome/browser/views/bookmark_manager_view.cc | 98 | ||||
-rw-r--r-- | chrome/browser/views/bookmark_manager_view.h | 16 |
2 files changed, 111 insertions, 3 deletions
diff --git a/chrome/browser/views/bookmark_manager_view.cc b/chrome/browser/views/bookmark_manager_view.cc index 76ac3d7..0c967a5 100644 --- a/chrome/browser/views/bookmark_manager_view.cc +++ b/chrome/browser/views/bookmark_manager_view.cc @@ -88,6 +88,42 @@ class ImportObserverImpl : public ImportObserver { DISALLOW_COPY_AND_ASSIGN(ImportObserverImpl); }; +// Converts a virtual keycode into the CutCopyPasteType. +BookmarkManagerView::CutCopyPasteType KeyCodeToCutCopyPaste( + unsigned short virtual_keycode) { + switch (virtual_keycode) { + case VK_INSERT: + if (GetKeyState(VK_CONTROL) < 0) + return BookmarkManagerView::COPY; + if (GetKeyState(VK_SHIFT) < 0) + return BookmarkManagerView::PASTE; + return BookmarkManagerView::NONE; + + case VK_DELETE: + if (GetKeyState(VK_SHIFT) < 0) + return BookmarkManagerView::CUT; + return BookmarkManagerView::NONE; + + case 'C': + if (GetKeyState(VK_CONTROL) < 0) + return BookmarkManagerView::COPY; + return BookmarkManagerView::NONE; + + case 'V': + if (GetKeyState(VK_CONTROL) < 0) + return BookmarkManagerView::PASTE; + return BookmarkManagerView::NONE; + + case 'X': + if (GetKeyState(VK_CONTROL) < 0) + return BookmarkManagerView::CUT; + return BookmarkManagerView::NONE; + + default: + return BookmarkManagerView::NONE; + } +} + } // namespace BookmarkManagerView::BookmarkManagerView(Profile* profile) @@ -320,8 +356,13 @@ 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()) + if (selected_nodes.size() == 1 && selected_nodes[0]->is_folder()) { SelectInTree(selected_nodes[0]); + } else { + bookmark_utils::OpenAll( + GetContainer()->GetHWND(), profile_, NULL, selected_nodes, + CURRENT_TAB); + } break; } @@ -333,6 +374,10 @@ void BookmarkManagerView::OnKeyDown(unsigned short virtual_keycode) { } break; } + + default: + OnCutCopyPaste(KeyCodeToCutCopyPaste(virtual_keycode), true); + break; } } @@ -372,6 +417,24 @@ void BookmarkManagerView::OnTreeViewSelectionChanged( SetTableModel(new_table_model, table_parent_node); } +void BookmarkManagerView::OnTreeViewKeyDown(unsigned short virtual_keycode) { + switch (virtual_keycode) { + case VK_DELETE: { + BookmarkNode* node = GetSelectedFolder(); + if (!node || node->GetParent() == GetBookmarkModel()->root_node()) + return; + + BookmarkNode* parent = node->GetParent(); + GetBookmarkModel()->Remove(parent, parent->IndexOfChild(node)); + break; + } + + default: + OnCutCopyPaste(KeyCodeToCutCopyPaste(virtual_keycode), false); + break; + } +} + void BookmarkManagerView::Loaded(BookmarkModel* model) { model->RemoveObserver(this); LoadedImpl(); @@ -401,6 +464,14 @@ void BookmarkManagerView::ShowContextMenu(views::View* source, bool is_mouse_gesture) { DCHECK(source == table_view_ || source == tree_view_); bool is_table = (source == table_view_); + if (is_table && x == -1 && y == -1) { + // TODO(sky): promote code to tableview that determines the location based + // on the selection. This is temporary until I fix that. + gfx::Point location(table_view_->width() / 2, table_view_->height() / 2); + View::ConvertPointToScreen(table_view_, &location); + x = location.x(); + y = location.y(); + } ShowMenu(GetContainer()->GetHWND(), x, y, is_table ? BookmarkContextMenu::BOOKMARK_MANAGER_TABLE : BookmarkContextMenu::BOOKMARK_MANAGER_TREE); @@ -584,6 +655,31 @@ void BookmarkManagerView::ShowMenu( } } +void BookmarkManagerView::OnCutCopyPaste(CutCopyPasteType type, + bool from_table) { + if (type == CUT || type == COPY) { + std::vector<BookmarkNode*> nodes; + if (from_table) { + nodes = GetSelectedTableNodes(); + } else { + BookmarkNode* node = GetSelectedFolder(); + if (!node || node->GetParent() == GetBookmarkModel()->root_node()) + return; + nodes.push_back(node); + } + if (nodes.empty()) + return; + + bookmark_utils::CopyToClipboard(GetBookmarkModel(), nodes, type == CUT); + } else if (type == PASTE) { + int index = from_table ? table_view_->FirstSelectedRow() : -1; + if (index != -1) + index++; + bookmark_utils::PasteFromClipboard(GetBookmarkModel(), GetSelectedFolder(), + index); + } +} + void BookmarkManagerView::ShowToolsMenu(HWND host, int x, int y) { views::MenuItemView menu(this); menu.AppendMenuItemWithLabel( diff --git a/chrome/browser/views/bookmark_manager_view.h b/chrome/browser/views/bookmark_manager_view.h index 0aa83dd..be99a16 100644 --- a/chrome/browser/views/bookmark_manager_view.h +++ b/chrome/browser/views/bookmark_manager_view.h @@ -45,6 +45,13 @@ class BookmarkManagerView : public views::View, public views::MenuDelegate, public SelectFileDialog::Listener { public: + enum CutCopyPasteType { + CUT, + COPY, + PASTE, + NONE + }; + explicit BookmarkManagerView(Profile* profile); virtual ~BookmarkManagerView(); @@ -63,7 +70,7 @@ class BookmarkManagerView : public views::View, // Expands all the children of the selected folder. void ExpandAll(BookmarkNode* node); - // Returns the selected folder, which may be null. + // Returns the selected folder in the tree, which may be null. BookmarkNode* GetSelectedFolder(); // Returns the selection of the table. @@ -99,8 +106,9 @@ class BookmarkManagerView : public views::View, virtual void OnTableViewDelete(views::TableView* table); virtual void OnKeyDown(unsigned short virtual_keycode); - // TreeViewController method. + // TreeViewController methods. virtual void OnTreeViewSelectionChanged(views::TreeView* tree_view); + virtual void OnTreeViewKeyDown(unsigned short virtual_keycode); // BookmarkModelObserver. We're only installed as an observer until the // bookmarks are loaded. @@ -181,6 +189,10 @@ class BookmarkManagerView : public views::View, int y, BookmarkContextMenu::ConfigurationType config); + // Invoked to handle cut/copy/paste from the table or tree. If |from_table| + // is true the source is the table. + void OnCutCopyPaste(CutCopyPasteType type, bool from_table); + // Shows the tools menu. void ShowToolsMenu(HWND host, int x, int y); |