summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views
diff options
context:
space:
mode:
authorsky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-07 17:53:09 +0000
committersky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-07 17:53:09 +0000
commitfafc8a4203d4308251f17fc18a61cfec71a9a27c (patch)
treedfee81ebce10c148f4dfa13b4621bc8fd40473fb /chrome/browser/views
parent8bc886faa6a178f51bf094efe491ab1da9595d14 (diff)
downloadchromium_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.cc98
-rw-r--r--chrome/browser/views/bookmark_manager_view.h16
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);