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 #ifndef CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_ | 5 #ifndef CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_ |
6 #define CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_ | 6 #define CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
11 #include "base/memory/ref_counted.h" | |
11 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/task.h" | |
14 #include "chrome/browser/ui/panels/auto_hiding_desktop_bar.h" | |
12 #include "chrome/browser/ui/panels/panel.h" | 15 #include "chrome/browser/ui/panels/panel.h" |
13 #include "ui/gfx/rect.h" | 16 #include "ui/gfx/rect.h" |
14 | 17 |
15 class Browser; | 18 class Browser; |
16 class Panel; | 19 class Panel; |
17 | 20 |
18 // This class manages a set of panels. | 21 // This class manages a set of panels. |
19 class PanelManager { | 22 // Note that the ref count is needed by using PostTask in the implementation. |
23 class PanelManager : public AutoHidingDesktopBar::Observer, | |
24 public base::RefCounted<PanelManager> { | |
20 public: | 25 public: |
26 typedef std::vector<Panel*> Panels; | |
27 | |
21 // Returns a single instance. | 28 // Returns a single instance. |
22 static PanelManager* GetInstance(); | 29 static PanelManager* GetInstance(); |
23 | 30 |
24 ~PanelManager(); | 31 virtual ~PanelManager(); |
25 | 32 |
26 // Called when the display is changed, i.e. work area is updated. | 33 // Called when the display is changed, i.e. work area is updated. |
27 void OnDisplayChanged(); | 34 void OnDisplayChanged(); |
28 | 35 |
29 // Creates a panel and returns it. The panel might be queued for display | 36 // Creates a panel and returns it. The panel might be queued for display |
30 // later. | 37 // later. |
31 Panel* CreatePanel(Browser* browser); | 38 Panel* CreatePanel(Browser* browser); |
32 | 39 |
33 void Remove(Panel* panel); | 40 void Remove(Panel* panel); |
34 void RemoveAll(); | 41 void RemoveAll(); |
35 | 42 |
36 // Drags the given panel. | 43 // Drags the given panel. |
37 void StartDragging(Panel* panel); | 44 void StartDragging(Panel* panel); |
38 void Drag(int delta_x); | 45 void Drag(int delta_x); |
39 void EndDragging(bool cancelled); | 46 void EndDragging(bool cancelled); |
40 | 47 |
41 // Should we bring up the titlebar, given the current mouse point? | 48 // Returns true if we should bring up the titlebars, given the current mouse |
42 bool ShouldBringUpTitlebarForAllMinimizedPanels(int mouse_x, | 49 // point? |
jennb
2011/08/26 20:41:57
s/?/.
jianli
2011/08/26 22:18:52
Done.
| |
43 int mouse_y) const; | 50 bool ShouldBringUpTitlebars(int mouse_x, int mouse_y) const; |
44 | 51 |
45 // Brings up or down the title-bar for all minimized panels. | 52 // Brings up or down the titlebars for all minimized panels. |
46 void BringUpOrDownTitlebarForAllMinimizedPanels(bool bring_up); | 53 void BringUpOrDownTitlebars(bool bring_up); |
54 | |
55 // Returns the bottom position for the panel per its expansion state. If auto- | |
56 // hide bottom bar is present, we want to move the minimized panel to the | |
57 // bottom of the screen, not the bottom of the work area. | |
58 int GetBottomPositionForExpansionState( | |
59 Panel::ExpansionState expansion_state) const; | |
47 | 60 |
48 int num_panels() const { return panels_.size(); } | 61 int num_panels() const { return panels_.size(); } |
49 bool is_dragging_panel() const; | 62 bool is_dragging_panel() const; |
50 | 63 |
64 #ifdef UNIT_TEST | |
65 const Panels& panels() const { return panels_; } | |
66 static int horizontal_spacing() { return kPanelsHorizontalSpacing; } | |
67 | |
68 const gfx::Rect& work_area() const { | |
69 return work_area_; | |
70 } | |
71 | |
72 void set_auto_hiding_desktop_bar( | |
73 AutoHidingDesktopBar* auto_hiding_desktop_bar) { | |
74 auto_hiding_desktop_bar_ = auto_hiding_desktop_bar; | |
75 } | |
76 | |
77 void SetWorkAreaForTesting(const gfx::Rect& work_area) { | |
78 SetWorkArea(work_area); | |
79 } | |
80 #endif | |
81 | |
51 private: | 82 private: |
52 friend class PanelBrowserTest; | 83 enum TitlebarAction { |
53 | 84 NO_ACTION, |
54 typedef std::vector<Panel*> Panels; | 85 BRING_UP, |
86 BRING_DOWN | |
87 }; | |
55 | 88 |
56 PanelManager(); | 89 PanelManager(); |
57 | 90 |
58 #if UNIT_TEST | 91 // Overridden from AutoHidingDesktopBar::Observer: |
59 const Panels& panels() const { return panels_; } | 92 virtual void OnAutoHidingDesktopBarThicknessChanged() OVERRIDE; |
60 static int horizontal_spacing() { return kPanelsHorizontalSpacing; } | 93 virtual void OnAutoHidingDesktopBarVisibilityChanged( |
61 #endif | 94 AutoHidingDesktopBar::Alignment alignment, |
95 AutoHidingDesktopBar::Visibility visibility) OVERRIDE; | |
62 | 96 |
63 // Applies the new work area. This is called by OnDisplayChanged and the test | 97 // Applies the new work area. This is called by OnDisplayChanged and the test |
64 // code. | 98 // code. |
65 void SetWorkArea(const gfx::Rect& work_area); | 99 void SetWorkArea(const gfx::Rect& work_area); |
66 | 100 |
101 // Adjusts the work area to exclude the influence of auto-hiding desktop bars. | |
102 void AdjustWorkAreaForAutoHidingDesktopBars(); | |
103 | |
67 // Handles all the panels that're delayed to be removed. | 104 // Handles all the panels that're delayed to be removed. |
68 void DelayedRemove(); | 105 void DelayedRemove(); |
69 | 106 |
70 // Does the remove. Called from Remove and DelayedRemove. | 107 // Does the remove. Called from Remove and DelayedRemove. |
71 void DoRemove(Panel* panel); | 108 void DoRemove(Panel* panel); |
72 | 109 |
73 // Rearranges the positions of the panels starting from the given iterator. | 110 // Rearranges the positions of the panels starting from the given iterator. |
74 // This is called when the display space has been changed, i.e. working | 111 // This is called when the display space has been changed, i.e. working |
75 // area being changed or a panel being closed. | 112 // area being changed or a panel being closed. |
76 void Rearrange(Panels::iterator iter_to_start); | 113 void Rearrange(Panels::iterator iter_to_start, int rightmost_position); |
77 | |
78 // Computes the bounds for next panel. | |
79 // |allow_size_change| is used to indicate if the panel size can be changed to | |
80 // fall within the size constraint, e.g., when the panel is created. | |
81 // Returns true if computed bounds are within the displayable area. | |
82 bool ComputeBoundsForNextPanel(gfx::Rect* bounds, bool allow_size_change); | |
83 | 114 |
84 // Finds one panel to close so that we may have space for the new panel | 115 // Finds one panel to close so that we may have space for the new panel |
85 // created by |extension|. | 116 // created by |extension|. |
86 void FindAndClosePanelOnOverflow(const Extension* extension); | 117 void FindAndClosePanelOnOverflow(const Extension* extension); |
87 | 118 |
88 // Help functions to drag the given panel. | 119 // Help functions to drag the given panel. |
89 void DragLeft(); | 120 void DragLeft(); |
90 void DragRight(); | 121 void DragRight(); |
91 | 122 |
92 // Horizontal spacing between panels. Used for unit testing. | 123 // Checks if the titlebars have been brought up or down. If not, do not wait |
124 // for the notifications to trigger it any more, and start to bring them up or | |
jennb
2011/08/26 20:41:57
s/any more/anymore
jianli
2011/08/26 22:18:52
Seems any more is better.
| |
125 // down immediately. | |
126 void DelayedBringUpOrDownTitlebarsCheck(); | |
127 | |
128 // Does the real job of bringing up or down the titlebars. | |
129 void DoBringUpOrDownTitlebars(bool bring_up); | |
130 | |
131 int GetRightMostAvaialblePosition() const; | |
93 | 132 |
94 Panels panels_; | 133 Panels panels_; |
95 | 134 |
96 // Stores the panels that are pending to remove. We want to delay the removal | 135 // Stores the panels that are pending to remove. We want to delay the removal |
97 // when we're in the process of the dragging. | 136 // when we're in the process of the dragging. |
98 Panels panels_pending_to_remove_; | 137 Panels panels_pending_to_remove_; |
99 | 138 |
100 // Current work area used in computing the panel bounds. | 139 // The maximum work area avaialble. This area does not include the area taken |
140 // by the always-visible (non-auto-hiding) desktop bars. | |
101 gfx::Rect work_area_; | 141 gfx::Rect work_area_; |
102 | 142 |
103 // Used in computing the bounds of the next panel. | 143 // The useable work area for computing the panel bounds. This area excludes |
104 int max_width_; | 144 // the potential area that could be taken by the auto-hiding desktop |
105 int max_height_; | 145 // bars (we only consider those bars that are aligned to bottom, left, and |
106 int min_x_; | 146 // right of the screen edges) when they become fully visible. |
107 int current_x_; | 147 gfx::Rect adjusted_work_area_; |
108 int bottom_edge_y_; | |
109 | 148 |
110 // Panel to drag. | 149 // Panel to drag. |
111 size_t dragging_panel_index_; | 150 size_t dragging_panel_index_; |
112 | 151 |
113 // Original x coordinate of the panel to drag. This is used to get back to | 152 // Original x coordinate of the panel to drag. This is used to get back to |
114 // the original position when we cancel the dragging. | 153 // the original position when we cancel the dragging. |
115 int dragging_panel_original_x_; | 154 int dragging_panel_original_x_; |
116 | 155 |
117 // Bounds of the panel to drag. It is first set to the original bounds when | 156 // Bounds of the panel to drag. It is first set to the original bounds when |
118 // the dragging happens. Then it is updated to the position that will be set | 157 // the dragging happens. Then it is updated to the position that will be set |
119 // to when the dragging ends. | 158 // to when the dragging ends. |
120 gfx::Rect dragging_panel_bounds_; | 159 gfx::Rect dragging_panel_bounds_; |
121 | 160 |
161 scoped_refptr<AutoHidingDesktopBar> auto_hiding_desktop_bar_; | |
162 | |
163 TitlebarAction delayed_titlebar_action_; | |
164 | |
165 ScopedRunnableMethodFactory<PanelManager> method_factory_; | |
166 | |
122 static const int kPanelsHorizontalSpacing = 4; | 167 static const int kPanelsHorizontalSpacing = 4; |
123 | 168 |
124 DISALLOW_COPY_AND_ASSIGN(PanelManager); | 169 DISALLOW_COPY_AND_ASSIGN(PanelManager); |
125 }; | 170 }; |
126 | 171 |
127 #endif // CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_ | 172 #endif // CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_ |
OLD | NEW |