OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/panels/panel_strip.h" | 5 #include "chrome/browser/ui/panels/panel_strip.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 const int PanelStrip::kPanelMinHeight = 20; | 50 const int PanelStrip::kPanelMinHeight = 20; |
51 | 51 |
52 PanelStrip::PanelStrip(PanelManager* panel_manager) | 52 PanelStrip::PanelStrip(PanelManager* panel_manager) |
53 : panel_manager_(panel_manager), | 53 : panel_manager_(panel_manager), |
54 minimized_panel_count_(0), | 54 minimized_panel_count_(0), |
55 are_titlebars_up_(false), | 55 are_titlebars_up_(false), |
56 dragging_panel_index_(kInvalidPanelIndex), | 56 dragging_panel_index_(kInvalidPanelIndex), |
57 dragging_panel_original_x_(0), | 57 dragging_panel_original_x_(0), |
58 delayed_titlebar_action_(NO_ACTION), | 58 delayed_titlebar_action_(NO_ACTION), |
59 remove_delays_for_testing_(false), | 59 remove_delays_for_testing_(false), |
60 titlebar_action_factory_(this), | 60 titlebar_action_factory_(this) { |
61 overflow_action_factory_(this) { | |
62 } | 61 } |
63 | 62 |
64 PanelStrip::~PanelStrip() { | 63 PanelStrip::~PanelStrip() { |
65 DCHECK(panels_.empty()); | 64 DCHECK(panels_.empty()); |
66 DCHECK(panels_pending_to_remove_.empty()); | 65 DCHECK(panels_pending_to_remove_.empty()); |
67 DCHECK_EQ(0, minimized_panel_count_); | 66 DCHECK_EQ(0, minimized_panel_count_); |
68 } | 67 } |
69 | 68 |
70 void PanelStrip::SetDisplayArea(const gfx::Rect& new_area) { | 69 void PanelStrip::SetDisplayArea(const gfx::Rect& new_area) { |
71 if (display_area_ == new_area) | 70 if (display_area_ == new_area) |
72 return; | 71 return; |
73 | 72 |
74 gfx::Rect old_area = display_area_; | 73 gfx::Rect old_area = display_area_; |
75 display_area_ = new_area; | 74 display_area_ = new_area; |
76 | 75 |
77 if (panels_.empty() || new_area.width() == old_area.width()) | 76 if (panels_.empty() || new_area.width() == old_area.width()) |
78 return; | 77 return; |
79 | 78 |
80 if (new_area.width() < old_area.width()) | 79 if (new_area.width() < old_area.width()) |
81 Rearrange(); | 80 Rearrange(); |
82 else | 81 else |
83 MovePanelsFromOverflowIfNeeded(); | 82 MovePanelsFromOverflowIfNeeded(); |
84 } | 83 } |
85 | 84 |
86 void PanelStrip::AddPanel(Panel* panel) { | 85 void PanelStrip::AddPanel(Panel* panel) { |
87 if (panel->initialized()) | 86 // Always update limits, even for exiting panels, in case the maximums changed |
88 AddExistingPanel(panel); | 87 // while panel was out of the strip. |
89 else | |
90 AddNewPanel(panel); | |
91 panels_.push_back(panel); | |
92 } | |
93 | |
94 void PanelStrip::AddNewPanel(Panel* panel) { | |
95 DCHECK(!panel->initialized()); | |
96 | |
97 int max_panel_width = GetMaxPanelWidth(); | 88 int max_panel_width = GetMaxPanelWidth(); |
98 int max_panel_height = GetMaxPanelHeight(); | 89 int max_panel_height = GetMaxPanelHeight(); |
99 panel->SetSizeRange(gfx::Size(kPanelMinWidth, kPanelMinHeight), | 90 panel->SetSizeRange(gfx::Size(kPanelMinWidth, kPanelMinHeight), |
100 gfx::Size(max_panel_width, max_panel_height)); | 91 gfx::Size(max_panel_width, max_panel_height)); |
101 | 92 |
102 gfx::Size restored_size = panel->restored_size(); | 93 gfx::Size restored_size = panel->restored_size(); |
103 int height = restored_size.height(); | 94 int height = restored_size.height(); |
104 int width = restored_size.width(); | 95 int width = restored_size.width(); |
105 | 96 |
106 if (height == 0 && width == 0) { | 97 if (panel->initialized()) { |
107 // Auto resizable is enabled only if no initial size is provided. | 98 // Bump panels in the strip to make room for this panel. |
108 panel->SetAutoResizable(true); | 99 int x; |
| 100 while ((x = GetRightMostAvailablePosition() - width) < display_area_.x()) { |
| 101 DCHECK(!panels_.empty()); |
| 102 MovePanelToOverflow(panels_.back(), false); |
| 103 } |
| 104 int y = display_area_.bottom() - height; |
| 105 panel->SetPanelBounds(gfx::Rect(x, y, width, height)); |
109 } else { | 106 } else { |
110 if (height == 0) | 107 // Initialize the newly created panel. Does not bump any panels from strip. |
111 height = width / kPanelDefaultWidthToHeightRatio; | 108 if (height == 0 && width == 0) { |
112 if (width == 0) | 109 // Auto resizable is enabled only if no initial size is provided. |
113 width = height * kPanelDefaultWidthToHeightRatio; | 110 panel->SetAutoResizable(true); |
| 111 } else { |
| 112 if (height == 0) |
| 113 height = width / kPanelDefaultWidthToHeightRatio; |
| 114 if (width == 0) |
| 115 width = height * kPanelDefaultWidthToHeightRatio; |
| 116 } |
| 117 |
| 118 // Constrain sizes to limits. |
| 119 if (width < kPanelMinWidth) |
| 120 width = kPanelMinWidth; |
| 121 else if (width > max_panel_width) |
| 122 width = max_panel_width; |
| 123 |
| 124 if (height < kPanelMinHeight) |
| 125 height = kPanelMinHeight; |
| 126 else if (height > max_panel_height) |
| 127 height = max_panel_height; |
| 128 |
| 129 panel->set_restored_size(gfx::Size(width, height)); |
| 130 int x = GetRightMostAvailablePosition() - width; |
| 131 int y = display_area_.bottom() - height; |
| 132 |
| 133 // Keep panel visible in the strip even if overlap would occur. |
| 134 // Panel is moved to overflow from the strip after a delay. |
| 135 if (x < display_area_.x()) { |
| 136 x = display_area_.x(); |
| 137 int delay_ms = remove_delays_for_testing_ ? 0 : |
| 138 kMoveNewPanelToOverflowDelayMilliseconds; |
| 139 MessageLoop::current()->PostDelayedTask( |
| 140 FROM_HERE, |
| 141 base::Bind(&PanelStrip::MovePanelToOverflow, |
| 142 base::Unretained(this), |
| 143 panel, |
| 144 true), // new panel |
| 145 delay_ms); |
| 146 } |
| 147 panel->Initialize(gfx::Rect(x, y, width, height)); |
114 } | 148 } |
115 | 149 |
116 // Constrain sizes to limits. | 150 panels_.push_back(panel); |
117 if (width < kPanelMinWidth) | |
118 width = kPanelMinWidth; | |
119 else if (width > max_panel_width) | |
120 width = max_panel_width; | |
121 | |
122 if (height < kPanelMinHeight) | |
123 height = kPanelMinHeight; | |
124 else if (height > max_panel_height) | |
125 height = max_panel_height; | |
126 panel->set_restored_size(gfx::Size(width, height)); | |
127 | |
128 // Layout the new panel. | |
129 int y = display_area_.bottom() - height; | |
130 int x = GetRightMostAvailablePosition() - width; | |
131 | |
132 // Keep panel visible in the strip even if overlap would occur. | |
133 // Panel is moved to overflow from the strip after a delay. | |
134 if (x < display_area_.x()) { | |
135 x = display_area_.x(); | |
136 MessageLoop::current()->PostDelayedTask( | |
137 FROM_HERE, | |
138 base::Bind(&PanelStrip::MovePanelToOverflow, | |
139 overflow_action_factory_.GetWeakPtr(), | |
140 panel, | |
141 true), // new panel | |
142 kMoveNewPanelToOverflowDelayMilliseconds); | |
143 } | |
144 panel->Initialize(gfx::Rect(x, y, width, height)); | |
145 } | |
146 | |
147 void PanelStrip::AddExistingPanel(Panel* panel) { | |
148 gfx::Size restored_size = panel->restored_size(); | |
149 int height = restored_size.height(); | |
150 int width = restored_size.width(); | |
151 int x; | |
152 while ((x = GetRightMostAvailablePosition() - width) < display_area_.x()) { | |
153 DCHECK(!panels_.empty()); | |
154 MovePanelToOverflow(panels_.back(), false); | |
155 } | |
156 int y = display_area_.bottom() - height; | |
157 panel->SetPanelBounds(gfx::Rect(x, y, width, height)); | |
158 } | 151 } |
159 | 152 |
160 int PanelStrip::GetMaxPanelWidth() const { | 153 int PanelStrip::GetMaxPanelWidth() const { |
161 return static_cast<int>(display_area_.width() * kPanelMaxWidthFactor); | 154 return static_cast<int>(display_area_.width() * kPanelMaxWidthFactor); |
162 } | 155 } |
163 | 156 |
164 int PanelStrip::GetMaxPanelHeight() const { | 157 int PanelStrip::GetMaxPanelHeight() const { |
165 return display_area_.height(); | 158 return display_area_.height(); |
166 } | 159 } |
167 | 160 |
(...skipping 30 matching lines...) Expand all Loading... |
198 | 191 |
199 bool PanelStrip::DoRemove(Panel* panel) { | 192 bool PanelStrip::DoRemove(Panel* panel) { |
200 Panels::iterator iter = find(panels_.begin(), panels_.end(), panel); | 193 Panels::iterator iter = find(panels_.begin(), panels_.end(), panel); |
201 if (iter == panels_.end()) | 194 if (iter == panels_.end()) |
202 return false; | 195 return false; |
203 | 196 |
204 if (panel->expansion_state() != Panel::EXPANDED) | 197 if (panel->expansion_state() != Panel::EXPANDED) |
205 DecrementMinimizedPanels(); | 198 DecrementMinimizedPanels(); |
206 | 199 |
207 panels_.erase(iter); | 200 panels_.erase(iter); |
| 201 panel_manager_->OnPanelRemoved(panel); |
208 return true; | 202 return true; |
209 } | 203 } |
210 | 204 |
211 void PanelStrip::StartDragging(Panel* panel) { | 205 void PanelStrip::StartDragging(Panel* panel) { |
212 for (size_t i = 0; i < panels_.size(); ++i) { | 206 for (size_t i = 0; i < panels_.size(); ++i) { |
213 if (panels_[i] == panel) { | 207 if (panels_[i] == panel) { |
214 dragging_panel_index_ = i; | 208 dragging_panel_index_ = i; |
215 dragging_panel_bounds_ = panel->GetBounds(); | 209 dragging_panel_bounds_ = panel->GetBounds(); |
216 dragging_panel_original_x_ = dragging_panel_bounds_.x(); | 210 dragging_panel_original_x_ = dragging_panel_bounds_.x(); |
217 break; | 211 break; |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 | 622 |
629 // Start from the bottom to avoid reshuffling. | 623 // Start from the bottom to avoid reshuffling. |
630 for (Panels::reverse_iterator iter = panels_copy.rbegin(); | 624 for (Panels::reverse_iterator iter = panels_copy.rbegin(); |
631 iter != panels_copy.rend(); ++iter) | 625 iter != panels_copy.rend(); ++iter) |
632 (*iter)->Close(); | 626 (*iter)->Close(); |
633 } | 627 } |
634 | 628 |
635 bool PanelStrip::is_dragging_panel() const { | 629 bool PanelStrip::is_dragging_panel() const { |
636 return dragging_panel_index_ != kInvalidPanelIndex; | 630 return dragging_panel_index_ != kInvalidPanelIndex; |
637 } | 631 } |
OLD | NEW |