Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5335)

Unified Diff: chrome/browser/ui/views/frame/opaque_browser_frame_view.cc

Issue 23531006: Factor out the layout code from OpaqueBrowserFrameView for testing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add string casts to make MSVS happy. Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)
- 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));
-}

Powered by Google App Engine
This is Rietveld 408576698