| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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_non_client_frame_view_aura.h" | 5 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view_aura.h" |
| 6 | 6 |
| 7 #include "ash/wm/frame_painter.h" | 7 #include "ash/wm/frame_painter.h" |
| 8 #include "ash/wm/workspace/frame_maximize_button.h" | 8 #include "ash/wm/workspace/frame_maximize_button.h" |
| 9 #include "chrome/browser/themes/theme_service.h" | 9 #include "chrome/browser/themes/theme_service.h" |
| 10 #include "chrome/browser/ui/views/avatar_menu_button.h" | 10 #include "chrome/browser/ui/views/avatar_menu_button.h" |
| 11 #include "chrome/browser/ui/views/frame/browser_frame.h" | 11 #include "chrome/browser/ui/views/frame/browser_frame.h" |
| 12 #include "chrome/browser/ui/views/frame/browser_view.h" | 12 #include "chrome/browser/ui/views/frame/browser_view.h" |
| 13 #include "content/public/browser/web_contents.h" | 13 #include "content/public/browser/web_contents.h" |
| 14 #include "grit/generated_resources.h" // Accessibility names | 14 #include "grit/generated_resources.h" // Accessibility names |
| 15 #include "grit/theme_resources.h" | 15 #include "grit/theme_resources.h" |
| 16 #include "grit/theme_resources_standard.h" | 16 #include "grit/theme_resources_standard.h" |
| 17 #include "grit/ui_resources.h" | 17 #include "grit/ui_resources.h" |
| 18 #include "ui/base/accessibility/accessible_view_state.h" | 18 #include "ui/base/accessibility/accessible_view_state.h" |
| 19 #include "ui/base/hit_test.h" |
| 19 #include "ui/base/l10n/l10n_util.h" | 20 #include "ui/base/l10n/l10n_util.h" |
| 20 #include "ui/base/resource/resource_bundle.h" | 21 #include "ui/base/resource/resource_bundle.h" |
| 21 #include "ui/base/theme_provider.h" | 22 #include "ui/base/theme_provider.h" |
| 22 #include "ui/gfx/canvas.h" | 23 #include "ui/gfx/canvas.h" |
| 23 #include "ui/views/controls/button/image_button.h" | 24 #include "ui/views/controls/button/image_button.h" |
| 24 #include "ui/views/widget/widget.h" | 25 #include "ui/views/widget/widget.h" |
| 25 #include "ui/views/widget/widget_delegate.h" | 26 #include "ui/views/widget/widget_delegate.h" |
| 26 | 27 |
| 27 namespace { | 28 namespace { |
| 28 | 29 |
| 29 // The avatar ends 2 px above the bottom of the tabstrip (which, given the | 30 // The avatar ends 2 px above the bottom of the tabstrip (which, given the |
| 30 // way the tabstrip draws its bottom edge, will appear like a 1 px gap to the | 31 // way the tabstrip draws its bottom edge, will appear like a 1 px gap to the |
| 31 // user). | 32 // user). |
| 32 const int kAvatarBottomSpacing = 2; | 33 const int kAvatarBottomSpacing = 2; |
| 33 // There are 2 px on each side of the avatar (between the frame border and | 34 // There are 2 px on each side of the avatar (between the frame border and |
| 34 // it on the left, and between it and the tabstrip on the right). | 35 // it on the left, and between it and the tabstrip on the right). |
| 35 const int kAvatarSideSpacing = 2; | 36 const int kAvatarSideSpacing = 2; |
| 36 // Space between left edge of window and tabstrip. | 37 // Space between left edge of window and tabstrip. |
| 37 const int kTabstripLeftSpacing = 4; | 38 const int kTabstripLeftSpacing = 4; |
| 38 // Space between right edge of tabstrip and maximize button. | 39 // Space between right edge of tabstrip and maximize button. |
| 39 const int kTabstripRightSpacing = 10; | 40 const int kTabstripRightSpacing = 10; |
| 40 // Space between top of window and top of tabstrip for restored windows. | 41 // Space between top of window and top of tabstrip for restored windows. |
| 41 const int kTabstripTopSpacingRestored = 10; | 42 const int kTabstripTopSpacingRestored = 8; |
| 42 // Space between top of window and top of tabstrip for maximized windows. | 43 // Space between top of window and top of tabstrip for maximized windows. |
| 43 // Place them flush to the top to make them clickable when the cursor is at | 44 // Place them flush to the top to make them clickable when the cursor is at |
| 44 // the screen edge. | 45 // the screen edge. |
| 45 const int kTabstripTopSpacingMaximized = 0; | 46 const int kTabstripTopSpacingMaximized = 0; |
| 46 // Height of the shadow of the tab images in the tab strip. | 47 // Height of the shadow in the tab image, used to ensure clicks in the shadow |
| 47 const int kTabShadowHeight = 1; | 48 // area still drag restored windows. This keeps the clickable area large enough |
| 49 // to hit easily. |
| 50 const int kTabShadowHeight = 4; |
| 51 // Height of the shadow of the content area, at the top of the toolbar. |
| 52 const int kContentShadowHeight = 1; |
| 53 |
| 48 } // namespace | 54 } // namespace |
| 49 | 55 |
| 50 /////////////////////////////////////////////////////////////////////////////// | 56 /////////////////////////////////////////////////////////////////////////////// |
| 51 // BrowserNonClientFrameViewAura, public: | 57 // BrowserNonClientFrameViewAura, public: |
| 52 | 58 |
| 53 BrowserNonClientFrameViewAura::BrowserNonClientFrameViewAura( | 59 BrowserNonClientFrameViewAura::BrowserNonClientFrameViewAura( |
| 54 BrowserFrame* frame, BrowserView* browser_view) | 60 BrowserFrame* frame, BrowserView* browser_view) |
| 55 : BrowserNonClientFrameView(frame, browser_view), | 61 : BrowserNonClientFrameView(frame, browser_view), |
| 56 maximize_button_(NULL), | 62 maximize_button_(NULL), |
| 57 close_button_(NULL), | 63 close_button_(NULL), |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 } | 132 } |
| 127 | 133 |
| 128 gfx::Rect BrowserNonClientFrameViewAura::GetWindowBoundsForClientBounds( | 134 gfx::Rect BrowserNonClientFrameViewAura::GetWindowBoundsForClientBounds( |
| 129 const gfx::Rect& client_bounds) const { | 135 const gfx::Rect& client_bounds) const { |
| 130 int top_height = NonClientTopBorderHeight(false); | 136 int top_height = NonClientTopBorderHeight(false); |
| 131 return frame_painter_->GetWindowBoundsForClientBounds(top_height, | 137 return frame_painter_->GetWindowBoundsForClientBounds(top_height, |
| 132 client_bounds); | 138 client_bounds); |
| 133 } | 139 } |
| 134 | 140 |
| 135 int BrowserNonClientFrameViewAura::NonClientHitTest(const gfx::Point& point) { | 141 int BrowserNonClientFrameViewAura::NonClientHitTest(const gfx::Point& point) { |
| 136 return frame_painter_->NonClientHitTest(this, point); | 142 int hit_test = frame_painter_->NonClientHitTest(this, point); |
| 143 // When the window is restored we want a large click target above the tabs |
| 144 // to drag the window, so redirect clicks in the tab's shadow to caption. |
| 145 if (hit_test == HTCLIENT && !frame()->IsMaximized()) { |
| 146 // Convert point to client coordinates. |
| 147 gfx::Point client_point(point); |
| 148 View::ConvertPointToView(this, frame()->client_view(), &client_point); |
| 149 // Report hits in shadow at top of tabstrip as caption. |
| 150 gfx::Rect tabstrip_bounds(browser_view()->tabstrip()->bounds()); |
| 151 if (client_point.y() < tabstrip_bounds.y() + kTabShadowHeight) |
| 152 hit_test = HTCAPTION; |
| 153 } |
| 154 return hit_test; |
| 137 } | 155 } |
| 138 | 156 |
| 139 void BrowserNonClientFrameViewAura::GetWindowMask(const gfx::Size& size, | 157 void BrowserNonClientFrameViewAura::GetWindowMask(const gfx::Size& size, |
| 140 gfx::Path* window_mask) { | 158 gfx::Path* window_mask) { |
| 141 // Aura does not use window masks. | 159 // Aura does not use window masks. |
| 142 } | 160 } |
| 143 | 161 |
| 144 void BrowserNonClientFrameViewAura::ResetWindowControls() { | 162 void BrowserNonClientFrameViewAura::ResetWindowControls() { |
| 145 maximize_button_->SetState(views::CustomButton::BS_NORMAL); | 163 maximize_button_->SetState(views::CustomButton::BS_NORMAL); |
| 146 // The close button isn't affected by this constraint. | 164 // The close button isn't affected by this constraint. |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 } | 281 } |
| 264 | 282 |
| 265 void BrowserNonClientFrameViewAura::LayoutAvatar() { | 283 void BrowserNonClientFrameViewAura::LayoutAvatar() { |
| 266 DCHECK(avatar_button()); | 284 DCHECK(avatar_button()); |
| 267 SkBitmap incognito_icon = browser_view()->GetOTRAvatarIcon(); | 285 SkBitmap incognito_icon = browser_view()->GetOTRAvatarIcon(); |
| 268 | 286 |
| 269 int avatar_bottom = GetHorizontalTabStripVerticalOffset(false) + | 287 int avatar_bottom = GetHorizontalTabStripVerticalOffset(false) + |
| 270 browser_view()->GetTabStripHeight() - kAvatarBottomSpacing; | 288 browser_view()->GetTabStripHeight() - kAvatarBottomSpacing; |
| 271 int avatar_restored_y = avatar_bottom - incognito_icon.height(); | 289 int avatar_restored_y = avatar_bottom - incognito_icon.height(); |
| 272 int avatar_y = frame()->IsMaximized() ? | 290 int avatar_y = frame()->IsMaximized() ? |
| 273 NonClientTopBorderHeight(false) + kTabShadowHeight: | 291 NonClientTopBorderHeight(false) + kContentShadowHeight: |
| 274 avatar_restored_y; | 292 avatar_restored_y; |
| 275 gfx::Rect avatar_bounds(kAvatarSideSpacing, | 293 gfx::Rect avatar_bounds(kAvatarSideSpacing, |
| 276 avatar_y, | 294 avatar_y, |
| 277 incognito_icon.width(), | 295 incognito_icon.width(), |
| 278 avatar_bottom - avatar_y); | 296 avatar_bottom - avatar_y); |
| 279 avatar_button()->SetBoundsRect(avatar_bounds); | 297 avatar_button()->SetBoundsRect(avatar_bounds); |
| 280 } | 298 } |
| 281 | 299 |
| 282 void BrowserNonClientFrameViewAura::PaintToolbarBackground( | 300 void BrowserNonClientFrameViewAura::PaintToolbarBackground( |
| 283 gfx::Canvas* canvas) { | 301 gfx::Canvas* canvas) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 311 // source y position. If you have to debug this code use an image editor | 329 // source y position. If you have to debug this code use an image editor |
| 312 // to paint a diagonal line through the toolbar image and ensure it lines up | 330 // to paint a diagonal line through the toolbar image and ensure it lines up |
| 313 // across the tab and toolbar. | 331 // across the tab and toolbar. |
| 314 bool restored = !frame()->IsMaximized(); | 332 bool restored = !frame()->IsMaximized(); |
| 315 canvas->TileImageInt( | 333 canvas->TileImageInt( |
| 316 *theme_toolbar, | 334 *theme_toolbar, |
| 317 x, bottom_y - GetHorizontalTabStripVerticalOffset(restored), | 335 x, bottom_y - GetHorizontalTabStripVerticalOffset(restored), |
| 318 x, bottom_y, | 336 x, bottom_y, |
| 319 w, theme_toolbar->height()); | 337 w, theme_toolbar->height()); |
| 320 | 338 |
| 339 // The content area line has a shadow that extends a couple of pixels above |
| 340 // the toolbar bounds. |
| 341 const int kContentShadowHeight = 2; |
| 321 SkBitmap* toolbar_center = | 342 SkBitmap* toolbar_center = |
| 322 tp->GetBitmapNamed(IDR_CONTENT_TOP_CENTER); | 343 tp->GetBitmapNamed(IDR_CONTENT_TOP_CENTER); |
| 323 canvas->TileImageInt(*toolbar_center, | 344 canvas->TileImageInt(*toolbar_center, |
| 324 0, 0, | 345 0, 0, |
| 325 x, y, | 346 x, y - kContentShadowHeight, |
| 326 w, split_point); | 347 w, split_point + kContentShadowHeight + 1); |
| 327 | 348 |
| 328 // Draw the content/toolbar separator. | 349 // Draw the content/toolbar separator. |
| 329 canvas->FillRect(gfx::Rect(x + kClientEdgeThickness, | 350 canvas->FillRect(gfx::Rect(x + kClientEdgeThickness, |
| 330 toolbar_bounds.bottom() - kClientEdgeThickness, | 351 toolbar_bounds.bottom() - kClientEdgeThickness, |
| 331 w - (2 * kClientEdgeThickness), | 352 w - (2 * kClientEdgeThickness), |
| 332 kClientEdgeThickness), | 353 kClientEdgeThickness), |
| 333 ThemeService::GetDefaultColor(ThemeService::COLOR_TOOLBAR_SEPARATOR)); | 354 ThemeService::GetDefaultColor(ThemeService::COLOR_TOOLBAR_SEPARATOR)); |
| 334 } | 355 } |
| 335 | 356 |
| 336 const SkBitmap* BrowserNonClientFrameViewAura::GetThemeFrameBitmap() const { | 357 const SkBitmap* BrowserNonClientFrameViewAura::GetThemeFrameBitmap() const { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 } | 403 } |
| 383 | 404 |
| 384 SkBitmap* BrowserNonClientFrameViewAura::GetCustomBitmap( | 405 SkBitmap* BrowserNonClientFrameViewAura::GetCustomBitmap( |
| 385 int bitmap_id, | 406 int bitmap_id, |
| 386 int fallback_bitmap_id) const { | 407 int fallback_bitmap_id) const { |
| 387 ui::ThemeProvider* tp = GetThemeProvider(); | 408 ui::ThemeProvider* tp = GetThemeProvider(); |
| 388 if (tp->HasCustomImage(bitmap_id)) | 409 if (tp->HasCustomImage(bitmap_id)) |
| 389 return tp->GetBitmapNamed(bitmap_id); | 410 return tp->GetBitmapNamed(bitmap_id); |
| 390 return tp->GetBitmapNamed(fallback_bitmap_id); | 411 return tp->GetBitmapNamed(fallback_bitmap_id); |
| 391 } | 412 } |
| OLD | NEW |