OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/views/frame/opaque_browser_frame_view.h" | 5 #include "chrome/browser/views/frame/opaque_browser_frame_view.h" |
6 | 6 |
7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
8 #include "app/resource_bundle.h" | 8 #include "app/resource_bundle.h" |
9 #include "app/theme_provider.h" | 9 #include "app/theme_provider.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 window_icon_->Update(); | 212 window_icon_->Update(); |
213 } | 213 } |
214 | 214 |
215 gfx::Size OpaqueBrowserFrameView::GetMinimumSize() { | 215 gfx::Size OpaqueBrowserFrameView::GetMinimumSize() { |
216 gfx::Size min_size(browser_view_->GetMinimumSize()); | 216 gfx::Size min_size(browser_view_->GetMinimumSize()); |
217 int border_thickness = NonClientBorderThickness(); | 217 int border_thickness = NonClientBorderThickness(); |
218 min_size.Enlarge(2 * border_thickness, | 218 min_size.Enlarge(2 * border_thickness, |
219 NonClientTopBorderHeight(false, false) + border_thickness); | 219 NonClientTopBorderHeight(false, false) + border_thickness); |
220 | 220 |
221 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); | 221 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); |
222 if (delegate == NULL) { | |
223 LOG(INFO) << "delegate is NULL, returning safe default."; | |
224 return min_size; | |
225 } | |
226 int min_titlebar_width = (2 * FrameBorderThickness(false)) + | 222 int min_titlebar_width = (2 * FrameBorderThickness(false)) + |
227 kIconLeftSpacing + | 223 kIconLeftSpacing + |
228 (delegate->ShouldShowWindowIcon() ? (IconSize() + kTitleLogoSpacing) : 0); | 224 (delegate && delegate->ShouldShowWindowIcon() ? |
| 225 (IconSize() + kTitleLogoSpacing) : 0); |
229 #if !defined(OS_CHROMEOS) | 226 #if !defined(OS_CHROMEOS) |
230 min_titlebar_width += | 227 min_titlebar_width += |
231 minimize_button_->GetMinimumSize().width() + | 228 minimize_button_->GetMinimumSize().width() + |
232 restore_button_->GetMinimumSize().width() + | 229 restore_button_->GetMinimumSize().width() + |
233 close_button_->GetMinimumSize().width(); | 230 close_button_->GetMinimumSize().width(); |
234 #endif | 231 #endif |
235 min_size.set_width(std::max(min_size.width(), min_titlebar_width)); | 232 min_size.set_width(std::max(min_size.width(), min_titlebar_width)); |
236 return min_size; | 233 return min_size; |
237 } | 234 } |
238 | 235 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 maximize_button_->GetBounds(APPLY_MIRRORING_TRANSFORMATION).Contains( | 291 maximize_button_->GetBounds(APPLY_MIRRORING_TRANSFORMATION).Contains( |
295 point)) | 292 point)) |
296 return HTMAXBUTTON; | 293 return HTMAXBUTTON; |
297 if (minimize_button_->IsVisible() && | 294 if (minimize_button_->IsVisible() && |
298 minimize_button_->GetBounds(APPLY_MIRRORING_TRANSFORMATION).Contains( | 295 minimize_button_->GetBounds(APPLY_MIRRORING_TRANSFORMATION).Contains( |
299 point)) | 296 point)) |
300 return HTMINBUTTON; | 297 return HTMINBUTTON; |
301 | 298 |
302 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); | 299 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); |
303 if (delegate == NULL) { | 300 if (delegate == NULL) { |
304 LOG(INFO) << "delegate is NULL, returning safe default."; | 301 LOG(WARNING) << "delegate is NULL, returning safe default."; |
305 return HTNOWHERE; | 302 return HTCAPTION; |
306 } | 303 } |
307 int window_component = GetHTComponentForFrame(point, TopResizeHeight(), | 304 int window_component = GetHTComponentForFrame(point, TopResizeHeight(), |
308 NonClientBorderThickness(), kResizeAreaCornerSize, kResizeAreaCornerSize, | 305 NonClientBorderThickness(), kResizeAreaCornerSize, kResizeAreaCornerSize, |
309 delegate->CanResize()); | 306 delegate->CanResize()); |
310 // Fall back to the caption if no other component matches. | 307 // Fall back to the caption if no other component matches. |
311 return (window_component == HTNOWHERE) ? HTCAPTION : window_component; | 308 return (window_component == HTNOWHERE) ? HTCAPTION : window_component; |
312 } | 309 } |
313 | 310 |
314 void OpaqueBrowserFrameView::GetWindowMask(const gfx::Size& size, | 311 void OpaqueBrowserFrameView::GetWindowMask(const gfx::Size& size, |
315 gfx::Path* window_mask) { | 312 gfx::Path* window_mask) { |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 // This function is queried during the creation of the window as the | 410 // This function is queried during the creation of the window as the |
414 // TabIconView we host is initialized, so we need to NULL check the selected | 411 // TabIconView we host is initialized, so we need to NULL check the selected |
415 // TabContents because in this condition there is not yet a selected tab. | 412 // TabContents because in this condition there is not yet a selected tab. |
416 TabContents* current_tab = browser_view_->GetSelectedTabContents(); | 413 TabContents* current_tab = browser_view_->GetSelectedTabContents(); |
417 return current_tab ? current_tab->is_loading() : false; | 414 return current_tab ? current_tab->is_loading() : false; |
418 } | 415 } |
419 | 416 |
420 SkBitmap OpaqueBrowserFrameView::GetFavIconForTabIconView() { | 417 SkBitmap OpaqueBrowserFrameView::GetFavIconForTabIconView() { |
421 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); | 418 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); |
422 if (delegate == NULL) { | 419 if (delegate == NULL) { |
423 LOG(INFO) << "delegate is NULL, returning safe default."; | 420 LOG(WARNING) << "delegate is NULL, returning safe default."; |
424 return SkBitmap(); | 421 return SkBitmap(); |
425 } | 422 } |
426 return delegate->GetWindowIcon(); | 423 return delegate->GetWindowIcon(); |
427 } | 424 } |
428 | 425 |
429 /////////////////////////////////////////////////////////////////////////////// | 426 /////////////////////////////////////////////////////////////////////////////// |
430 // OpaqueBrowserFrameView, private: | 427 // OpaqueBrowserFrameView, private: |
431 | 428 |
432 int OpaqueBrowserFrameView::FrameBorderThickness(bool restored) const { | 429 int OpaqueBrowserFrameView::FrameBorderThickness(bool restored) const { |
433 views::Window* window = frame_->GetWindow(); | 430 views::Window* window = frame_->GetWindow(); |
(...skipping 11 matching lines...) Expand all Loading... |
445 return FrameBorderThickness(false) + | 442 return FrameBorderThickness(false) + |
446 ((window->IsMaximized() || window->IsFullscreen()) ? | 443 ((window->IsMaximized() || window->IsFullscreen()) ? |
447 0 : kClientEdgeThickness); | 444 0 : kClientEdgeThickness); |
448 } | 445 } |
449 | 446 |
450 int OpaqueBrowserFrameView::NonClientTopBorderHeight( | 447 int OpaqueBrowserFrameView::NonClientTopBorderHeight( |
451 bool restored, | 448 bool restored, |
452 bool ignore_vertical_tabs) const { | 449 bool ignore_vertical_tabs) const { |
453 views::Window* window = frame_->GetWindow(); | 450 views::Window* window = frame_->GetWindow(); |
454 views::WindowDelegate* delegate = window->GetDelegate(); | 451 views::WindowDelegate* delegate = window->GetDelegate(); |
455 // |delegate| may be NULL if called from callback of InputMethodChanged | 452 // |delegate| may be NULL if called from callback of InputMethodChanged while |
456 // while a window is being destroyed. | 453 // a window is being destroyed. |
457 // See more discussion at http://crosbug.com/8958 | 454 // See more discussion at http://crosbug.com/8958 |
458 if (!delegate) { | 455 if ((delegate && delegate->ShouldShowWindowTitle()) || |
459 LOG(INFO) << "delegate is NULL"; | |
460 return 0; | |
461 } | |
462 | |
463 if (delegate->ShouldShowWindowTitle() || | |
464 (browser_view_->IsTabStripVisible() && !ignore_vertical_tabs && | 456 (browser_view_->IsTabStripVisible() && !ignore_vertical_tabs && |
465 browser_view_->UseVerticalTabs())) { | 457 browser_view_->UseVerticalTabs())) { |
466 return std::max(FrameBorderThickness(restored) + IconSize(), | 458 return std::max(FrameBorderThickness(restored) + IconSize(), |
467 CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) + | 459 CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) + |
468 TitlebarBottomThickness(restored); | 460 TitlebarBottomThickness(restored); |
469 } | 461 } |
470 | 462 |
471 return FrameBorderThickness(restored) - | 463 return FrameBorderThickness(restored) - |
472 ((browser_view_->IsTabStripVisible() && !restored && | 464 ((browser_view_->IsTabStripVisible() && !restored && |
473 window->IsMaximized()) ? kTabstripTopShadowThickness : 0); | 465 window->IsMaximized()) ? kTabstripTopShadowThickness : 0); |
474 } | 466 } |
475 | 467 |
(...skipping 18 matching lines...) Expand all Loading... |
494 #else | 486 #else |
495 return std::max(BrowserFrame::GetTitleFont().GetHeight(), kIconMinimumSize); | 487 return std::max(BrowserFrame::GetTitleFont().GetHeight(), kIconMinimumSize); |
496 #endif | 488 #endif |
497 } | 489 } |
498 | 490 |
499 gfx::Rect OpaqueBrowserFrameView::IconBounds() const { | 491 gfx::Rect OpaqueBrowserFrameView::IconBounds() const { |
500 int size = IconSize(); | 492 int size = IconSize(); |
501 int frame_thickness = FrameBorderThickness(false); | 493 int frame_thickness = FrameBorderThickness(false); |
502 int y; | 494 int y; |
503 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); | 495 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); |
504 if (delegate == NULL) { | 496 if (delegate && (delegate->ShouldShowWindowIcon() || |
505 LOG(INFO) << "delegate is NULL, returning safe default."; | 497 delegate->ShouldShowWindowTitle())) { |
506 return gfx::Rect(0, 0, 0, 0); | |
507 } | |
508 if (delegate->ShouldShowWindowIcon() || delegate->ShouldShowWindowTitle()) { | |
509 // Our frame border has a different "3D look" than Windows'. Theirs has a | 498 // Our frame border has a different "3D look" than Windows'. Theirs has a |
510 // more complex gradient on the top that they push their icon/title below; | 499 // more complex gradient on the top that they push their icon/title below; |
511 // then the maximized window cuts this off and the icon/title are centered | 500 // then the maximized window cuts this off and the icon/title are centered |
512 // in the remaining space. Because the apparent shape of our border is | 501 // in the remaining space. Because the apparent shape of our border is |
513 // simpler, using the same positioning makes things look slightly uncentered | 502 // simpler, using the same positioning makes things look slightly uncentered |
514 // with restored windows, so when the window is restored, instead of | 503 // with restored windows, so when the window is restored, instead of |
515 // calculating the remaining space from below the frame border, we calculate | 504 // calculating the remaining space from below the frame border, we calculate |
516 // from below the 3D edge. | 505 // from below the 3D edge. |
517 int unavailable_px_at_top = frame_->GetWindow()->IsMaximized() ? | 506 int unavailable_px_at_top = frame_->GetWindow()->IsMaximized() ? |
518 frame_thickness : kTitlebarTopAndBottomEdgeThickness; | 507 frame_thickness : kTitlebarTopAndBottomEdgeThickness; |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 int edge_height = top_center->height() - kClientEdgeThickness; | 682 int edge_height = top_center->height() - kClientEdgeThickness; |
694 canvas->TileImageInt(*top_center, 0, | 683 canvas->TileImageInt(*top_center, 0, |
695 window->GetClientView()->y() - edge_height, width(), edge_height); | 684 window->GetClientView()->y() - edge_height, width(), edge_height); |
696 } | 685 } |
697 } | 686 } |
698 | 687 |
699 void OpaqueBrowserFrameView::PaintTitleBar(gfx::Canvas* canvas) { | 688 void OpaqueBrowserFrameView::PaintTitleBar(gfx::Canvas* canvas) { |
700 // The window icon is painted by the TabIconView. | 689 // The window icon is painted by the TabIconView. |
701 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); | 690 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); |
702 if (delegate == NULL) { | 691 if (delegate == NULL) { |
703 LOG(INFO) << "delegate is NULL"; | 692 LOG(WARNING) << "delegate is NULL"; |
704 return; | 693 return; |
705 } | 694 } |
706 if (delegate->ShouldShowWindowTitle()) { | 695 if (delegate->ShouldShowWindowTitle()) { |
707 canvas->DrawStringInt(delegate->GetWindowTitle(), | 696 canvas->DrawStringInt(delegate->GetWindowTitle(), |
708 BrowserFrame::GetTitleFont(), | 697 BrowserFrame::GetTitleFont(), |
709 SK_ColorWHITE, MirroredLeftPointForRect(title_bounds_), | 698 SK_ColorWHITE, MirroredLeftPointForRect(title_bounds_), |
710 title_bounds_.y(), title_bounds_.width(), title_bounds_.height()); | 699 title_bounds_.y(), title_bounds_.width(), title_bounds_.height()); |
711 /* TODO(pkasting): If this window is active, we should also draw a drop | 700 /* TODO(pkasting): If this window is active, we should also draw a drop |
712 * shadow on the title. This is tricky, because we don't want to hardcode a | 701 * shadow on the title. This is tricky, because we don't want to hardcode a |
713 * shadow color (since we want to work with various themes), but we can't | 702 * shadow color (since we want to work with various themes), but we can't |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1007 visible_button->x() - minimize_button_size.width(), caption_y, | 996 visible_button->x() - minimize_button_size.width(), caption_y, |
1008 minimize_button_size.width(), | 997 minimize_button_size.width(), |
1009 minimize_button_size.height()); | 998 minimize_button_size.height()); |
1010 } | 999 } |
1011 | 1000 |
1012 void OpaqueBrowserFrameView::LayoutTitleBar() { | 1001 void OpaqueBrowserFrameView::LayoutTitleBar() { |
1013 // The window title is based on the calculated icon position, even when there | 1002 // The window title is based on the calculated icon position, even when there |
1014 // is no icon. | 1003 // is no icon. |
1015 gfx::Rect icon_bounds(IconBounds()); | 1004 gfx::Rect icon_bounds(IconBounds()); |
1016 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); | 1005 views::WindowDelegate* delegate = frame_->GetWindow()->GetDelegate(); |
1017 if (delegate == NULL) { | 1006 if (delegate && delegate->ShouldShowWindowIcon()) |
1018 LOG(INFO) << "delegate is NULL"; | |
1019 return; | |
1020 } | |
1021 if (delegate->ShouldShowWindowIcon()) | |
1022 window_icon_->SetBounds(icon_bounds); | 1007 window_icon_->SetBounds(icon_bounds); |
1023 | 1008 |
1024 // Size the title, if visible. | 1009 // Size the title, if visible. |
1025 if (delegate->ShouldShowWindowTitle()) { | 1010 if (delegate && delegate->ShouldShowWindowTitle()) { |
1026 int title_x = delegate->ShouldShowWindowIcon() ? | 1011 int title_x = delegate->ShouldShowWindowIcon() ? |
1027 icon_bounds.right() + kIconTitleSpacing : icon_bounds.x(); | 1012 icon_bounds.right() + kIconTitleSpacing : icon_bounds.x(); |
1028 int title_height = BrowserFrame::GetTitleFont().GetHeight(); | 1013 int title_height = BrowserFrame::GetTitleFont().GetHeight(); |
1029 // We bias the title position so that when the difference between the icon | 1014 // We bias the title position so that when the difference between the icon |
1030 // and title heights is odd, the extra pixel of the title is above the | 1015 // and title heights is odd, the extra pixel of the title is above the |
1031 // vertical midline rather than below. This compensates for how the icon is | 1016 // vertical midline rather than below. This compensates for how the icon is |
1032 // already biased downwards (see IconBounds()) and helps prevent descenders | 1017 // already biased downwards (see IconBounds()) and helps prevent descenders |
1033 // on the title from overlapping the 3D edge at the bottom of the titlebar. | 1018 // on the title from overlapping the 3D edge at the bottom of the titlebar. |
1034 title_bounds_.SetRect(title_x, | 1019 title_bounds_.SetRect(title_x, |
1035 icon_bounds.y() + ((icon_bounds.height() - title_height - 1) / 2), | 1020 icon_bounds.y() + ((icon_bounds.height() - title_height - 1) / 2), |
(...skipping 22 matching lines...) Expand all Loading... |
1058 } | 1043 } |
1059 | 1044 |
1060 gfx::Rect OpaqueBrowserFrameView::CalculateClientAreaBounds(int width, | 1045 gfx::Rect OpaqueBrowserFrameView::CalculateClientAreaBounds(int width, |
1061 int height) const { | 1046 int height) const { |
1062 int top_height = NonClientTopBorderHeight(false, false); | 1047 int top_height = NonClientTopBorderHeight(false, false); |
1063 int border_thickness = NonClientBorderThickness(); | 1048 int border_thickness = NonClientBorderThickness(); |
1064 return gfx::Rect(border_thickness, top_height, | 1049 return gfx::Rect(border_thickness, top_height, |
1065 std::max(0, width - (2 * border_thickness)), | 1050 std::max(0, width - (2 * border_thickness)), |
1066 std::max(0, height - top_height - border_thickness)); | 1051 std::max(0, height - top_height - border_thickness)); |
1067 } | 1052 } |
OLD | NEW |