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

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

Issue 570014: Adding drag-drop support in and out of the Browser Action overflow menu.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 11 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/browser_actions_container.cc
===================================================================
--- chrome/browser/views/browser_actions_container.cc (revision 37978)
+++ chrome/browser/views/browser_actions_container.cc (working copy)
@@ -20,7 +20,6 @@
#include "chrome/browser/view_ids.h"
#include "chrome/browser/views/detachable_toolbar_view.h"
#include "chrome/browser/views/extensions/browser_action_drag_data.h"
-#include "chrome/browser/views/extensions/browser_action_overflow_menu_controller.h"
#include "chrome/browser/views/extensions/extension_popup.h"
#include "chrome/browser/views/toolbar_view.h"
#include "chrome/common/notification_source.h"
@@ -301,11 +300,13 @@
model_(NULL),
resize_gripper_(NULL),
chevron_(NULL),
+ overflow_menu_(NULL),
suppress_chevron_(false),
resize_amount_(0),
animation_target_size_(0),
drop_indicator_position_(-1),
- ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)) {
+ ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)),
+ ALLOW_THIS_IN_INITIALIZER_LIST(show_menu_task_factory_(this)) {
SetID(VIEW_ID_BROWSER_ACTION_TOOLBAR);
ExtensionsService* extension_service = profile->GetExtensionsService();
@@ -347,6 +348,7 @@
BrowserActionsContainer::~BrowserActionsContainer() {
if (model_)
model_->RemoveObserver(this);
+ StopShowFolderDropMenuTimer();
CloseOverflowMenu();
HidePopup();
DeleteBrowserActionViews();
@@ -384,10 +386,37 @@
void BrowserActionsContainer::CloseOverflowMenu() {
// Close the overflow menu if open (and the context menu off of that).
- if (overflow_menu_.get())
+ if (overflow_menu_)
overflow_menu_->CancelMenu();
}
+void BrowserActionsContainer::StopShowFolderDropMenuTimer() {
+ show_menu_task_factory_.RevokeAll();
+}
+
+void BrowserActionsContainer::StartShowFolderDropMenuTimer() {
+ int delay = View::GetMenuShowDelay();
+ MessageLoop::current()->PostDelayedTask(FROM_HERE,
+ show_menu_task_factory_.NewRunnableMethod(
+ &BrowserActionsContainer::ShowDropFolder),
+ delay);
+}
+
+void BrowserActionsContainer::ShowDropFolder() {
+ DCHECK(!overflow_menu_);
+ overflow_menu_ = new BrowserActionOverflowMenuController(
+ this, chevron_, browser_action_views_, VisibleBrowserActions());
+ overflow_menu_->set_observer(this);
+ overflow_menu_->RunMenu(GetWindow()->GetNativeWindow(), true);
+}
+
+void BrowserActionsContainer::SetDropIndicator(int x_pos) {
+ if (drop_indicator_position_ != x_pos) {
+ drop_indicator_position_ = x_pos;
+ SchedulePaint();
+ }
+}
+
void BrowserActionsContainer::CreateBrowserActionViews() {
DCHECK(browser_action_views_.empty());
for (ExtensionList::iterator iter = model_->begin();
@@ -635,6 +664,17 @@
int BrowserActionsContainer::OnDragUpdated(
const views::DropTargetEvent& event) {
+ // First check if we are above the chevron (overflow) menu.
+ if (GetViewForPoint(event.location()) == chevron_) {
+ SetDropIndicator(-1);
+
+ if (show_menu_task_factory_.empty() && !overflow_menu_)
+ StartShowFolderDropMenuTimer();
+ return DragDropTypes::DRAG_MOVE;
+ } else {
+ StopShowFolderDropMenuTimer();
+ }
+
// Modifying the x value before clamping affects how far you have to drag to
// get the drop indicator to shift to another position. Modifying after
// clamping affects where the drop indicator is drawn.
@@ -657,15 +697,14 @@
// Clamping gives us a value where the next button will be drawn, but we want
// to subtract the padding (and then some) to make it appear in-between the
// buttons.
- drop_indicator_position_ = x - kBrowserActionButtonPadding -
+ SetDropIndicator(x - kBrowserActionButtonPadding -
(UILayoutIsRightToLeft() ? kDropIndicatorOffsetRtl :
- kDropIndicatorOffsetLtr);
-
- SchedulePaint();
+ kDropIndicatorOffsetLtr));
return DragDropTypes::DRAG_MOVE;
}
void BrowserActionsContainer::OnDragExited() {
+ StopShowFolderDropMenuTimer();
drop_indicator_position_ = -1;
SchedulePaint();
}
@@ -711,6 +750,14 @@
return DragDropTypes::DRAG_MOVE;
}
+void BrowserActionsContainer::MoveBrowserAction(
+ const std::string& extension_id, size_t new_index) {
+ ExtensionsService* service = profile_->GetExtensionsService();
+ Extension* extension = service->GetExtensionById(extension_id, false);
+ model_->MoveBrowserAction(extension, new_index);
+ SchedulePaint();
+}
+
void BrowserActionsContainer::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
@@ -772,9 +819,10 @@
void BrowserActionsContainer::RunMenu(View* source, const gfx::Point& pt) {
if (source == chevron_) {
- overflow_menu_.reset(new BrowserActionOverflowMenuController(
- this, chevron_, browser_action_views_, VisibleBrowserActions()));
- overflow_menu_->RunMenu(GetWindow()->GetNativeWindow());
+ overflow_menu_ = new BrowserActionOverflowMenuController(
+ this, chevron_, browser_action_views_, VisibleBrowserActions());
+ overflow_menu_->set_observer(this);
+ overflow_menu_->RunMenu(GetWindow()->GetNativeWindow(), false);
}
}
@@ -1007,3 +1055,9 @@
profile_->GetPrefs()->SetInteger(prefs::kBrowserActionContainerWidth,
container_size_.width());
}
+
+void BrowserActionsContainer::NotifyMenuDeleted(
+ BrowserActionOverflowMenuController* controller) {
+ DCHECK(controller == overflow_menu_);
+ overflow_menu_ = NULL;
+}

Powered by Google App Engine
This is Rietveld 408576698