OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/ui/panels/docked_panel_drag_handler.h" | |
6 | |
7 #include "chrome/browser/ui/panels/docked_panel_collection.h" | |
8 #include "chrome/browser/ui/panels/panel.h" | |
9 #include "chrome/browser/ui/panels/panel_manager.h" | |
10 #include "ui/gfx/geometry/point.h" | |
11 #include "ui/gfx/geometry/rect.h" | |
12 | |
13 // static | |
14 void DockedPanelDragHandler::HandleDrag(Panel* panel, | |
15 const gfx::Point& target_position) { | |
16 DCHECK_EQ(PanelCollection::DOCKED, panel->collection()->type()); | |
17 | |
18 DockedPanelCollection* collection = | |
19 static_cast<DockedPanelCollection*>(panel->collection()); | |
20 | |
21 // Moves this panel to the dragging position. | |
22 // Note that we still allow the panel to be moved vertically until it gets | |
23 // aligned to the bottom area. | |
24 gfx::Rect new_bounds(panel->GetBounds()); | |
25 new_bounds.set_x(target_position.x()); | |
26 int delta_x = new_bounds.x() - panel->GetBounds().x(); | |
27 int bottom = collection->GetBottomPositionForExpansionState( | |
28 panel->expansion_state()); | |
29 if (new_bounds.bottom() != bottom) { | |
30 new_bounds.set_y(target_position.y()); | |
31 if (new_bounds.bottom() > bottom) | |
32 new_bounds.set_y(bottom - new_bounds.height()); | |
33 } | |
34 panel->SetPanelBoundsInstantly(new_bounds); | |
35 | |
36 if (delta_x) { | |
37 // Checks and processes other affected panels. | |
38 if (delta_x > 0) | |
39 DragRight(panel); | |
40 else | |
41 DragLeft(panel); | |
42 | |
43 // Layout refresh will automatically recompute the bounds of all affected | |
44 // panels due to their position changes. | |
45 collection->RefreshLayout(); | |
46 } | |
47 } | |
48 | |
49 // static | |
50 void DockedPanelDragHandler::DragLeft(Panel* panel) { | |
51 DockedPanelCollection* collection = | |
52 static_cast<DockedPanelCollection*>(panel->collection()); | |
53 | |
54 // This is the left corner of the dragging panel. We use it to check against | |
55 // all the panels on its left. | |
56 int dragging_panel_left_boundary = panel->GetBounds().x(); | |
57 | |
58 // Checks the panels to the left of the dragging panel. | |
59 DockedPanelCollection::Panels::iterator dragging_panel_iterator = | |
60 find(collection->panels_.begin(), collection->panels_.end(), panel); | |
61 DockedPanelCollection::Panels::iterator current_panel_iterator = | |
62 dragging_panel_iterator; | |
63 ++current_panel_iterator; | |
64 for (; current_panel_iterator != collection->panels_.end(); | |
65 ++current_panel_iterator) { | |
66 Panel* current_panel = *current_panel_iterator; | |
67 | |
68 // Can we swap dragging panel with its left panel? The criterion is that | |
69 // the left corner of dragging panel should pass the middle position of | |
70 // its left panel. | |
71 if (dragging_panel_left_boundary > current_panel->GetBounds().x() + | |
72 current_panel->GetBounds().width() / 2) | |
73 break; | |
74 | |
75 // Swaps the contents and makes |dragging_panel_iterator| refers to the new | |
76 // position. | |
77 *dragging_panel_iterator = current_panel; | |
78 *current_panel_iterator = panel; | |
79 dragging_panel_iterator = current_panel_iterator; | |
80 } | |
81 } | |
82 | |
83 // static | |
84 void DockedPanelDragHandler::DragRight(Panel* panel) { | |
85 DockedPanelCollection* collection = | |
86 static_cast<DockedPanelCollection*>(panel->collection()); | |
87 | |
88 // This is the right corner of the dragging panel. We use it to check against | |
89 // all the panels on its right. | |
90 int dragging_panel_right_boundary = panel->GetBounds().x() + | |
91 panel->GetBounds().width() - 1; | |
92 | |
93 // Checks the panels to the right of the dragging panel. | |
94 DockedPanelCollection::Panels::iterator dragging_panel_iterator = | |
95 find(collection->panels_.begin(), collection->panels_.end(), panel); | |
96 DockedPanelCollection::Panels::iterator current_panel_iterator = | |
97 dragging_panel_iterator; | |
98 while (current_panel_iterator != collection->panels_.begin()) { | |
99 current_panel_iterator--; | |
100 Panel* current_panel = *current_panel_iterator; | |
101 | |
102 // Can we swap dragging panel with its right panel? The criterion is that | |
103 // the left corner of dragging panel should pass the middle position of | |
104 // its right panel. | |
105 if (dragging_panel_right_boundary < current_panel->GetBounds().x() + | |
106 current_panel->GetBounds().width() / 2) | |
107 break; | |
108 | |
109 // Swaps the contents and makes |dragging_panel_iterator| refers to the new | |
110 // position. | |
111 *dragging_panel_iterator = current_panel; | |
112 *current_panel_iterator = panel; | |
113 dragging_panel_iterator = current_panel_iterator; | |
114 } | |
115 } | |
OLD | NEW |