Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "ash/wm/dock/docked_window_layout_manager.h" | 5 #include "ash/wm/dock/docked_window_layout_manager.h" |
| 6 | 6 |
| 7 #include "ash/ash_switches.h" | 7 #include "ash/ash_switches.h" |
| 8 #include "ash/screen_ash.h" | 8 #include "ash/screen_ash.h" |
| 9 #include "ash/shelf/shelf.h" | 9 #include "ash/shelf/shelf.h" |
| 10 #include "ash/shelf/shelf_constants.h" | 10 #include "ash/shelf/shelf_constants.h" |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 451 | 451 |
| 452 void DockedWindowLayoutManager::RemoveObserver( | 452 void DockedWindowLayoutManager::RemoveObserver( |
| 453 DockedWindowLayoutManagerObserver* observer) { | 453 DockedWindowLayoutManagerObserver* observer) { |
| 454 observer_list_.RemoveObserver(observer); | 454 observer_list_.RemoveObserver(observer); |
| 455 } | 455 } |
| 456 | 456 |
| 457 void DockedWindowLayoutManager::StartDragging(aura::Window* window) { | 457 void DockedWindowLayoutManager::StartDragging(aura::Window* window) { |
| 458 DCHECK(!dragged_window_); | 458 DCHECK(!dragged_window_); |
| 459 dragged_window_ = window; | 459 dragged_window_ = window; |
| 460 DCHECK(!IsPopupOrTransient(window)); | 460 DCHECK(!IsPopupOrTransient(window)); |
| 461 | |
| 462 // If there are no other docked windows clear alignment when a docked window | |
| 463 // is moved. | |
| 464 if (dragged_window_->parent() == dock_container_ && | |
| 465 !IsAnyWindowDocked() && | |
| 466 wm::GetWindowState(dragged_window_)->drag_details() && | |
| 467 !(wm::GetWindowState(dragged_window_)->drag_details()->bounds_change & | |
| 468 WindowResizer::kBoundsChange_Resizes)) { | |
| 469 alignment_ = DOCKED_ALIGNMENT_NONE; | |
| 470 } | |
| 461 // Start observing a window unless it is docked container's child in which | 471 // Start observing a window unless it is docked container's child in which |
| 462 // case it is already observed. | 472 // case it is already observed. |
| 463 wm::WindowState* dragged_state = wm::GetWindowState(dragged_window_); | 473 wm::WindowState* dragged_state = wm::GetWindowState(dragged_window_); |
| 464 if (dragged_window_->parent() != dock_container_) { | 474 if (dragged_window_->parent() != dock_container_) { |
| 465 dragged_window_->AddObserver(this); | 475 dragged_window_->AddObserver(this); |
| 466 dragged_state->AddObserver(this); | 476 dragged_state->AddObserver(this); |
| 467 } | 477 } |
| 468 is_dragged_from_dock_ = window->parent() == dock_container_; | 478 is_dragged_from_dock_ = window->parent() == dock_container_; |
| 469 DCHECK(!is_dragged_window_docked_); | 479 DCHECK(!is_dragged_window_docked_); |
| 470 | 480 |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 500 is_dragged_from_dock_ = false; | 510 is_dragged_from_dock_ = false; |
| 501 } | 511 } |
| 502 | 512 |
| 503 void DockedWindowLayoutManager::FinishDragging(DockedAction action, | 513 void DockedWindowLayoutManager::FinishDragging(DockedAction action, |
| 504 DockedActionSource source) { | 514 DockedActionSource source) { |
| 505 DCHECK(dragged_window_); | 515 DCHECK(dragged_window_); |
| 506 DCHECK(!IsPopupOrTransient(dragged_window_)); | 516 DCHECK(!IsPopupOrTransient(dragged_window_)); |
| 507 if (is_dragged_window_docked_) | 517 if (is_dragged_window_docked_) |
| 508 OnDraggedWindowUndocked(); | 518 OnDraggedWindowUndocked(); |
| 509 DCHECK (!is_dragged_window_docked_); | 519 DCHECK (!is_dragged_window_docked_); |
| 520 | |
| 521 // If this is the first window getting docked by moving it - update alignment. | |
| 522 if (dragged_window_->parent() == dock_container_ && | |
| 523 !IsAnyWindowDocked() && | |
| 524 wm::GetWindowState(dragged_window_)->drag_details() && | |
| 525 !(wm::GetWindowState(dragged_window_)->drag_details()->bounds_change & | |
| 526 WindowResizer::kBoundsChange_Resizes)) { | |
|
pkotwicz
2014/01/16 21:43:27
I wonder whether it is possible to have a new func
varkha
2014/01/16 23:34:14
I will try to use the "closest to edge" logic when
| |
| 527 alignment_ = GetAlignmentOfWindow(dragged_window_); | |
| 528 } | |
| 510 // Stop observing a window unless it is docked container's child in which | 529 // Stop observing a window unless it is docked container's child in which |
| 511 // case it needs to keep being observed after the drag completes. | 530 // case it needs to keep being observed after the drag completes. |
| 512 if (dragged_window_->parent() != dock_container_) { | 531 if (dragged_window_->parent() != dock_container_) { |
| 513 dragged_window_->RemoveObserver(this); | 532 dragged_window_->RemoveObserver(this); |
| 514 wm::GetWindowState(dragged_window_)->RemoveObserver(this); | 533 wm::GetWindowState(dragged_window_)->RemoveObserver(this); |
| 515 if (last_active_window_ == dragged_window_) | 534 if (last_active_window_ == dragged_window_) |
| 516 last_active_window_ = NULL; | 535 last_active_window_ = NULL; |
| 517 | 536 |
| 518 views::corewm::SetWindowShowAnimationDuration(dragged_window_, | 537 views::corewm::SetWindowShowAnimationDuration(dragged_window_, |
| 519 base::TimeDelta()); | 538 base::TimeDelta()); |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 978 void DockedWindowLayoutManager::UpdateDockedWidth(int width) { | 997 void DockedWindowLayoutManager::UpdateDockedWidth(int width) { |
| 979 if (docked_width_ == width) | 998 if (docked_width_ == width) |
| 980 return; | 999 return; |
| 981 docked_width_ = width; | 1000 docked_width_ = width; |
| 982 UMA_HISTOGRAM_COUNTS_10000("Ash.Dock.Width", docked_width_); | 1001 UMA_HISTOGRAM_COUNTS_10000("Ash.Dock.Width", docked_width_); |
| 983 } | 1002 } |
| 984 | 1003 |
| 985 void DockedWindowLayoutManager::OnDraggedWindowDocked(aura::Window* window) { | 1004 void DockedWindowLayoutManager::OnDraggedWindowDocked(aura::Window* window) { |
| 986 DCHECK(!is_dragged_window_docked_); | 1005 DCHECK(!is_dragged_window_docked_); |
| 987 is_dragged_window_docked_ = true; | 1006 is_dragged_window_docked_ = true; |
| 988 | |
| 989 // If there are no other docked windows update alignment when the window is | |
| 990 // moved. | |
| 991 if (!IsAnyWindowDocked() && | |
| 992 wm::GetWindowState(dragged_window_)->drag_details() && | |
| 993 !(wm::GetWindowState(dragged_window_)->drag_details()->bounds_change & | |
| 994 WindowResizer::kBoundsChange_Resizes)) { | |
| 995 alignment_ = DOCKED_ALIGNMENT_NONE; | |
| 996 } | |
| 997 } | 1007 } |
| 998 | 1008 |
| 999 void DockedWindowLayoutManager::OnDraggedWindowUndocked() { | 1009 void DockedWindowLayoutManager::OnDraggedWindowUndocked() { |
| 1000 // If this is the first window getting docked by moving it - update alignment. | |
| 1001 if (!IsAnyWindowDocked() && | |
| 1002 wm::GetWindowState(dragged_window_)->drag_details() && | |
| 1003 !(wm::GetWindowState(dragged_window_)->drag_details()->bounds_change & | |
| 1004 WindowResizer::kBoundsChange_Resizes)) { | |
| 1005 alignment_ = GetAlignmentOfWindow(dragged_window_); | |
| 1006 } | |
| 1007 DCHECK (is_dragged_window_docked_); | 1010 DCHECK (is_dragged_window_docked_); |
| 1008 is_dragged_window_docked_ = false; | 1011 is_dragged_window_docked_ = false; |
| 1009 } | 1012 } |
| 1010 | 1013 |
| 1011 bool DockedWindowLayoutManager::IsAnyWindowDocked() { | 1014 bool DockedWindowLayoutManager::IsAnyWindowDocked() { |
| 1012 return CalculateAlignment() != DOCKED_ALIGNMENT_NONE; | 1015 return CalculateAlignment() != DOCKED_ALIGNMENT_NONE; |
| 1013 } | 1016 } |
| 1014 | 1017 |
| 1015 void DockedWindowLayoutManager::Relayout() { | 1018 void DockedWindowLayoutManager::Relayout() { |
| 1016 if (in_layout_) | 1019 if (in_layout_) |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1305 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( | 1308 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( |
| 1306 const gfx::Rect& keyboard_bounds) { | 1309 const gfx::Rect& keyboard_bounds) { |
| 1307 // This bounds change will have caused a change to the Shelf which does not | 1310 // This bounds change will have caused a change to the Shelf which does not |
| 1308 // propagate automatically to this class, so manually recalculate bounds. | 1311 // propagate automatically to this class, so manually recalculate bounds. |
| 1309 Relayout(); | 1312 Relayout(); |
| 1310 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); | 1313 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); |
| 1311 } | 1314 } |
| 1312 | 1315 |
| 1313 } // namespace internal | 1316 } // namespace internal |
| 1314 } // namespace ash | 1317 } // namespace ash |
| OLD | NEW |