OLD | NEW |
| (Empty) |
1 // Copyright (c) 2006-2008 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/dock_info.h" | |
6 | |
7 #if defined(TOOLKIT_VIEWS) | |
8 #include "chrome/browser/views/tabs/tab.h" | |
9 #else | |
10 #include "chrome/browser/gtk/tabs/tab_gtk.h" | |
11 #endif | |
12 | |
13 namespace { | |
14 | |
15 // Distance in pixels between the hotspot and when the hint should be shown. | |
16 const int kHotSpotDeltaX = 120; | |
17 const int kHotSpotDeltaY = 120; | |
18 | |
19 // Size of the popup window. | |
20 const int kPopupWidth = 70; | |
21 const int kPopupHeight = 70; | |
22 | |
23 } // namespace | |
24 | |
25 // static | |
26 DockInfo::Factory* DockInfo::factory_ = NULL; | |
27 | |
28 // static | |
29 bool DockInfo::IsCloseToPoint(const gfx::Point& screen_loc, | |
30 int x, | |
31 int y, | |
32 bool* in_enable_area) { | |
33 int delta_x = abs(x - screen_loc.x()); | |
34 int delta_y = abs(y - screen_loc.y()); | |
35 *in_enable_area = (delta_x < kPopupWidth / 2 && delta_y < kPopupHeight / 2); | |
36 return *in_enable_area || (delta_x < kHotSpotDeltaX && | |
37 delta_y < kHotSpotDeltaY); | |
38 } | |
39 | |
40 // static | |
41 bool DockInfo::IsCloseToMonitorPoint(const gfx::Point& screen_loc, | |
42 int x, | |
43 int y, | |
44 DockInfo::Type type, | |
45 bool* in_enable_area) { | |
46 // Because the monitor relative positions are aligned with the edge of the | |
47 // monitor these need to be handled differently. | |
48 int delta_x = abs(x - screen_loc.x()); | |
49 int delta_y = abs(y - screen_loc.y()); | |
50 | |
51 int enable_delta_x = kPopupWidth / 2; | |
52 int enable_delta_y = kPopupHeight / 2; | |
53 int hot_spot_delta_x = kHotSpotDeltaX; | |
54 int hot_spot_delta_y = kHotSpotDeltaY; | |
55 | |
56 switch (type) { | |
57 case DockInfo::LEFT_HALF: | |
58 case DockInfo::RIGHT_HALF: | |
59 enable_delta_x += enable_delta_x; | |
60 hot_spot_delta_x += hot_spot_delta_x; | |
61 break; | |
62 | |
63 | |
64 case DockInfo::MAXIMIZE: { | |
65 // Make the maximize height smaller than the tab height to avoid showing | |
66 // the dock indicator when close to maximized browser. | |
67 #if defined(TOOLKIT_VIEWS) | |
68 hot_spot_delta_y = Tab::GetMinimumUnselectedSize().height() - 1; | |
69 #else | |
70 hot_spot_delta_y = TabGtk::GetMinimumUnselectedSize().height() - 1; | |
71 #endif | |
72 enable_delta_y = hot_spot_delta_y / 2; | |
73 break; | |
74 } | |
75 case DockInfo::BOTTOM_HALF: | |
76 enable_delta_y += enable_delta_y; | |
77 hot_spot_delta_y += hot_spot_delta_y; | |
78 break; | |
79 | |
80 default: | |
81 NOTREACHED(); | |
82 return false; | |
83 } | |
84 *in_enable_area = (delta_x < enable_delta_x && delta_y < enable_delta_y); | |
85 bool result = (*in_enable_area || (delta_x < hot_spot_delta_x && | |
86 delta_y < hot_spot_delta_y)); | |
87 if (type != DockInfo::MAXIMIZE) | |
88 return result; | |
89 | |
90 // Make the hot spot/enable spot for maximized windows the whole top of the | |
91 // monitor. | |
92 int max_delta_y = abs(screen_loc.y() - y); | |
93 *in_enable_area = (*in_enable_area || (max_delta_y < enable_delta_y)); | |
94 return *in_enable_area || (max_delta_y < hot_spot_delta_y); | |
95 } | |
96 | |
97 // static | |
98 int DockInfo::popup_width() { | |
99 return kPopupWidth; | |
100 } | |
101 | |
102 // static | |
103 int DockInfo::popup_height() { | |
104 return kPopupHeight; | |
105 } | |
106 | |
107 bool DockInfo::IsValidForPoint(const gfx::Point& screen_point) { | |
108 if (type_ == NONE) | |
109 return false; | |
110 | |
111 if (window_) { | |
112 return IsCloseToPoint(screen_point, hot_spot_.x(), hot_spot_.y(), | |
113 &in_enable_area_); | |
114 } | |
115 | |
116 return monitor_bounds_.Contains(screen_point) && | |
117 IsCloseToMonitorPoint(screen_point, hot_spot_.x(), | |
118 hot_spot_.y(), type_, &in_enable_area_); | |
119 } | |
120 | |
121 bool DockInfo::GetNewWindowBounds(gfx::Rect* new_window_bounds, | |
122 bool* maximize_new_window) const { | |
123 if (type_ == NONE || !in_enable_area_) | |
124 return false; | |
125 | |
126 gfx::Rect window_bounds; | |
127 if (window_ && !GetWindowBounds(&window_bounds)) | |
128 return false; | |
129 | |
130 int half_m_width = (monitor_bounds_.right() - monitor_bounds_.x()) / 2; | |
131 int half_m_height = (monitor_bounds_.bottom() - monitor_bounds_.y()) / 2; | |
132 | |
133 *maximize_new_window = false; | |
134 | |
135 switch (type_) { | |
136 case LEFT_OF_WINDOW: | |
137 new_window_bounds->SetRect(monitor_bounds_.x(), window_bounds.y(), | |
138 half_m_width, window_bounds.height()); | |
139 break; | |
140 | |
141 case RIGHT_OF_WINDOW: | |
142 new_window_bounds->SetRect(monitor_bounds_.x() + half_m_width, | |
143 window_bounds.y(), half_m_width, | |
144 window_bounds.height()); | |
145 break; | |
146 | |
147 case TOP_OF_WINDOW: | |
148 new_window_bounds->SetRect(window_bounds.x(), monitor_bounds_.y(), | |
149 window_bounds.width(), half_m_height); | |
150 break; | |
151 | |
152 case BOTTOM_OF_WINDOW: | |
153 new_window_bounds->SetRect(window_bounds.x(), | |
154 monitor_bounds_.y() + half_m_height, | |
155 window_bounds.width(), half_m_height); | |
156 break; | |
157 | |
158 case LEFT_HALF: | |
159 new_window_bounds->SetRect(monitor_bounds_.x(), monitor_bounds_.y(), | |
160 half_m_width, monitor_bounds_.height()); | |
161 break; | |
162 | |
163 case RIGHT_HALF: | |
164 new_window_bounds->SetRect(monitor_bounds_.right() - half_m_width, | |
165 monitor_bounds_.y(), half_m_width, monitor_bounds_.height()); | |
166 break; | |
167 | |
168 case BOTTOM_HALF: | |
169 new_window_bounds->SetRect(monitor_bounds_.x(), | |
170 monitor_bounds_.y() + half_m_height, | |
171 monitor_bounds_.width(), half_m_height); | |
172 break; | |
173 | |
174 case MAXIMIZE: | |
175 *maximize_new_window = true; | |
176 break; | |
177 | |
178 default: | |
179 NOTREACHED(); | |
180 } | |
181 return true; | |
182 } | |
183 | |
184 void DockInfo::AdjustOtherWindowBounds() const { | |
185 if (!in_enable_area_) | |
186 return; | |
187 | |
188 gfx::Rect window_bounds; | |
189 if (!window_ || !GetWindowBounds(&window_bounds)) | |
190 return; | |
191 | |
192 gfx::Rect other_window_bounds; | |
193 int half_m_width = (monitor_bounds_.right() - monitor_bounds_.x()) / 2; | |
194 int half_m_height = (monitor_bounds_.bottom() - monitor_bounds_.y()) / 2; | |
195 | |
196 switch (type_) { | |
197 case LEFT_OF_WINDOW: | |
198 other_window_bounds.SetRect(monitor_bounds_.x() + half_m_width, | |
199 window_bounds.y(), half_m_width, | |
200 window_bounds.height()); | |
201 break; | |
202 | |
203 case RIGHT_OF_WINDOW: | |
204 other_window_bounds.SetRect(monitor_bounds_.x(), window_bounds.y(), | |
205 half_m_width, window_bounds.height()); | |
206 break; | |
207 | |
208 case TOP_OF_WINDOW: | |
209 other_window_bounds.SetRect(window_bounds.x(), | |
210 monitor_bounds_.y() + half_m_height, | |
211 window_bounds.width(), half_m_height); | |
212 break; | |
213 | |
214 case BOTTOM_OF_WINDOW: | |
215 other_window_bounds.SetRect(window_bounds.x(), monitor_bounds_.y(), | |
216 window_bounds.width(), half_m_height); | |
217 break; | |
218 | |
219 default: | |
220 return; | |
221 } | |
222 | |
223 SizeOtherWindowTo(other_window_bounds); | |
224 } | |
225 | |
226 gfx::Rect DockInfo::GetPopupRect() const { | |
227 int x = hot_spot_.x() - popup_width() / 2; | |
228 int y = hot_spot_.y() - popup_height() / 2; | |
229 switch (type_) { | |
230 case LEFT_OF_WINDOW: | |
231 case RIGHT_OF_WINDOW: | |
232 case TOP_OF_WINDOW: | |
233 case BOTTOM_OF_WINDOW: { | |
234 // Constrain the popup to the monitor's bounds. | |
235 gfx::Rect ideal_bounds(x, y, popup_width(), popup_height()); | |
236 ideal_bounds = ideal_bounds.AdjustToFit(monitor_bounds_); | |
237 return ideal_bounds; | |
238 } | |
239 case DockInfo::MAXIMIZE: | |
240 y += popup_height() / 2; | |
241 break; | |
242 case DockInfo::LEFT_HALF: | |
243 x += popup_width() / 2; | |
244 break; | |
245 case DockInfo::RIGHT_HALF: | |
246 x -= popup_width() / 2; | |
247 break; | |
248 case DockInfo::BOTTOM_HALF: | |
249 y -= popup_height() / 2; | |
250 break; | |
251 | |
252 default: | |
253 NOTREACHED(); | |
254 } | |
255 return gfx::Rect(x, y, popup_width(), popup_height()); | |
256 } | |
257 | |
258 bool DockInfo::CheckMonitorPoint(const gfx::Point& screen_loc, | |
259 int x, | |
260 int y, | |
261 Type type) { | |
262 if (IsCloseToMonitorPoint(screen_loc, x, y, type, &in_enable_area_)) { | |
263 hot_spot_.SetPoint(x, y); | |
264 type_ = type; | |
265 return true; | |
266 } | |
267 return false; | |
268 } | |
OLD | NEW |