Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(509)

Unified Diff: chrome/browser/views/bookmark_menu_button.cc

Issue 42460: Adds a bookmark menu. This is experimental. To turn on you need... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/views/bookmark_menu_button.cc
===================================================================
--- chrome/browser/views/bookmark_menu_button.cc (revision 0)
+++ chrome/browser/views/bookmark_menu_button.cc (revision 0)
@@ -0,0 +1,145 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/views/bookmark_menu_button.h"
+
+#include "chrome/browser/bookmarks/bookmark_model.h"
+#include "chrome/browser/bookmarks/bookmark_utils.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/view_ids.h"
+#include "chrome/common/os_exchange_data.h"
+#include "chrome/common/resource_bundle.h"
+#include "chrome/views/widget/widget.h"
+#include "grit/theme_resources.h"
+
+BookmarkMenuButton::BookmarkMenuButton(Browser* browser)
+ : views::MenuButton(NULL, std::wstring(), NULL, false),
+ browser_(browser),
+ bookmark_drop_menu_(NULL),
+ drop_operation_(0) {
+ set_menu_delegate(this);
+ SetID(VIEW_ID_BOOKMARK_MENU);
+
+ ResourceBundle &rb = ResourceBundle::GetSharedInstance();
+ // TODO (sky): if we keep this code, we need real icons, a11y support, and a
+ // tooltip.
+ SetIcon(*rb.GetBitmapNamed(IDR_MENU_BOOKMARK));
+}
+
+BookmarkMenuButton::~BookmarkMenuButton() {
+ if (bookmark_drop_menu_)
+ bookmark_drop_menu_->set_observer(NULL);
+}
+
+bool BookmarkMenuButton::CanDrop(const OSExchangeData& data) {
+ BookmarkModel* bookmark_model = GetBookmarkModel();
+ if (!bookmark_model || !bookmark_model->IsLoaded())
+ return false;
+
+ drag_data_ = BookmarkDragData();
+ // Only accept drops of 1 node, which is the case for all data dragged from
+ // bookmark bar and menus.
+ return drag_data_.Read(data) && drag_data_.has_single_url();
+}
+
+int BookmarkMenuButton::OnDragUpdated(const views::DropTargetEvent& event) {
+ if (!drag_data_.is_valid())
+ return 0;
+
+ BookmarkModel* bookmark_model = GetBookmarkModel();
+ drop_operation_ = bookmark_utils::BookmarkDropOperation(
+ browser_->profile(), event, drag_data_,
+ bookmark_model->GetBookmarkBarNode(),
+ bookmark_model->GetBookmarkBarNode()->GetChildCount());
+ if (drop_operation_ != 0)
+ StartShowFolderDropMenuTimer();
+ else
+ StopShowFolderDropMenuTimer();
+ return drop_operation_;
+}
+
+void BookmarkMenuButton::OnDragExited() {
+ StopShowFolderDropMenuTimer();
+ drag_data_ = BookmarkDragData();
+}
+
+int BookmarkMenuButton::OnPerformDrop(const views::DropTargetEvent& event) {
+ StopShowFolderDropMenuTimer();
+
+ if (bookmark_drop_menu_)
+ bookmark_drop_menu_->Cancel();
+
+ // Reset the drag data to take as little memory as needed.
+ BookmarkDragData data = drag_data_;
+ drag_data_ = BookmarkDragData();
+
+ if (!drop_operation_)
+ return DragDropTypes::DRAG_NONE;
+
+ BookmarkModel* model = GetBookmarkModel();
+ if (!model)
+ return DragDropTypes::DRAG_NONE;
+
+ BookmarkNode* parent = model->GetBookmarkBarNode();
+ return bookmark_utils::PerformBookmarkDrop(
+ browser_->profile(), data, parent, parent->GetChildCount());
+}
+
+void BookmarkMenuButton::BookmarkMenuDeleted(
+ BookmarkMenuController* controller) {
+ bookmark_drop_menu_ = NULL;
+}
+
+void BookmarkMenuButton::RunMenu(views::View* source,
+ const CPoint& pt,
+ gfx::NativeView hwnd) {
+ RunMenu(source, pt, hwnd, false);
+}
+
+void BookmarkMenuButton::RunMenu(views::View* source,
+ const CPoint& pt,
+ gfx::NativeView hwnd,
+ bool for_drop) {
+ Profile* profile = browser_->profile();
+ BookmarkMenuController* menu = new BookmarkMenuController(
+ browser_, profile, browser_->GetSelectedTabContents(), hwnd,
+ GetBookmarkModel()->GetBookmarkBarNode(), 0, true);
+
+ views::MenuItemView::AnchorPosition anchor = views::MenuItemView::TOPRIGHT;
+ if (UILayoutIsRightToLeft())
+ anchor = views::MenuItemView::TOPLEFT;
+ gfx::Point button_origin;
+ ConvertPointToScreen(this, &button_origin);
+ gfx::Rect menu_bounds(button_origin.x(), button_origin.y(), width(),
+ height());
+ if (for_drop) {
+ bookmark_drop_menu_ = menu;
+ bookmark_drop_menu_->set_observer(this);
+ }
+ menu->RunMenuAt(menu_bounds, views::MenuItemView::TOPRIGHT, for_drop);
+}
+
+BookmarkModel* BookmarkMenuButton::GetBookmarkModel() {
+ return browser_->profile()->GetBookmarkModel();
+}
+
+void BookmarkMenuButton::StartShowFolderDropMenuTimer() {
+ if (show_drop_menu_timer_.IsRunning())
+ return;
+
+ static DWORD delay = 0;
+ if (!delay && !SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &delay, 0))
+ delay = 400;
+ show_drop_menu_timer_.Start(base::TimeDelta::FromMilliseconds(delay),
+ this, &BookmarkMenuButton::ShowDropMenu);
+}
+
+void BookmarkMenuButton::StopShowFolderDropMenuTimer() {
+ show_drop_menu_timer_.Stop();
+}
+
+void BookmarkMenuButton::ShowDropMenu() {
+ RunMenu(NULL, CPoint(), GetWidget()->GetNativeView(), true);
+}
Property changes on: chrome\browser\views\bookmark_menu_button.cc
___________________________________________________________________
Added: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698