OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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/views/frame/browser_view_layout.h" | 5 #include "chrome/browser/ui/views/frame/browser_view_layout.h" |
6 | 6 |
7 #include "base/observer_list.h" | 7 #include "base/observer_list.h" |
8 #include "chrome/browser/profiles/profile.h" | 8 #include "chrome/browser/profiles/profile.h" |
9 #include "chrome/browser/ui/browser.h" | 9 #include "chrome/browser/ui/browser.h" |
10 #include "chrome/browser/ui/browser_finder.h" | 10 #include "chrome/browser/ui/browser_finder.h" |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 // Finally decrease the width of the bounding box by the width of | 236 // Finally decrease the width of the bounding box by the width of |
237 // the vertical scroll bar. | 237 // the vertical scroll bar. |
238 int scrollbar_width = gfx::scrollbar_size(); | 238 int scrollbar_width = gfx::scrollbar_size(); |
239 bounding_box.set_width(std::max(0, bounding_box.width() - scrollbar_width)); | 239 bounding_box.set_width(std::max(0, bounding_box.width() - scrollbar_width)); |
240 if (base::i18n::IsRTL()) | 240 if (base::i18n::IsRTL()) |
241 bounding_box.set_x(bounding_box.x() + scrollbar_width); | 241 bounding_box.set_x(bounding_box.x() + scrollbar_width); |
242 | 242 |
243 return bounding_box; | 243 return bounding_box; |
244 } | 244 } |
245 | 245 |
246 bool BrowserViewLayout::IsPositionInWindowCaption( | 246 int BrowserViewLayout::NonClientHitTest(const gfx::Point& point) { |
247 const gfx::Point& point) { | |
248 // Tab strip may transiently have no parent between the RemoveChildView() and | |
249 // AddChildView() caused by reparenting during an immersive mode reveal. | |
250 // During this window report that the point didn't hit a tab. | |
251 if (!tab_strip_->parent()) | |
252 return true; | |
253 gfx::Point tabstrip_point(point); | |
254 views::View::ConvertPointToTarget(browser_view_, tab_strip_, &tabstrip_point); | |
255 return tab_strip_->IsPositionInWindowCaption(tabstrip_point); | |
256 } | |
257 | |
258 int BrowserViewLayout::NonClientHitTest( | |
259 const gfx::Point& point) { | |
260 // Since the TabStrip only renders in some parts of the top of the window, | 247 // Since the TabStrip only renders in some parts of the top of the window, |
261 // the un-obscured area is considered to be part of the non-client caption | 248 // the un-obscured area is considered to be part of the non-client caption |
262 // area of the window. So we need to treat hit-tests in these regions as | 249 // area of the window. So we need to treat hit-tests in these regions as |
263 // hit-tests of the titlebar. | 250 // hit-tests of the titlebar. |
264 | 251 |
265 views::View* parent = browser_view_->parent(); | 252 views::View* parent = browser_view_->parent(); |
266 | 253 |
267 gfx::Point point_in_browser_view_coords(point); | 254 gfx::Point point_in_browser_view_coords(point); |
268 views::View::ConvertPointToTarget( | 255 views::View::ConvertPointToTarget( |
269 parent, browser_view_, &point_in_browser_view_coords); | 256 parent, browser_view_, &point_in_browser_view_coords); |
270 gfx::Point test_point(point); | 257 gfx::Point test_point(point); |
271 | 258 |
272 // Determine if the TabStrip exists and is capable of being clicked on. We | 259 // Determine if the TabStrip exists and is capable of being clicked on. We |
273 // might be a popup window without a TabStrip. | 260 // might be a popup window without a TabStrip. |
274 if (browser_view_->IsTabStripVisible()) { | 261 if (browser_view_->IsTabStripVisible()) { |
275 // See if the mouse pointer is within the bounds of the TabStrip. | 262 // See if the mouse pointer is within the bounds of the TabStrip. |
276 if (ConvertedHitTest(parent, tab_strip_, &test_point)) { | 263 if (ConvertedHitTest(parent, tab_strip_, &test_point)) { |
277 if (tab_strip_->IsPositionInWindowCaption(test_point)) | 264 if (tab_strip_->IsPositionInWindowCaption(test_point)) |
278 return HTCAPTION; | 265 return HTCAPTION; |
279 return HTCLIENT; | 266 return HTCLIENT; |
280 } | 267 } |
281 | 268 |
282 // The top few pixels of the TabStrip are a drop-shadow - as we're pretty | 269 // The top few pixels of the TabStrip are a drop-shadow - as we're pretty |
283 // starved of dragable area, let's give it to window dragging (this also | 270 // starved of dragable area, let's give it to window dragging (this also |
284 // makes sense visually). | 271 // makes sense visually). |
285 if (!browser_view_->IsMaximized() && | 272 if (!(browser_view_->IsMaximized() || browser_view_->IsFullscreen()) && |
286 (point_in_browser_view_coords.y() < | 273 (point_in_browser_view_coords.y() < |
287 (tab_strip_->y() + kTabShadowSize))) { | 274 (tab_strip_->y() + kTabShadowSize))) { |
288 // We return HTNOWHERE as this is a signal to our containing | 275 // We return HTNOWHERE as this is a signal to our containing |
289 // NonClientView that it should figure out what the correct hit-test | 276 // NonClientView that it should figure out what the correct hit-test |
290 // code is given the mouse position... | 277 // code is given the mouse position... |
291 return HTNOWHERE; | 278 return HTNOWHERE; |
292 } | 279 } |
293 } | 280 } |
294 | 281 |
295 // If the point's y coordinate is below the top of the toolbar and otherwise | 282 // If the point's y coordinate is below the top of the toolbar and otherwise |
296 // within the bounds of this view, the point is considered to be within the | 283 // within the bounds of this view, the point is considered to be within the |
297 // client area. | 284 // client area. |
298 gfx::Rect bv_bounds = browser_view_->bounds(); | 285 gfx::Rect bv_bounds = browser_view_->bounds(); |
299 bv_bounds.Offset(0, toolbar_->y()); | 286 bv_bounds.Offset(0, toolbar_->y()); |
300 bv_bounds.set_height(bv_bounds.height() - toolbar_->y()); | 287 bv_bounds.set_height(bv_bounds.height() - toolbar_->y()); |
301 if (bv_bounds.Contains(point)) | 288 if (bv_bounds.Contains(point)) |
302 return HTCLIENT; | 289 return HTCLIENT; |
303 | 290 |
304 // If the point's y coordinate is above the top of the toolbar, but not in | 291 // If the point is within the bounds of the window switcher button, the point |
305 // the tabstrip (per previous checking in this function), then we consider it | 292 // is considered to be within the client area. |
306 // in the window caption (e.g. the area to the right of the tabstrip | 293 views::View* window_switcher_button = delegate_->GetWindowSwitcherButton(); |
307 // underneath the window controls). However, note that we DO NOT return | 294 if (window_switcher_button && window_switcher_button->visible()) { |
308 // HTCAPTION here, because when the window is maximized the window controls | 295 gfx::Point window_switcher_point(point_in_browser_view_coords); |
309 // will fall into this space (since the BrowserView is sized to entire size | 296 views::View::ConvertPointToTarget(browser_view_, window_switcher_button, |
310 // of the window at that point), and the HTCAPTION value will cause the | 297 &window_switcher_point); |
311 // window controls not to work. So we return HTNOWHERE so that the caller | 298 if (window_switcher_button->HitTestPoint(window_switcher_point)) |
312 // will hit-test the window controls before finally falling back to | 299 return HTCLIENT; |
313 // HTCAPTION. | 300 } |
| 301 |
| 302 // If the point's y coordinate is above the top of the toolbar, but neither |
| 303 // over the tabstrip nor over the window switcher button (per previous |
| 304 // checking in this function), then we consider it in the window caption |
| 305 // (e.g. the area to the right of the tabstrip underneath the window |
| 306 // controls). However, note that we DO NOT return HTCAPTION here, because |
| 307 // when the window is maximized the window controls will fall into this |
| 308 // space (since the BrowserView is sized to entire size of the window at that |
| 309 // point), and the HTCAPTION value will cause the window controls not to work. |
| 310 // So we return HTNOWHERE so that the caller will hit-test the window controls |
| 311 // before finally falling back to HTCAPTION. |
314 bv_bounds = browser_view_->bounds(); | 312 bv_bounds = browser_view_->bounds(); |
315 bv_bounds.set_height(toolbar_->y()); | 313 bv_bounds.set_height(toolbar_->y()); |
316 if (bv_bounds.Contains(point)) | 314 if (bv_bounds.Contains(point)) |
317 return HTNOWHERE; | 315 return HTNOWHERE; |
318 | 316 |
319 // If the point is somewhere else, delegate to the default implementation. | 317 // If the point is somewhere else, delegate to the default implementation. |
320 return browser_view_->views::ClientView::NonClientHitTest(point); | 318 return browser_view_->views::ClientView::NonClientHitTest(point); |
321 } | 319 } |
322 | 320 |
323 ////////////////////////////////////////////////////////////////////////////// | 321 ////////////////////////////////////////////////////////////////////////////// |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 return bottom; | 556 return bottom; |
559 } | 557 } |
560 | 558 |
561 bool BrowserViewLayout::InfobarVisible() const { | 559 bool BrowserViewLayout::InfobarVisible() const { |
562 // Cast to a views::View to access GetPreferredSize(). | 560 // Cast to a views::View to access GetPreferredSize(). |
563 views::View* infobar_container = infobar_container_; | 561 views::View* infobar_container = infobar_container_; |
564 // NOTE: Can't check if the size IsEmpty() since it's always 0-width. | 562 // NOTE: Can't check if the size IsEmpty() since it's always 0-width. |
565 return browser_->SupportsWindowFeature(Browser::FEATURE_INFOBAR) && | 563 return browser_->SupportsWindowFeature(Browser::FEATURE_INFOBAR) && |
566 (infobar_container->GetPreferredSize().height() != 0); | 564 (infobar_container->GetPreferredSize().height() != 0); |
567 } | 565 } |
OLD | NEW |