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 a7b7c34c4555eb778deaca1d35f180c556514ba6..4e3ef0d5629765d9ed123fd40934be1d04165493 100644 |
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc |
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc |
@@ -42,6 +42,7 @@ |
#include "ui/gfx/path.h" |
#include "ui/views/controls/button/image_button.h" |
#include "ui/views/controls/image_view.h" |
+#include "ui/views/controls/label.h" |
#include "ui/views/widget/root_view.h" |
#include "ui/views/window/frame_background.h" |
#include "ui/views/window/window_shape.h" |
@@ -139,6 +140,7 @@ OpaqueBrowserFrameView::OpaqueBrowserFrameView(BrowserFrame* frame, |
restore_button_(NULL), |
close_button_(NULL), |
window_icon_(NULL), |
+ window_title_(NULL), |
frame_background_(new views::FrameBackground()) { |
if (ShouldAddDefaultCaptionButtons()) { |
minimize_button_ = InitWindowCaptionButton(IDR_MINIMIZE, |
@@ -171,6 +173,17 @@ OpaqueBrowserFrameView::OpaqueBrowserFrameView(BrowserFrame* frame, |
window_icon_->Update(); |
} |
+ window_title_ = new views::Label(browser_view->GetWindowTitle(), |
+ BrowserFrame::GetTitleFont()); |
+ window_title_->SetVisible(browser_view->ShouldShowWindowTitle()); |
+ window_title_->SetEnabledColor(SK_ColorWHITE); |
+ // TODO(msw): Use a transparent background color as a workaround to use the |
+ // gfx::Canvas::NO_SUBPIXEL_RENDERING flag and avoid some visual artifacts. |
+ window_title_->SetBackgroundColor(0x00000000); |
+ window_title_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
+ window_title_->SetElideBehavior(views::Label::ELIDE_AT_END); |
+ AddChildView(window_title_); |
+ |
UpdateAvatarInfo(); |
if (!browser_view->IsOffTheRecord()) { |
registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
@@ -388,7 +401,15 @@ void OpaqueBrowserFrameView::OnPaint(gfx::Canvas* canvas) { |
PaintMaximizedFrameBorder(canvas); |
else |
PaintRestoredFrameBorder(canvas); |
- PaintTitleBar(canvas); |
+ |
+ // The window icon and title are painted by their respective views. |
+ /* TODO(pkasting): If this window is active, we should also draw a drop |
+ * shadow on the title. This is tricky, because we don't want to hardcode a |
+ * shadow color (since we want to work with various themes), but we can't |
+ * alpha-blend either (since the Windows text APIs don't really do this). |
+ * So we'd need to sample the background color at the right location and |
+ * synthesize a good shadow color. */ |
+ |
if (browser_view()->IsToolbarVisible()) |
PaintToolbarBackground(canvas); |
if (!frame()->IsMaximized()) |
@@ -659,27 +680,6 @@ void OpaqueBrowserFrameView::PaintMaximizedFrameBorder(gfx::Canvas* canvas) { |
} |
} |
-void OpaqueBrowserFrameView::PaintTitleBar(gfx::Canvas* canvas) { |
- // The window icon is painted by the TabIconView. |
- views::WidgetDelegate* delegate = frame()->widget_delegate(); |
- if (!delegate) { |
- LOG(WARNING) << "delegate is NULL"; |
- return; |
- } |
- if (delegate->ShouldShowWindowTitle()) { |
- canvas->DrawStringInt(delegate->GetWindowTitle(), |
- BrowserFrame::GetTitleFont(), |
- SK_ColorWHITE, GetMirroredXForRect(title_bounds_), |
- title_bounds_.y(), title_bounds_.width(), title_bounds_.height()); |
- /* TODO(pkasting): If this window is active, we should also draw a drop |
- * shadow on the title. This is tricky, because we don't want to hardcode a |
- * shadow color (since we want to work with various themes), but we can't |
- * alpha-blend either (since the Windows text APIs don't really do this). |
- * So we'd need to sample the background color at the right location and |
- * synthesize a good shadow color. */ |
- } |
-} |
- |
void OpaqueBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { |
gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds()); |
if (toolbar_bounds.IsEmpty()) |
@@ -1001,27 +1001,19 @@ void OpaqueBrowserFrameView::LayoutWindowControls() { |
} |
void OpaqueBrowserFrameView::LayoutTitleBar() { |
- // The window title is based on the calculated icon position, even when there |
- // is no icon. |
- gfx::Rect icon_bounds(IconBounds()); |
- views::WidgetDelegate* delegate = frame()->widget_delegate(); |
- if (delegate && delegate->ShouldShowWindowIcon()) |
- window_icon_->SetBoundsRect(icon_bounds); |
- |
- // Size the title, if visible. |
- if (delegate && delegate->ShouldShowWindowTitle()) { |
- int title_x = delegate->ShouldShowWindowIcon() ? |
+ 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()); |
+ window_title_->SetText(delegate->GetWindowTitle()); |
+ const int title_x = delegate->ShouldShowWindowIcon() ? |
icon_bounds.right() + kIconTitleSpacing : icon_bounds.x(); |
- int title_height = BrowserFrame::GetTitleFont().GetHeight(); |
- // We bias the title position so that when the difference between the icon |
- // and title heights is odd, the extra pixel of the title is above the |
- // vertical midline rather than below. This compensates for how the icon is |
- // already biased downwards (see IconBounds()) and helps prevent descenders |
- // on the title from overlapping the 3D edge at the bottom of the titlebar. |
- title_bounds_.SetRect(title_x, |
- icon_bounds.y() + ((icon_bounds.height() - title_height - 1) / 2), |
+ window_title_->SetBounds(title_x, icon_bounds.y(), |
std::max(0, minimize_button_->x() - kTitleLogoSpacing - title_x), |
- title_height); |
+ icon_bounds.height()); |
} |
} |