| // 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 "views/bubble/bubble_delegate.h" |
| |
| #include "ui/base/animation/slide_animation.h" |
| #include "views/bubble/bubble_frame_view.h" |
| #include "views/widget/widget.h" |
| |
| // The duration of the fade animation in milliseconds. |
| static const int kHideFadeDurationMS = 1000; |
| |
| namespace views { |
| |
| BubbleDelegateView::BubbleDelegateView() |
| : WidgetDelegateView(), |
| close_on_esc_(true), |
| arrow_location_(BubbleBorder::TOP_LEFT), |
| color_(SK_ColorWHITE) { |
| AddAccelerator(Accelerator(ui::VKEY_ESCAPE, 0)); |
| } |
| |
| BubbleDelegateView::BubbleDelegateView( |
| const gfx::Point& anchor_point, |
| BubbleBorder::ArrowLocation arrow_location, |
| const SkColor& color) |
| : WidgetDelegateView(), |
| close_on_esc_(true), |
| anchor_point_(anchor_point), |
| arrow_location_(arrow_location), |
| color_(color) { |
| AddAccelerator(Accelerator(ui::VKEY_ESCAPE, 0)); |
| } |
| |
| BubbleDelegateView::~BubbleDelegateView() {} |
| |
| // static |
| Widget* BubbleDelegateView::CreateBubble(BubbleDelegateView* bubble_delegate, |
| Widget* parent_widget) { |
| bubble_delegate->Init(); |
| views::Widget* bubble_widget = new views::Widget(); |
| views::Widget::InitParams params(views::Widget::InitParams::TYPE_BUBBLE); |
| params.delegate = bubble_delegate; |
| params.transparent = true; |
| if (!parent_widget) |
| params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| params.parent_widget = parent_widget; |
| bubble_widget->Init(params); |
| bubble_widget->SetBounds(bubble_delegate->GetBubbleBounds()); |
| return bubble_widget; |
| } |
| |
| View* BubbleDelegateView::GetInitiallyFocusedView() { |
| return this; |
| } |
| |
| View* BubbleDelegateView::GetContentsView() { |
| return this; |
| } |
| |
| ClientView* BubbleDelegateView::CreateClientView(Widget* widget) { |
| return new ClientView(widget, GetContentsView()); |
| } |
| |
| NonClientFrameView* BubbleDelegateView::CreateNonClientFrameView() { |
| return new BubbleFrameView(GetArrowLocation(), |
| GetPreferredSize(), |
| GetColor()); |
| } |
| |
| gfx::Point BubbleDelegateView::GetAnchorPoint() { |
| return anchor_point_; |
| } |
| |
| BubbleBorder::ArrowLocation BubbleDelegateView::GetArrowLocation() const { |
| return arrow_location_; |
| } |
| |
| SkColor BubbleDelegateView::GetColor() const { |
| return color_; |
| } |
| |
| void BubbleDelegateView::Init() {} |
| |
| void BubbleDelegateView::StartFade(bool fade_in) { |
| fade_animation_.reset(new ui::SlideAnimation(this)); |
| fade_animation_->SetSlideDuration(kHideFadeDurationMS); |
| fade_animation_->Reset(fade_in ? 0.0 : 1.0); |
| if (fade_in) { |
| GetWidget()->SetOpacity(0); |
| GetWidget()->Show(); |
| fade_animation_->Show(); |
| } else { |
| fade_animation_->Hide(); |
| } |
| } |
| |
| bool BubbleDelegateView::AcceleratorPressed(const Accelerator& accelerator) { |
| if (!close_on_esc() || accelerator.key_code() != ui::VKEY_ESCAPE) |
| return false; |
| if (fade_animation_.get()) |
| fade_animation_->Reset(); |
| GetWidget()->Close(); |
| return true; |
| } |
| |
| void BubbleDelegateView::AnimationEnded(const ui::Animation* animation) { |
| DCHECK_EQ(animation, fade_animation_.get()); |
| bool closed = fade_animation_->GetCurrentValue() == 0; |
| fade_animation_->Reset(); |
| if (closed) |
| GetWidget()->Close(); |
| } |
| |
| void BubbleDelegateView::AnimationProgressed(const ui::Animation* animation) { |
| DCHECK_EQ(animation, fade_animation_.get()); |
| DCHECK(fade_animation_->is_animating()); |
| GetWidget()->SetOpacity(fade_animation_->GetCurrentValue() * 255); |
| SchedulePaint(); |
| } |
| |
| const BubbleView* BubbleDelegateView::GetBubbleView() const { |
| return GetWidget()->client_view()->AsBubbleView(); |
| } |
| |
| const BubbleFrameView* BubbleDelegateView::GetBubbleFrameView() const { |
| return static_cast<BubbleFrameView*>( |
| GetWidget()->non_client_view()->frame_view()); |
| } |
| |
| gfx::Rect BubbleDelegateView::GetBubbleBounds() { |
| // The argument rect has its origin at the bubble's arrow anchor point; |
| // its size is the preferred size of the bubble's client view (this view). |
| return GetBubbleFrameView()->GetWindowBoundsForClientBounds( |
| gfx::Rect(GetAnchorPoint(), GetPreferredSize())); |
| } |
| |
| } // namespace views |