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

Side by Side Diff: chrome/browser/ui/panels/docked_panel_strip.cc

Issue 9560002: Cleanup to keep panel from manipulating its panel strip assignment directly. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/docked_panel_strip.h" 5 #include "chrome/browser/ui/panels/docked_panel_strip.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 gfx::Rect old_area = display_area_; 79 gfx::Rect old_area = display_area_;
80 display_area_ = display_area; 80 display_area_ = display_area;
81 81
82 if (panels_.empty()) 82 if (panels_.empty())
83 return; 83 return;
84 84
85 RefreshLayout(); 85 RefreshLayout();
86 } 86 }
87 87
88 void DockedPanelStrip::AddPanel(Panel* panel) { 88 void DockedPanelStrip::AddPanel(Panel* panel) {
89 DCHECK_EQ(this, panel->panel_strip()); 89 DCHECK_NE(this, panel->panel_strip());
90 panel->SetPanelStrip(this);
90 91
91 // Always update limits, even for exiting panels, in case the maximums changed 92 // Always update limits, even for exiting panels, in case the maximums changed
92 // while panel was out of the strip. 93 // while panel was out of the strip.
93 int max_panel_width = GetMaxPanelWidth(); 94 int max_panel_width = GetMaxPanelWidth();
94 int max_panel_height = GetMaxPanelHeight(); 95 int max_panel_height = GetMaxPanelHeight();
95 panel->SetSizeRange(gfx::Size(kPanelMinWidth, kPanelMinHeight), 96 panel->SetSizeRange(gfx::Size(kPanelMinWidth, kPanelMinHeight),
96 gfx::Size(max_panel_width, max_panel_height)); 97 gfx::Size(max_panel_width, max_panel_height));
97 98
98 gfx::Size restored_size = panel->restored_size(); 99 gfx::Size restored_size = panel->restored_size();
99 int height = restored_size.height(); 100 int height = restored_size.height();
100 int width = restored_size.width(); 101 int width = restored_size.width();
101 102
102 if (panel->initialized()) { 103 if (panel->initialized()) {
103 // Bump panels in the strip to make room for this panel. 104 // Bump panels in the strip to make room for this panel.
104 // Prevent layout refresh when panel is removed from this strip. 105 // Prevent layout refresh when panel is removed from this strip.
105 disable_layout_refresh_ = true; 106 disable_layout_refresh_ = true;
106 PanelStrip* overflow_strip = panel_manager_->overflow_strip();
107 int x; 107 int x;
108 while ((x = GetRightMostAvailablePosition() - width) < display_area_.x()) { 108 while ((x = GetRightMostAvailablePosition() - width) < display_area_.x()) {
109 DCHECK(!panels_.empty()); 109 DCHECK(!panels_.empty());
110 panels_.back()->MoveToStrip(overflow_strip); 110 panel_manager_->ChangePanelLayout(panels_.back(),
111 PanelStrip::IN_OVERFLOW);
Andrei 2012/03/01 00:08:50 I like this change, and I can see how you are tryi
jennb 2012/03/01 20:52:58 Ended up leaving this, though moved into a subrout
111 } 112 }
112 disable_layout_refresh_ = false; 113 disable_layout_refresh_ = false;
113 114
114 Panel::ExpansionState expansion_state_to_restore; 115 Panel::ExpansionState expansion_state_to_restore;
115 if (panel->expansion_state() == Panel::EXPANDED) { 116 if (panel->expansion_state() == Panel::EXPANDED) {
116 expansion_state_to_restore = Panel::EXPANDED; 117 expansion_state_to_restore = Panel::EXPANDED;
117 } else { 118 } else {
118 if (are_titlebars_up_ || panel->IsDrawingAttention()) { 119 if (are_titlebars_up_ || panel->IsDrawingAttention()) {
119 expansion_state_to_restore = Panel::TITLE_ONLY; 120 expansion_state_to_restore = Panel::TITLE_ONLY;
120 height = panel->TitleOnlyHeight(); 121 height = panel->TitleOnlyHeight();
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 197
197 int DockedPanelStrip::StartingRightPosition() const { 198 int DockedPanelStrip::StartingRightPosition() const {
198 return display_area_.right(); 199 return display_area_.right();
199 } 200 }
200 201
201 int DockedPanelStrip::GetRightMostAvailablePosition() const { 202 int DockedPanelStrip::GetRightMostAvailablePosition() const {
202 return panels_.empty() ? StartingRightPosition() : 203 return panels_.empty() ? StartingRightPosition() :
203 (panels_.back()->GetBounds().x() - kPanelsHorizontalSpacing); 204 (panels_.back()->GetBounds().x() - kPanelsHorizontalSpacing);
204 } 205 }
205 206
206 bool DockedPanelStrip::RemovePanel(Panel* panel) { 207 void DockedPanelStrip::RemovePanel(Panel* panel) {
208 DCHECK_EQ(this, panel->panel_strip());
207 if (panel->has_temporary_layout()) { 209 if (panel->has_temporary_layout()) {
208 panels_in_temporary_layout_.erase(panel); 210 panels_in_temporary_layout_.erase(panel);
209 return true; 211 return;
210 } 212 }
211 213
212 Panels::iterator iter = find(panels_.begin(), panels_.end(), panel); 214 Panels::iterator iter = find(panels_.begin(), panels_.end(), panel);
213 if (iter == panels_.end()) 215 DCHECK(iter != panels_.end());
214 return false;
215 216
216 if (panel->expansion_state() != Panel::EXPANDED) 217 if (panel->expansion_state() != Panel::EXPANDED)
217 DecrementMinimizedPanels(); 218 DecrementMinimizedPanels();
218 219
219 // Removing an element from the list will invalidate the iterator that refers 220 // Removing an element from the list will invalidate the iterator that refers
220 // to it. So we need to check if the dragging panel iterators are affected. 221 // to it. So we need to update the iterator in that case.
221 bool update_original_dragging_iterator_after_erase = false; 222 DCHECK(dragging_panel_current_iterator_ != iter);
222 if (dragging_panel_original_iterator_ != panels_.end()) { 223 bool update_iterator_after_erase =
223 if (dragging_panel_current_iterator_ == iter) { 224 (dragging_panel_original_iterator_ == iter);
224 // If the dragging panel is being removed, set both dragging iterators to
225 // the end of the list.
226 dragging_panel_current_iterator_ = dragging_panel_original_iterator_ =
227 panels_.end();
228 } else if (dragging_panel_original_iterator_ == iter) {
229 // If |dragging_panel_original_iterator_| refers to the element being
230 // removed, set the flag so that the iterator can be updated to next
231 // element.
232 update_original_dragging_iterator_after_erase = true;
233 }
234 }
235 225
236 iter = panels_.erase(iter); 226 iter = panels_.erase(iter);
237 227
238 if (update_original_dragging_iterator_after_erase) 228 if (update_iterator_after_erase)
239 dragging_panel_original_iterator_ = iter; 229 dragging_panel_original_iterator_ = iter;
240 230
241 if (!disable_layout_refresh_) 231 if (!disable_layout_refresh_)
242 RefreshLayout(); 232 RefreshLayout();
Andrei 2012/03/01 00:08:50 If AddPanel() sets panel->SetPanelStrip() to this,
jennb 2012/03/01 00:30:58 Agree. I actually tried it and undid the change. S
243
244 return true;
245 } 233 }
246 234
247 bool DockedPanelStrip::CanShowPanelAsActive(const Panel* panel) const { 235 bool DockedPanelStrip::CanShowPanelAsActive(const Panel* panel) const {
248 // Panels with temporary layout cannot be shown as active. 236 // Panels with temporary layout cannot be shown as active.
249 return !panel->has_temporary_layout(); 237 return !panel->has_temporary_layout();
250 } 238 }
251 239
252 bool DockedPanelStrip::CanDragPanel(const Panel* panel) const { 240 bool DockedPanelStrip::CanDragPanel(const Panel* panel) const {
253 // Only the panels having temporary layout can't be dragged. 241 // Only the panels having temporary layout can't be dragged.
254 return !panel->has_temporary_layout(); 242 return !panel->has_temporary_layout();
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 new_bounds.set_y( 685 new_bounds.set_y(
698 GetBottomPositionForExpansionState(panel->expansion_state()) - 686 GetBottomPositionForExpansionState(panel->expansion_state()) -
699 new_bounds.height()); 687 new_bounds.height());
700 panel->SetPanelBounds(new_bounds); 688 panel->SetPanelBounds(new_bounds);
701 } 689 }
702 690
703 rightmost_position = x - kPanelsHorizontalSpacing; 691 rightmost_position = x - kPanelsHorizontalSpacing;
704 } 692 }
705 693
706 // Add/remove panels from/to overflow. A change in work area or the 694 // Add/remove panels from/to overflow. A change in work area or the
707 // resize/removal of a panel may affect how many panels fit in the strip. 695 // resize/removal of a panel may affect how many panels fit in the strip.
Andrei 2012/03/01 00:08:50 This is higher-level logic affecting multiple stri
jennb 2012/03/01 20:52:58 I simplified the logic that bumps panels to overfl
708 OverflowPanelStrip* overflow_strip = panel_manager_->overflow_strip();
709 if (panel_iter != panels_.end()) { 696 if (panel_iter != panels_.end()) {
710 // Prevent layout refresh when panel is removed from this strip. 697 // Prevent layout refresh when panel is removed from this strip.
711 disable_layout_refresh_ = true; 698 disable_layout_refresh_ = true;
712 699
713 // Keep track of panels to move to overflow in a separate storage since 700 // Keep track of panels to move to overflow in a separate storage since
714 // removing it from the list will invalidate the iterator. 701 // removing it from the list will invalidate the iterator.
715 std::vector<Panel*> panels_to_move_to_overflow; 702 std::vector<Panel*> panels_to_move_to_overflow;
716 for (; panel_iter != panels_.end(); ++panel_iter) 703 for (; panel_iter != panels_.end(); ++panel_iter)
717 panels_to_move_to_overflow.push_back(*panel_iter); 704 panels_to_move_to_overflow.push_back(*panel_iter);
718 705
719 // Move panels to overflow in reverse to maintain their order. 706 // Move panels to overflow in reverse to maintain their order.
720 for (std::vector<Panel*>::reverse_iterator iter = 707 for (std::vector<Panel*>::reverse_iterator iter =
721 panels_to_move_to_overflow.rbegin(); 708 panels_to_move_to_overflow.rbegin();
722 iter != panels_to_move_to_overflow.rend(); ++iter) { 709 iter != panels_to_move_to_overflow.rend(); ++iter) {
723 (*iter)->MoveToStrip(overflow_strip); 710 panel_manager_->ChangePanelLayout(*iter, PanelStrip::IN_OVERFLOW);
724 } 711 }
725 712
726 disable_layout_refresh_ = false; 713 disable_layout_refresh_ = false;
727 } else { 714 } else {
728 // Attempt to add more panels from overflow to the strip. 715 // Attempt to add more panels from overflow to the strip.
716 OverflowPanelStrip* overflow_strip = panel_manager_->overflow_strip();
729 Panel* overflow_panel; 717 Panel* overflow_panel;
730 while ((overflow_panel = overflow_strip->first_panel()) && 718 while ((overflow_panel = overflow_strip->first_panel()) &&
731 GetRightMostAvailablePosition() >= 719 GetRightMostAvailablePosition() >=
732 display_area_.x() + overflow_panel->restored_size().width()) { 720 display_area_.x() + overflow_panel->restored_size().width()) {
733 overflow_panel->MoveToStrip(this); 721 panel_manager_->ChangePanelLayout(overflow_panel, PanelStrip::DOCKED);
734 } 722 }
735 } 723 }
736 } 724 }
737 725
738 void DockedPanelStrip::DelayedMovePanelToOverflow(Panel* panel) { 726 void DockedPanelStrip::DelayedMovePanelToOverflow(Panel* panel) {
Andrei 2012/03/01 00:08:50 This can be easily moved to the manager I think.
jennb 2012/03/01 20:52:58 Ended up keeping this here. This provides a guard
739 if (panels_in_temporary_layout_.erase(panel)) { 727 if (panels_in_temporary_layout_.erase(panel)) {
740 DCHECK(panel->has_temporary_layout()); 728 DCHECK(panel->has_temporary_layout());
741 panel->MoveToStrip(panel_manager_->overflow_strip()); 729 panel_manager_->ChangePanelLayout(panel, PanelStrip::IN_OVERFLOW);
742 } 730 }
743 } 731 }
744 732
745 void DockedPanelStrip::CloseAll() { 733 void DockedPanelStrip::CloseAll() {
746 // This should only be called at the end of tests to clean up. 734 // This should only be called at the end of tests to clean up.
747 DCHECK(panels_in_temporary_layout_.empty()); 735 DCHECK(panels_in_temporary_layout_.empty());
748 736
749 // Make a copy of the iterator as closing panels can modify the vector. 737 // Make a copy of the iterator as closing panels can modify the vector.
750 Panels panels_copy = panels_; 738 Panels panels_copy = panels_;
751 739
752 // Start from the bottom to avoid reshuffling. 740 // Start from the bottom to avoid reshuffling.
753 for (Panels::reverse_iterator iter = panels_copy.rbegin(); 741 for (Panels::reverse_iterator iter = panels_copy.rbegin();
754 iter != panels_copy.rend(); ++iter) 742 iter != panels_copy.rend(); ++iter)
755 (*iter)->Close(); 743 (*iter)->Close();
756 } 744 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698