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

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

Issue 9546001: Support detaching/attaching panels via inter-strip drags. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Patch to land 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/panel_manager.h" 5 #include "chrome/browser/ui/panels/panel_manager.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 } 62 }
63 63
64 PanelManager::PanelManager() 64 PanelManager::PanelManager()
65 : panel_mouse_watcher_(PanelMouseWatcher::Create()), 65 : panel_mouse_watcher_(PanelMouseWatcher::Create()),
66 auto_sizing_enabled_(true), 66 auto_sizing_enabled_(true),
67 is_full_screen_(false), 67 is_full_screen_(false),
68 is_processing_overflow_(false) { 68 is_processing_overflow_(false) {
69 detached_strip_.reset(new DetachedPanelStrip(this)); 69 detached_strip_.reset(new DetachedPanelStrip(this));
70 docked_strip_.reset(new DockedPanelStrip(this)); 70 docked_strip_.reset(new DockedPanelStrip(this));
71 overflow_strip_.reset(new OverflowPanelStrip(this)); 71 overflow_strip_.reset(new OverflowPanelStrip(this));
72 drag_controller_.reset(new PanelDragController()); 72 drag_controller_.reset(new PanelDragController(this));
73 display_settings_provider_.reset(DisplaySettingsProvider::Create(this)); 73 display_settings_provider_.reset(DisplaySettingsProvider::Create(this));
74 74
75 OnDisplayChanged(); 75 OnDisplayChanged();
76 } 76 }
77 77
78 PanelManager::~PanelManager() { 78 PanelManager::~PanelManager() {
79 } 79 }
80 80
81 void PanelManager::OnDisplayChanged() { 81 void PanelManager::OnDisplayChanged() {
82 gfx::Rect work_area = display_settings_provider_->GetWorkArea(); 82 gfx::Rect work_area = display_settings_provider_->GetWorkArea();
(...skipping 23 matching lines...) Expand all
106 106
107 Panel* PanelManager::CreatePanel(Browser* browser) { 107 Panel* PanelManager::CreatePanel(Browser* browser) {
108 // Need to sync the display area if no panel is present. This is because we 108 // Need to sync the display area if no panel is present. This is because we
109 // could only get display area notifications through a panel window. 109 // could only get display area notifications through a panel window.
110 if (num_panels() == 0) 110 if (num_panels() == 0)
111 OnDisplayChanged(); 111 OnDisplayChanged();
112 112
113 int width = browser->override_bounds().width(); 113 int width = browser->override_bounds().width();
114 int height = browser->override_bounds().height(); 114 int height = browser->override_bounds().height();
115 Panel* panel = new Panel(browser, gfx::Size(width, height)); 115 Panel* panel = new Panel(browser, gfx::Size(width, height));
116 docked_strip_->AddPanel(panel); 116 docked_strip_->AddPanel(panel, PanelStrip::DEFAULT_POSITION);
117 117
118 content::NotificationService::current()->Notify( 118 content::NotificationService::current()->Notify(
119 chrome::NOTIFICATION_PANEL_ADDED, 119 chrome::NOTIFICATION_PANEL_ADDED,
120 content::Source<Panel>(panel), 120 content::Source<Panel>(panel),
121 content::NotificationService::NoDetails()); 121 content::NotificationService::NoDetails());
122 122
123 if (num_panels() == 1) { 123 if (num_panels() == 1) {
124 full_screen_mode_timer_.Start(FROM_HERE, 124 full_screen_mode_timer_.Start(FROM_HERE,
125 base::TimeDelta::FromMilliseconds(kFullScreenModeCheckIntervalMs), 125 base::TimeDelta::FromMilliseconds(kFullScreenModeCheckIntervalMs),
126 this, &PanelManager::CheckFullScreenMode); 126 this, &PanelManager::CheckFullScreenMode);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 const gfx::Size& preferred_window_size) { 176 const gfx::Size& preferred_window_size) {
177 DCHECK(auto_sizing_enabled_); 177 DCHECK(auto_sizing_enabled_);
178 docked_strip_->ResizePanelWindow(panel, preferred_window_size); 178 docked_strip_->ResizePanelWindow(panel, preferred_window_size);
179 } 179 }
180 180
181 void PanelManager::ResizePanel(Panel* panel, const gfx::Size& new_size) { 181 void PanelManager::ResizePanel(Panel* panel, const gfx::Size& new_size) {
182 docked_strip_->ResizePanelWindow(panel, new_size); 182 docked_strip_->ResizePanelWindow(panel, new_size);
183 panel->SetAutoResizable(false); 183 panel->SetAutoResizable(false);
184 } 184 }
185 185
186 void PanelManager::MovePanelToStrip(Panel* panel, 186 void PanelManager::MovePanelToStrip(
187 PanelStrip::Type new_layout) { 187 Panel* panel,
188 PanelStrip::Type new_layout,
189 PanelStrip::PositioningMask positioning_mask) {
188 DCHECK(panel); 190 DCHECK(panel);
189 PanelStrip* current_strip = panel->panel_strip(); 191 PanelStrip* current_strip = panel->panel_strip();
190 DCHECK(current_strip); 192 DCHECK(current_strip);
191 DCHECK_NE(current_strip->type(), new_layout); 193 DCHECK_NE(current_strip->type(), new_layout);
192 current_strip->RemovePanel(panel); 194 current_strip->RemovePanel(panel);
193 195
194 PanelStrip* target_strip = NULL; 196 PanelStrip* target_strip = NULL;
195 switch (new_layout) { 197 switch (new_layout) {
196 case PanelStrip::DETACHED: 198 case PanelStrip::DETACHED:
197 target_strip = detached_strip_.get(); 199 target_strip = detached_strip_.get();
198 break; 200 break;
199 case PanelStrip::DOCKED: 201 case PanelStrip::DOCKED:
200 target_strip = docked_strip_.get(); 202 target_strip = docked_strip_.get();
201 break; 203 break;
202 case PanelStrip::IN_OVERFLOW: 204 case PanelStrip::IN_OVERFLOW:
203 target_strip = overflow_strip_.get(); 205 target_strip = overflow_strip_.get();
204 break; 206 break;
205 default: 207 default:
206 NOTREACHED(); 208 NOTREACHED();
207 } 209 }
208 210
209 target_strip->AddPanel(panel); 211 target_strip->AddPanel(panel, positioning_mask);
210 212
211 content::NotificationService::current()->Notify( 213 content::NotificationService::current()->Notify(
212 chrome::NOTIFICATION_PANEL_CHANGED_LAYOUT_MODE, 214 chrome::NOTIFICATION_PANEL_CHANGED_LAYOUT_MODE,
213 content::Source<Panel>(panel), 215 content::Source<Panel>(panel),
214 content::NotificationService::NoDetails()); 216 content::NotificationService::NoDetails());
215 } 217 }
216 218
217 void PanelManager::MovePanelsToOverflow(Panel* last_panel_to_move) { 219 void PanelManager::MovePanelsToOverflow(Panel* last_panel_to_move) {
218 AutoReset<bool> processing_overflow(&is_processing_overflow_, true); 220 AutoReset<bool> processing_overflow(&is_processing_overflow_, true);
219 // Move panels to overflow in reverse to maintain their order. 221 // Move panels to overflow in reverse to maintain their order.
220 Panel* bumped_panel; 222 Panel* bumped_panel;
221 while ((bumped_panel = docked_strip_->last_panel())) { 223 while ((bumped_panel = docked_strip_->last_panel())) {
222 MovePanelToStrip(bumped_panel, PanelStrip::IN_OVERFLOW); 224 MovePanelToStrip(bumped_panel,
225 PanelStrip::IN_OVERFLOW,
226 PanelStrip::DEFAULT_POSITION);
223 if (bumped_panel == last_panel_to_move) 227 if (bumped_panel == last_panel_to_move)
224 break; 228 break;
225 } 229 }
226 DCHECK(!docked_strip_->panels().empty()); 230 DCHECK(!docked_strip_->panels().empty());
227 } 231 }
228 232
229 void PanelManager::MovePanelsOutOfOverflowIfCanFit() { 233 void PanelManager::MovePanelsOutOfOverflowIfCanFit() {
230 if (is_processing_overflow_) 234 if (is_processing_overflow_)
231 return; 235 return;
232 236
233 Panel* overflow_panel; 237 Panel* overflow_panel;
234 while ((overflow_panel = overflow_strip_->first_panel()) && 238 while ((overflow_panel = overflow_strip_->first_panel()) &&
235 docked_strip_->CanFitPanel(overflow_panel)) 239 docked_strip_->CanFitPanel(overflow_panel)) {
236 MovePanelToStrip(overflow_panel, PanelStrip::DOCKED); 240 MovePanelToStrip(overflow_panel,
241 PanelStrip::DOCKED,
242 PanelStrip::DEFAULT_POSITION);
243 }
237 } 244 }
238 245
239 bool PanelManager::ShouldBringUpTitlebars(int mouse_x, int mouse_y) const { 246 bool PanelManager::ShouldBringUpTitlebars(int mouse_x, int mouse_y) const {
240 return docked_strip_->ShouldBringUpTitlebars(mouse_x, mouse_y); 247 return docked_strip_->ShouldBringUpTitlebars(mouse_x, mouse_y);
241 } 248 }
242 249
243 void PanelManager::BringUpOrDownTitlebars(bool bring_up) { 250 void PanelManager::BringUpOrDownTitlebars(bool bring_up) {
244 docked_strip_->BringUpOrDownTitlebars(bring_up); 251 docked_strip_->BringUpOrDownTitlebars(bring_up);
245 } 252 }
246 253
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 return panels; 326 return panels;
320 } 327 }
321 328
322 int PanelManager::overflow_strip_width() const { 329 int PanelManager::overflow_strip_width() const {
323 return kOverflowStripThickness; 330 return kOverflowStripThickness;
324 } 331 }
325 332
326 void PanelManager::SetMouseWatcher(PanelMouseWatcher* watcher) { 333 void PanelManager::SetMouseWatcher(PanelMouseWatcher* watcher) {
327 panel_mouse_watcher_.reset(watcher); 334 panel_mouse_watcher_.reset(watcher);
328 } 335 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/panels/panel_manager.h ('k') | chrome/browser/ui/panels/panel_overflow_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698