| 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();
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|