Chromium Code Reviews| Index: chrome/browser/ui/views/frame/opaque_browser_frame_view.cc |
| diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc |
| index e43a5179e70e2a0afc0807a4d03722fc6899c9c2..7f854d766a71099aebb13becf75252df8c698c60 100644 |
| --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc |
| +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc |
| @@ -17,6 +17,7 @@ |
| #include "chrome/browser/ui/views/avatar_menu_button.h" |
| #include "chrome/browser/ui/views/frame/browser_frame.h" |
| #include "chrome/browser/ui/views/frame/browser_view.h" |
| +#include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h" |
| #include "chrome/browser/ui/views/tab_icon_view.h" |
| #include "chrome/browser/ui/views/tabs/tab_strip.h" |
| #include "chrome/browser/ui/views/toolbar_view.h" |
| @@ -46,66 +47,30 @@ |
| #include "ui/views/window/frame_background.h" |
| #include "ui/views/window/window_shape.h" |
| -#if defined(OS_WIN) |
| -#include "win8/util/win8_util.h" |
| -#endif // OS_WIN |
| - |
| using content::WebContents; |
| namespace { |
| -// The frame border is only visible in restored mode and is hardcoded to 4 px on |
| -// each side regardless of the system window border size. |
| -const int kFrameBorderThickness = 4; |
| -// Besides the frame border, there's another 9 px of empty space atop the |
| -// window in restored mode, to use to drag the window around. |
| -const int kNonClientRestoredExtraThickness = 9; |
| // While resize areas on Windows are normally the same size as the window |
| // borders, our top area is shrunk by 1 px to make it easier to move the window |
| // around with our thinner top grabbable strip. (Incidentally, our side and |
| // bottom resize areas don't match the frame border thickness either -- they |
| // span the whole nonclient area, so there's no "dead zone" for the mouse.) |
| const int kTopResizeAdjust = 1; |
| + |
| // In the window corners, the resize areas don't actually expand bigger, but the |
| // 16 px at the end of each edge triggers diagonal resizing. |
| const int kResizeAreaCornerSize = 16; |
| -// The titlebar never shrinks too short to show the caption button plus some |
| -// padding below it. |
| -const int kCaptionButtonHeightWithPadding = 19; |
| + |
| // The content left/right images have a shadow built into them. |
| const int kContentEdgeShadowThickness = 2; |
| -// The titlebar has a 2 px 3D edge along the top and bottom. |
| -const int kTitlebarTopAndBottomEdgeThickness = 2; |
| -// The icon is inset 2 px from the left frame border. |
| -const int kIconLeftSpacing = 2; |
| + |
| // The icon never shrinks below 16 px on a side. |
| const int kIconMinimumSize = 16; |
| -// There is a 4 px gap between the icon and the title text. |
| -const int kIconTitleSpacing = 4; |
| -// There is a 5 px gap between the title text and the caption buttons. |
| -const int kTitleLogoSpacing = 5; |
| -// The avatar ends 2 px above the bottom of the tabstrip (which, given the |
| -// way the tabstrip draws its bottom edge, will appear like a 1 px gap to the |
| -// user). |
| -const int kAvatarBottomSpacing = 2; |
| -// Space between the frame border and the left edge of the avatar. |
| -const int kAvatarLeftSpacing = 2; |
| -// Space between the right edge of the avatar and the tabstrip. |
| -const int kAvatarRightSpacing = -2; |
| + |
| // The top 3 px of the tabstrip is shadow; in maximized mode we push this off |
| // the top of the screen so the tabs appear flush against the screen edge. |
| const int kTabstripTopShadowThickness = 3; |
| -// In restored mode, the New Tab button isn't at the same height as the caption |
| -// buttons, but the space will look cluttered if it actually slides under them, |
| -// so we stop it when the gap between the two is down to 5 px. |
| -const int kNewTabCaptionRestoredSpacing = 5; |
| -// In maximized mode, where the New Tab button and the caption buttons are at |
| -// similar vertical coordinates, we need to reserve a larger, 16 px gap to avoid |
| -// looking too cluttered. |
| -const int kNewTabCaptionMaximizedSpacing = 16; |
| -// How far to indent the tabstrip from the left side of the screen when there |
| -// is no avatar icon. |
| -const int kTabStripIndent = -6; |
| // Converts |bounds| from |src|'s coordinate system to |dst|, and checks if |
| // |pt| is contained within. |
| @@ -119,13 +84,6 @@ bool ConvertedContainsCheck(gfx::Rect bounds, const views::View* src, |
| return bounds.Contains(pt); |
| } |
| -bool ShouldAddDefaultCaptionButtons() { |
| -#if defined(OS_WIN) |
| - return !win8::IsSingleWindowMetroMode(); |
| -#endif // OS_WIN |
| - return true; |
| -} |
| - |
| } // namespace |
| /////////////////////////////////////////////////////////////////////////////// |
| @@ -134,6 +92,7 @@ bool ShouldAddDefaultCaptionButtons() { |
| OpaqueBrowserFrameView::OpaqueBrowserFrameView(BrowserFrame* frame, |
| BrowserView* browser_view) |
| : BrowserNonClientFrameView(frame, browser_view), |
| + layout_(new OpaqueBrowserFrameViewLayout(this)), |
| minimize_button_(NULL), |
| maximize_button_(NULL), |
| restore_button_(NULL), |
| @@ -141,33 +100,40 @@ OpaqueBrowserFrameView::OpaqueBrowserFrameView(BrowserFrame* frame, |
| window_icon_(NULL), |
| window_title_(NULL), |
| frame_background_(new views::FrameBackground()) { |
| - if (ShouldAddDefaultCaptionButtons()) { |
| + SetLayoutManager(layout_); |
| + |
| + if (OpaqueBrowserFrameViewLayout::ShouldAddDefaultCaptionButtons()) { |
| minimize_button_ = InitWindowCaptionButton(IDR_MINIMIZE, |
| IDR_MINIMIZE_H, |
| IDR_MINIMIZE_P, |
| IDR_MINIMIZE_BUTTON_MASK, |
| - IDS_ACCNAME_MINIMIZE); |
| + IDS_ACCNAME_MINIMIZE, |
| + VIEW_ID_MINIMIZE_BUTTON); |
| maximize_button_ = InitWindowCaptionButton(IDR_MAXIMIZE, |
| IDR_MAXIMIZE_H, |
| IDR_MAXIMIZE_P, |
| IDR_MAXIMIZE_BUTTON_MASK, |
| - IDS_ACCNAME_MAXIMIZE); |
| + IDS_ACCNAME_MAXIMIZE, |
| + VIEW_ID_MAXIMIZE_BUTTON); |
| restore_button_ = InitWindowCaptionButton(IDR_RESTORE, |
| IDR_RESTORE_H, |
| IDR_RESTORE_P, |
| IDR_RESTORE_BUTTON_MASK, |
| - IDS_ACCNAME_RESTORE); |
| + IDS_ACCNAME_RESTORE, |
| + VIEW_ID_RESTORE_BUTTON); |
| close_button_ = InitWindowCaptionButton(IDR_CLOSE, |
| IDR_CLOSE_H, |
| IDR_CLOSE_P, |
| IDR_CLOSE_BUTTON_MASK, |
| - IDS_ACCNAME_CLOSE); |
| + IDS_ACCNAME_CLOSE, |
| + VIEW_ID_CLOSE_BUTTON); |
| } |
| // Initializing the TabIconView is expensive, so only do it if we need to. |
| if (browser_view->ShouldShowWindowIcon()) { |
| window_icon_ = new TabIconView(this); |
| window_icon_->set_is_light(true); |
| + window_icon_->set_id(VIEW_ID_WINDOW_ICON); |
| AddChildView(window_icon_); |
| window_icon_->Update(); |
| } |
| @@ -180,6 +146,7 @@ OpaqueBrowserFrameView::OpaqueBrowserFrameView(BrowserFrame* frame, |
| // gfx::Canvas::NO_SUBPIXEL_RENDERING flag and avoid some visual artifacts. |
| window_title_->SetBackgroundColor(0x00000000); |
| window_title_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + window_title_->set_id(VIEW_ID_WINDOW_TITLE); |
| AddChildView(window_title_); |
| UpdateAvatarInfo(); |
| @@ -193,40 +160,6 @@ OpaqueBrowserFrameView::~OpaqueBrowserFrameView() { |
| } |
| /////////////////////////////////////////////////////////////////////////////// |
| -// OpaqueBrowserFrameView, protected: |
| - |
| -int OpaqueBrowserFrameView::GetReservedHeight() const { |
| - return 0; |
| -} |
| - |
| -gfx::Rect OpaqueBrowserFrameView::GetBoundsForReservedArea() const { |
| - gfx::Rect client_view_bounds = CalculateClientAreaBounds(width(), height()); |
| - return gfx::Rect( |
| - client_view_bounds.x(), |
| - client_view_bounds.y() + client_view_bounds.height(), |
| - client_view_bounds.width(), |
| - GetReservedHeight()); |
| -} |
| - |
| -int OpaqueBrowserFrameView::NonClientTopBorderHeight( |
| - bool restored) const { |
| - views::WidgetDelegate* delegate = frame()->widget_delegate(); |
| - // |delegate| may be NULL if called from callback of InputMethodChanged while |
| - // a window is being destroyed. |
| - // See more discussion at http://crosbug.com/8958 |
| - if (delegate && delegate->ShouldShowWindowTitle()) { |
| - return std::max(FrameBorderThickness(restored) + IconSize(), |
| - CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) + |
| - TitlebarBottomThickness(restored); |
| - } |
| - |
| - return FrameBorderThickness(restored) - |
| - ((browser_view()->IsTabStripVisible() && |
| - !restored && !frame()->ShouldLeaveOffsetNearTopBorder()) |
| - ? kTabstripTopShadowThickness : 0); |
| -} |
| - |
| -/////////////////////////////////////////////////////////////////////////////// |
| // OpaqueBrowserFrameView, BrowserNonClientFrameView implementation: |
| gfx::Rect OpaqueBrowserFrameView::GetBoundsForTabStrip( |
| @@ -234,31 +167,13 @@ gfx::Rect OpaqueBrowserFrameView::GetBoundsForTabStrip( |
| if (!tabstrip) |
| return gfx::Rect(); |
| - gfx::Rect bounds = GetBoundsForTabStripAndAvatarArea(tabstrip); |
| - int space_left_of_tabstrip = kTabStripIndent; |
| - if (browser_view()->ShouldShowAvatar()) { |
| - if (avatar_label() && avatar_label()->bounds().width()) { |
| - // Space between the right edge of the avatar label and the tabstrip. |
| - const int kAvatarLabelRightSpacing = -10; |
| - space_left_of_tabstrip = |
| - avatar_label()->bounds().right() + kAvatarLabelRightSpacing; |
| - } else { |
| - space_left_of_tabstrip = |
| - kAvatarLeftSpacing + avatar_bounds_.width() + kAvatarRightSpacing; |
| - } |
| - } |
| - bounds.Inset(space_left_of_tabstrip, 0, 0, 0); |
| - return bounds; |
| + return layout_->GetBoundsForTabStrip(tabstrip->GetPreferredSize(), width()); |
| } |
| BrowserNonClientFrameView::TabStripInsets |
| OpaqueBrowserFrameView::GetTabStripInsets(bool restored) const { |
| - int top = NonClientTopBorderHeight(restored) + ((!restored && |
| - (!frame()->ShouldLeaveOffsetNearTopBorder() || |
| - frame()->IsFullscreen())) ? |
| - 0 : kNonClientRestoredExtraThickness); |
| // TODO: include OTR and caption. |
| - return TabStripInsets(top, 0, 0); |
| + return TabStripInsets(layout_->GetTabStripInsetsTop(restored), 0, 0); |
| } |
| int OpaqueBrowserFrameView::GetThemeBackgroundXInset() const { |
| @@ -271,56 +186,19 @@ void OpaqueBrowserFrameView::UpdateThrobber(bool running) { |
| } |
| gfx::Size OpaqueBrowserFrameView::GetMinimumSize() { |
| - gfx::Size min_size(browser_view()->GetMinimumSize()); |
| - int border_thickness = NonClientBorderThickness(); |
| - min_size.Enlarge(2 * border_thickness, |
| - NonClientTopBorderHeight(false) + border_thickness); |
| - |
| - views::WidgetDelegate* delegate = frame()->widget_delegate(); |
| - int min_titlebar_width = (2 * FrameBorderThickness(false)) + |
| - kIconLeftSpacing + |
| - (delegate && delegate->ShouldShowWindowIcon() ? |
| - (IconSize() + kTitleLogoSpacing) : 0); |
| -#if !defined(OS_CHROMEOS) |
|
sky
2013/08/30 16:35:18
It looks like you nuked this in the new code. Inte
Elliot Glaysher
2013/08/30 17:55:01
Intentional, and I had to do some history diving t
|
| - if (ShouldAddDefaultCaptionButtons()) { |
| - min_titlebar_width += |
| - minimize_button_->GetMinimumSize().width() + |
| - restore_button_->GetMinimumSize().width() + |
| - close_button_->GetMinimumSize().width(); |
| - } |
| -#endif |
| - min_size.set_width(std::max(min_size.width(), min_titlebar_width)); |
| - |
| - // Ensure that the minimum width is enough to hold a minimum width tab strip |
| - // and avatar icon at their usual insets. |
| - if (browser_view()->IsTabStripVisible()) { |
| - TabStrip* tabstrip = browser_view()->tabstrip(); |
| - const int min_tabstrip_width = tabstrip->GetMinimumSize().width(); |
| - const int min_tabstrip_area_width = |
| - width() - GetBoundsForTabStripAndAvatarArea(tabstrip).width() + |
| - min_tabstrip_width + browser_view()->GetOTRAvatarIcon().width() + |
| - kAvatarLeftSpacing + kAvatarRightSpacing; |
| - min_size.set_width(std::max(min_size.width(), min_tabstrip_area_width)); |
| - } |
| - |
| - return min_size; |
| + return layout_->GetMinimumSize(width()); |
| } |
| /////////////////////////////////////////////////////////////////////////////// |
| // OpaqueBrowserFrameView, views::NonClientFrameView implementation: |
| gfx::Rect OpaqueBrowserFrameView::GetBoundsForClientView() const { |
| - return client_view_bounds_; |
| + return layout_->client_view_bounds(); |
| } |
| gfx::Rect OpaqueBrowserFrameView::GetWindowBoundsForClientBounds( |
| const gfx::Rect& client_bounds) const { |
| - int top_height = NonClientTopBorderHeight(false); |
| - int border_thickness = NonClientBorderThickness(); |
| - return gfx::Rect(std::max(0, client_bounds.x() - border_thickness), |
| - std::max(0, client_bounds.y() - top_height), |
| - client_bounds.width() + (2 * border_thickness), |
| - client_bounds.height() + top_height + border_thickness); |
| + return layout_->GetWindowBoundsForClientBounds(client_bounds); |
| } |
| int OpaqueBrowserFrameView::NonClientHitTest(const gfx::Point& point) { |
| @@ -387,7 +265,7 @@ void OpaqueBrowserFrameView::GetWindowMask(const gfx::Size& size, |
| } |
| void OpaqueBrowserFrameView::ResetWindowControls() { |
| - if (!ShouldAddDefaultCaptionButtons()) |
| + if (!OpaqueBrowserFrameViewLayout::ShouldAddDefaultCaptionButtons()) |
| return; |
| restore_button_->SetState(views::CustomButton::STATE_NORMAL); |
| minimize_button_->SetState(views::CustomButton::STATE_NORMAL); |
| @@ -430,13 +308,6 @@ void OpaqueBrowserFrameView::OnPaint(gfx::Canvas* canvas) { |
| PaintRestoredClientEdge(canvas); |
| } |
| -void OpaqueBrowserFrameView::Layout() { |
| - LayoutWindowControls(); |
| - LayoutTitleBar(); |
| - LayoutAvatar(); |
| - client_view_bounds_ = CalculateClientAreaBounds(width(), height()); |
| -} |
| - |
| bool OpaqueBrowserFrameView::HitTestRect(const gfx::Rect& rect) const { |
| if (!views::View::HitTestRect(rect)) { |
| // |rect| is outside OpaqueBrowserFrameView's bounds. |
| @@ -559,6 +430,86 @@ void OpaqueBrowserFrameView::Observe( |
| } |
| /////////////////////////////////////////////////////////////////////////////// |
| +// OpaqueBrowserFrameView, OpaqueBrowserFrameViewLayoutDelegate implementation: |
| + |
| +bool OpaqueBrowserFrameView::ShouldShowWindowIcon() const { |
| + views::WidgetDelegate* delegate = frame()->widget_delegate(); |
| + return delegate && delegate->ShouldShowWindowIcon(); |
| +} |
| + |
| +bool OpaqueBrowserFrameView::ShouldShowWindowTitle() const { |
| + // |delegate| may be NULL if called from callback of InputMethodChanged while |
| + // a window is being destroyed. |
| + // See more discussion at http://crosbug.com/8958 |
| + views::WidgetDelegate* delegate = frame()->widget_delegate(); |
| + return delegate && delegate->ShouldShowWindowTitle(); |
| +} |
| + |
| +string16 OpaqueBrowserFrameView::GetWindowTitle() const { |
| + return frame()->widget_delegate()->GetWindowTitle(); |
| +} |
| + |
| +int OpaqueBrowserFrameView::GetIconSize() const { |
| +#if defined(OS_WIN) |
| + // This metric scales up if either the titlebar height or the titlebar font |
| + // size are increased. |
| + return GetSystemMetrics(SM_CYSMICON); |
| +#else |
| + return std::max(BrowserFrame::GetTitleFont().GetHeight(), kIconMinimumSize); |
| +#endif |
| +} |
| + |
| +bool OpaqueBrowserFrameView::ShouldLeaveOffsetNearTopBorder() const { |
| + return frame()->ShouldLeaveOffsetNearTopBorder(); |
| +} |
| + |
| +gfx::Size OpaqueBrowserFrameView::GetBrowserViewMinimumSize() const { |
| + return browser_view()->GetMinimumSize(); |
| +} |
| + |
| +bool OpaqueBrowserFrameView::ShouldShowAvatar() const { |
| + return browser_view()->ShouldShowAvatar(); |
| +} |
| + |
| +gfx::ImageSkia OpaqueBrowserFrameView::GetOTRAvatarIcon() const { |
| + return browser_view()->GetOTRAvatarIcon(); |
| +} |
| + |
| +bool OpaqueBrowserFrameView::IsMaximized() const { |
| + return frame()->IsMaximized(); |
| +} |
| + |
| +bool OpaqueBrowserFrameView::IsMinimized() const { |
| + return frame()->IsMinimized(); |
| +} |
| + |
| +bool OpaqueBrowserFrameView::IsFullscreen() const { |
| + return frame()->IsFullscreen(); |
| +} |
| + |
| +bool OpaqueBrowserFrameView::IsTabStripVisible() const { |
| + return browser_view()->IsTabStripVisible(); |
| +} |
| + |
| +int OpaqueBrowserFrameView::GetTabStripHeight() const { |
| + return browser_view()->GetTabStripHeight(); |
| +} |
| + |
| +int OpaqueBrowserFrameView::GetAdditionalReservedSpaceInTabStrip() const { |
| + // We don't have the sysmenu buttons in Windows 8 metro mode. However there |
| + // are buttons like the window switcher which are drawn in the non client |
| + // are in the BrowserView. We need to ensure that the tab strip does not |
| + // draw on the window switcher button. |
| + views::View* button = browser_view()->window_switcher_button(); |
| + return button ? button->width() : 0; |
| +} |
| + |
| +gfx::Size OpaqueBrowserFrameView::GetTabstripPreferredSize() const { |
| + gfx::Size s = browser_view()->tabstrip()->GetPreferredSize(); |
| + return s; |
| +} |
| + |
| +/////////////////////////////////////////////////////////////////////////////// |
| // OpaqueBrowserFrameView, private: |
| views::ImageButton* OpaqueBrowserFrameView::InitWindowCaptionButton( |
| @@ -566,7 +517,8 @@ views::ImageButton* OpaqueBrowserFrameView::InitWindowCaptionButton( |
| int hot_image_id, |
| int pushed_image_id, |
| int mask_image_id, |
| - int accessibility_string_id) { |
| + int accessibility_string_id, |
| + ViewID view_id) { |
| views::ImageButton* button = new views::ImageButton(this); |
| ui::ThemeProvider* tp = frame()->GetThemeProvider(); |
| button->SetImage(views::CustomButton::STATE_NORMAL, |
| @@ -583,13 +535,13 @@ views::ImageButton* OpaqueBrowserFrameView::InitWindowCaptionButton( |
| } |
| button->SetAccessibleName( |
| l10n_util::GetStringUTF16(accessibility_string_id)); |
| + button->set_id(view_id); |
| AddChildView(button); |
| return button; |
| } |
| int OpaqueBrowserFrameView::FrameBorderThickness(bool restored) const { |
| - return (!restored && (frame()->IsMaximized() || frame()->IsFullscreen())) ? |
| - 0 : kFrameBorderThickness; |
| + return layout_->FrameBorderThickness(restored); |
| } |
| int OpaqueBrowserFrameView::TopResizeHeight() const { |
| @@ -597,86 +549,11 @@ int OpaqueBrowserFrameView::TopResizeHeight() const { |
| } |
| int OpaqueBrowserFrameView::NonClientBorderThickness() const { |
| - // When we fill the screen, we don't show a client edge. |
| - return FrameBorderThickness(false) + |
| - ((frame()->IsMaximized() || frame()->IsFullscreen()) ? |
| - 0 : kClientEdgeThickness); |
| -} |
| - |
| -int OpaqueBrowserFrameView::CaptionButtonY(bool restored) const { |
| - // Maximized buttons start at window top so that even if their images aren't |
| - // drawn flush with the screen edge, they still obey Fitts' Law. |
| - return (!restored && frame()->IsMaximized()) ? |
| - FrameBorderThickness(false) : kFrameShadowThickness; |
| -} |
| - |
| -int OpaqueBrowserFrameView::TitlebarBottomThickness(bool restored) const { |
| - return kTitlebarTopAndBottomEdgeThickness + |
| - ((!restored && frame()->IsMaximized()) ? 0 : kClientEdgeThickness); |
| -} |
| - |
| -int OpaqueBrowserFrameView::IconSize() const { |
| -#if defined(OS_WIN) |
| - // This metric scales up if either the titlebar height or the titlebar font |
| - // size are increased. |
| - return GetSystemMetrics(SM_CYSMICON); |
| -#else |
| - return std::max(BrowserFrame::GetTitleFont().GetHeight(), kIconMinimumSize); |
| -#endif |
| + return layout_->NonClientBorderThickness(); |
| } |
| gfx::Rect OpaqueBrowserFrameView::IconBounds() const { |
| - int size = IconSize(); |
| - int frame_thickness = FrameBorderThickness(false); |
| - int y; |
| - views::WidgetDelegate* delegate = frame()->widget_delegate(); |
| - if (delegate && (delegate->ShouldShowWindowIcon() || |
| - delegate->ShouldShowWindowTitle())) { |
| - // Our frame border has a different "3D look" than Windows'. Theirs has a |
| - // more complex gradient on the top that they push their icon/title below; |
| - // then the maximized window cuts this off and the icon/title are centered |
| - // in the remaining space. Because the apparent shape of our border is |
| - // simpler, using the same positioning makes things look slightly uncentered |
| - // with restored windows, so when the window is restored, instead of |
| - // calculating the remaining space from below the frame border, we calculate |
| - // from below the 3D edge. |
| - int unavailable_px_at_top = frame()->IsMaximized() ? |
| - frame_thickness : kTitlebarTopAndBottomEdgeThickness; |
| - // When the icon is shorter than the minimum space we reserve for the |
| - // caption button, we vertically center it. We want to bias rounding to put |
| - // extra space above the icon, since the 3D edge (+ client edge, for |
| - // restored windows) below looks (to the eye) more like additional space |
| - // than does the 3D edge (or nothing at all, for maximized windows) above; |
| - // hence the +1. |
| - y = unavailable_px_at_top + (NonClientTopBorderHeight(false) - |
| - unavailable_px_at_top - size - TitlebarBottomThickness(false) + 1) / 2; |
| - } else { |
| - // For "browser mode" windows, we use the native positioning, which is just |
| - // below the top frame border. |
| - y = frame_thickness; |
| - } |
| - return gfx::Rect(frame_thickness + kIconLeftSpacing, y, size, size); |
| -} |
| - |
| -gfx::Rect OpaqueBrowserFrameView::GetBoundsForTabStripAndAvatarArea( |
| - views::View* tabstrip) const { |
| - int available_width = width(); |
| - if (minimize_button_) { |
| - available_width = minimize_button_->x(); |
| - } else if (browser_view()->window_switcher_button()) { |
| - // We don't have the sysmenu buttons in Windows 8 metro mode. However there |
| - // are buttons like the window switcher which are drawn in the non client |
| - // are in the BrowserView. We need to ensure that the tab strip does not |
| - // draw on the window switcher button. |
| - available_width -= browser_view()->window_switcher_button()->width(); |
| - } |
| - const int caption_spacing = frame()->IsMaximized() ? |
| - kNewTabCaptionMaximizedSpacing : kNewTabCaptionRestoredSpacing; |
| - const int tabstrip_x = NonClientBorderThickness(); |
| - const int tabstrip_width = available_width - tabstrip_x - caption_spacing; |
| - return gfx::Rect(tabstrip_x, GetTabStripInsets(false).top, |
| - std::max(0, tabstrip_width), |
| - tabstrip->GetPreferredSize().height()); |
| + return layout_->IconBounds(); |
| } |
| void OpaqueBrowserFrameView::PaintRestoredFrameBorder(gfx::Canvas* canvas) { |
| @@ -845,7 +722,8 @@ void OpaqueBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { |
| int client_area_top = frame()->client_view()->y(); |
| int image_top = client_area_top; |
| - gfx::Rect client_area_bounds = CalculateClientAreaBounds(width(), height()); |
| + gfx::Rect client_area_bounds = |
| + layout_->CalculateClientAreaBounds(width(), height()); |
| SkColor toolbar_color = tp->GetColor(ThemeProperties::COLOR_TOOLBAR); |
| if (browser_view()->IsToolbarVisible()) { |
| @@ -989,111 +867,3 @@ int OpaqueBrowserFrameView::GetTopAreaHeight() const { |
| } |
| return top_area_height; |
| } |
| - |
| -void OpaqueBrowserFrameView::LayoutWindowControls() { |
| - if (!ShouldAddDefaultCaptionButtons()) |
| - return; |
| - bool is_maximized = frame()->IsMaximized(); |
| - close_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, |
| - views::ImageButton::ALIGN_BOTTOM); |
| - int caption_y = CaptionButtonY(false); |
| - // There should always be the same number of non-shadow pixels visible to the |
| - // side of the caption buttons. In maximized mode we extend the rightmost |
| - // button to the screen corner to obey Fitts' Law. |
| - int right_extra_width = is_maximized ? |
| - (kFrameBorderThickness - kFrameShadowThickness) : 0; |
| - gfx::Size close_button_size = close_button_->GetPreferredSize(); |
| - close_button_->SetBounds(width() - FrameBorderThickness(false) - |
| - right_extra_width - close_button_size.width(), caption_y, |
| - close_button_size.width() + right_extra_width, |
| - close_button_size.height()); |
| - |
| - // When the window is restored, we show a maximized button; otherwise, we show |
| - // a restore button. |
| - bool is_restored = !is_maximized && !frame()->IsMinimized(); |
| - views::ImageButton* invisible_button = is_restored ? |
| - restore_button_ : maximize_button_; |
| - invisible_button->SetVisible(false); |
| - |
| - views::ImageButton* visible_button = is_restored ? |
| - maximize_button_ : restore_button_; |
| - visible_button->SetVisible(true); |
| - visible_button->SetImageAlignment(views::ImageButton::ALIGN_LEFT, |
| - views::ImageButton::ALIGN_BOTTOM); |
| - gfx::Size visible_button_size = visible_button->GetPreferredSize(); |
| - visible_button->SetBounds(close_button_->x() - visible_button_size.width(), |
| - caption_y, visible_button_size.width(), |
| - visible_button_size.height()); |
| - |
| - minimize_button_->SetVisible(true); |
| - minimize_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, |
| - views::ImageButton::ALIGN_BOTTOM); |
| - gfx::Size minimize_button_size = minimize_button_->GetPreferredSize(); |
| - minimize_button_->SetBounds( |
| - visible_button->x() - minimize_button_size.width(), caption_y, |
| - minimize_button_size.width(), |
| - minimize_button_size.height()); |
| -} |
| - |
| -void OpaqueBrowserFrameView::LayoutTitleBar() { |
| - const views::WidgetDelegate* delegate = frame()->widget_delegate(); |
| - if (delegate) { |
| - gfx::Rect icon_bounds(IconBounds()); |
| - if (delegate->ShouldShowWindowIcon()) |
| - window_icon_->SetBoundsRect(icon_bounds); |
| - |
| - window_title_->SetVisible(delegate->ShouldShowWindowTitle()); |
| - if (delegate->ShouldShowWindowTitle()) { |
| - window_title_->SetText(delegate->GetWindowTitle()); |
| - const int title_x = delegate->ShouldShowWindowIcon() ? |
| - icon_bounds.right() + kIconTitleSpacing : icon_bounds.x(); |
| - window_title_->SetBounds(title_x, icon_bounds.y(), |
| - std::max(0, minimize_button_->x() - kTitleLogoSpacing - title_x), |
| - icon_bounds.height()); |
| - } |
| - } |
| -} |
| - |
| -void OpaqueBrowserFrameView::LayoutAvatar() { |
| - // Even though the avatar is used for both incognito and profiles we always |
| - // use the incognito icon to layout the avatar button. The profile icon |
| - // can be customized so we can't depend on its size to perform layout. |
| - gfx::ImageSkia incognito_icon = browser_view()->GetOTRAvatarIcon(); |
| - |
| - int avatar_bottom = GetTabStripInsets(false).top + |
| - browser_view()->GetTabStripHeight() - kAvatarBottomSpacing; |
| - int avatar_restored_y = avatar_bottom - incognito_icon.height(); |
| - int avatar_y = frame()->IsMaximized() ? |
| - (NonClientTopBorderHeight(false) + kTabstripTopShadowThickness) : |
| - avatar_restored_y; |
| - avatar_bounds_.SetRect(NonClientBorderThickness() + kAvatarLeftSpacing, |
| - avatar_y, incognito_icon.width(), |
| - browser_view()->ShouldShowAvatar() ? (avatar_bottom - avatar_y) : 0); |
| - if (avatar_button()) |
| - avatar_button()->SetBoundsRect(avatar_bounds_); |
| - |
| - if (avatar_label()) { |
| - // Space between the bottom of the avatar and the bottom of the avatar |
| - // label. |
| - const int kAvatarLabelBottomSpacing = 3; |
| - // Space between the frame border and the left edge of the avatar label. |
| - const int kAvatarLabelLeftSpacing = -1; |
| - gfx::Size label_size = avatar_label()->GetPreferredSize(); |
| - gfx::Rect label_bounds( |
| - FrameBorderThickness(false) + kAvatarLabelLeftSpacing, |
| - avatar_bottom - kAvatarLabelBottomSpacing - label_size.height(), |
| - label_size.width(), |
| - browser_view()->ShouldShowAvatar() ? label_size.height() : 0); |
| - avatar_label()->SetBoundsRect(label_bounds); |
| - } |
| -} |
| - |
| -gfx::Rect OpaqueBrowserFrameView::CalculateClientAreaBounds(int width, |
| - int height) const { |
| - int top_height = NonClientTopBorderHeight(false); |
| - int border_thickness = NonClientBorderThickness(); |
| - return gfx::Rect(border_thickness, top_height, |
| - std::max(0, width - (2 * border_thickness)), |
| - std::max(0, height - GetReservedHeight() - |
| - top_height - border_thickness)); |
| -} |