Chromium Code Reviews| Index: chrome/browser/ui/panels/panel_strip.cc |
| diff --git a/chrome/browser/ui/panels/panel_strip.cc b/chrome/browser/ui/panels/panel_strip.cc |
| index 6d4efba0c611d0b5564caa5e41693ac5f912c459..df87fd5b1bfc42e32265b54e4ae660eab0b842ae 100644 |
| --- a/chrome/browser/ui/panels/panel_strip.cc |
| +++ b/chrome/browser/ui/panels/panel_strip.cc |
| @@ -57,7 +57,6 @@ PanelStrip::PanelStrip(PanelManager* panel_manager) |
| dragging_panel_index_(kInvalidPanelIndex), |
| dragging_panel_original_x_(0), |
| delayed_titlebar_action_(NO_ACTION), |
| - remove_delays_for_testing_(false), |
| titlebar_action_factory_(this) { |
| } |
| @@ -81,6 +80,8 @@ void PanelStrip::SetDisplayArea(const gfx::Rect& new_area) { |
| } |
| void PanelStrip::AddPanel(Panel* panel) { |
| + DCHECK_EQ(Panel::EXPANDED, panel->expansion_state()); |
| + |
| // Always update limits, even for exiting panels, in case the maximums changed |
| // while panel was out of the strip. |
| int max_panel_width = GetMaxPanelWidth(); |
| @@ -97,11 +98,10 @@ void PanelStrip::AddPanel(Panel* panel) { |
| int x; |
| while ((x = GetRightMostAvailablePosition() - width) < display_area_.x()) { |
| DCHECK(!panels_.empty()); |
| - MovePanelToOverflow(panels_.back(), false); |
| + panels_.back()->SetExpansionState(Panel::IN_OVERFLOW); |
| } |
| int y = display_area_.bottom() - height; |
| panel->SetPanelBounds(gfx::Rect(x, y, width, height)); |
| - panel->SetExpansionState(Panel::EXPANDED); |
| } else { |
| // Initialize the newly created panel. Does not bump any panels from strip. |
| if (height == 0 && width == 0) { |
| @@ -136,21 +136,18 @@ void PanelStrip::AddPanel(Panel* panel) { |
| #if defined(OS_WIN) |
| if (x < display_area_.x()) { |
| x = display_area_.x(); |
| - int delay_ms = remove_delays_for_testing_ ? 0 : |
| - kMoveNewPanelToOverflowDelayMilliseconds; |
| + panel->set_temporary_layout(true); |
| MessageLoop::current()->PostDelayedTask( |
| FROM_HERE, |
| - base::Bind(&PanelStrip::MovePanelToOverflow, |
| + base::Bind(&PanelStrip::MovePanelToOverflowAfterDelay, |
| base::Unretained(this), |
| - panel, |
| - true), // new panel |
| - delay_ms); |
| + panel), |
| + kMoveNewPanelToOverflowDelayMilliseconds); |
| } |
| #endif |
| panel->Initialize(gfx::Rect(x, y, width, height)); |
| } |
| - DCHECK(panel->expansion_state() == Panel::EXPANDED); |
| panels_.push_back(panel); |
| } |
| @@ -198,7 +195,8 @@ bool PanelStrip::DoRemove(Panel* panel) { |
| if (iter == panels_.end()) |
| return false; |
| - if (panel->expansion_state() != Panel::EXPANDED) |
| + if (panel->expansion_state() == Panel::TITLE_ONLY || |
| + panel->expansion_state() == Panel::MINIMIZED) |
|
jianli
2011/12/07 22:13:26
indentation.
jennb
2011/12/07 23:35:40
Done.
|
| DecrementMinimizedPanels(); |
| panels_.erase(iter); |
| @@ -343,8 +341,13 @@ void PanelStrip::OnPanelExpansionStateChanged( |
| Panel::ExpansionState expansion_state = panel->expansion_state(); |
| switch (expansion_state) { |
| case Panel::EXPANDED: |
| - if (old_state == Panel::TITLE_ONLY || old_state == Panel::MINIMIZED) |
| + if (old_state == Panel::TITLE_ONLY || old_state == Panel::MINIMIZED) { |
| DecrementMinimizedPanels(); |
| + } else if (old_state == Panel::IN_OVERFLOW) { |
| + panel_manager_->panel_overflow_strip()->Remove(panel); |
| + AddPanel(panel); |
| + panel->SetAppIconVisibility(true); |
| + } |
| break; |
| case Panel::TITLE_ONLY: |
| size.set_height(panel->TitleOnlyHeight()); |
| @@ -440,9 +443,28 @@ bool PanelStrip::ShouldBringUpTitlebars(int mouse_x, int mouse_y) const { |
| mouse_y >= display_area_.bottom()) |
| return true; |
| + // Bring up titlebars if any panel needs the titlebar up. |
| for (Panels::const_iterator iter = panels_.begin(); |
| iter != panels_.end(); ++iter) { |
| - if ((*iter)->ShouldBringUpTitlebar(mouse_x, mouse_y)) |
| + Panel* panel = *iter; |
| + Panel::ExpansionState state = panel->expansion_state(); |
| + // Skip the expanded panel. |
| + if (state == Panel::EXPANDED) |
| + continue; |
| + |
| + // 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; |
| + |
| + // 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. |
|
jianli
2011/12/07 22:13:26
extra spaces after "attract"
jennb
2011/12/07 23:35:40
Done.
|
| + if (panel->IsDrawingAttention()) |
| + continue; |
| + |
| + gfx::Rect bounds = panel->GetBounds(); |
| + if (bounds.x() <= mouse_x && mouse_x <= bounds.right() && |
| + mouse_y >= bounds.y()) |
| return true; |
| } |
| return false; |
| @@ -491,8 +513,6 @@ void PanelStrip::BringUpOrDownTitlebars(bool bring_up) { |
| // OnAutoHidingDesktopBarVisibilityChanged will handle this. |
| delayed_titlebar_action_ = bring_up ? BRING_UP : BRING_DOWN; |
| - if (remove_delays_for_testing_) |
| - task_delay_milliseconds = 0; |
| // If user moves the mouse in and out of mouse tracking area, we might have |
| // previously posted but not yet dispatched task in the queue. New action |
| @@ -596,10 +616,8 @@ void PanelStrip::Rearrange() { |
| // TODO(jianli): remove the guard when overflow support is enabled on other |
| // platforms. http://crbug.com/105073 |
| #if defined(OS_WIN) |
| - if (x < display_area_.x()) { |
| - MovePanelsToOverflow(panel_index); |
| + if (x < display_area_.x()) |
| break; |
| - } |
| #endif |
| new_bounds.set_x(x); |
| @@ -614,33 +632,34 @@ void PanelStrip::Rearrange() { |
| // TODO(jianli): remove the guard when overflow support is enabled on other |
| // platforms. http://crbug.com/105073 |
| #if defined(OS_WIN) |
| - if (panel_index == panels_.size()) |
| - MovePanelsFromOverflowIfNeeded(); |
| + if (panel_index < panels_.size()) { |
| + // Move panels to overflow in reverse to maintain their order. |
|
jianli
2011/12/07 22:13:26
Better to add more comment to explain that we do n
jennb
2011/12/07 23:35:40
Done.
|
| + for (size_t overflow_index = panels_.size() - 1; |
|
jianli
2011/12/07 22:13:26
Either add DCHECK to ensure panel_index is not 0,
jennb
2011/12/07 23:35:40
Done.
|
| + overflow_index >= panel_index; --overflow_index) |
| + panels_[overflow_index]->SetExpansionState(Panel::IN_OVERFLOW); |
| + } else { |
| + // Attempt to add more panels from overflow to the strip. |
| + PanelOverflowStrip* overflow_strip = panel_manager_->panel_overflow_strip(); |
| + Panel* overflow_panel; |
| + while ((overflow_panel = overflow_strip->first_panel()) && |
| + GetRightMostAvailablePosition() - |
| + overflow_panel->restored_size().width() >= display_area_.x()) { |
|
jianli
2011/12/07 22:13:26
4 more spaces before this line.
jennb
2011/12/07 23:35:40
Done.
|
| + overflow_panel->SetExpansionState(Panel::EXPANDED); |
| + } |
| + } |
| #endif |
| } |
| -void PanelStrip::MovePanelsToOverflow(size_t overflow_point) { |
| - DCHECK(overflow_point >= 0); |
| - // Move panels in reverse to maintain their order. |
| - for (size_t i = panels_.size() - 1; i >= overflow_point; --i) |
| - MovePanelToOverflow(panels_[i], false); |
| -} |
| - |
| -void PanelStrip::MovePanelToOverflow(Panel* panel, bool is_new) { |
| - if (!DoRemove(panel)) |
| - return; |
| - |
| - panel_manager_->panel_overflow_strip()->AddPanel(panel, is_new); |
| -} |
| - |
| -void PanelStrip::MovePanelsFromOverflowIfNeeded() { |
| - PanelOverflowStrip* overflow_strip = panel_manager_->panel_overflow_strip(); |
| - Panel* overflow_panel; |
| - while ((overflow_panel = overflow_strip->first_panel()) && |
| - GetRightMostAvailablePosition() - |
| - overflow_panel->restored_size().width() >= display_area_.x()) { |
| - overflow_strip->Remove(overflow_panel); |
| - AddPanel(overflow_panel); |
| +void PanelStrip::MovePanelToOverflowAfterDelay(Panel* panel) { |
| + // Make sure panel still exists in the strip. |
| + // Search in reverse as new panels are at the end of the strip. |
| + for (Panels::reverse_iterator iter = panels_.rbegin(); |
| + iter != panels_.rend(); ++iter) { |
| + if (*iter == panel) { |
| + DCHECK(panel->temporary_layout()); |
| + panel->SetExpansionState(Panel::IN_OVERFLOW); |
| + break; |
| + } |
| } |
| } |