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 |