Index: chrome/browser/views/constrained_window_impl.cc |
=================================================================== |
--- chrome/browser/views/constrained_window_impl.cc (revision 10688) |
+++ chrome/browser/views/constrained_window_impl.cc (working copy) |
@@ -184,22 +184,22 @@ |
SkBitmap* OTRWindowResources::bitmaps_[]; |
//////////////////////////////////////////////////////////////////////////////// |
-// ConstrainedWindowNonClientView |
+// ConstrainedWindowFrameView |
-class ConstrainedWindowNonClientView |
- : public views::NonClientView, |
+class ConstrainedWindowFrameView |
+ : public views::NonClientFrameView, |
public views::BaseButton::ButtonListener { |
public: |
- ConstrainedWindowNonClientView(ConstrainedWindowImpl* container, |
- TabContents* owner); |
- virtual ~ConstrainedWindowNonClientView(); |
+ explicit ConstrainedWindowFrameView(ConstrainedWindowImpl* container); |
+ virtual ~ConstrainedWindowFrameView(); |
void UpdateWindowTitle(); |
- // Overridden from views::NonClientView: |
- virtual gfx::Rect CalculateClientAreaBounds(int width, int height) const; |
- virtual gfx::Size CalculateWindowSizeForClientSize(int width, |
- int height) const; |
+ // Overridden from views::NonClientFrameView: |
+ virtual gfx::Rect GetBoundsForClientView() const; |
+ virtual bool AlwaysUseCustomFrame() const; |
+ virtual gfx::Rect GetWindowBoundsForClientBounds( |
+ const gfx::Rect& client_bounds) const; |
virtual gfx::Point GetSystemMenuPoint() const; |
virtual int NonClientHitTest(const gfx::Point& point); |
virtual void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask); |
@@ -209,7 +209,7 @@ |
// Overridden from views::View: |
virtual void Paint(ChromeCanvas* canvas); |
virtual void Layout(); |
- virtual void ViewHierarchyChanged(bool is_add, View *parent, View *child); |
+ virtual void ThemeChanged(); |
// Overridden from views::BaseButton::ButtonListener: |
virtual void ButtonPressed(views::BaseButton* sender); |
@@ -242,11 +242,17 @@ |
void LayoutTitleBar(); |
void LayoutClientView(); |
+ // Returns the bounds of the client area for the specified view size. |
+ gfx::Rect CalculateClientAreaBounds(int width, int height) const; |
+ |
SkColor GetTitleColor() const { |
return (container_->owner()->profile()->IsOffTheRecord() || |
!win_util::ShouldUseVistaFrame()) ? SK_ColorWHITE : SK_ColorBLACK; |
} |
+ // Loads the appropriate set of WindowResources for the frame view. |
+ void InitWindowResources(); |
+ |
ConstrainedWindowImpl* container_; |
scoped_ptr<views::WindowResources> resources_; |
@@ -255,15 +261,18 @@ |
views::Button* close_button_; |
+ // The bounds of the ClientView. |
+ gfx::Rect client_view_bounds_; |
+ |
static void InitClass(); |
// The font to be used to render the titlebar text. |
static ChromeFont title_font_; |
- DISALLOW_EVIL_CONSTRUCTORS(ConstrainedWindowNonClientView); |
+ DISALLOW_EVIL_CONSTRUCTORS(ConstrainedWindowFrameView); |
}; |
-ChromeFont ConstrainedWindowNonClientView::title_font_; |
+ChromeFont ConstrainedWindowFrameView::title_font_; |
namespace { |
// The frame border is only visible in restored mode and is hardcoded to 4 px on |
@@ -294,23 +303,15 @@ |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// ConstrainedWindowNonClientView, public: |
+// ConstrainedWindowFrameView, public: |
-ConstrainedWindowNonClientView::ConstrainedWindowNonClientView( |
- ConstrainedWindowImpl* container, TabContents* owner) |
- : NonClientView(), |
+ConstrainedWindowFrameView::ConstrainedWindowFrameView( |
+ ConstrainedWindowImpl* container) |
+ : NonClientFrameView(), |
container_(container), |
close_button_(new views::Button) { |
InitClass(); |
- if (owner->profile()->IsOffTheRecord()) { |
- resources_.reset(new OTRWindowResources); |
- } else { |
- if (win_util::ShouldUseVistaFrame()) { |
- resources_.reset(new VistaWindowResources); |
- } else { |
- resources_.reset(new XPWindowResources); |
- } |
- } |
+ InitWindowResources(); |
close_button_->SetImage(views::Button::BS_NORMAL, |
resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON)); |
@@ -324,35 +325,37 @@ |
AddChildView(close_button_); |
} |
-ConstrainedWindowNonClientView::~ConstrainedWindowNonClientView() { |
+ConstrainedWindowFrameView::~ConstrainedWindowFrameView() { |
} |
-void ConstrainedWindowNonClientView::UpdateWindowTitle() { |
+void ConstrainedWindowFrameView::UpdateWindowTitle() { |
SchedulePaint(title_bounds_, false); |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// ConstrainedWindowNonClientView, views::NonClientView implementation: |
+// ConstrainedWindowFrameView, views::NonClientFrameView implementation: |
-gfx::Rect ConstrainedWindowNonClientView::CalculateClientAreaBounds( |
- int width, |
- int height) const { |
- int top_height = NonClientTopBorderHeight(); |
- 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)); |
+gfx::Rect ConstrainedWindowFrameView::GetBoundsForClientView() const { |
+ return client_view_bounds_; |
} |
-gfx::Size ConstrainedWindowNonClientView::CalculateWindowSizeForClientSize( |
- int width, |
- int height) const { |
+bool ConstrainedWindowFrameView::AlwaysUseCustomFrame() const { |
+ // Constrained windows always use the custom frame - they just have a |
+ // different set of bitmaps. |
+ return true; |
+} |
+ |
+gfx::Rect ConstrainedWindowFrameView::GetWindowBoundsForClientBounds( |
+ const gfx::Rect& client_bounds) const { |
+ int top_height = NonClientTopBorderHeight(); |
int border_thickness = NonClientBorderThickness(); |
- return gfx::Size(width + (2 * border_thickness), |
- height + NonClientTopBorderHeight() + border_thickness); |
+ 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); |
} |
-gfx::Point ConstrainedWindowNonClientView::GetSystemMenuPoint() const { |
+gfx::Point ConstrainedWindowFrameView::GetSystemMenuPoint() const { |
// Doesn't really matter, since we never show system menus on constrained |
// windows... |
gfx::Point system_menu_point(FrameBorderThickness(), |
@@ -361,7 +364,7 @@ |
return system_menu_point; |
} |
-int ConstrainedWindowNonClientView::NonClientHitTest(const gfx::Point& point) { |
+int ConstrainedWindowFrameView::NonClientHitTest(const gfx::Point& point) { |
if (!bounds().Contains(point)) |
return HTNOWHERE; |
@@ -380,8 +383,8 @@ |
return (window_component == HTNOWHERE) ? HTCAPTION : window_component; |
} |
-void ConstrainedWindowNonClientView::GetWindowMask(const gfx::Size& size, |
- gfx::Path* window_mask) { |
+void ConstrainedWindowFrameView::GetWindowMask(const gfx::Size& size, |
+ gfx::Path* window_mask) { |
DCHECK(window_mask); |
// Redefine the window visible region for the new size. |
@@ -403,60 +406,55 @@ |
window_mask->close(); |
} |
-void ConstrainedWindowNonClientView::EnableClose(bool enable) { |
+void ConstrainedWindowFrameView::EnableClose(bool enable) { |
close_button_->SetEnabled(enable); |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// ConstrainedWindowNonClientView, views::View implementation: |
+// ConstrainedWindowFrameView, views::View implementation: |
-void ConstrainedWindowNonClientView::Paint(ChromeCanvas* canvas) { |
+void ConstrainedWindowFrameView::Paint(ChromeCanvas* canvas) { |
PaintFrameBorder(canvas); |
PaintTitleBar(canvas); |
PaintClientEdge(canvas); |
} |
-void ConstrainedWindowNonClientView::Layout() { |
+void ConstrainedWindowFrameView::Layout() { |
LayoutWindowControls(); |
LayoutTitleBar(); |
LayoutClientView(); |
} |
-void ConstrainedWindowNonClientView::ViewHierarchyChanged(bool is_add, |
- View *parent, |
- View *child) { |
- // Add our Client View as we are added to the Container so that if we are |
- // subsequently resized all the parent-child relationships are established. |
- if (is_add && GetWidget() && child == this) |
- AddChildView(container_->client_view()); |
+void ConstrainedWindowFrameView::ThemeChanged() { |
+ InitWindowResources(); |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// ConstrainedWindowNonClientView, views::BaseButton::Button |
+// ConstrainedWindowFrameView, views::BaseButton::Button |
// implementation: |
-void ConstrainedWindowNonClientView::ButtonPressed(views::BaseButton* sender) { |
+void ConstrainedWindowFrameView::ButtonPressed(views::BaseButton* sender) { |
if (sender == close_button_) |
container_->ExecuteSystemMenuCommand(SC_CLOSE); |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// ConstrainedWindowNonClientView, private: |
+// ConstrainedWindowFrameView, private: |
-int ConstrainedWindowNonClientView::FrameBorderThickness() const { |
+int ConstrainedWindowFrameView::FrameBorderThickness() const { |
return kFrameBorderThickness; |
} |
-int ConstrainedWindowNonClientView::NonClientBorderThickness() const { |
+int ConstrainedWindowFrameView::NonClientBorderThickness() const { |
return FrameBorderThickness() + kClientEdgeThickness; |
} |
-int ConstrainedWindowNonClientView::NonClientTopBorderHeight() const { |
+int ConstrainedWindowFrameView::NonClientTopBorderHeight() const { |
int title_top_spacing, title_thickness; |
return TitleCoordinates(&title_top_spacing, &title_thickness); |
} |
-int ConstrainedWindowNonClientView::TitleCoordinates( |
+int ConstrainedWindowFrameView::TitleCoordinates( |
int* title_top_spacing, |
int* title_thickness) const { |
int frame_thickness = FrameBorderThickness(); |
@@ -470,7 +468,7 @@ |
return *title_top_spacing + *title_thickness + title_bottom_spacing; |
} |
-void ConstrainedWindowNonClientView::PaintFrameBorder(ChromeCanvas* canvas) { |
+void ConstrainedWindowFrameView::PaintFrameBorder(ChromeCanvas* canvas) { |
SkBitmap* top_left_corner = resources_->GetPartBitmap(FRAME_TOP_LEFT_CORNER); |
SkBitmap* top_right_corner = |
resources_->GetPartBitmap(FRAME_TOP_RIGHT_CORNER); |
@@ -514,13 +512,13 @@ |
height() - top_left_corner->height() - bottom_left_corner->height()); |
} |
-void ConstrainedWindowNonClientView::PaintTitleBar(ChromeCanvas* canvas) { |
+void ConstrainedWindowFrameView::PaintTitleBar(ChromeCanvas* canvas) { |
canvas->DrawStringInt(container_->GetWindowTitle(), title_font_, |
GetTitleColor(), MirroredLeftPointForRect(title_bounds_), |
title_bounds_.y(), title_bounds_.width(), title_bounds_.height()); |
} |
-void ConstrainedWindowNonClientView::PaintClientEdge(ChromeCanvas* canvas) { |
+void ConstrainedWindowFrameView::PaintClientEdge(ChromeCanvas* canvas) { |
gfx::Rect client_edge_bounds(CalculateClientAreaBounds(width(), height())); |
client_edge_bounds.Inset(-kClientEdgeThickness, -kClientEdgeThickness); |
gfx::Rect frame_shadow_bounds(client_edge_bounds); |
@@ -535,7 +533,7 @@ |
client_edge_bounds.height()); |
} |
-void ConstrainedWindowNonClientView::LayoutWindowControls() { |
+void ConstrainedWindowFrameView::LayoutWindowControls() { |
gfx::Size close_button_size = close_button_->GetPreferredSize(); |
close_button_->SetBounds( |
width() - close_button_size.width() - FrameBorderThickness(), |
@@ -543,7 +541,7 @@ |
close_button_size.height()); |
} |
-void ConstrainedWindowNonClientView::LayoutTitleBar() { |
+void ConstrainedWindowFrameView::LayoutTitleBar() { |
// Size the title. |
int title_x = FrameBorderThickness() + kIconLeftSpacing; |
int title_top_spacing, title_thickness; |
@@ -554,13 +552,34 @@ |
title_font_.height()); |
} |
-void ConstrainedWindowNonClientView::LayoutClientView() { |
- container_->client_view()->SetBounds(CalculateClientAreaBounds(width(), |
- height())); |
+void ConstrainedWindowFrameView::LayoutClientView() { |
+ client_view_bounds_ = CalculateClientAreaBounds(width(), height()); |
} |
+gfx::Rect ConstrainedWindowFrameView::CalculateClientAreaBounds( |
+ int width, |
+ int height) const { |
+ int top_height = NonClientTopBorderHeight(); |
+ 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)); |
+} |
+ |
+void ConstrainedWindowFrameView::InitWindowResources() { |
+ if (container_->owner()->profile()->IsOffTheRecord()) { |
+ resources_.reset(new OTRWindowResources); |
+ } else { |
+ if (win_util::ShouldUseVistaFrame()) { |
+ resources_.reset(new VistaWindowResources); |
+ } else { |
+ resources_.reset(new XPWindowResources); |
+ } |
+ } |
+} |
+ |
// static |
-void ConstrainedWindowNonClientView::InitClass() { |
+void ConstrainedWindowFrameView::InitClass() { |
static bool initialized = false; |
if (!initialized) { |
title_font_ = win_util::GetWindowTitleFont(); |
@@ -583,8 +602,8 @@ |
//////////////////////////////////////////////////////////////////////////////// |
// ConstrainedWindowImpl, ConstrainedWindow implementation: |
-ConstrainedWindowNonClientView* ConstrainedWindowImpl::non_client_view() { |
- return static_cast<ConstrainedWindowNonClientView*>(non_client_view_); |
+views::NonClientFrameView* ConstrainedWindowImpl::CreateFrameViewForWindow() { |
+ return new ConstrainedWindowFrameView(this); |
} |
void ConstrainedWindowImpl::UpdateWindowTitle() { |
@@ -652,13 +671,13 @@ |
ConstrainedWindowImpl::ConstrainedWindowImpl( |
TabContents* owner, |
views::WindowDelegate* window_delegate) |
- : CustomFrameWindow(window_delegate, |
- new ConstrainedWindowNonClientView(this, owner)) { |
- Init(owner); |
+ : Window(window_delegate), |
+ owner_(owner) { |
+ non_client_view_->SetFrameView(CreateFrameViewForWindow()); |
+ Init(); |
} |
-void ConstrainedWindowImpl::Init(TabContents* owner) { |
- owner_ = owner; |
+void ConstrainedWindowImpl::Init() { |
focus_restoration_disabled_ = false; |
set_window_style(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | |
WS_THICKFRAME | WS_SYSMENU); |
@@ -666,13 +685,13 @@ |
} |
void ConstrainedWindowImpl::InitAsDialog(const gfx::Rect& initial_bounds) { |
- CustomFrameWindow::Init(owner_->GetNativeView(), initial_bounds); |
+ Window::Init(owner_->GetNativeView(), initial_bounds); |
ActivateConstrainedWindow(); |
} |
void ConstrainedWindowImpl::UpdateUI(unsigned int changed_flags) { |
if (changed_flags & TabContents::INVALIDATE_TITLE) |
- non_client_view()->UpdateWindowTitle(); |
+ UpdateWindowTitle(); |
} |
//////////////////////////////////////////////////////////////////////////////// |