Index: chrome/browser/ui/panels/docked_panel_strip.cc |
diff --git a/chrome/browser/ui/panels/docked_panel_strip.cc b/chrome/browser/ui/panels/docked_panel_strip.cc |
index 40fbb2599e92b3b74cc5e7630a17c0b283e1fa67..8554f5f5f7e9b480abc81ddb2dcb7285029c7578 100644 |
--- a/chrome/browser/ui/panels/docked_panel_strip.cc |
+++ b/chrome/browser/ui/panels/docked_panel_strip.cc |
@@ -11,6 +11,7 @@ |
#include "base/message_loop.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/panels/overflow_panel_strip.h" |
+#include "chrome/browser/ui/panels/panel_drag_controller.h" |
#include "chrome/browser/ui/panels/panel_manager.h" |
#include "chrome/browser/ui/panels/panel_mouse_watcher.h" |
#include "chrome/common/chrome_notification_types.h" |
@@ -59,7 +60,6 @@ DockedPanelStrip::DockedPanelStrip(PanelManager* panel_manager) |
minimized_panel_count_(0), |
are_titlebars_up_(false), |
disable_layout_refresh_(false), |
- dragging_panel_(NULL), |
dragging_panel_original_x_(0), |
delayed_titlebar_action_(NO_ACTION), |
titlebar_action_factory_(this) { |
@@ -67,7 +67,6 @@ DockedPanelStrip::DockedPanelStrip(PanelManager* panel_manager) |
DockedPanelStrip::~DockedPanelStrip() { |
DCHECK(panels_.empty()); |
- DCHECK(panels_pending_to_remove_.empty()); |
DCHECK(panels_in_temporary_layout_.empty()); |
DCHECK_EQ(0, minimized_panel_count_); |
} |
@@ -183,7 +182,6 @@ void DockedPanelStrip::AddPanel(Panel* panel) { |
// Set panel properties for this strip. |
panel->SetAppIconVisibility(true); |
- panel->set_draggable(!panel->has_temporary_layout()); |
panel->ApplyVisualStyleForStrip(); |
if (panel->has_temporary_layout()) |
@@ -210,79 +208,65 @@ int DockedPanelStrip::GetRightMostAvailablePosition() const { |
} |
bool DockedPanelStrip::RemovePanel(Panel* panel) { |
+ bool refresh_layout = !disable_layout_refresh_; |
if (panel->has_temporary_layout()) { |
panels_in_temporary_layout_.erase(panel); |
- return true; |
- } |
+ refresh_layout = false; |
jennb
2012/02/17 21:28:45
Keep this 'return true'. No need for refresh_layou
jianli
2012/02/17 23:52:56
Per discussion, remove the change from this patch.
|
+ } else { |
+ Panels::iterator iter = find(panels_.begin(), panels_.end(), panel); |
+ if (iter == panels_.end()) |
+ return false; |
- if (find(panels_.begin(), panels_.end(), panel) == panels_.end()) |
- return false; |
+ if (panel->expansion_state() != Panel::EXPANDED) |
+ DecrementMinimizedPanels(); |
- // If we're in the process of dragging, delay the removal. |
- if (dragging_panel_) { |
- panels_pending_to_remove_.push_back(panel); |
- return true; |
+ panels_.erase(iter); |
} |
- DoRemove(panel); |
+ panel_manager_->OnPanelRemoved(panel); |
jennb
2012/02/17 21:28:45
Move this right after erase(iter) so notification
jianli
2012/02/17 23:52:56
Per discussion, remove the change from this patch.
|
- if (!disable_layout_refresh_) |
+ if (refresh_layout) |
RefreshLayout(); |
return true; |
} |
-void DockedPanelStrip::DelayedRemove() { |
- for (size_t i = 0; i < panels_pending_to_remove_.size(); ++i) |
- DoRemove(panels_pending_to_remove_[i]); |
- panels_pending_to_remove_.clear(); |
- RefreshLayout(); |
-} |
- |
-bool DockedPanelStrip::DoRemove(Panel* panel) { |
- Panels::iterator iter = find(panels_.begin(), panels_.end(), panel); |
- if (iter == panels_.end()) |
- return false; |
- |
- if (panel->expansion_state() != Panel::EXPANDED) |
- DecrementMinimizedPanels(); |
- |
- panels_.erase(iter); |
- panel_manager_->OnPanelRemoved(panel); |
- return true; |
+bool DockedPanelStrip::CanDragPanel(Panel* panel) const { |
+ // Only the panels having temporary layout can't be dragged. |
+ return !panel->has_temporary_layout(); |
} |
-void DockedPanelStrip::StartDragging(Panel* panel) { |
+void DockedPanelStrip::StartDraggingPanel(Panel* panel) { |
dragging_panel_iterator_ = find(panels_.begin(), panels_.end(), panel); |
DCHECK(dragging_panel_iterator_ != panels_.end()); |
- dragging_panel_ = panel; |
dragging_panel_bounds_ = panel->GetBounds(); |
dragging_panel_original_x_ = dragging_panel_bounds_.x(); |
} |
-void DockedPanelStrip::Drag(int delta_x) { |
- DCHECK(dragging_panel_); |
- |
+void DockedPanelStrip::DragPanel(int delta_x, int delta_y) { |
if (!delta_x) |
return; |
+ Panel* dragging_panel = panel_manager_->drag_controller()->dragging_panel(); |
+ DCHECK(dragging_panel); |
+ |
// Moves this panel to the dragging position. |
- gfx::Rect new_bounds(dragging_panel_->GetBounds()); |
+ gfx::Rect new_bounds(dragging_panel->GetBounds()); |
new_bounds.set_x(new_bounds.x() + delta_x); |
- dragging_panel_->SetPanelBounds(new_bounds); |
+ dragging_panel->SetPanelBounds(new_bounds); |
// Checks and processes other affected panels. |
if (delta_x > 0) |
- DragRight(); |
+ DragRight(dragging_panel); |
else |
- DragLeft(); |
+ DragLeft(dragging_panel); |
} |
-void DockedPanelStrip::DragLeft() { |
+void DockedPanelStrip::DragLeft(Panel* dragging_panel) { |
// This is the left corner of the dragging panel. We use it to check against |
// all the panels on its left. |
- int dragging_panel_left_boundary = dragging_panel_->GetBounds().x(); |
+ int dragging_panel_left_boundary = dragging_panel->GetBounds().x(); |
// This is the right corner which a panel will be moved to. |
int current_panel_right_boundary = |
@@ -308,7 +292,7 @@ void DockedPanelStrip::DragLeft() { |
// Swaps current panel and dragging panel. |
*dragging_panel_iterator_ = current_panel; |
- *current_panel_iterator = dragging_panel_; |
+ *current_panel_iterator = dragging_panel; |
dragging_panel_iterator_ = current_panel_iterator; |
} |
@@ -318,11 +302,11 @@ void DockedPanelStrip::DragLeft() { |
dragging_panel_bounds_.width()); |
} |
-void DockedPanelStrip::DragRight() { |
+void DockedPanelStrip::DragRight(Panel* dragging_panel) { |
// This is the right corner of the dragging panel. We use it to check against |
// all the panels on its right. |
- int dragging_panel_right_boundary = dragging_panel_->GetBounds().x() + |
- dragging_panel_->GetBounds().width() - 1; |
+ int dragging_panel_right_boundary = dragging_panel->GetBounds().x() + |
+ dragging_panel->GetBounds().width() - 1; |
// This is the left corner which a panel will be moved to. |
int current_panel_left_boundary = dragging_panel_bounds_.x(); |
@@ -347,7 +331,7 @@ void DockedPanelStrip::DragRight() { |
// Swaps current panel and dragging panel. |
*dragging_panel_iterator_ = current_panel; |
- *current_panel_iterator = dragging_panel_; |
+ *current_panel_iterator = dragging_panel; |
dragging_panel_iterator_ = current_panel_iterator; |
} |
@@ -356,17 +340,14 @@ void DockedPanelStrip::DragRight() { |
dragging_panel_bounds_.set_x(current_panel_left_boundary); |
} |
-void DockedPanelStrip::EndDragging(bool cancelled) { |
- DCHECK(dragging_panel_); |
+void DockedPanelStrip::EndDraggingPanel(bool cancelled) { |
+ Panel* dragging_panel = panel_manager_->drag_controller()->dragging_panel(); |
+ DCHECK(dragging_panel); |
if (cancelled) |
- Drag(dragging_panel_original_x_ - dragging_panel_->GetBounds().x()); |
+ DragPanel(dragging_panel_original_x_ - dragging_panel->GetBounds().x(), 0); |
else |
- dragging_panel_->SetPanelBounds(dragging_panel_bounds_); |
- |
- dragging_panel_ = NULL; |
- |
- DelayedRemove(); |
+ dragging_panel->SetPanelBounds(dragging_panel_bounds_); |
} |
void DockedPanelStrip::OnPanelExpansionStateChanged(Panel* panel) { |
@@ -524,8 +505,12 @@ bool DockedPanelStrip::ShouldBringUpTitlebars(int mouse_x, int mouse_y) const { |
// If the panel is showing titlebar only, we want to keep it up when it is |
// being dragged. |
- if (state == Panel::TITLE_ONLY && is_dragging_panel()) |
- return true; |
+ if (state == Panel::TITLE_ONLY) { |
+ Panel* dragging_panel = |
jennb
2012/02/17 21:28:45
shouldn't this be:
if (state == title_only && dra
jianli
2012/02/17 23:52:56
Done.
|
+ panel_manager_->drag_controller()->dragging_panel(); |
+ if (dragging_panel && dragging_panel->panel_strip() == this) |
+ return true; |
+ } |
// We do not want to bring up other minimized panels if the mouse is over |
// the panel that pops up the titlebar to attract attention. |
@@ -744,7 +729,6 @@ void DockedPanelStrip::DelayedMovePanelToOverflow(Panel* panel) { |
void DockedPanelStrip::CloseAll() { |
// This should only be called at the end of tests to clean up. |
- DCHECK(!dragging_panel_); |
DCHECK(panels_in_temporary_layout_.empty()); |
// Make a copy of the iterator as closing panels can modify the vector. |
@@ -755,7 +739,3 @@ void DockedPanelStrip::CloseAll() { |
iter != panels_copy.rend(); ++iter) |
(*iter)->Close(); |
} |
- |
-bool DockedPanelStrip::is_dragging_panel() const { |
- return dragging_panel_ != NULL; |
-} |