| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 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 | 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/views/custom_frame_window.h" | 5 #include "chrome/views/custom_frame_window.h" |
| 6 | 6 |
| 7 #include "base/gfx/point.h" | 7 #include "base/gfx/point.h" |
| 8 #include "base/gfx/size.h" | 8 #include "base/gfx/size.h" |
| 9 #include "base/win_util.h" | 9 #include "base/win_util.h" |
| 10 #include "chrome/app/theme/theme_resources.h" | 10 #include "chrome/app/theme/theme_resources.h" |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 virtual gfx::Size CalculateWindowSizeForClientSize(int width, | 237 virtual gfx::Size CalculateWindowSizeForClientSize(int width, |
| 238 int height) const; | 238 int height) const; |
| 239 virtual CPoint GetSystemMenuPoint() const; | 239 virtual CPoint GetSystemMenuPoint() const; |
| 240 virtual int NonClientHitTest(const gfx::Point& point); | 240 virtual int NonClientHitTest(const gfx::Point& point); |
| 241 virtual void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask); | 241 virtual void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask); |
| 242 virtual void EnableClose(bool enable); | 242 virtual void EnableClose(bool enable); |
| 243 | 243 |
| 244 // View overrides: | 244 // View overrides: |
| 245 virtual void Paint(ChromeCanvas* canvas); | 245 virtual void Paint(ChromeCanvas* canvas); |
| 246 virtual void Layout(); | 246 virtual void Layout(); |
| 247 virtual void GetPreferredSize(CSize* out); | 247 virtual gfx::Size GetPreferredSize(); |
| 248 virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child); | 248 virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child); |
| 249 | 249 |
| 250 // BaseButton::ButtonListener implementation: | 250 // BaseButton::ButtonListener implementation: |
| 251 virtual void ButtonPressed(BaseButton* sender); | 251 virtual void ButtonPressed(BaseButton* sender); |
| 252 | 252 |
| 253 private: | 253 private: |
| 254 // Updates the system menu icon button. | 254 // Updates the system menu icon button. |
| 255 void SetWindowIcon(SkBitmap window_icon); | 255 void SetWindowIcon(SkBitmap window_icon); |
| 256 | 256 |
| 257 // Returns the height of the non-client area at the top of the window (the | 257 // Returns the height of the non-client area at the top of the window (the |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 } | 508 } |
| 509 } | 509 } |
| 510 | 510 |
| 511 void DefaultNonClientView::Layout() { | 511 void DefaultNonClientView::Layout() { |
| 512 LayoutWindowControls(); | 512 LayoutWindowControls(); |
| 513 LayoutTitleBar(); | 513 LayoutTitleBar(); |
| 514 LayoutClientView(); | 514 LayoutClientView(); |
| 515 SchedulePaint(); | 515 SchedulePaint(); |
| 516 } | 516 } |
| 517 | 517 |
| 518 void DefaultNonClientView::GetPreferredSize(CSize* out) { | 518 gfx::Size DefaultNonClientView::GetPreferredSize() { |
| 519 DCHECK(out); | 519 gfx::Size prefsize = container_->client_view()->GetPreferredSize(); |
| 520 container_->client_view()->GetPreferredSize(out); | 520 prefsize.Enlarge(2 * kWindowHorizontalBorderSize, |
| 521 out->cx += 2 * kWindowHorizontalBorderSize; | 521 CalculateContentsTop() + kWindowVerticalBorderSize); |
| 522 out->cy += CalculateContentsTop() + kWindowVerticalBorderSize; | 522 return prefsize; |
| 523 } | 523 } |
| 524 | 524 |
| 525 void DefaultNonClientView::ViewHierarchyChanged(bool is_add, | 525 void DefaultNonClientView::ViewHierarchyChanged(bool is_add, |
| 526 View* parent, | 526 View* parent, |
| 527 View* child) { | 527 View* child) { |
| 528 // Add our Client View as we are added to the ViewContainer so that if we are | 528 // Add our Client View as we are added to the ViewContainer so that if we are |
| 529 // subsequently resized all the parent-child relationships are established. | 529 // subsequently resized all the parent-child relationships are established. |
| 530 if (is_add && GetViewContainer() && child == this) | 530 if (is_add && GetViewContainer() && child == this) |
| 531 AddChildView(container_->client_view()); | 531 AddChildView(container_->client_view()); |
| 532 } | 532 } |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 652 canvas->DrawBitmapInt(*bottom_left, | 652 canvas->DrawBitmapInt(*bottom_left, |
| 653 client_area_bounds.x() - bottom_left->width(), | 653 client_area_bounds.x() - bottom_left->width(), |
| 654 client_area_bounds.bottom()); | 654 client_area_bounds.bottom()); |
| 655 canvas->TileImageInt(*left, client_area_bounds.x() - left->width(), | 655 canvas->TileImageInt(*left, client_area_bounds.x() - left->width(), |
| 656 client_area_bounds.y() - top->height() + | 656 client_area_bounds.y() - top->height() + |
| 657 top_left->height(), | 657 top_left->height(), |
| 658 left->width(), client_area_bounds.height()); | 658 left->width(), client_area_bounds.height()); |
| 659 } | 659 } |
| 660 | 660 |
| 661 void DefaultNonClientView::LayoutWindowControls() { | 661 void DefaultNonClientView::LayoutWindowControls() { |
| 662 CSize ps; | 662 gfx::Size ps; |
| 663 if (container_->IsMaximized() || container_->IsMinimized()) { | 663 if (container_->IsMaximized() || container_->IsMinimized()) { |
| 664 maximize_button_->SetVisible(false); | 664 maximize_button_->SetVisible(false); |
| 665 restore_button_->SetVisible(true); | 665 restore_button_->SetVisible(true); |
| 666 } | 666 } |
| 667 | 667 |
| 668 if (container_->IsMaximized()) { | 668 if (container_->IsMaximized()) { |
| 669 close_button_->GetPreferredSize(&ps); | 669 ps = close_button_->GetPreferredSize(); |
| 670 close_button_->SetImageAlignment(Button::ALIGN_LEFT, Button::ALIGN_BOTTOM); | 670 close_button_->SetImageAlignment(Button::ALIGN_LEFT, Button::ALIGN_BOTTOM); |
| 671 close_button_->SetBounds( | 671 close_button_->SetBounds( |
| 672 width() - ps.cx - kWindowControlsRightZoomedOffset, | 672 width() - ps.width() - kWindowControlsRightZoomedOffset, |
| 673 0, ps.cx + kWindowControlsRightZoomedOffset, | 673 0, ps.width() + kWindowControlsRightZoomedOffset, |
| 674 ps.cy + kWindowControlsTopZoomedOffset); | 674 ps.height() + kWindowControlsTopZoomedOffset); |
| 675 | 675 |
| 676 if (should_show_minmax_buttons_) { | 676 if (should_show_minmax_buttons_) { |
| 677 restore_button_->GetPreferredSize(&ps); | 677 ps = restore_button_->GetPreferredSize(); |
| 678 restore_button_->SetImageAlignment(Button::ALIGN_LEFT, | 678 restore_button_->SetImageAlignment(Button::ALIGN_LEFT, |
| 679 Button::ALIGN_BOTTOM); | 679 Button::ALIGN_BOTTOM); |
| 680 restore_button_->SetBounds(close_button_->x() - ps.cx, 0, ps.cx, | 680 restore_button_->SetBounds(close_button_->x() - ps.width(), 0, |
| 681 ps.cy + kWindowControlsTopZoomedOffset); | 681 ps.width(), |
| 682 ps.height() + kWindowControlsTopZoomedOffset); |
| 682 | 683 |
| 683 minimize_button_->GetPreferredSize(&ps); | 684 ps = minimize_button_->GetPreferredSize(); |
| 684 minimize_button_->SetImageAlignment(Button::ALIGN_LEFT, | 685 minimize_button_->SetImageAlignment(Button::ALIGN_LEFT, |
| 685 Button::ALIGN_BOTTOM); | 686 Button::ALIGN_BOTTOM); |
| 686 minimize_button_->SetBounds(restore_button_->x() - ps.cx, 0, ps.cx, | 687 minimize_button_->SetBounds(restore_button_->x() - ps.width(), 0, |
| 687 ps.cy + kWindowControlsTopZoomedOffset); | 688 ps.width(), |
| 689 ps.height() + kWindowControlsTopZoomedOffset); |
| 688 } | 690 } |
| 689 } else if (container_->IsMinimized()) { | 691 } else if (container_->IsMinimized()) { |
| 690 close_button_->GetPreferredSize(&ps); | 692 ps = close_button_->GetPreferredSize(); |
| 691 close_button_->SetImageAlignment(Button::ALIGN_LEFT, Button::ALIGN_BOTTOM); | 693 close_button_->SetImageAlignment(Button::ALIGN_LEFT, Button::ALIGN_BOTTOM); |
| 692 close_button_->SetBounds( | 694 close_button_->SetBounds( |
| 693 width() - ps.cx - kWindowControlsRightZoomedOffset, | 695 width() - ps.width() - kWindowControlsRightZoomedOffset, |
| 694 0, ps.cx + kWindowControlsRightZoomedOffset, | 696 0, ps.width() + kWindowControlsRightZoomedOffset, |
| 695 ps.cy + kWindowControlsTopZoomedOffset); | 697 ps.height() + kWindowControlsTopZoomedOffset); |
| 696 | 698 |
| 697 if (should_show_minmax_buttons_) { | 699 if (should_show_minmax_buttons_) { |
| 698 restore_button_->GetPreferredSize(&ps); | 700 ps = restore_button_->GetPreferredSize(); |
| 699 restore_button_->SetImageAlignment(Button::ALIGN_LEFT, | 701 restore_button_->SetImageAlignment(Button::ALIGN_LEFT, |
| 700 Button::ALIGN_BOTTOM); | 702 Button::ALIGN_BOTTOM); |
| 701 restore_button_->SetBounds(close_button_->x() - ps.cx, 0, ps.cx, | 703 restore_button_->SetBounds(close_button_->x() - ps.width(), 0, |
| 702 ps.cy + kWindowControlsTopZoomedOffset); | 704 ps.width(), |
| 705 ps.height() + kWindowControlsTopZoomedOffset); |
| 703 | 706 |
| 704 minimize_button_->GetPreferredSize(&ps); | 707 ps = minimize_button_->GetPreferredSize(); |
| 705 minimize_button_->SetImageAlignment(Button::ALIGN_LEFT, | 708 minimize_button_->SetImageAlignment(Button::ALIGN_LEFT, |
| 706 Button::ALIGN_BOTTOM); | 709 Button::ALIGN_BOTTOM); |
| 707 minimize_button_->SetBounds(restore_button_->x() - ps.cx, 0, ps.cx, | 710 minimize_button_->SetBounds(restore_button_->x() - ps.width(), 0, |
| 708 ps.cy + kWindowControlsTopZoomedOffset); | 711 ps.width(), |
| 712 ps.height() + |
| 713 kWindowControlsTopZoomedOffset); |
| 709 } | 714 } |
| 710 } else { | 715 } else { |
| 711 close_button_->GetPreferredSize(&ps); | 716 ps = close_button_->GetPreferredSize(); |
| 712 close_button_->SetImageAlignment(Button::ALIGN_LEFT, Button::ALIGN_TOP); | 717 close_button_->SetImageAlignment(Button::ALIGN_LEFT, Button::ALIGN_TOP); |
| 713 close_button_->SetBounds(width() - kWindowControlsRightOffset - ps.cx, | 718 close_button_->SetBounds(width() - kWindowControlsRightOffset - ps.width(), |
| 714 kWindowControlsTopOffset, ps.cx, ps.cy); | 719 kWindowControlsTopOffset, ps.width(), |
| 720 ps.height()); |
| 715 | 721 |
| 716 if (should_show_minmax_buttons_) { | 722 if (should_show_minmax_buttons_) { |
| 717 close_button_->SetImage( | 723 close_button_->SetImage( |
| 718 Button::BS_NORMAL, | 724 Button::BS_NORMAL, |
| 719 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON)); | 725 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON)); |
| 720 close_button_->SetImage( | 726 close_button_->SetImage( |
| 721 Button::BS_HOT, | 727 Button::BS_HOT, |
| 722 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_H)); | 728 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_H)); |
| 723 close_button_->SetImage( | 729 close_button_->SetImage( |
| 724 Button::BS_PUSHED, | 730 Button::BS_PUSHED, |
| 725 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_P)); | 731 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_P)); |
| 726 | 732 |
| 727 restore_button_->SetVisible(false); | 733 restore_button_->SetVisible(false); |
| 728 | 734 |
| 729 maximize_button_->SetVisible(true); | 735 maximize_button_->SetVisible(true); |
| 730 maximize_button_->GetPreferredSize(&ps); | 736 ps = maximize_button_->GetPreferredSize(); |
| 731 maximize_button_->SetImageAlignment(Button::ALIGN_LEFT, | 737 maximize_button_->SetImageAlignment(Button::ALIGN_LEFT, |
| 732 Button::ALIGN_TOP); | 738 Button::ALIGN_TOP); |
| 733 maximize_button_->SetBounds(close_button_->x() - ps.cx, | 739 maximize_button_->SetBounds(close_button_->x() - ps.width(), |
| 734 kWindowControlsTopOffset, ps.cx, ps.cy); | 740 kWindowControlsTopOffset, ps.width(), |
| 741 ps.height()); |
| 735 | 742 |
| 736 minimize_button_->GetPreferredSize(&ps); | 743 ps = minimize_button_->GetPreferredSize(); |
| 737 minimize_button_->SetImageAlignment(Button::ALIGN_LEFT, | 744 minimize_button_->SetImageAlignment(Button::ALIGN_LEFT, |
| 738 Button::ALIGN_TOP); | 745 Button::ALIGN_TOP); |
| 739 minimize_button_->SetBounds(maximize_button_->x() - ps.cx, | 746 minimize_button_->SetBounds(maximize_button_->x() - ps.width(), |
| 740 kWindowControlsTopOffset, ps.cx, ps.cy); | 747 kWindowControlsTopOffset, ps.width(), |
| 748 ps.height()); |
| 741 } | 749 } |
| 742 } | 750 } |
| 743 if (!should_show_minmax_buttons_) { | 751 if (!should_show_minmax_buttons_) { |
| 744 close_button_->SetImage( | 752 close_button_->SetImage( |
| 745 Button::BS_NORMAL, | 753 Button::BS_NORMAL, |
| 746 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_SA)); | 754 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_SA)); |
| 747 close_button_->SetImage( | 755 close_button_->SetImage( |
| 748 Button::BS_HOT, | 756 Button::BS_HOT, |
| 749 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_SA_H)); | 757 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_SA_H)); |
| 750 close_button_->SetImage( | 758 close_button_->SetImage( |
| 751 Button::BS_PUSHED, | 759 Button::BS_PUSHED, |
| 752 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_SA_P)); | 760 active_resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_SA_P)); |
| 753 | 761 |
| 754 restore_button_->SetVisible(false); | 762 restore_button_->SetVisible(false); |
| 755 maximize_button_->SetVisible(false); | 763 maximize_button_->SetVisible(false); |
| 756 minimize_button_->SetVisible(false); | 764 minimize_button_->SetVisible(false); |
| 757 } | 765 } |
| 758 } | 766 } |
| 759 | 767 |
| 760 void DefaultNonClientView::LayoutTitleBar() { | 768 void DefaultNonClientView::LayoutTitleBar() { |
| 761 int top_offset = container_->IsMaximized() ? kWindowTopMarginZoomed : 0; | 769 int top_offset = container_->IsMaximized() ? kWindowTopMarginZoomed : 0; |
| 762 WindowDelegate* d = container_->window_delegate(); | 770 WindowDelegate* d = container_->window_delegate(); |
| 763 | 771 |
| 764 // Size the window icon, if visible. | 772 // Size the window icon, if visible. |
| 765 if (d->ShouldShowWindowIcon()) { | 773 if (d->ShouldShowWindowIcon()) { |
| 766 system_menu_button_->SetVisible(true); | 774 system_menu_button_->SetVisible(true); |
| 767 CSize ps; | 775 gfx::Size ps = system_menu_button_->GetPreferredSize(); |
| 768 system_menu_button_->GetPreferredSize(&ps); | |
| 769 system_menu_button_->SetBounds( | 776 system_menu_button_->SetBounds( |
| 770 kWindowIconLeftOffset, kWindowIconTopOffset + top_offset, ps.cx, ps.cy); | 777 kWindowIconLeftOffset, kWindowIconTopOffset + top_offset, ps.width(), |
| 778 ps.height()); |
| 771 } else { | 779 } else { |
| 772 // Put the menu in the right place at least even if it is hidden so we | 780 // Put the menu in the right place at least even if it is hidden so we |
| 773 // can size the title based on its position. | 781 // can size the title based on its position. |
| 774 system_menu_button_->SetBounds(kWindowIconLeftOffset, | 782 system_menu_button_->SetBounds(kWindowIconLeftOffset, |
| 775 kWindowIconTopOffset, 0, 0); | 783 kWindowIconTopOffset, 0, 0); |
| 776 } | 784 } |
| 777 | 785 |
| 778 // Size the title, if visible. | 786 // Size the title, if visible. |
| 779 if (d->ShouldShowWindowTitle()) { | 787 if (d->ShouldShowWindowTitle()) { |
| 780 gfx::Rect system_menu_bounds = system_menu_button_->bounds(); | 788 gfx::Rect system_menu_bounds = system_menu_button_->bounds(); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 849 virtual void Layout(ChromeViews::View* host) { | 857 virtual void Layout(ChromeViews::View* host) { |
| 850 int horizontal_border_width = | 858 int horizontal_border_width = |
| 851 window_->IsMaximized() ? kBorderAndPadding : 0; | 859 window_->IsMaximized() ? kBorderAndPadding : 0; |
| 852 int vertical_border_height = | 860 int vertical_border_height = |
| 853 window_->IsMaximized() ? kBorderAndPadding : 0; | 861 window_->IsMaximized() ? kBorderAndPadding : 0; |
| 854 | 862 |
| 855 child_->SetBounds(horizontal_border_width, vertical_border_height, | 863 child_->SetBounds(horizontal_border_width, vertical_border_height, |
| 856 host->width() - (2 * horizontal_border_width), | 864 host->width() - (2 * horizontal_border_width), |
| 857 host->height() - (2 * vertical_border_height)); | 865 host->height() - (2 * vertical_border_height)); |
| 858 } | 866 } |
| 859 virtual void GetPreferredSize(ChromeViews::View* host, CSize* out) { | 867 virtual gfx::Size GetPreferredSize(ChromeViews::View* host) { |
| 860 child_->GetPreferredSize(out); | 868 return child_->GetPreferredSize(); |
| 861 } | 869 } |
| 862 | 870 |
| 863 private: | 871 private: |
| 864 ChromeViews::View* child_; | 872 ChromeViews::View* child_; |
| 865 ChromeViews::Window* window_; | 873 ChromeViews::Window* window_; |
| 866 | 874 |
| 867 DISALLOW_COPY_AND_ASSIGN(NonClientViewLayout); | 875 DISALLOW_COPY_AND_ASSIGN(NonClientViewLayout); |
| 868 }; | 876 }; |
| 869 | 877 |
| 870 /////////////////////////////////////////////////////////////////////////////// | 878 /////////////////////////////////////////////////////////////////////////////// |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 } | 953 } |
| 946 | 954 |
| 947 void CustomFrameWindow::DisableInactiveRendering(bool disable) { | 955 void CustomFrameWindow::DisableInactiveRendering(bool disable) { |
| 948 Window::DisableInactiveRendering(disable); | 956 Window::DisableInactiveRendering(disable); |
| 949 non_client_view_->set_paint_as_active(disable); | 957 non_client_view_->set_paint_as_active(disable); |
| 950 if (!disable) | 958 if (!disable) |
| 951 non_client_view_->SchedulePaint(); | 959 non_client_view_->SchedulePaint(); |
| 952 } | 960 } |
| 953 | 961 |
| 954 void CustomFrameWindow::SizeWindowToDefault() { | 962 void CustomFrameWindow::SizeWindowToDefault() { |
| 955 CSize pref(0, 0); | 963 gfx::Size pref = client_view()->GetPreferredSize(); |
| 956 client_view()->GetPreferredSize(&pref); | 964 DCHECK(pref.width() > 0 && pref.height() > 0); |
| 957 DCHECK(pref.cx > 0 && pref.cy > 0); | |
| 958 gfx::Size window_size = | 965 gfx::Size window_size = |
| 959 non_client_view_->CalculateWindowSizeForClientSize(pref.cx, pref.cy); | 966 non_client_view_->CalculateWindowSizeForClientSize(pref.width(), |
| 967 pref.height()); |
| 960 win_util::CenterAndSizeWindow(owning_window(), GetHWND(), | 968 win_util::CenterAndSizeWindow(owning_window(), GetHWND(), |
| 961 window_size.ToSIZE(), false); | 969 window_size.ToSIZE(), false); |
| 962 } | 970 } |
| 963 | 971 |
| 964 /////////////////////////////////////////////////////////////////////////////// | 972 /////////////////////////////////////////////////////////////////////////////// |
| 965 // CustomFrameWindow, HWNDViewContainer overrides: | 973 // CustomFrameWindow, HWNDViewContainer overrides: |
| 966 | 974 |
| 967 void CustomFrameWindow::OnGetMinMaxInfo(MINMAXINFO* minmax_info) { | 975 void CustomFrameWindow::OnGetMinMaxInfo(MINMAXINFO* minmax_info) { |
| 968 // We handle this message so that we can make sure we interact nicely with | 976 // We handle this message so that we can make sure we interact nicely with |
| 969 // the taskbar on different edges of the screen and auto-hide taskbars. | 977 // the taskbar on different edges of the screen and auto-hide taskbars. |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1307 SetWindowRgn(new_region, TRUE); | 1315 SetWindowRgn(new_region, TRUE); |
| 1308 } else if (new_region) { | 1316 } else if (new_region) { |
| 1309 DeleteObject(new_region); | 1317 DeleteObject(new_region); |
| 1310 } | 1318 } |
| 1311 | 1319 |
| 1312 DeleteObject(current_rgn); | 1320 DeleteObject(current_rgn); |
| 1313 } | 1321 } |
| 1314 | 1322 |
| 1315 } // namespace ChromeViews | 1323 } // namespace ChromeViews |
| 1316 | 1324 |
| OLD | NEW |