| Index: ui/aura_shell/toplevel_frame_view.cc
|
| ===================================================================
|
| --- ui/aura_shell/toplevel_frame_view.cc (revision 115655)
|
| +++ ui/aura_shell/toplevel_frame_view.cc (working copy)
|
| @@ -1,487 +0,0 @@
|
| -// Copyright (c) 2011 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.
|
| -
|
| -#include "ui/aura_shell/toplevel_frame_view.h"
|
| -
|
| -#include "grit/ui_resources.h"
|
| -#include "ui/aura/cursor.h"
|
| -#include "ui/base/animation/throb_animation.h"
|
| -#include "ui/base/hit_test.h"
|
| -#include "ui/base/resource/resource_bundle.h"
|
| -#include "ui/gfx/canvas.h"
|
| -#include "ui/views/controls/button/custom_button.h"
|
| -#include "ui/views/widget/widget.h"
|
| -#include "ui/views/widget/widget_delegate.h"
|
| -
|
| -namespace aura_shell {
|
| -namespace internal {
|
| -
|
| -namespace {
|
| -// The thickness of the left, right and bottom edges of the frame.
|
| -const int kFrameBorderThickness = 8;
|
| -const int kFrameOpacity = 50;
|
| -// The color used to fill the frame.
|
| -const SkColor kFrameColor = SkColorSetARGB(kFrameOpacity, 0, 0, 0);
|
| -const int kFrameBorderHiddenOpacity = 0;
|
| -const int kFrameBorderVisibleOpacity = kFrameOpacity;
|
| -// How long the hover animation takes if uninterrupted.
|
| -const int kHoverFadeDurationMs = 250;
|
| -} // namespace
|
| -
|
| -// Buttons for window controls - close, zoom, etc.
|
| -class WindowControlButton : public views::CustomButton {
|
| - public:
|
| - WindowControlButton(views::ButtonListener* listener,
|
| - SkColor color,
|
| - const SkBitmap& icon)
|
| - : views::CustomButton(listener),
|
| - color_(color),
|
| - icon_(icon) {
|
| - }
|
| - virtual ~WindowControlButton() {}
|
| -
|
| - // Overridden from views::View:
|
| - virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
|
| - canvas->FillRect(GetBackgroundColor(), GetLocalBounds());
|
| - canvas->DrawBitmapInt(icon_, 0, 0);
|
| - }
|
| - virtual gfx::Size GetPreferredSize() OVERRIDE {
|
| - gfx::Size size(icon_.width(), icon_.height());
|
| - size.Enlarge(3, 2);
|
| - return size;
|
| - }
|
| -
|
| - private:
|
| - SkColor GetBackgroundColor() {
|
| - return SkColorSetARGB(hover_animation_->CurrentValueBetween(0, 150),
|
| - SkColorGetR(color_),
|
| - SkColorGetG(color_),
|
| - SkColorGetB(color_));
|
| - }
|
| -
|
| - SkColor color_;
|
| - SkBitmap icon_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(WindowControlButton);
|
| -};
|
| -
|
| -// Base class for all animatable frame components such as sizing borders and
|
| -// the window's caption. Provides shared animation and event-handling logic.
|
| -class FrameComponent : public views::View,
|
| - public ui::AnimationDelegate {
|
| - public:
|
| - virtual ~FrameComponent() {
|
| - }
|
| -
|
| - // Control animations.
|
| - void Show() {
|
| - animation_->Show();
|
| - }
|
| - void Hide() {
|
| - animation_->Hide();
|
| - }
|
| -
|
| - // Current animation state.
|
| - bool IsShowing() const {
|
| - return animation_->IsShowing();
|
| - }
|
| - bool IsHiding() const {
|
| - return animation_->IsClosing();
|
| - }
|
| -
|
| - // Returns true if the view ignores events to itself or its children at the
|
| - // specified point in its parent's coordinates. By default, any events within
|
| - // the bounds of this view are ignored so that the parent (the NCFV) can
|
| - // handle them instead. Derived classes can override to disable this for some
|
| - // of their children.
|
| - virtual bool IgnoreEventsForPoint(const gfx::Point& point) {
|
| - gfx::Point translated_point(point);
|
| - ConvertPointToView(parent(), this, &translated_point);
|
| - return HitTest(translated_point);
|
| - }
|
| -
|
| - protected:
|
| - FrameComponent()
|
| - : ALLOW_THIS_IN_INITIALIZER_LIST(
|
| - animation_(new ui::SlideAnimation(this))) {
|
| - animation_->SetSlideDuration(kHoverFadeDurationMs);
|
| - }
|
| -
|
| - // Most of the frame components are rendered with a transparent bg.
|
| - void PaintTransparentBackground(gfx::Canvas* canvas) {
|
| - // Fill with current opacity value.
|
| - int opacity = animation_->CurrentValueBetween(kFrameBorderHiddenOpacity,
|
| - kFrameBorderVisibleOpacity);
|
| - canvas->FillRect(SkColorSetARGB(opacity,
|
| - SkColorGetR(kFrameColor),
|
| - SkColorGetG(kFrameColor),
|
| - SkColorGetB(kFrameColor)),
|
| - GetLocalBounds());
|
| - }
|
| -
|
| - // Overridden from ui::AnimationDelegate:
|
| - virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE {
|
| - SchedulePaint();
|
| - }
|
| -
|
| - private:
|
| - scoped_ptr<ui::SlideAnimation> animation_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FrameComponent);
|
| -};
|
| -
|
| -// A view that renders the title bar of the window, and also hosts the window
|
| -// controls.
|
| -class WindowCaption : public FrameComponent,
|
| - public views::ButtonListener {
|
| - public:
|
| - WindowCaption() {
|
| - ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
| - close_button_ =
|
| - new WindowControlButton(this, SK_ColorRED,
|
| - *rb.GetBitmapNamed(IDR_AURA_WINDOW_CLOSE_ICON));
|
| - zoom_button_ =
|
| - new WindowControlButton(this, SK_ColorGREEN,
|
| - *rb.GetBitmapNamed(IDR_AURA_WINDOW_ZOOM_ICON));
|
| - AddChildView(close_button_);
|
| - AddChildView(zoom_button_);
|
| - }
|
| - virtual ~WindowCaption() {}
|
| -
|
| - // Returns the hit-test code for the specified point in parent coordinates.
|
| - int NonClientHitTest(const gfx::Point& point) {
|
| - gfx::Point translated_point(point);
|
| - View::ConvertPointToView(parent(), this, &translated_point);
|
| - // The window controls come second.
|
| - if (close_button_->GetMirroredBounds().Contains(translated_point))
|
| - return HTCLOSE;
|
| - else if (zoom_button_->GetMirroredBounds().Contains(translated_point))
|
| - return HTMAXBUTTON;
|
| - return HTNOWHERE;
|
| - }
|
| -
|
| - // Overridden from FrameComponent:
|
| - virtual bool IgnoreEventsForPoint(const gfx::Point& point) OVERRIDE {
|
| - gfx::Point translated_point(point);
|
| - ConvertPointToView(parent(), this, &translated_point);
|
| - if (PointIsInChildView(close_button_, translated_point))
|
| - return false;
|
| - if (PointIsInChildView(zoom_button_, translated_point))
|
| - return false;
|
| - return FrameComponent::IgnoreEventsForPoint(point);
|
| - }
|
| -
|
| - // Overridden from views::View:
|
| - virtual gfx::Size GetPreferredSize() OVERRIDE {
|
| - return gfx::Size(0, close_button_->GetPreferredSize().height());
|
| - }
|
| -
|
| - private:
|
| - // Returns true if the specified |point| in this view's coordinates hit tests
|
| - // against |child|, a child view of this view.
|
| - bool PointIsInChildView(views::View* child,
|
| - const gfx::Point& point) const {
|
| - gfx::Point child_point(point);
|
| - ConvertPointToView(this, child, &child_point);
|
| - return child->HitTest(child_point);
|
| - }
|
| -
|
| - // Overridden from views::View:
|
| - virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
|
| - PaintTransparentBackground(canvas);
|
| - }
|
| - virtual void Layout() OVERRIDE {
|
| - gfx::Size close_button_ps = close_button_->GetPreferredSize();
|
| - close_button_->SetBoundsRect(
|
| - gfx::Rect(width() - close_button_ps.width(),
|
| - 0, close_button_ps.width(), close_button_ps.height()));
|
| -
|
| - gfx::Size zoom_button_ps = zoom_button_->GetPreferredSize();
|
| - zoom_button_->SetBoundsRect(
|
| - gfx::Rect(close_button_->x() - zoom_button_ps.width(), 0,
|
| - zoom_button_ps.width(), zoom_button_ps.height()));
|
| - }
|
| -
|
| - // Overridden from views::ButtonListener:
|
| - virtual void ButtonPressed(views::Button* sender,
|
| - const views::Event& event) OVERRIDE {
|
| - if (sender == close_button_) {
|
| - GetWidget()->Close();
|
| - } else if (sender == zoom_button_) {
|
| - if (GetWidget()->IsMaximized())
|
| - GetWidget()->Restore();
|
| - else
|
| - GetWidget()->Maximize();
|
| - }
|
| - }
|
| -
|
| - views::Button* close_button_;
|
| - views::Button* zoom_button_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(WindowCaption);
|
| -};
|
| -
|
| -// A class that renders the sizing border that appears when the user moves
|
| -// their mouse over a sizing edge. This view is not actually responsible for
|
| -// resizing the window, the EventFilter is.
|
| -class SizingBorder : public FrameComponent {
|
| - public:
|
| - SizingBorder() {}
|
| - virtual ~SizingBorder() {}
|
| -
|
| - void Configure(const gfx::Rect& hidden_bounds,
|
| - const gfx::Rect& visible_bounds) {
|
| - hidden_bounds_ = hidden_bounds;
|
| - visible_bounds_ = visible_bounds;
|
| - SetBoundsRect(hidden_bounds_);
|
| - }
|
| -
|
| - protected:
|
| - // Overridden from ui::AnimationDelegate:
|
| - virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE {
|
| - gfx::Rect current_bounds = animation->CurrentValueBetween(hidden_bounds_,
|
| - visible_bounds_);
|
| - SetBoundsRect(current_bounds);
|
| - FrameComponent::AnimationProgressed(animation);
|
| - }
|
| -
|
| - private:
|
| - // Overridden from views::View:
|
| - virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
|
| - PaintTransparentBackground(canvas);
|
| - }
|
| -
|
| - // Each of these represents the hidden/visible states of the sizing border.
|
| - // When the view is shown or hidden it animates between them.
|
| - gfx::Rect hidden_bounds_;
|
| - gfx::Rect visible_bounds_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(SizingBorder);
|
| -};
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// ToplevelFrameView, public:
|
| -
|
| -ToplevelFrameView::ToplevelFrameView()
|
| - : current_hittest_code_(HTNOWHERE),
|
| - caption_(new WindowCaption),
|
| - left_edge_(new SizingBorder),
|
| - right_edge_(new SizingBorder),
|
| - bottom_edge_(new SizingBorder) {
|
| - AddChildView(caption_);
|
| - AddChildView(left_edge_);
|
| - AddChildView(right_edge_);
|
| - AddChildView(bottom_edge_);
|
| -}
|
| -
|
| -ToplevelFrameView::~ToplevelFrameView() {
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// ToplevelFrameView, private:
|
| -
|
| -int ToplevelFrameView::NonClientBorderThickness() const {
|
| - return kFrameBorderThickness;
|
| -}
|
| -
|
| -int ToplevelFrameView::NonClientTopBorderHeight() const {
|
| - return caption_->GetPreferredSize().height();
|
| -}
|
| -
|
| -int ToplevelFrameView::NonClientHitTestImpl(const gfx::Point& point) {
|
| - // Sanity check.
|
| - if (!GetLocalBounds().Contains(point))
|
| - return HTNOWHERE;
|
| -
|
| - // The client view gets first crack at claiming the point.
|
| - int frame_component = GetWidget()->client_view()->NonClientHitTest(point);
|
| - if (frame_component != HTNOWHERE)
|
| - return frame_component;
|
| -
|
| - frame_component = caption_->NonClientHitTest(point);
|
| - if (frame_component != HTNOWHERE)
|
| - return frame_component;
|
| -
|
| - // Finally other portions of the frame/sizing border.
|
| - frame_component =
|
| - GetHTComponentForFrame(point,
|
| - NonClientBorderThickness(),
|
| - NonClientBorderThickness(),
|
| - NonClientBorderThickness(),
|
| - NonClientBorderThickness(),
|
| - GetWidget()->widget_delegate()->CanResize());
|
| -
|
| - // Coerce HTCAPTION as a fallback.
|
| - return frame_component == HTNOWHERE ? HTCAPTION : frame_component;
|
| -}
|
| -
|
| -void ToplevelFrameView::ShowFrameComponent(FrameComponent* frame_component) {
|
| - if (frame_component && !frame_component->IsShowing())
|
| - frame_component->Show();
|
| - if (caption_ != frame_component && !caption_->IsHiding())
|
| - caption_->Hide();
|
| - if (left_edge_ != frame_component && !left_edge_->IsHiding())
|
| - left_edge_->Hide();
|
| - if (right_edge_ != frame_component && !right_edge_->IsHiding())
|
| - right_edge_->Hide();
|
| - if (bottom_edge_ != frame_component && !bottom_edge_->IsHiding())
|
| - bottom_edge_->Hide();
|
| -}
|
| -
|
| -gfx::Rect ToplevelFrameView::GetHiddenBoundsForSizingBorder(
|
| - int frame_component) const {
|
| - int border_size = NonClientBorderThickness();
|
| - int caption_height = NonClientTopBorderHeight();
|
| - switch (frame_component) {
|
| - case HTLEFT:
|
| - return gfx::Rect(border_size, caption_height, border_size,
|
| - height() - border_size - caption_height);
|
| - case HTBOTTOM:
|
| - return gfx::Rect(border_size, height() - 2 * border_size,
|
| - width() - 2 * border_size, border_size);
|
| - case HTRIGHT:
|
| - return gfx::Rect(width() - 2 * border_size, caption_height, border_size,
|
| - height() - border_size - caption_height);
|
| - default:
|
| - break;
|
| - }
|
| - return gfx::Rect();
|
| -}
|
| -
|
| -gfx::Rect ToplevelFrameView::GetVisibleBoundsForSizingBorder(
|
| - int frame_component) const {
|
| - int border_size = NonClientBorderThickness();
|
| - int caption_height = NonClientTopBorderHeight();
|
| - switch (frame_component) {
|
| - case HTLEFT:
|
| - return gfx::Rect(0, caption_height, border_size,
|
| - height() - border_size - caption_height);
|
| - case HTBOTTOM:
|
| - return gfx::Rect(border_size, height() - border_size,
|
| - width() - 2 * border_size, border_size);
|
| - case HTRIGHT:
|
| - return gfx::Rect(width() - border_size, caption_height, border_size,
|
| - height() - border_size - caption_height);
|
| - default:
|
| - break;
|
| - }
|
| - return gfx::Rect();
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// ToplevelFrameView, views::NonClientFrameView overrides:
|
| -
|
| -gfx::Rect ToplevelFrameView::GetBoundsForClientView() const {
|
| - return client_view_bounds_;
|
| -}
|
| -
|
| -gfx::Rect ToplevelFrameView::GetWindowBoundsForClientBounds(
|
| - const gfx::Rect& client_bounds) const {
|
| - gfx::Rect window_bounds = client_bounds;
|
| - window_bounds.Inset(-NonClientBorderThickness(),
|
| - -NonClientTopBorderHeight(),
|
| - -NonClientBorderThickness(),
|
| - -NonClientBorderThickness());
|
| - return window_bounds;
|
| -}
|
| -
|
| -int ToplevelFrameView::NonClientHitTest(const gfx::Point& point) {
|
| - current_hittest_code_ = NonClientHitTestImpl(point);
|
| - return current_hittest_code_;
|
| -}
|
| -
|
| -void ToplevelFrameView::GetWindowMask(const gfx::Size& size,
|
| - gfx::Path* window_mask) {
|
| - // Nothing.
|
| -}
|
| -
|
| -void ToplevelFrameView::ResetWindowControls() {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void ToplevelFrameView::UpdateWindowIcon() {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// ToplevelFrameView, views::View overrides:
|
| -
|
| -void ToplevelFrameView::Layout() {
|
| - client_view_bounds_ = GetLocalBounds();
|
| - client_view_bounds_.Inset(NonClientBorderThickness(),
|
| - NonClientTopBorderHeight(),
|
| - NonClientBorderThickness(),
|
| - NonClientBorderThickness());
|
| -
|
| - caption_->SetBounds(NonClientBorderThickness(), 0,
|
| - width() - 2 * NonClientBorderThickness(),
|
| - NonClientTopBorderHeight());
|
| -
|
| - left_edge_->Configure(GetHiddenBoundsForSizingBorder(HTLEFT),
|
| - GetVisibleBoundsForSizingBorder(HTLEFT));
|
| - right_edge_->Configure(GetHiddenBoundsForSizingBorder(HTRIGHT),
|
| - GetVisibleBoundsForSizingBorder(HTRIGHT));
|
| - bottom_edge_->Configure(GetHiddenBoundsForSizingBorder(HTBOTTOM),
|
| - GetVisibleBoundsForSizingBorder(HTBOTTOM));
|
| -}
|
| -
|
| -void ToplevelFrameView::OnMouseMoved(const views::MouseEvent& event) {
|
| - switch (current_hittest_code_) {
|
| - case HTLEFT:
|
| - ShowFrameComponent(left_edge_);
|
| - break;
|
| - case HTRIGHT:
|
| - ShowFrameComponent(right_edge_);
|
| - break;
|
| - case HTBOTTOM:
|
| - ShowFrameComponent(bottom_edge_);
|
| - break;
|
| - case HTCAPTION:
|
| - ShowFrameComponent(caption_);
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void ToplevelFrameView::OnMouseExited(const views::MouseEvent& event) {
|
| - ShowFrameComponent(NULL);
|
| -}
|
| -
|
| -views::View* ToplevelFrameView::GetEventHandlerForPoint(
|
| - const gfx::Point& point) {
|
| - if (left_edge_->IgnoreEventsForPoint(point) ||
|
| - right_edge_->IgnoreEventsForPoint(point) ||
|
| - bottom_edge_->IgnoreEventsForPoint(point) ||
|
| - caption_->IgnoreEventsForPoint(point)) {
|
| - return this;
|
| - }
|
| - return View::GetEventHandlerForPoint(point);
|
| -}
|
| -
|
| -gfx::NativeCursor ToplevelFrameView::GetCursor(const views::MouseEvent& event) {
|
| - switch (current_hittest_code_) {
|
| - case HTBOTTOM:
|
| - return aura::kCursorSouthResize;
|
| - case HTBOTTOMLEFT:
|
| - return aura::kCursorSouthWestResize;
|
| - case HTBOTTOMRIGHT:
|
| - return aura::kCursorSouthEastResize;
|
| - case HTLEFT:
|
| - return aura::kCursorWestResize;
|
| - case HTRIGHT:
|
| - return aura::kCursorEastResize;
|
| - case HTTOP:
|
| - return aura::kCursorNorthResize;
|
| - case HTTOPLEFT:
|
| - return aura::kCursorNorthWestResize;
|
| - case HTTOPRIGHT:
|
| - return aura::kCursorNorthEastResize;
|
| - default:
|
| - return aura::kCursorNull;
|
| - }
|
| -}
|
| -
|
| -} // namespace internal
|
| -} // namespace aura_shell
|
|
|