diff options
24 files changed, 390 insertions, 358 deletions
diff --git a/chrome/browser/chromeos/frame/normal_browser_frame_view.cc b/chrome/browser/chromeos/frame/normal_browser_frame_view.cc index 6e6362b..2878eae 100644 --- a/chrome/browser/chromeos/frame/normal_browser_frame_view.cc +++ b/chrome/browser/chromeos/frame/normal_browser_frame_view.cc @@ -91,11 +91,16 @@ gfx::Rect NormalBrowserFrameView::GetBoundsForTabStrip( return gfx::Rect(border_thickness, NonClientTopBorderHeight(), ps.width(), browser_view_->height()); } - return gfx::Rect(border_thickness, NonClientTopBorderHeight(), + return gfx::Rect(border_thickness, GetHorizontalTabStripVerticalOffset(false), std::max(0, width() - (2 * border_thickness)), tabstrip->GetPreferredHeight()); } +int NormalBrowserFrameView::GetHorizontalTabStripVerticalOffset( + bool restored) const { + return NonClientTopBorderHeight(); +} + void NormalBrowserFrameView::UpdateThrobber(bool running) { // No window icon. } @@ -256,27 +261,30 @@ void NormalBrowserFrameView::PaintMaximizedFrameBorder(gfx::Canvas* canvas) { // Window frame mode and color SkBitmap* theme_frame; - int y = 0; + // HACK: This is to properly align the frame background with the tab + // background. This was added because when this code was copied from the + // opaque frame code, that code didn't correctly handle maximized mode theme + // alignment. That bug has since been fixed in a more general but more + // complex way in the opaque frame. Since this file is eventually going to + // die (see crbug.com/52674), I'm just leaving this here rather than replacing + // it with the complex fix. + int y = -kCustomFrameBackgroundVerticalOffset; // Never theme app and popup windows. if (!browser_view_->IsBrowserTypeNormal()) { ResourceBundle& rb = ResourceBundle::GetSharedInstance(); theme_frame = rb.GetBitmapNamed(ShouldPaintAsActive() ? IDR_FRAME : IDR_FRAME_INACTIVE); + y = 0; // These are never themed. } else if (!browser_view_->IsOffTheRecord()) { theme_frame = tp->GetBitmapNamed(ShouldPaintAsActive() ? IDR_THEME_FRAME : IDR_THEME_FRAME_INACTIVE); - // TODO(oshima): gtk based CHROMEOS is using non custom frame - // mode which does this adjustment. This should be removed - // once it's fully migrated to views. -1 is due to the layout - // difference between views and gtk and will be removed. - // See http://crbug.com/28580. - y = -kCustomFrameBackgroundVerticalOffset - 1; } else { theme_frame = tp->GetBitmapNamed(ShouldPaintAsActive() ? IDR_THEME_FRAME_INCOGNITO: IDR_THEME_FRAME_INCOGNITO_INACTIVE); - y = -kCustomFrameBackgroundVerticalOffset - 1; } - // Draw the theme frame. + // Draw the theme frame. It must be aligned with the tabstrip as if we were + // in restored mode. Note that the top of the tabstrip is + // kTabstripTopShadowThickness px off the top of the screen. canvas->TileImageInt(*theme_frame, 0, y, width(), theme_frame->height()); // Draw the theme frame overlay @@ -284,7 +292,7 @@ void NormalBrowserFrameView::PaintMaximizedFrameBorder(gfx::Canvas* canvas) { browser_view_->IsBrowserTypeNormal()) { SkBitmap* theme_overlay = tp->GetBitmapNamed(ShouldPaintAsActive() ? IDR_THEME_FRAME_OVERLAY : IDR_THEME_FRAME_OVERLAY_INACTIVE); - canvas->DrawBitmapInt(*theme_overlay, 0, 0); + canvas->DrawBitmapInt(*theme_overlay, 0, y); } if (!browser_view_->IsToolbarVisible()) { @@ -328,14 +336,13 @@ void NormalBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { tp->GetColor(BrowserThemeProvider::COLOR_TOOLBAR); canvas->FillRectInt(theme_toolbar_color, toolbar_bounds.x(), bottom_y, toolbar_bounds.width(), bottom_edge_height); - toolbar_bounds.Inset(-kClientEdgeThickness, 0); int strip_height = browser_view_->GetTabStripHeight(); SkBitmap* theme_toolbar = tp->GetBitmapNamed(IDR_THEME_TOOLBAR); canvas->TileImageInt(*theme_toolbar, toolbar_bounds.x(), - strip_height - kFrameShadowThickness, toolbar_bounds.x(), - bottom_y, toolbar_bounds.width(), theme_toolbar->height()); + strip_height - kFrameShadowThickness, toolbar_bounds.x(), bottom_y, + toolbar_bounds.width(), theme_toolbar->height()); canvas->DrawBitmapInt(*toolbar_left, 0, 0, toolbar_left->width(), split_point, toolbar_bounds.x() - toolbar_left->width(), toolbar_bounds.y(), diff --git a/chrome/browser/chromeos/frame/normal_browser_frame_view.h b/chrome/browser/chromeos/frame/normal_browser_frame_view.h index 96d27e8..cc73a39 100644 --- a/chrome/browser/chromeos/frame/normal_browser_frame_view.h +++ b/chrome/browser/chromeos/frame/normal_browser_frame_view.h @@ -34,6 +34,7 @@ class NormalBrowserFrameView : public BrowserNonClientFrameView, // Overridden from BrowserNonClientFrameView: virtual gfx::Rect GetBoundsForTabStrip(BaseTabStrip* tabstrip) const; + virtual int GetHorizontalTabStripVerticalOffset(bool restored) const; virtual void UpdateThrobber(bool running); virtual gfx::Size GetMinimumSize(); diff --git a/chrome/browser/views/detachable_toolbar_view.cc b/chrome/browser/views/detachable_toolbar_view.cc index ba44f3d..f7664c2 100644 --- a/chrome/browser/views/detachable_toolbar_view.cc +++ b/chrome/browser/views/detachable_toolbar_view.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -11,6 +11,7 @@ #include "grit/theme_resources.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkShader.h" +#include "views/window/non_client_view.h" // How round the 'new tab' style bookmarks bar is. static const int kNewtabBarRoundness = 5; @@ -21,21 +22,18 @@ const SkColor DetachableToolbarView::kMiddleDividerColor = SkColorSetRGB(194, 205, 212); // static -void DetachableToolbarView::PaintBackgroundAttachedMode(gfx::Canvas* canvas, - views::View* view) { - gfx::Rect bounds = - view->GetBounds(views::View::APPLY_MIRRORING_TRANSFORMATION); - +void DetachableToolbarView::PaintBackgroundAttachedMode( + gfx::Canvas* canvas, + views::View* view, + const gfx::Point& background_origin) { ThemeProvider* tp = view->GetThemeProvider(); SkColor theme_toolbar_color = tp->GetColor(BrowserThemeProvider::COLOR_TOOLBAR); canvas->FillRectInt(theme_toolbar_color, 0, 0, view->width(), view->height()); - canvas->TileImageInt(*tp->GetBitmapNamed(IDR_THEME_TOOLBAR), - view->GetParent()->GetBounds( - views::View::APPLY_MIRRORING_TRANSFORMATION).x() + bounds.x(), - bounds.y(), 0, 0, view->width(), view->height()); + background_origin.x(), background_origin.y(), 0, 0, + view->width(), view->height()); } // static @@ -57,9 +55,10 @@ void DetachableToolbarView::PaintHorizontalBorder(gfx::Canvas* canvas, DetachableToolbarView* view) { // Border can be at the top or at the bottom of the view depending on whether // the view (bar/shelf) is attached or detached. - int y = !view->IsDetached() ? view->height() - 1 : 0; + int thickness = views::NonClientFrameView::kClientEdgeThickness; + int y = view->IsDetached() ? 0 : (view->height() - thickness); canvas->FillRectInt(ResourceBundle::toolbar_separator_color, - 0, y, view->width(), 1); + 0, y, view->width(), thickness); } // static diff --git a/chrome/browser/views/detachable_toolbar_view.h b/chrome/browser/views/detachable_toolbar_view.h index d44557c..0211e88 100644 --- a/chrome/browser/views/detachable_toolbar_view.h +++ b/chrome/browser/views/detachable_toolbar_view.h @@ -32,10 +32,12 @@ class DetachableToolbarView : public AccessibleToolbarView { // Gets the current amount of overlap atop the browser toolbar. virtual int GetToolbarOverlap() const = 0; - // Paint the background (including the theme image behind content area) when - // in bar/shelf is attached to the Chrome frame. + // Paints the background (including the theme image behind content area) when + // the bar/shelf is attached to the top toolbar. |background_origin| is the + // origin to use for painting the theme image. static void PaintBackgroundAttachedMode(gfx::Canvas* canvas, - views::View* view); + views::View* view, + const gfx::Point& background_origin); // Calculate the rect for the content area of the bar/shelf. This is only // needed when the bar/shelf is detached from the Chrome frame (otherwise the diff --git a/chrome/browser/views/dropdown_bar_host.cc b/chrome/browser/views/dropdown_bar_host.cc index d01459e..f756cb2 100644 --- a/chrome/browser/views/dropdown_bar_host.cc +++ b/chrome/browser/views/dropdown_bar_host.cc @@ -174,13 +174,6 @@ void DropdownBarHost::AnimationEnded(const Animation* animation) { } } -void DropdownBarHost::GetThemePosition(gfx::Rect* bounds) { - *bounds = GetDialogPosition(gfx::Rect()); - gfx::Rect toolbar_bounds = browser_view_->GetToolbarBounds(); - gfx::Rect tab_strip_bounds = browser_view_->GetTabStripBounds(); - bounds->Offset(-toolbar_bounds.x(), -tab_strip_bounds.y()); -} - //////////////////////////////////////////////////////////////////////////////// // DropdownBarHost protected: diff --git a/chrome/browser/views/dropdown_bar_host.h b/chrome/browser/views/dropdown_bar_host.h index 8924456..72b9aac 100644 --- a/chrome/browser/views/dropdown_bar_host.h +++ b/chrome/browser/views/dropdown_bar_host.h @@ -78,9 +78,6 @@ class DropdownBarHost : public views::AcceleratorTarget, virtual void AnimationProgressed(const Animation* animation); virtual void AnimationEnded(const Animation* animation); - // Get the offset with which to paint the theme image. - void GetThemePosition(gfx::Rect* bounds); - // During testing we can disable animations by setting this flag to true, // so that opening and closing the dropdown bar is shown instantly, instead of // having to poll it while it animates to open/closed status. diff --git a/chrome/browser/views/find_bar_view.cc b/chrome/browser/views/find_bar_view.cc index 355a56f..62fa29c 100644 --- a/chrome/browser/views/find_bar_view.cc +++ b/chrome/browser/views/find_bar_view.cc @@ -17,6 +17,7 @@ #include "chrome/browser/profile.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/views/find_bar_host.h" +#include "chrome/browser/views/frame/browser_view.h" #include "chrome/browser/view_ids.h" #include "gfx/canvas.h" #include "grit/generated_resources.h" @@ -25,6 +26,7 @@ #include "views/background.h" #include "views/controls/button/image_button.h" #include "views/controls/label.h" +#include "views/widget/widget.h" // The amount of whitespace to have before the find button. static const int kWhiteSpaceAfterMatchCountLabel = 1; @@ -232,16 +234,26 @@ void FindBarView::SetFocusAndSelection(bool select_all) { void FindBarView::Paint(gfx::Canvas* canvas) { SkPaint paint; + // Determine the find bar size as well as the offset from which to tile the + // toolbar background image. First, get the widget bounds. + gfx::Rect bounds; + GetWidget()->GetBounds(&bounds, true); + // Now convert from screen to parent coordinates. + gfx::Point origin(bounds.origin()); + BrowserView* browser_view = host()->browser_view(); + ConvertPointToView(NULL, browser_view, &origin); + bounds.set_origin(origin); + // Finally, calculate the background image tiling offset. + origin = browser_view->OffsetPointForToolbarBackgroundImage(origin); + // First, we draw the background image for the whole dialog (3 images: left, // middle and right). Note, that the window region has been set by the // controller, so the whitespace in the left and right background images is // actually outside the window region and is therefore not drawn. See // FindInPageWidgetWin::CreateRoundedWindowEdges() for details. ThemeProvider* tp = GetThemeProvider(); - gfx::Rect bounds; - host()->GetThemePosition(&bounds); - canvas->TileImageInt(*tp->GetBitmapNamed(IDR_THEME_TOOLBAR), bounds.x(), - bounds.y(), 0, 0, bounds.width(), bounds.height()); + canvas->TileImageInt(*tp->GetBitmapNamed(IDR_THEME_TOOLBAR), origin.x(), + origin.y(), 0, 0, bounds.width(), bounds.height()); // Now flip the canvas for the rest of the graphics if in RTL mode. canvas->Save(); diff --git a/chrome/browser/views/frame/app_panel_browser_frame_view.cc b/chrome/browser/views/frame/app_panel_browser_frame_view.cc index b8a1b33..d7efbe9 100644 --- a/chrome/browser/views/frame/app_panel_browser_frame_view.cc +++ b/chrome/browser/views/frame/app_panel_browser_frame_view.cc @@ -93,6 +93,12 @@ gfx::Rect AppPanelBrowserFrameView::GetBoundsForTabStrip( return gfx::Rect(); } +int AppPanelBrowserFrameView::GetHorizontalTabStripVerticalOffset( + bool restored) const { + // App panels are not themed and don't need this. + return 0; +} + void AppPanelBrowserFrameView::UpdateThrobber(bool running) { window_icon_->Update(); } diff --git a/chrome/browser/views/frame/app_panel_browser_frame_view.h b/chrome/browser/views/frame/app_panel_browser_frame_view.h index f7a7c745..eae6d9b 100644 --- a/chrome/browser/views/frame/app_panel_browser_frame_view.h +++ b/chrome/browser/views/frame/app_panel_browser_frame_view.h @@ -35,6 +35,7 @@ class AppPanelBrowserFrameView : public BrowserNonClientFrameView, // Overridden from BrowserNonClientFrameView: virtual gfx::Rect GetBoundsForTabStrip(BaseTabStrip* tabstrip) const; + virtual int GetHorizontalTabStripVerticalOffset(bool restored) const; virtual void UpdateThrobber(bool running); virtual gfx::Size GetMinimumSize(); diff --git a/chrome/browser/views/frame/browser_frame.h b/chrome/browser/views/frame/browser_frame.h index 5706d6b..0e3b9b2 100644 --- a/chrome/browser/views/frame/browser_frame.h +++ b/chrome/browser/views/frame/browser_frame.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -50,6 +50,11 @@ class BrowserFrame { // TabStrip. virtual gfx::Rect GetBoundsForTabStrip(BaseTabStrip* tabstrip) const = 0; + // Returns the y coordinate within the window at which the horizontal TabStrip + // begins (or would begin). If |restored| is true, this is calculated as if + // we were in restored mode regardless of the current mode. + virtual int GetHorizontalTabStripVerticalOffset(bool restored) const = 0; + // Tells the frame to update the throbber. virtual void UpdateThrobber(bool running) = 0; diff --git a/chrome/browser/views/frame/browser_frame_gtk.cc b/chrome/browser/views/frame/browser_frame_gtk.cc index 5b66885..3a9a1ba 100644 --- a/chrome/browser/views/frame/browser_frame_gtk.cc +++ b/chrome/browser/views/frame/browser_frame_gtk.cc @@ -71,6 +71,10 @@ gfx::Rect BrowserFrameGtk::GetBoundsForTabStrip(BaseTabStrip* tabstrip) const { return browser_frame_view_->GetBoundsForTabStrip(tabstrip); } +int BrowserFrameGtk::GetHorizontalTabStripVerticalOffset(bool restored) const { + return browser_frame_view_->GetHorizontalTabStripVerticalOffset(restored); +} + void BrowserFrameGtk::UpdateThrobber(bool running) { browser_frame_view_->UpdateThrobber(running); } diff --git a/chrome/browser/views/frame/browser_frame_gtk.h b/chrome/browser/views/frame/browser_frame_gtk.h index 20a5be2..742eea5 100644 --- a/chrome/browser/views/frame/browser_frame_gtk.h +++ b/chrome/browser/views/frame/browser_frame_gtk.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -31,6 +31,7 @@ class BrowserFrameGtk : public BrowserFrame, virtual views::Window* GetWindow(); virtual int GetMinimizeButtonOffset() const; virtual gfx::Rect GetBoundsForTabStrip(BaseTabStrip* tabstrip) const; + virtual int GetHorizontalTabStripVerticalOffset(bool restored) const; virtual void UpdateThrobber(bool running); virtual void ContinueDraggingDetachedTab(); virtual ThemeProvider* GetThemeProviderForFrame() const; diff --git a/chrome/browser/views/frame/browser_frame_win.cc b/chrome/browser/views/frame/browser_frame_win.cc index d018712..22fb3cc 100644 --- a/chrome/browser/views/frame/browser_frame_win.cc +++ b/chrome/browser/views/frame/browser_frame_win.cc @@ -67,15 +67,6 @@ void BrowserFrameWin::Init() { BrowserFrameWin::~BrowserFrameWin() { } -int BrowserFrameWin::GetTitleBarHeight() { - RECT caption = { 0 }; - if (DwmGetWindowAttribute(GetNativeView(), DWMWA_CAPTION_BUTTON_BOUNDS, - &caption, sizeof(RECT)) == S_OK) { - return caption.bottom; - } - return GetSystemMetrics(SM_CYCAPTION); -} - views::Window* BrowserFrameWin::GetWindow() { return this; } @@ -96,6 +87,10 @@ gfx::Rect BrowserFrameWin::GetBoundsForTabStrip(BaseTabStrip* tabstrip) const { return browser_frame_view_->GetBoundsForTabStrip(tabstrip); } +int BrowserFrameWin::GetHorizontalTabStripVerticalOffset(bool restored) const { + return browser_frame_view_->GetHorizontalTabStripVerticalOffset(restored); +} + void BrowserFrameWin::UpdateThrobber(bool running) { browser_frame_view_->UpdateThrobber(running); } @@ -311,13 +306,10 @@ void BrowserFrameWin::UpdateDWMFrame() { // In maximized mode, we only have a titlebar strip of glass, no side/bottom // borders. if (!browser_view_->IsFullscreen()) { - if (browser_view_->UseVerticalTabs()) { - margins.cyTopHeight = GetTitleBarHeight(); - } else { - margins.cyTopHeight = - GetBoundsForTabStrip(browser_view_->tabstrip()).bottom() + - kDWMFrameTopOffset; - } + gfx::Rect tabstrip_bounds( + GetBoundsForTabStrip(browser_view_->tabstrip())); + margins.cyTopHeight = (browser_view_->UseVerticalTabs() ? + tabstrip_bounds.y() : tabstrip_bounds.bottom()) + kDWMFrameTopOffset; } } else { // For popup and app windows we want to use the default margins. diff --git a/chrome/browser/views/frame/browser_frame_win.h b/chrome/browser/views/frame/browser_frame_win.h index 583eb87..fdc5d62 100644 --- a/chrome/browser/views/frame/browser_frame_win.h +++ b/chrome/browser/views/frame/browser_frame_win.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -36,13 +36,11 @@ class BrowserFrameWin : public BrowserFrame, public views::WindowWin { BrowserView* browser_view() const { return browser_view_; } - // Returns the height of the title bar. - int GetTitleBarHeight(); - // BrowserFrame implementation. virtual views::Window* GetWindow(); virtual int GetMinimizeButtonOffset() const; virtual gfx::Rect GetBoundsForTabStrip(BaseTabStrip* tabstrip) const; + virtual int GetHorizontalTabStripVerticalOffset(bool restored) const; virtual void UpdateThrobber(bool running); virtual void ContinueDraggingDetachedTab(); virtual ThemeProvider* GetThemeProviderForFrame() const; diff --git a/chrome/browser/views/frame/browser_non_client_frame_view.h b/chrome/browser/views/frame/browser_non_client_frame_view.h index ffcde5c..ba8ba40 100644 --- a/chrome/browser/views/frame/browser_non_client_frame_view.h +++ b/chrome/browser/views/frame/browser_non_client_frame_view.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -20,6 +20,12 @@ class BrowserNonClientFrameView : public views::NonClientFrameView { // Returns the bounds within which the TabStrip should be laid out. virtual gfx::Rect GetBoundsForTabStrip(BaseTabStrip* tabstrip) const = 0; + // Returns the y coordinate within the window at which the horizontal TabStrip + // begins, or (in vertical tabs mode) would begin. If |restored| is true, + // this is calculated as if we were in restored mode regardless of the current + // mode. This is used to correctly align theme images. + virtual int GetHorizontalTabStripVerticalOffset(bool restored) const = 0; + // Updates the throbber. virtual void UpdateThrobber(bool running) = 0; }; diff --git a/chrome/browser/views/frame/browser_view.cc b/chrome/browser/views/frame/browser_view.cc index 65548ef..68c08ef 100644 --- a/chrome/browser/views/frame/browser_view.cc +++ b/chrome/browser/views/frame/browser_view.cc @@ -269,7 +269,9 @@ void BookmarkExtensionBackground::Paint(gfx::Canvas* canvas, if (!toolbar_overlap) DetachableToolbarView::PaintHorizontalBorder(canvas, host_view_); } else { - DetachableToolbarView::PaintBackgroundAttachedMode(canvas, host_view_); + DetachableToolbarView::PaintBackgroundAttachedMode(canvas, host_view_, + browser_view_->OffsetPointForToolbarBackgroundImage( + gfx::Point(host_view_->MirroredX(), host_view_->y()))); if (host_view_->height() >= toolbar_overlap) DetachableToolbarView::PaintHorizontalBorder(canvas, host_view_); } @@ -591,7 +593,16 @@ void BrowserView::WindowMoveOrResizeStarted() { } gfx::Rect BrowserView::GetToolbarBounds() const { - return toolbar_->bounds(); + gfx::Rect toolbar_bounds(toolbar_->bounds()); + if (toolbar_bounds.IsEmpty()) + return toolbar_bounds; + // When using vertical tabs, the toolbar appears to extend behind the tab + // column. + if (UseVerticalTabs()) + toolbar_bounds.Inset(tabstrip_->x() - toolbar_bounds.x(), 0, 0, 0); + // The apparent toolbar edges are outside the "real" toolbar edges. + toolbar_bounds.Inset(-views::NonClientFrameView::kClientEdgeThickness, 0); + return toolbar_bounds; } gfx::Rect BrowserView::GetClientAreaBounds() const { @@ -619,8 +630,14 @@ int BrowserView::GetTabStripHeight() const { return IsTabStripVisible() ? tabstrip_->GetPreferredSize().height() : 0; } -gfx::Rect BrowserView::GetTabStripBounds() const { - return frame_->GetBoundsForTabStrip(tabstrip_); +gfx::Point BrowserView::OffsetPointForToolbarBackgroundImage( + const gfx::Point& point) const { + // The background image starts tiling horizontally at the window left edge and + // vertically at the top edge of the horizontal tab strip (or where it would + // be). We expect our parent's origin to be the window origin. + gfx::Point window_point(point.Add(gfx::Point(MirroredX(), y()))); + window_point.Offset(0, -frame_->GetHorizontalTabStripVerticalOffset(false)); + return window_point; } int BrowserView::GetSidebarWidth() const { @@ -1778,11 +1795,12 @@ void BrowserView::Layout() { // Send the margins of the "user-perceived content area" of this // browser window so AeroPeekManager can render a background-tab image in // the area. + // TODO(pkasting) correct content inset?? if (aeropeek_manager_.get()) { gfx::Insets insets(GetFindBarBoundingBox().y() + 1, - GetTabStripBounds().x(), - GetTabStripBounds().x(), - GetTabStripBounds().x()); + 0, + 0, + 0); aeropeek_manager_->SetContentInsets(insets); } #endif diff --git a/chrome/browser/views/frame/browser_view.h b/chrome/browser/views/frame/browser_view.h index a56bbb3..1d77dff 100644 --- a/chrome/browser/views/frame/browser_view.h +++ b/chrome/browser/views/frame/browser_view.h @@ -116,7 +116,10 @@ class BrowserView : public BrowserBubbleHost, // initiated. void WindowMoveOrResizeStarted(); - // Returns the bounds of the toolbar, in BrowserView coordinates. + // Returns the apparent bounds of the toolbar, in BrowserView coordinates. + // These differ from |toolbar_.bounds()| in that they match where the toolbar + // background image is drawn -- slightly outside the "true" bounds + // horizontally, and, when using vertical tabs, behind the tab column. gfx::Rect GetToolbarBounds() const; // Returns the bounds of the content area, in the coordinates of the @@ -140,9 +143,11 @@ class BrowserView : public BrowserBubbleHost, // avatar icon. int GetTabStripHeight() const; - // Returns the bounds of the TabStrip. Used by themed views to determine the - // offset of IDR_THEME_TOOLBAR. - gfx::Rect GetTabStripBounds() const; + // Takes some view's origin (relative to this BrowserView) and offsets it such + // that it can be used as the source origin for seamlessly tiling the toolbar + // background image over that view. + gfx::Point OffsetPointForToolbarBackgroundImage( + const gfx::Point& point) const; // Returns the width of the currently displayed sidebar or 0. int GetSidebarWidth() const; diff --git a/chrome/browser/views/frame/browser_view_layout.cc b/chrome/browser/views/frame/browser_view_layout.cc index f7d8128..0abd70e 100644 --- a/chrome/browser/views/frame/browser_view_layout.cc +++ b/chrome/browser/views/frame/browser_view_layout.cc @@ -246,8 +246,8 @@ void BrowserViewLayout::Layout(views::View* host) { int top = LayoutTabStrip(); if (browser_view_->IsTabStripVisible() && !browser_view_->UseVerticalTabs()) { tabstrip_->SetBackgroundOffset(gfx::Point( - tabstrip_->x() - browser_view_->GetToolbarBounds().x(), - tabstrip_->y())); + tabstrip_->MirroredX() + browser_view_->MirroredX(), + browser_view_->frame()->GetHorizontalTabStripVerticalOffset(false))); } top = LayoutToolbar(top); top = LayoutBookmarkAndInfoBars(top); diff --git a/chrome/browser/views/frame/glass_browser_frame_view.cc b/chrome/browser/views/frame/glass_browser_frame_view.cc index 6f30e6a..e9f6a41 100644 --- a/chrome/browser/views/frame/glass_browser_frame_view.cc +++ b/chrome/browser/views/frame/glass_browser_frame_view.cc @@ -33,9 +33,6 @@ const int kNonClientRestoredExtraThickness = 11; // In the window corners, the resize areas don't actually expand bigger, but the // 16 px at the end of the top and bottom edges triggers diagonal resizing. const int kResizeAreaCornerSize = 16; -// In maximized mode, the OTR avatar starts 2 px below the top of the screen, so -// that it doesn't extend into the "3D edge" portion of the titlebar. -const int kOTRMaximizedTopSpacing = 2; // The OTR 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). @@ -82,8 +79,9 @@ gfx::Rect GlassBrowserFrameView::GetBoundsForTabStrip( BaseTabStrip* tabstrip) const { if (browser_view_->UseVerticalTabs()) { gfx::Size ps = tabstrip->GetPreferredSize(); - return gfx::Rect(NonClientBorderThickness(), NonClientTopBorderHeight(), - ps.width(), browser_view_->height()); + return gfx::Rect(NonClientBorderThickness(), + NonClientTopBorderHeight(false, false), ps.width(), + browser_view_->height()); } int minimize_button_offset = frame_->GetMinimizeButtonOffset(); int tabstrip_x = browser_view_->ShouldShowOffTheRecordAvatar() ? @@ -103,11 +101,16 @@ gfx::Rect GlassBrowserFrameView::GetBoundsForTabStrip( int tabstrip_width = minimize_button_offset - tabstrip_x - (frame_->GetWindow()->IsMaximized() ? kNewTabCaptionMaximizedSpacing : kNewTabCaptionRestoredSpacing); - return gfx::Rect(tabstrip_x, NonClientTopBorderHeight(), + return gfx::Rect(tabstrip_x, GetHorizontalTabStripVerticalOffset(false), std::max(0, tabstrip_width), tabstrip->GetPreferredHeight()); } +int GlassBrowserFrameView::GetHorizontalTabStripVerticalOffset( + bool restored) const { + return NonClientTopBorderHeight(restored, true); +} + void GlassBrowserFrameView::UpdateThrobber(bool running) { if (throbber_running_) { if (running) { @@ -145,7 +148,7 @@ gfx::Rect GlassBrowserFrameView::GetWindowBoundsForClientBounds( return gfx::Rect(rect); } - int top_height = NonClientTopBorderHeight(); + int top_height = NonClientTopBorderHeight(false, false); int border_thickness = NonClientBorderThickness(); return gfx::Rect(std::max(0, client_bounds.x() - border_thickness), std::max(0, client_bounds.y() - top_height), @@ -222,15 +225,19 @@ int GlassBrowserFrameView::NonClientBorderThickness() const { kNonClientBorderThickness; } -int GlassBrowserFrameView::NonClientTopBorderHeight() const { - if (frame_->GetWindow()->IsFullscreen()) +int GlassBrowserFrameView::NonClientTopBorderHeight( + bool restored, + bool ignore_vertical_tabs) const { + if (!restored && frame_->GetWindow()->IsFullscreen()) return 0; - if (browser_view_->UseVerticalTabs()) - return static_cast<BrowserFrameWin*>(frame_)->GetTitleBarHeight(); // We'd like to use FrameBorderThickness() here, but the maximized Aero glass // frame has a 0 frame border around most edges and a CYSIZEFRAME-thick border // at the top (see AeroGlassFrame::OnGetMinMaxInfo()). - return GetSystemMetrics(SM_CYSIZEFRAME) + (browser_view_->IsMaximized() ? + if (browser_view_->IsTabStripVisible() && !ignore_vertical_tabs && + browser_view_->UseVerticalTabs()) + return GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYCAPTION); + return GetSystemMetrics(SM_CYSIZEFRAME) + + ((!restored && browser_view_->IsMaximized()) ? -kTabstripTopShadowThickness : kNonClientRestoredExtraThickness); } @@ -241,55 +248,56 @@ void GlassBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { gfx::Point toolbar_origin(toolbar_bounds.origin()); View::ConvertPointToView(browser_view_, this, &toolbar_origin); toolbar_bounds.set_origin(toolbar_origin); + int x = toolbar_bounds.x(); + int w = toolbar_bounds.width(); + int left_x = x - kContentEdgeShadowThickness; SkBitmap* theme_toolbar = tp->GetBitmapNamed(IDR_THEME_TOOLBAR); SkBitmap* toolbar_left = tp->GetBitmapNamed(IDR_CONTENT_TOP_LEFT_CORNER); SkBitmap* toolbar_center = tp->GetBitmapNamed(IDR_CONTENT_TOP_CENTER); if (browser_view_->UseVerticalTabs()) { - gfx::Rect tabstrip_bounds(browser_view_->tabstrip()->bounds()); - gfx::Point tabstrip_origin(tabstrip_bounds.origin()); + gfx::Point tabstrip_origin(browser_view_->tabstrip()->bounds().origin()); View::ConvertPointToView(browser_view_, this, &tabstrip_origin); - tabstrip_bounds.set_origin(tabstrip_origin); - - int x = tabstrip_bounds.x(); int y = tabstrip_origin.y(); - int w = toolbar_bounds.right() - x; - canvas->TileImageInt(*theme_toolbar, 0, - Tab::GetMinimumUnselectedSize().height(), - MirroredLeftPointForRect(toolbar_bounds), y, - toolbar_bounds.width(), theme_toolbar->height()); + // Tile the toolbar image starting at the frame edge on the left and where + // the horizontal tabstrip would be on the top. + canvas->TileImageInt(*theme_toolbar, x, + y - GetHorizontalTabStripVerticalOffset(false), x, y, + w, theme_toolbar->height()); // Draw left edge. int dest_y = y - kNonClientBorderThickness; canvas->DrawBitmapInt(*toolbar_left, 0, 0, kNonClientBorderThickness, - kNonClientBorderThickness, x - kNonClientBorderThickness, dest_y, - kNonClientBorderThickness, kNonClientBorderThickness, false); + kNonClientBorderThickness, left_x, dest_y, + kNonClientBorderThickness, kNonClientBorderThickness, + false); // Draw center edge. We need to draw a while line above the toolbar for the // image to overlay nicely. - canvas->FillRectInt(SK_ColorWHITE, x, y - 1, w, 1); - canvas->TileImageInt(*toolbar_center, x, dest_y, w, - toolbar_center->height()); + int center_offset = + -kContentEdgeShadowThickness + kNonClientBorderThickness; + canvas->FillRectInt(SK_ColorWHITE, x + center_offset, y - 1, + w - (2 * center_offset), 1); + canvas->TileImageInt(*toolbar_center, x + center_offset, dest_y, + w - (2 * center_offset), toolbar_center->height()); // Right edge. SkBitmap* toolbar_right = tp->GetBitmapNamed(IDR_CONTENT_TOP_RIGHT_CORNER); canvas->DrawBitmapInt(*toolbar_right, toolbar_right->width() - kNonClientBorderThickness, 0, kNonClientBorderThickness, kNonClientBorderThickness, - x + w - kNonClientBorderThickness, dest_y, kNonClientBorderThickness, + x + w - center_offset, dest_y, kNonClientBorderThickness, kNonClientBorderThickness, false); } else { - // Draw the toolbar background, setting src_y of the paint to the tab - // strip height as the toolbar background begins at the top of the tabs. - int x = toolbar_bounds.x() - kClientEdgeThickness; + // Tile the toolbar image starting at the frame edge on the left and where + // the tabstrip is on the top. int y = toolbar_bounds.y(); - int src_y = browser_view_->GetTabStripHeight() - 1; - canvas->TileImageInt(*theme_toolbar, 0, src_y, x, - y + (kFrameShadowThickness * 2), - toolbar_bounds.width() + (2 * kClientEdgeThickness), - theme_toolbar->height()); + int dest_y = y + (kFrameShadowThickness * 2); + canvas->TileImageInt(*theme_toolbar, x, + dest_y - GetHorizontalTabStripVerticalOffset(false), x, + dest_y, w, theme_toolbar->height()); // Draw rounded corners for the tab. SkBitmap* toolbar_left_mask = @@ -304,12 +312,11 @@ void GlassBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { paint.setXfermodeMode(SkXfermode::kDstIn_Mode); // Mask out the top left corner. - int left_x = x - kContentEdgeShadowThickness; canvas->DrawBitmapInt(*toolbar_left_mask, left_x, y, paint); // Mask out the top right corner. - int right_x = toolbar_bounds.right() - toolbar_right_mask->width() + - kContentEdgeShadowThickness + kClientEdgeThickness; + int right_x = + x + w + kContentEdgeShadowThickness - toolbar_right_mask->width(); canvas->DrawBitmapInt(*toolbar_right_mask, right_x, y, paint); // Draw left edge. @@ -326,33 +333,29 @@ void GlassBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { // Draw the content/toolbar separator. canvas->FillRectInt(ResourceBundle::toolbar_separator_color, - toolbar_bounds.x(), toolbar_bounds.bottom() - kClientEdgeThickness, - toolbar_bounds.width(), kClientEdgeThickness); + x + kClientEdgeThickness, toolbar_bounds.bottom() - kClientEdgeThickness, + w - (2 * kClientEdgeThickness), kClientEdgeThickness); } void GlassBrowserFrameView::PaintOTRAvatar(gfx::Canvas* canvas) { + // In RTL mode, the avatar icon should be looking the opposite direction. + canvas->Save(); + if (base::i18n::IsRTL()) { + canvas->TranslateInt(width(), 0); + canvas->ScaleInt(-1, 1); + } + SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon(); - int src_x = 0; - int src_y = (otr_avatar_icon.height() - otr_avatar_bounds_.height()) / 2; - int dst_x = MirroredLeftPointForRect(otr_avatar_bounds_); - int dst_y = otr_avatar_bounds_.y(); int w = otr_avatar_bounds_.width(); int h = otr_avatar_bounds_.height(); - if (browser_view_->UseVerticalTabs()) { - // Only a portion of the otr icon is visible for vertical tabs. Clip it - // so that it doesn't overlap shadows. - gfx::Point tabstrip_origin(browser_view_->tabstrip()->bounds().origin()); - View::ConvertPointToView(frame_->GetWindow()->GetClientView(), this, - &tabstrip_origin); - canvas->Save(); - canvas->ClipRectInt(dst_x, 2, w, tabstrip_origin.y() - 4); - canvas->DrawBitmapInt(otr_avatar_icon, src_x, src_y, w, h, dst_x, dst_y, - w, h, false); - canvas->Restore(); - } else { - canvas->DrawBitmapInt(otr_avatar_icon, src_x, src_y, w, h, dst_x, dst_y, - w, h, false); - } + canvas->DrawBitmapInt(otr_avatar_icon, 0, + // Bias the rounding to select a region that's lower rather than higher, + // as the shadows at the image top mean the apparent center is below the + // real center. + ((otr_avatar_icon.height() - otr_avatar_bounds_.height()) + 1) / 2, w, h, + otr_avatar_bounds_.x(), otr_avatar_bounds_.y(), w, h, false); + + canvas->Restore(); } void GlassBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { @@ -370,23 +373,10 @@ void GlassBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { std::max(client_area_top, height() - NonClientBorderThickness()); int client_area_height = client_area_bottom - client_area_top; + // Draw the client edge images. SkBitmap* right = tp->GetBitmapNamed(IDR_CONTENT_RIGHT_SIDE); canvas->TileImageInt(*right, client_area_bounds.right(), client_area_top, right->width(), client_area_height); - - // Draw the toolbar color so that the client edges show the right color even - // where not covered by the toolbar image. - SkColor toolbar_color = tp->GetColor(BrowserThemeProvider::COLOR_TOOLBAR); - canvas->FillRectInt(toolbar_color, - client_area_bounds.x() - kClientEdgeThickness, client_area_top, - kClientEdgeThickness, - client_area_bottom + kClientEdgeThickness - client_area_top); - canvas->FillRectInt(toolbar_color, client_area_bounds.x(), client_area_bottom, - client_area_bounds.width(), kClientEdgeThickness); - canvas->FillRectInt(toolbar_color, client_area_bounds.right(), - client_area_top, kClientEdgeThickness, - client_area_bottom + kClientEdgeThickness - client_area_top); - canvas->DrawBitmapInt( *tp->GetBitmapNamed(IDR_CONTENT_BOTTOM_RIGHT_CORNER), client_area_bounds.right(), client_area_bottom); @@ -401,6 +391,21 @@ void GlassBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { SkBitmap* left = tp->GetBitmapNamed(IDR_CONTENT_LEFT_SIDE); canvas->TileImageInt(*left, client_area_bounds.x() - left->width(), client_area_top, left->width(), client_area_height); + + // Draw the toolbar color so that the client edges show the right color even + // where not covered by the toolbar image. NOTE: We do this after drawing the + // images because the images are meant to alpha-blend atop the frame whereas + // these rects are meant to be fully opaque, without anything overlaid. + SkColor toolbar_color = tp->GetColor(BrowserThemeProvider::COLOR_TOOLBAR); + canvas->FillRectInt(toolbar_color, + client_area_bounds.x() - kClientEdgeThickness, client_area_top, + kClientEdgeThickness, + client_area_bottom + kClientEdgeThickness - client_area_top); + canvas->FillRectInt(toolbar_color, client_area_bounds.x(), client_area_bottom, + client_area_bounds.width(), kClientEdgeThickness); + canvas->FillRectInt(toolbar_color, client_area_bounds.right(), + client_area_top, kClientEdgeThickness, + client_area_bottom + kClientEdgeThickness - client_area_top); } void GlassBrowserFrameView::LayoutOTRAvatar() { @@ -413,20 +418,20 @@ void GlassBrowserFrameView::LayoutOTRAvatar() { otr_x += width() - frame_->GetMinimizeButtonOffset(); SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon(); - int otr_height = browser_view_->IsTabStripVisible() ? - otr_avatar_icon.height() : 0; - int otr_y = 0; + int otr_bottom, otr_restored_y; if (browser_view_->UseVerticalTabs()) { - otr_y = NonClientTopBorderHeight() - otr_avatar_icon.height(); - } else if (browser_view_->IsTabStripVisible()) { - int top_height = NonClientTopBorderHeight(); - int tabstrip_height = + otr_bottom = NonClientTopBorderHeight(false, false) - kOTRBottomSpacing; + otr_restored_y = kFrameShadowThickness; + } else { + otr_bottom = GetHorizontalTabStripVerticalOffset(false) + browser_view_->GetTabStripHeight() - kOTRBottomSpacing; - otr_height = frame_->GetWindow()->IsMaximized() ? - (tabstrip_height - kOTRMaximizedTopSpacing) : otr_avatar_icon.height(); - otr_y = top_height + tabstrip_height - otr_height; + otr_restored_y = otr_bottom - otr_avatar_icon.height(); } - otr_avatar_bounds_.SetRect(otr_x, otr_y, otr_avatar_icon.width(), otr_height); + int otr_y = frame_->GetWindow()->IsMaximized() ? + (NonClientTopBorderHeight(false, true) + kTabstripTopShadowThickness) : + otr_restored_y; + otr_avatar_bounds_.SetRect(otr_x, otr_y, otr_avatar_icon.width(), + browser_view_->ShouldShowOffTheRecordAvatar() ? (otr_bottom - otr_y) : 0); } void GlassBrowserFrameView::LayoutClientView() { @@ -438,7 +443,7 @@ gfx::Rect GlassBrowserFrameView::CalculateClientAreaBounds(int width, if (!browser_view_->IsTabStripVisible()) return gfx::Rect(0, 0, this->width(), this->height()); - int top_height = NonClientTopBorderHeight(); + int top_height = NonClientTopBorderHeight(false, false); int border_thickness = NonClientBorderThickness(); return gfx::Rect(border_thickness, top_height, std::max(0, width - (2 * border_thickness)), diff --git a/chrome/browser/views/frame/glass_browser_frame_view.h b/chrome/browser/views/frame/glass_browser_frame_view.h index 363e73f..0a39da1 100644 --- a/chrome/browser/views/frame/glass_browser_frame_view.h +++ b/chrome/browser/views/frame/glass_browser_frame_view.h @@ -22,6 +22,7 @@ class GlassBrowserFrameView : public BrowserNonClientFrameView { // Overridden from BrowserNonClientFrameView: virtual gfx::Rect GetBoundsForTabStrip(BaseTabStrip* tabstrip) const; + virtual int GetHorizontalTabStripVerticalOffset(bool restored) const; virtual void UpdateThrobber(bool running); // Overridden from views::NonClientFrameView: @@ -49,8 +50,11 @@ class GlassBrowserFrameView : public BrowserNonClientFrameView { int NonClientBorderThickness() const; // Returns the height of the entire nonclient top border, including the window - // frame, any title area, and any connected client edge. - int NonClientTopBorderHeight() const; + // frame, any title area, and any connected client edge. If |restored| is + // true, acts as if the window is restored regardless of the real mode. If + // |ignore_vertical_tabs| is true, acts as if vertical tabs are off regardless + // of the real state. + int NonClientTopBorderHeight(bool restored, bool ignore_vertical_tabs) const; // Paint various sub-components of this view. void PaintToolbarBackground(gfx::Canvas* canvas); @@ -71,9 +75,6 @@ class GlassBrowserFrameView : public BrowserNonClientFrameView { // Displays the next throbber frame. void DisplayNextThrobberFrame(); - // The layout rect of the distributor logo, if visible. - gfx::Rect logo_bounds_; - // The layout rect of the OTR avatar icon, if visible. gfx::Rect otr_avatar_bounds_; diff --git a/chrome/browser/views/frame/opaque_browser_frame_view.cc b/chrome/browser/views/frame/opaque_browser_frame_view.cc index 80c2c0b..514a8c7 100644 --- a/chrome/browser/views/frame/opaque_browser_frame_view.cc +++ b/chrome/browser/views/frame/opaque_browser_frame_view.cc @@ -32,10 +32,6 @@ #include "views/window/hit_test.h" #endif -#if defined(OS_CHROMEOS) -const int kCustomFrameBackgroundVerticalOffset = 15; -#endif - 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. @@ -67,9 +63,6 @@ const int kIconMinimumSize = 16; const int kIconTitleSpacing = 4; // There is a 5 px gap between the title text and the caption buttons. const int kTitleLogoSpacing = 5; -// In maximized mode, the OTR avatar starts 2 px below the top of the screen, so -// that it doesn't extend into the "3D edge" portion of the titlebar. -const int kOTRMaximizedTopSpacing = 2; // The OTR 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). @@ -91,8 +84,6 @@ const int kNewTabCaptionMaximizedSpacing = 16; // How far to indent the tabstrip from the left side of the screen when there // is no OTR icon. const int kTabStripIndent = 1; -// Padding between the caption and start of vertical tabs. -const int kVerticalTabPadding = 6; // Inset from the top of the toolbar/tabstrip to the shadow. Used only for // vertical tabs. const int kVerticalTabBorderInset = 3; @@ -104,7 +95,6 @@ const int kVerticalTabBorderInset = 3; OpaqueBrowserFrameView::OpaqueBrowserFrameView(BrowserFrame* frame, BrowserView* browser_view) : BrowserNonClientFrameView(), - otr_avatar_icon_(new views::ImageView()), ALLOW_THIS_IN_INITIALIZER_LIST( minimize_button_(new views::ImageButton(this))), ALLOW_THIS_IN_INITIALIZER_LIST( @@ -174,8 +164,6 @@ OpaqueBrowserFrameView::OpaqueBrowserFrameView(BrowserFrame* frame, close_button_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_CLOSE)); AddChildView(close_button_); - otr_avatar_icon_->SetImage(browser_view_->GetOTRAvatarIcon()); - AddChildView(otr_avatar_icon_); // Initializing the TabIconView is expensive, so only do it if we need to. if (browser_view_->ShouldShowWindowIcon()) { window_icon_ = new TabIconView(this); @@ -195,26 +183,30 @@ gfx::Rect OpaqueBrowserFrameView::GetBoundsForTabStrip( BaseTabStrip* tabstrip) const { if (browser_view_->UseVerticalTabs()) { gfx::Size ps = tabstrip->GetPreferredSize(); - return gfx::Rect(NonClientBorderThickness(), NonClientTopBorderHeight(), - ps.width(), browser_view_->height()); + return gfx::Rect(NonClientBorderThickness(), + NonClientTopBorderHeight(false, false), ps.width(), + browser_view_->height()); } - int tabstrip_y = NonClientTopBorderHeight(); - if (!frame_->GetWindow()->IsMaximized() && - !frame_->GetWindow()->IsFullscreen()) - tabstrip_y += kNonClientRestoredExtraThickness; - int tabstrip_x = browser_view_->ShouldShowOffTheRecordAvatar() ? - (otr_avatar_icon_->bounds().right() + kOTRSideSpacing) : + (otr_avatar_bounds_.right() + kOTRSideSpacing) : NonClientBorderThickness() + kTabStripIndent; int tabstrip_width = minimize_button_->x() - tabstrip_x - (frame_->GetWindow()->IsMaximized() ? kNewTabCaptionMaximizedSpacing : kNewTabCaptionRestoredSpacing); - return gfx::Rect(tabstrip_x, tabstrip_y, + return gfx::Rect(tabstrip_x, GetHorizontalTabStripVerticalOffset(false), std::max(0, tabstrip_width), tabstrip->GetPreferredHeight()); } +int OpaqueBrowserFrameView::GetHorizontalTabStripVerticalOffset( + bool restored) const { + return NonClientTopBorderHeight(restored, true) + ((!restored && + (frame_->GetWindow()->IsMaximized() || + frame_->GetWindow()->IsFullscreen())) ? + 0 : kNonClientRestoredExtraThickness); +} + void OpaqueBrowserFrameView::UpdateThrobber(bool running) { if (window_icon_) window_icon_->Update(); @@ -224,10 +216,11 @@ gfx::Size OpaqueBrowserFrameView::GetMinimumSize() { gfx::Size min_size(browser_view_->GetMinimumSize()); int border_thickness = NonClientBorderThickness(); min_size.Enlarge(2 * border_thickness, - NonClientTopBorderHeight() + border_thickness); + NonClientTopBorderHeight(false, false) + border_thickness); views::WindowDelegate* d = frame_->GetWindow()->GetDelegate(); - int min_titlebar_width = (2 * FrameBorderThickness()) + kIconLeftSpacing + + int min_titlebar_width = (2 * FrameBorderThickness(false)) + + kIconLeftSpacing + (d->ShouldShowWindowIcon() ? (IconSize() + kTitleLogoSpacing) : 0); #if !defined(OS_CHROMEOS) min_titlebar_width += @@ -256,7 +249,7 @@ bool OpaqueBrowserFrameView::AlwaysUseCustomFrame() const { gfx::Rect OpaqueBrowserFrameView::GetWindowBoundsForClientBounds( const gfx::Rect& client_bounds) const { - int top_height = NonClientTopBorderHeight(); + int top_height = NonClientTopBorderHeight(false, false); int border_thickness = NonClientBorderThickness(); return gfx::Rect(std::max(0, client_bounds.x() - border_thickness), std::max(0, client_bounds.y() - top_height), @@ -345,34 +338,12 @@ void OpaqueBrowserFrameView::Paint(gfx::Canvas* canvas) { PaintTitleBar(canvas); if (browser_view_->IsToolbarVisible()) PaintToolbarBackground(canvas); + if (browser_view_->ShouldShowOffTheRecordAvatar()) + PaintOTRAvatar(canvas); if (!window->IsMaximized()) PaintRestoredClientEdge(canvas); } -void OpaqueBrowserFrameView::PaintChildren(gfx::Canvas* canvas) { - if (!browser_view_->UseVerticalTabs() || !otr_avatar_icon_->IsVisible()) { - View::PaintChildren(canvas); - return; - } - - // The otr icon is clipped for side tabs. - for (int i = 0, count = GetChildViewCount(); i < count; ++i) { - View* child = GetChildViewAt(i); - if (!child) { - NOTREACHED() << "Should not have a NULL child View for index in bounds"; - continue; - } - if (child == otr_avatar_icon_) { - canvas->Save(); - canvas->ClipRectInt(0, 2, width(), otr_avatar_icon_->height() - 10); - child->ProcessPaint(canvas); - canvas->Restore(); - } else { - child->ProcessPaint(canvas); - } - } -} - void OpaqueBrowserFrameView::Layout() { LayoutWindowControls(); LayoutTitleBar(); @@ -447,56 +418,52 @@ SkBitmap OpaqueBrowserFrameView::GetFavIconForTabIconView() { /////////////////////////////////////////////////////////////////////////////// // OpaqueBrowserFrameView, private: -int OpaqueBrowserFrameView::FrameBorderThickness() const { +int OpaqueBrowserFrameView::FrameBorderThickness(bool restored) const { views::Window* window = frame_->GetWindow(); - return (window->IsMaximized() || window->IsFullscreen()) ? + return (!restored && (window->IsMaximized() || window->IsFullscreen())) ? 0 : kFrameBorderThickness; } int OpaqueBrowserFrameView::TopResizeHeight() const { - return FrameBorderThickness() - kTopResizeAdjust; + return FrameBorderThickness(false) - kTopResizeAdjust; } int OpaqueBrowserFrameView::NonClientBorderThickness() const { // When we fill the screen, we don't show a client edge. views::Window* window = frame_->GetWindow(); - return FrameBorderThickness() + + return FrameBorderThickness(false) + ((window->IsMaximized() || window->IsFullscreen()) ? 0 : kClientEdgeThickness); } -int OpaqueBrowserFrameView::NonClientTopBorderHeight() const { +int OpaqueBrowserFrameView::NonClientTopBorderHeight( + bool restored, + bool ignore_vertical_tabs) const { views::Window* window = frame_->GetWindow(); - if (window->GetDelegate()->ShouldShowWindowTitle()) { - return std::max(FrameBorderThickness() + IconSize(), - CaptionButtonY() + kCaptionButtonHeightWithPadding) + - TitlebarBottomThickness(); - } - - if (browser_view_->IsTabStripVisible() && browser_view_->UseVerticalTabs()) { - return CaptionButtonY() + minimize_button_->GetPreferredSize().height() + - kVerticalTabPadding; + if (window->GetDelegate()->ShouldShowWindowTitle() || + (browser_view_->IsTabStripVisible() && !ignore_vertical_tabs && + browser_view_->UseVerticalTabs())) { + return std::max(FrameBorderThickness(restored) + IconSize(), + CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) + + TitlebarBottomThickness(restored); } - return FrameBorderThickness() - - ((browser_view_->IsTabStripVisible() && window->IsMaximized()) ? - kTabstripTopShadowThickness : 0); + return FrameBorderThickness(restored) - + ((browser_view_->IsTabStripVisible() && !restored && + window->IsMaximized()) ? kTabstripTopShadowThickness : 0); } -int OpaqueBrowserFrameView::CaptionButtonY() const { +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 frame_->GetWindow()->IsMaximized() ? - FrameBorderThickness() : kFrameShadowThickness; + return (!restored && frame_->GetWindow()->IsMaximized()) ? + FrameBorderThickness(false) : kFrameShadowThickness; } -int OpaqueBrowserFrameView::TitlebarBottomThickness() const { - // When a toolbar is edging the titlebar, it draws its own bottom edge. - if (browser_view_->IsToolbarVisible()) - return 0; - +int OpaqueBrowserFrameView::TitlebarBottomThickness(bool restored) const { return kTitlebarTopAndBottomEdgeThickness + - (frame_->GetWindow()->IsMaximized() ? 0 : kClientEdgeThickness); + ((!restored && frame_->GetWindow()->IsMaximized()) ? + 0 : kClientEdgeThickness); } int OpaqueBrowserFrameView::IconSize() const { @@ -511,7 +478,7 @@ int OpaqueBrowserFrameView::IconSize() const { gfx::Rect OpaqueBrowserFrameView::IconBounds() const { int size = IconSize(); - int frame_thickness = FrameBorderThickness(); + int frame_thickness = FrameBorderThickness(false); int y; views::WindowDelegate* d = frame_->GetWindow()->GetDelegate(); if (d->ShouldShowWindowIcon() || d->ShouldShowWindowTitle()) { @@ -531,8 +498,8 @@ gfx::Rect OpaqueBrowserFrameView::IconBounds() const { // 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() - - unavailable_px_at_top - size - TitlebarBottomThickness() + 1) / 2; + y = unavailable_px_at_top + (NonClientTopBorderHeight(false, 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. @@ -665,7 +632,6 @@ void OpaqueBrowserFrameView::PaintMaximizedFrameBorder(gfx::Canvas* canvas) { // Window frame mode and color SkBitmap* theme_frame; - int y = 0; // Never theme app and popup windows. if (!browser_view_->IsBrowserTypeNormal()) { ResourceBundle& rb = ResourceBundle::GetSharedInstance(); @@ -674,30 +640,24 @@ void OpaqueBrowserFrameView::PaintMaximizedFrameBorder(gfx::Canvas* canvas) { } else if (!browser_view_->IsOffTheRecord()) { theme_frame = tp->GetBitmapNamed(ShouldPaintAsActive() ? IDR_THEME_FRAME : IDR_THEME_FRAME_INACTIVE); -#if defined(OS_CHROMEOS) - // TODO:(oshima): gtk based CHROMEOS is using non custom frame - // mode which does this adjustment. This should be removed - // once it's fully migrated to views. -1 is due to the layout - // difference between views and gtk and will be removed. - // See http://crbug.com/28580. - y = -kCustomFrameBackgroundVerticalOffset - 1; -#endif } else { theme_frame = tp->GetBitmapNamed(ShouldPaintAsActive() ? IDR_THEME_FRAME_INCOGNITO : IDR_THEME_FRAME_INCOGNITO_INACTIVE); -#if defined(OS_CHROMEOS) - y = -kCustomFrameBackgroundVerticalOffset - 1; -#endif } - // Draw the theme frame. - canvas->TileImageInt(*theme_frame, 0, y, width(), theme_frame->height()); + // Draw the theme frame. It must be aligned with the tabstrip as if we were + // in restored mode. Note that the top of the tabstrip is + // kTabstripTopShadowThickness px off the top of the screen. + int theme_background_y = -(GetHorizontalTabStripVerticalOffset(true) + + kTabstripTopShadowThickness); + canvas->TileImageInt(*theme_frame, 0, theme_background_y, width(), + theme_frame->height()); // Draw the theme frame overlay if (tp->HasCustomImage(IDR_THEME_FRAME_OVERLAY) && browser_view_->IsBrowserTypeNormal()) { SkBitmap* theme_overlay = tp->GetBitmapNamed(ShouldPaintAsActive() ? IDR_THEME_FRAME_OVERLAY : IDR_THEME_FRAME_OVERLAY_INACTIVE); - canvas->DrawBitmapInt(*theme_overlay, 0, 0); + canvas->DrawBitmapInt(*theme_overlay, 0, theme_background_y); } if (!browser_view_->IsToolbarVisible()) { @@ -729,20 +689,22 @@ void OpaqueBrowserFrameView::PaintTitleBar(gfx::Canvas* canvas) { } void OpaqueBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { - gfx::Rect toolbar_bounds = GetViewBounds(browser_view_->toolbar(), this); + gfx::Rect toolbar_bounds(browser_view_->GetToolbarBounds()); if (toolbar_bounds.IsEmpty()) return; + gfx::Point toolbar_origin(toolbar_bounds.origin()); + ConvertPointToView(browser_view_, this, &toolbar_origin); + toolbar_bounds.set_origin(toolbar_origin); - int x, y, w, h; + int x = toolbar_bounds.x(); + int w = toolbar_bounds.width(); + int y, h; if (browser_view_->UseVerticalTabs()) { - gfx::Rect tabstrip_bounds = GetViewBounds(browser_view_->tabstrip(), this); - x = tabstrip_bounds.x(); - w = toolbar_bounds.right() - x; - y = tabstrip_bounds.y() - kVerticalTabBorderInset; + gfx::Point tabstrip_origin(browser_view_->tabstrip()->bounds().origin()); + ConvertPointToView(browser_view_, this, &tabstrip_origin); + y = tabstrip_origin.y() - kVerticalTabBorderInset; h = toolbar_bounds.bottom() - y; } else { - x = toolbar_bounds.x(); - w = toolbar_bounds.width(); y = toolbar_bounds.y(); h = toolbar_bounds.bottom(); } @@ -768,11 +730,12 @@ void OpaqueBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { tp->GetColor(BrowserThemeProvider::COLOR_TOOLBAR); canvas->FillRectInt(theme_toolbar_color, x, bottom_y, w, bottom_edge_height); + // Tile the toolbar image starting at the frame edge on the left and where the + // horizontal tabstrip is (or would be) on the top. SkBitmap* theme_toolbar = tp->GetBitmapNamed(IDR_THEME_TOOLBAR); - int strip_height = browser_view_->GetTabStripHeight(); - canvas->TileImageInt(*theme_toolbar, x - kClientEdgeThickness, - strip_height - kFrameShadowThickness, x - kClientEdgeThickness, bottom_y, - w + (2 * kClientEdgeThickness), theme_toolbar->height()); + canvas->TileImageInt(*theme_toolbar, x, + bottom_y - GetHorizontalTabStripVerticalOffset(false), x, + bottom_y, w, theme_toolbar->height()); // Draw rounded corners for the tab. SkBitmap* toolbar_left_mask = @@ -797,8 +760,8 @@ void OpaqueBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { toolbar_left_mask->width(), bottom_edge_height, false, paint); // Mask the right edge. - int right_x = x + w - toolbar_right_mask->width() + kClientEdgeThickness + - kContentEdgeShadowThickness; + int right_x = + x + w - toolbar_right_mask->width() + kContentEdgeShadowThickness; canvas->DrawBitmapInt(*toolbar_right_mask, 0, 0, toolbar_right_mask->width(), split_point, right_x, y, toolbar_right_mask->width(), split_point, false, paint); @@ -831,26 +794,52 @@ void OpaqueBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { // Draw the content/toolbar separator. canvas->FillRectInt(ResourceBundle::toolbar_separator_color, - toolbar_bounds.x(), toolbar_bounds.bottom() - kClientEdgeThickness, - toolbar_bounds.width(), kClientEdgeThickness); + x + kClientEdgeThickness, toolbar_bounds.bottom() - kClientEdgeThickness, + w - (2 * kClientEdgeThickness), kClientEdgeThickness); +} + +void OpaqueBrowserFrameView::PaintOTRAvatar(gfx::Canvas* canvas) { + // In RTL mode, the avatar icon should be looking the opposite direction. + canvas->Save(); + if (base::i18n::IsRTL()) { + canvas->TranslateInt(width(), 0); + canvas->ScaleInt(-1, 1); + } + + SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon(); + int w = otr_avatar_bounds_.width(); + int h = otr_avatar_bounds_.height(); + canvas->DrawBitmapInt(otr_avatar_icon, 0, + // Bias the rounding to select a region that's lower rather than higher, + // as the shadows at the image top mean the apparent center is below the + // real center. + ((otr_avatar_icon.height() - otr_avatar_bounds_.height()) + 1) / 2, w, h, + otr_avatar_bounds_.x(), otr_avatar_bounds_.y(), w, h, false); + + canvas->Restore(); } void OpaqueBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { ThemeProvider* tp = GetThemeProvider(); int client_area_top = frame_->GetWindow()->GetClientView()->y(); + int image_top = client_area_top; gfx::Rect client_area_bounds = CalculateClientAreaBounds(width(), height()); SkColor toolbar_color = tp->GetColor(BrowserThemeProvider::COLOR_TOOLBAR); if (browser_view_->IsToolbarVisible()) { - // The client edges start below the toolbar or its corner images, whichever - // is shorter. + // The client edge images always start below the toolbar corner images. The + // client edge filled rects start there or at the bottom of the tooolbar, + // whichever is shorter. gfx::Rect toolbar_bounds(browser_view_->GetToolbarBounds()); - client_area_top += browser_view_->GetToolbarBounds().y() + - std::min(tp->GetBitmapNamed(IDR_CONTENT_TOP_LEFT_CORNER)->height(), - toolbar_bounds.height()); - if (browser_view_->UseVerticalTabs()) + image_top += toolbar_bounds.y() + + tp->GetBitmapNamed(IDR_CONTENT_TOP_LEFT_CORNER)->height(); + client_area_top = std::min(image_top, + client_area_top + toolbar_bounds.bottom() - kClientEdgeThickness); + if (browser_view_->UseVerticalTabs()) { client_area_top -= kVerticalTabBorderInset; + image_top -= kVerticalTabBorderInset; + } } else if (!browser_view_->IsTabStripVisible()) { // The toolbar isn't going to draw a client edge for us, so draw one // ourselves. @@ -879,24 +868,13 @@ void OpaqueBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { int client_area_bottom = std::max(client_area_top, height() - NonClientBorderThickness()); - int client_area_height = client_area_bottom - client_area_top; - - // Draw the toolbar color so that the client edges show the right color even - // where not covered by the toolbar image. - canvas->FillRectInt(toolbar_color, - client_area_bounds.x() - kClientEdgeThickness, client_area_top, - kClientEdgeThickness, - client_area_bottom + kClientEdgeThickness - client_area_top); - canvas->FillRectInt(toolbar_color, client_area_bounds.x(), client_area_bottom, - client_area_bounds.width(), kClientEdgeThickness); - canvas->FillRectInt(toolbar_color, client_area_bounds.right(), - client_area_top, kClientEdgeThickness, - client_area_bottom + kClientEdgeThickness - client_area_top); + int image_height = client_area_bottom - image_top; // Draw the client edge images. + // Draw the client edge images. SkBitmap* right = tp->GetBitmapNamed(IDR_CONTENT_RIGHT_SIDE); - canvas->TileImageInt(*right, client_area_bounds.right(), client_area_top, - right->width(), client_area_height); + canvas->TileImageInt(*right, client_area_bounds.right(), image_top, + right->width(), image_height); canvas->DrawBitmapInt( *tp->GetBitmapNamed(IDR_CONTENT_BOTTOM_RIGHT_CORNER), client_area_bounds.right(), client_area_bottom); @@ -910,21 +888,35 @@ void OpaqueBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { client_area_bounds.x() - bottom_left->width(), client_area_bottom); SkBitmap* left = tp->GetBitmapNamed(IDR_CONTENT_LEFT_SIDE); canvas->TileImageInt(*left, client_area_bounds.x() - left->width(), - client_area_top, left->width(), client_area_height); + image_top, left->width(), image_height); + + // Draw the toolbar color so that the client edges show the right color even + // where not covered by the toolbar image. NOTE: We do this after drawing the + // images because the images are meant to alpha-blend atop the frame whereas + // these rects are meant to be fully opaque, without anything overlaid. + canvas->FillRectInt(toolbar_color, + client_area_bounds.x() - kClientEdgeThickness, client_area_top, + kClientEdgeThickness, + client_area_bottom + kClientEdgeThickness - client_area_top); + canvas->FillRectInt(toolbar_color, client_area_bounds.x(), client_area_bottom, + client_area_bounds.width(), kClientEdgeThickness); + canvas->FillRectInt(toolbar_color, client_area_bounds.right(), + client_area_top, kClientEdgeThickness, + client_area_bottom + kClientEdgeThickness - client_area_top); } void OpaqueBrowserFrameView::LayoutWindowControls() { bool is_maximized = frame_->GetWindow()->IsMaximized(); close_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, views::ImageButton::ALIGN_BOTTOM); - int caption_y = CaptionButtonY(); + 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() - + 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()); @@ -944,9 +936,8 @@ void OpaqueBrowserFrameView::LayoutWindowControls() { // other places that rely on the bounds. Put it slightly to the right // of the edge of the view, so that when we remove the spacing it lines // up with the edge. - minimize_button_->SetBounds( - width() - FrameBorderThickness() + kNewTabCaptionMaximizedSpacing, - 0, 0, 0); + minimize_button_->SetBounds(width() - FrameBorderThickness(false) + + kNewTabCaptionMaximizedSpacing, 0, 0, 0); } return; @@ -1008,50 +999,29 @@ void OpaqueBrowserFrameView::LayoutTitleBar() { } void OpaqueBrowserFrameView::LayoutOTRAvatar() { - int otr_y = NonClientTopBorderHeight(); - if (!frame_->GetWindow()->IsMaximized() && - !frame_->GetWindow()->IsFullscreen()) { - otr_y += kNonClientRestoredExtraThickness; - } - bool visible = browser_view_->ShouldShowOffTheRecordAvatar(); - gfx::Size preferred_size = otr_avatar_icon_->GetPreferredSize(); - int otr_height = 0; - if (browser_view_->IsTabStripVisible()) { - if (browser_view_->UseVerticalTabs()) { - otr_height = preferred_size.height(); - otr_y = -2; - } else { - int tabstrip_height = - browser_view_->GetTabStripHeight() - kOTRBottomSpacing; - otr_height = frame_->GetWindow()->IsMaximized() ? - (tabstrip_height - kOTRMaximizedTopSpacing) : - preferred_size.height(); - otr_y += tabstrip_height - otr_height; - } + SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon(); + int otr_bottom, otr_restored_y; + if (browser_view_->UseVerticalTabs()) { + otr_bottom = NonClientTopBorderHeight(false, false) - kOTRBottomSpacing; + otr_restored_y = kFrameShadowThickness; } else { - visible = false; + otr_bottom = GetHorizontalTabStripVerticalOffset(false) + + browser_view_->GetTabStripHeight() - kOTRBottomSpacing; + otr_restored_y = otr_bottom - otr_avatar_icon.height(); } - otr_avatar_icon_->SetVisible(visible); - otr_avatar_icon_->SetBounds(NonClientBorderThickness() + kOTRSideSpacing, - otr_y, preferred_size.width(), otr_height); + int otr_y = frame_->GetWindow()->IsMaximized() ? + (NonClientTopBorderHeight(false, true) + kTabstripTopShadowThickness) : + otr_restored_y; + otr_avatar_bounds_.SetRect(NonClientBorderThickness() + kOTRSideSpacing, + otr_y, otr_avatar_icon.width(), + browser_view_->ShouldShowOffTheRecordAvatar() ? (otr_bottom - otr_y) : 0); } gfx::Rect OpaqueBrowserFrameView::CalculateClientAreaBounds(int width, int height) const { - int top_height = NonClientTopBorderHeight(); + int top_height = NonClientTopBorderHeight(false, false); int border_thickness = NonClientBorderThickness(); return gfx::Rect(border_thickness, top_height, std::max(0, width - (2 * border_thickness)), std::max(0, height - top_height - border_thickness)); } - -// static -gfx::Rect OpaqueBrowserFrameView::GetViewBounds(views::View* src, - views::View* dst) { - gfx::Rect bounds(src->bounds()); - - gfx::Point origin_in_dst(bounds.origin()); - View::ConvertPointToView(src->GetParent(), dst, &origin_in_dst); - bounds.set_origin(origin_in_dst); - return bounds; -} diff --git a/chrome/browser/views/frame/opaque_browser_frame_view.h b/chrome/browser/views/frame/opaque_browser_frame_view.h index a2e6543..452c14e 100644 --- a/chrome/browser/views/frame/opaque_browser_frame_view.h +++ b/chrome/browser/views/frame/opaque_browser_frame_view.h @@ -33,6 +33,7 @@ class OpaqueBrowserFrameView : public BrowserNonClientFrameView, // Overridden from BrowserNonClientFrameView: virtual gfx::Rect GetBoundsForTabStrip(BaseTabStrip* tabstrip) const; + virtual int GetHorizontalTabStripVerticalOffset(bool restored) const; virtual void UpdateThrobber(bool running); virtual gfx::Size GetMinimumSize(); @@ -50,7 +51,6 @@ class OpaqueBrowserFrameView : public BrowserNonClientFrameView, // Overridden from views::View: virtual void Paint(gfx::Canvas* canvas); - virtual void PaintChildren(gfx::Canvas* canvas); virtual void Layout(); virtual bool HitTest(const gfx::Point& l) const; virtual bool GetAccessibleRole(AccessibilityTypes::Role* role); @@ -64,8 +64,9 @@ class OpaqueBrowserFrameView : public BrowserNonClientFrameView, private: // Returns the thickness of the border that makes up the window frame edges. - // This does not include any client edge. - int FrameBorderThickness() const; + // This does not include any client edge. If |restored| is true, acts as if + // the window is restored regardless of the real mode. + int FrameBorderThickness(bool restored) const; // Returns the height of the top resize area. This is smaller than the frame // border height in order to increase the window draggable area. @@ -76,15 +77,20 @@ class OpaqueBrowserFrameView : public BrowserNonClientFrameView, int NonClientBorderThickness() const; // Returns the height of the entire nonclient top border, including the window - // frame, any title area, and any connected client edge. - int NonClientTopBorderHeight() const; + // frame, any title area, and any connected client edge. If |restored| is + // true, acts as if the window is restored regardless of the real mode. If + // |ignore_vertical_tabs| is true, acts as if vertical tabs are off regardless + // of the real state. + int NonClientTopBorderHeight(bool restored, bool ignore_vertical_tabs) const; - // Returns the y-coordinate of the caption buttons. - int CaptionButtonY() const; + // Returns the y-coordinate of the caption buttons. If |restored| is true, + // acts as if the window is restored regardless of the real mode. + int CaptionButtonY(bool restored) const; - // Returns the thickness of the nonclient portion of the 3D edge along the - // bottom of the titlebar. - int TitlebarBottomThickness() const; + // Returns the thickness of the 3D edge along the bottom of the titlebar. If + // |restored| is true, acts as if the window is restored regardless of the + // real mode. + int TitlebarBottomThickness(bool restored) const; // Returns the size of the titlebar icon. This is used even when the icon is // not shown, e.g. to set the titlebar height. @@ -101,6 +107,7 @@ class OpaqueBrowserFrameView : public BrowserNonClientFrameView, void PaintMaximizedFrameBorder(gfx::Canvas* canvas); void PaintTitleBar(gfx::Canvas* canvas); void PaintToolbarBackground(gfx::Canvas* canvas); + void PaintOTRAvatar(gfx::Canvas* canvas); void PaintRestoredClientEdge(gfx::Canvas* canvas); // Layout various sub-components of this view. @@ -111,15 +118,11 @@ class OpaqueBrowserFrameView : public BrowserNonClientFrameView, // Returns the bounds of the client area for the specified view size. gfx::Rect CalculateClientAreaBounds(int width, int height) const; - // Returns the bounds of |src| in the coordinate system of |dst|. - // TODO(sky): promote this to view. - static gfx::Rect GetViewBounds(views::View* src, views::View* dst); - // The layout rect of the title, if visible. gfx::Rect title_bounds_; - // Off the record avatar icon. - views::ImageView* otr_avatar_icon_; + // The layout rect of the OTR avatar icon, if visible. + gfx::Rect otr_avatar_bounds_; // Window controls. views::ImageButton* minimize_button_; diff --git a/chrome/browser/views/frame/popup_non_client_frame_view.cc b/chrome/browser/views/frame/popup_non_client_frame_view.cc index 5d16079..d3b4d96 100644 --- a/chrome/browser/views/frame/popup_non_client_frame_view.cc +++ b/chrome/browser/views/frame/popup_non_client_frame_view.cc @@ -50,5 +50,10 @@ gfx::Rect PopupNonClientFrameView::GetBoundsForTabStrip( return gfx::Rect(0, 0, width(), tabstrip->GetPreferredHeight()); } +int PopupNonClientFrameView::GetHorizontalTabStripVerticalOffset( + bool restored) const { + return 0; +} + void PopupNonClientFrameView::UpdateThrobber(bool running) { } diff --git a/chrome/browser/views/frame/popup_non_client_frame_view.h b/chrome/browser/views/frame/popup_non_client_frame_view.h index e403bf3..12982c9 100644 --- a/chrome/browser/views/frame/popup_non_client_frame_view.h +++ b/chrome/browser/views/frame/popup_non_client_frame_view.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -30,6 +30,7 @@ class PopupNonClientFrameView : public BrowserNonClientFrameView { // BrowserNonClientFrameView: virtual gfx::Rect GetBoundsForTabStrip(BaseTabStrip* tabstrip) const; + virtual int GetHorizontalTabStripVerticalOffset(bool restored) const; virtual void UpdateThrobber(bool running); private: |