| Index: chrome/browser/ui/views/fullscreen_exit_bubble.cc
|
| diff --git a/chrome/browser/ui/views/fullscreen_exit_bubble.cc b/chrome/browser/ui/views/fullscreen_exit_bubble.cc
|
| deleted file mode 100644
|
| index 43bbe78d5f90e1f3b2a7090a976d913822885c63..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/views/fullscreen_exit_bubble.cc
|
| +++ /dev/null
|
| @@ -1,261 +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 "chrome/browser/ui/views/fullscreen_exit_bubble.h"
|
| -
|
| -#include "base/message_loop.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "chrome/app/chrome_command_ids.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "ui/base/animation/slide_animation.h"
|
| -#include "ui/base/keycodes/keyboard_codes.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -#include "ui/base/resource/resource_bundle.h"
|
| -#include "ui/gfx/canvas_skia.h"
|
| -#include "ui/gfx/screen.h"
|
| -#include "views/controls/link.h"
|
| -#include "views/widget/widget.h"
|
| -
|
| -#if defined(OS_WIN)
|
| -#include "ui/base/l10n/l10n_util_win.h"
|
| -#endif
|
| -
|
| -// FullscreenExitView ----------------------------------------------------------
|
| -
|
| -class FullscreenExitBubble::FullscreenExitView : public views::View {
|
| - public:
|
| - FullscreenExitView(FullscreenExitBubble* bubble,
|
| - const std::wstring& accelerator);
|
| - virtual ~FullscreenExitView();
|
| -
|
| - // views::View
|
| - virtual gfx::Size GetPreferredSize();
|
| -
|
| - private:
|
| - static const int kPaddingPixels; // Number of pixels around all sides of link
|
| -
|
| - // views::View
|
| - virtual void Layout();
|
| - virtual void OnPaint(gfx::Canvas* canvas);
|
| -
|
| - // Clickable hint text to show in the bubble.
|
| - views::Link link_;
|
| -};
|
| -
|
| -const int FullscreenExitBubble::FullscreenExitView::kPaddingPixels = 8;
|
| -
|
| -FullscreenExitBubble::FullscreenExitView::FullscreenExitView(
|
| - FullscreenExitBubble* bubble,
|
| - const std::wstring& accelerator) {
|
| - link_.set_parent_owned(false);
|
| -#if !defined(OS_CHROMEOS)
|
| - link_.SetText(
|
| - UTF16ToWide(l10n_util::GetStringFUTF16(IDS_EXIT_FULLSCREEN_MODE,
|
| - WideToUTF16(accelerator))));
|
| -#else
|
| - link_.SetText(
|
| - UTF16ToWide(l10n_util::GetStringUTF16(IDS_EXIT_FULLSCREEN_MODE)));
|
| -#endif
|
| - link_.set_listener(bubble);
|
| - link_.SetFont(ResourceBundle::GetSharedInstance().GetFont(
|
| - ResourceBundle::LargeFont));
|
| - link_.SetNormalColor(SK_ColorWHITE);
|
| - link_.SetHighlightedColor(SK_ColorWHITE);
|
| - AddChildView(&link_);
|
| -}
|
| -
|
| -FullscreenExitBubble::FullscreenExitView::~FullscreenExitView() {
|
| -}
|
| -
|
| -gfx::Size FullscreenExitBubble::FullscreenExitView::GetPreferredSize() {
|
| - gfx::Size preferred_size(link_.GetPreferredSize());
|
| - preferred_size.Enlarge(kPaddingPixels * 2, kPaddingPixels * 2);
|
| - return preferred_size;
|
| -}
|
| -
|
| -void FullscreenExitBubble::FullscreenExitView::Layout() {
|
| - gfx::Size link_preferred_size(link_.GetPreferredSize());
|
| - link_.SetBounds(kPaddingPixels,
|
| - height() - kPaddingPixels - link_preferred_size.height(),
|
| - link_preferred_size.width(), link_preferred_size.height());
|
| -}
|
| -
|
| -void FullscreenExitBubble::FullscreenExitView::OnPaint(gfx::Canvas* canvas) {
|
| - // Create a round-bottomed rect to fill the whole View.
|
| - SkRect rect;
|
| - SkScalar padding = SkIntToScalar(kPaddingPixels);
|
| - // The "-padding" top coordinate ensures that the rect is always tall enough
|
| - // to contain the complete rounded corner radius. If we set this to 0, as the
|
| - // popup slides offscreen (in reality, squishes to 0 height), the corners will
|
| - // flatten out as the height becomes less than the corner radius.
|
| - rect.set(0, -padding, SkIntToScalar(width()), SkIntToScalar(height()));
|
| - SkScalar rad[8] = { 0, 0, 0, 0, padding, padding, padding, padding };
|
| - SkPath path;
|
| - path.addRoundRect(rect, rad, SkPath::kCW_Direction);
|
| -
|
| - // Fill it black.
|
| - SkPaint paint;
|
| - paint.setStyle(SkPaint::kFill_Style);
|
| - paint.setFlags(SkPaint::kAntiAlias_Flag);
|
| - paint.setColor(SK_ColorBLACK);
|
| - canvas->AsCanvasSkia()->drawPath(path, paint);
|
| -}
|
| -
|
| -// FullscreenExitBubble --------------------------------------------------------
|
| -
|
| -const double FullscreenExitBubble::kOpacity = 0.7;
|
| -const int FullscreenExitBubble::kInitialDelayMs = 2300;
|
| -const int FullscreenExitBubble::kIdleTimeMs = 2300;
|
| -const int FullscreenExitBubble::kPositionCheckHz = 10;
|
| -const int FullscreenExitBubble::kSlideInRegionHeightPx = 4;
|
| -const int FullscreenExitBubble::kSlideInDurationMs = 350;
|
| -const int FullscreenExitBubble::kSlideOutDurationMs = 700;
|
| -
|
| -FullscreenExitBubble::FullscreenExitBubble(
|
| - views::Widget* frame,
|
| - CommandUpdater::CommandUpdaterDelegate* delegate)
|
| - : root_view_(frame->GetRootView()),
|
| - delegate_(delegate),
|
| - popup_(NULL),
|
| - size_animation_(new ui::SlideAnimation(this)) {
|
| - size_animation_->Reset(1);
|
| -
|
| - // Create the contents view.
|
| - views::Accelerator accelerator(ui::VKEY_UNKNOWN, false, false, false);
|
| - bool got_accelerator = frame->GetAccelerator(IDC_FULLSCREEN, &accelerator);
|
| - DCHECK(got_accelerator);
|
| - view_ = new FullscreenExitView(
|
| - this, UTF16ToWideHack(accelerator.GetShortcutText()));
|
| -
|
| - // Initialize the popup.
|
| - popup_ = new views::Widget;
|
| - views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
|
| - params.transparent = true;
|
| - params.can_activate = false;
|
| - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
| - params.parent = frame->GetNativeView();
|
| - params.bounds = GetPopupRect(false);
|
| - popup_->Init(params);
|
| - popup_->SetContentsView(view_);
|
| - popup_->SetOpacity(static_cast<unsigned char>(0xff * kOpacity));
|
| - popup_->Show(); // This does not activate the popup.
|
| -
|
| - // Start the initial delay timer and begin watching the mouse.
|
| - initial_delay_.Start(base::TimeDelta::FromMilliseconds(kInitialDelayMs), this,
|
| - &FullscreenExitBubble::CheckMousePosition);
|
| - gfx::Point cursor_pos = gfx::Screen::GetCursorScreenPoint();
|
| - last_mouse_pos_ = cursor_pos;
|
| - views::View::ConvertPointToView(NULL, root_view_, &last_mouse_pos_);
|
| - mouse_position_checker_.Start(
|
| - base::TimeDelta::FromMilliseconds(1000 / kPositionCheckHz), this,
|
| - &FullscreenExitBubble::CheckMousePosition);
|
| -}
|
| -
|
| -FullscreenExitBubble::~FullscreenExitBubble() {
|
| - // This is tricky. We may be in an ATL message handler stack, in which case
|
| - // the popup cannot be deleted yet. We also can't set the popup's ownership
|
| - // model to NATIVE_WIDGET_OWNS_WIDGET because if the user closed the last tab
|
| - // while in fullscreen mode, Windows has already destroyed the popup HWND by
|
| - // the time we get here, and thus either the popup will already have been
|
| - // deleted (if we set this in our constructor) or the popup will never get
|
| - // another OnFinalMessage() call (if not, as currently). So instead, we tell
|
| - // the popup to synchronously hide, and then asynchronously close and delete
|
| - // itself.
|
| - popup_->Close();
|
| - MessageLoop::current()->DeleteSoon(FROM_HERE, popup_);
|
| -}
|
| -
|
| -void FullscreenExitBubble::LinkClicked(views::Link* source, int event_flags) {
|
| - delegate_->ExecuteCommand(IDC_FULLSCREEN);
|
| -}
|
| -
|
| -void FullscreenExitBubble::AnimationProgressed(
|
| - const ui::Animation* animation) {
|
| - gfx::Rect popup_rect(GetPopupRect(false));
|
| - if (popup_rect.IsEmpty()) {
|
| - popup_->Hide();
|
| - } else {
|
| - popup_->SetBounds(popup_rect);
|
| - popup_->Show();
|
| - }
|
| -}
|
| -void FullscreenExitBubble::AnimationEnded(
|
| - const ui::Animation* animation) {
|
| - AnimationProgressed(animation);
|
| -}
|
| -
|
| -void FullscreenExitBubble::CheckMousePosition() {
|
| - // Desired behavior:
|
| - //
|
| - // +------------+-----------------------------+------------+
|
| - // | _ _ _ _ | Exit full screen mode (F11) | _ _ _ _ | Slide-in region
|
| - // | _ _ _ _ \_____________________________/ _ _ _ _ | Neutral region
|
| - // | | Slide-out region
|
| - // : :
|
| - //
|
| - // * If app is not active, we hide the popup.
|
| - // * If the mouse is offscreen or in the slide-out region, we hide the popup.
|
| - // * If the mouse goes idle, we hide the popup.
|
| - // * If the mouse is in the slide-in-region and not idle, we show the popup.
|
| - // * If the mouse is in the neutral region and not idle, and the popup is
|
| - // currently sliding out, we show it again. This facilitates users
|
| - // correcting us if they try to mouse horizontally towards the popup and
|
| - // unintentionally drop too low.
|
| - // * Otherwise, we do nothing, because the mouse is in the neutral region and
|
| - // either the popup is hidden or the mouse is not idle, so we don't want to
|
| - // change anything's state.
|
| -
|
| - gfx::Point cursor_pos = gfx::Screen::GetCursorScreenPoint();
|
| - gfx::Point transformed_pos(cursor_pos);
|
| - views::View::ConvertPointToView(NULL, root_view_, &transformed_pos);
|
| -
|
| - // Check to see whether the mouse is idle.
|
| - if (transformed_pos != last_mouse_pos_) {
|
| - // The mouse moved; reset the idle timer.
|
| - idle_timeout_.Stop(); // If the timer isn't running, this is a no-op.
|
| - idle_timeout_.Start(base::TimeDelta::FromMilliseconds(kIdleTimeMs), this,
|
| - &FullscreenExitBubble::CheckMousePosition);
|
| - }
|
| - last_mouse_pos_ = transformed_pos;
|
| -
|
| - if ((!root_view_->GetWidget()->IsActive()) ||
|
| - !root_view_->HitTest(transformed_pos) ||
|
| - (cursor_pos.y() >= GetPopupRect(true).bottom()) ||
|
| - !idle_timeout_.IsRunning()) {
|
| - // The cursor is offscreen, in the slide-out region, or idle.
|
| - Hide();
|
| - } else if ((cursor_pos.y() < kSlideInRegionHeightPx) ||
|
| - (size_animation_->GetCurrentValue() != 0)) {
|
| - // The cursor is not idle, and either it's in the slide-in region or it's in
|
| - // the neutral region and we're sliding out.
|
| - size_animation_->SetSlideDuration(kSlideInDurationMs);
|
| - size_animation_->Show();
|
| - }
|
| -}
|
| -
|
| -void FullscreenExitBubble::Hide() {
|
| - // Allow the bubble to hide if the window is deactivated or our initial delay
|
| - // finishes.
|
| - if ((!root_view_->GetWidget()->IsActive()) || !initial_delay_.IsRunning()) {
|
| - size_animation_->SetSlideDuration(kSlideOutDurationMs);
|
| - size_animation_->Hide();
|
| - }
|
| -}
|
| -
|
| -gfx::Rect FullscreenExitBubble::GetPopupRect(
|
| - bool ignore_animation_state) const {
|
| - gfx::Size size(view_->GetPreferredSize());
|
| - if (!ignore_animation_state) {
|
| - size.set_height(static_cast<int>(static_cast<double>(size.height()) *
|
| - size_animation_->GetCurrentValue()));
|
| - }
|
| - // NOTE: don't use the bounds of the root_view_. On linux changing window
|
| - // size is async. Instead we use the size of the screen.
|
| - gfx::Rect screen_bounds = gfx::Screen::GetMonitorAreaNearestWindow(
|
| - root_view_->GetWidget()->GetNativeView());
|
| - gfx::Point origin(screen_bounds.x() +
|
| - (screen_bounds.width() - size.width()) / 2,
|
| - screen_bounds.y());
|
| - return gfx::Rect(origin, size);
|
| -}
|
|
|