window_slider.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/web_contents/aura/window_slider.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <algorithm>
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/bind.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/callback.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/web_contents/aura/shadow_layer_delegate.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/overscroll_configuration.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/window.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/compositor/layer_animation_observer.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace content {
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace {
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void DeleteLayerAndShadow(ui::Layer* layer,
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          ShadowLayerDelegate* shadow) {
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  delete shadow;
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  delete layer;
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// An animation observer that runs a callback at the end of the animation, and
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// destroys itself.
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CallbackAnimationObserver : public ui::ImplicitAnimationObserver {
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CallbackAnimationObserver(const base::Closure& closure)
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : closure_(closure) {
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~CallbackAnimationObserver() {}
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Overridden from ui::ImplicitAnimationObserver:
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnImplicitAnimationsCompleted() OVERRIDE {
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!closure_.is_null())
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      closure_.Run();
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::Closure closure_;
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CallbackAnimationObserver);
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)WindowSlider::WindowSlider(Delegate* delegate,
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           aura::Window* event_window,
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           aura::Window* owner)
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : delegate_(delegate),
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      event_window_(event_window),
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      owner_(owner),
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      delta_x_(0.f),
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      weak_factory_(this),
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      active_start_threshold_(0.f),
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      start_threshold_touchscreen_(content::GetOverscrollConfig(
63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          content::OVERSCROLL_CONFIG_HORIZ_THRESHOLD_START_TOUCHSCREEN)),
64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      start_threshold_touchpad_(content::GetOverscrollConfig(
65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          content::OVERSCROLL_CONFIG_HORIZ_THRESHOLD_START_TOUCHPAD)),
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      complete_threshold_(content::GetOverscrollConfig(
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          content::OVERSCROLL_CONFIG_HORIZ_THRESHOLD_COMPLETE)) {
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  event_window_->AddPreTargetHandler(this);
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  event_window_->AddObserver(this);
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  owner_->AddObserver(this);
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)WindowSlider::~WindowSlider() {
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (event_window_) {
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    event_window_->RemovePreTargetHandler(this);
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    event_window_->RemoveObserver(this);
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (owner_)
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    owner_->RemoveObserver(this);
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  delegate_->OnWindowSliderDestroyed();
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::ChangeOwner(aura::Window* new_owner) {
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (owner_)
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    owner_->RemoveObserver(this);
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  owner_ = new_owner;
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (owner_) {
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    owner_->AddObserver(this);
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    UpdateForScroll(0.f, 0.f);
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool WindowSlider::IsSlideInProgress() const {
95424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return fabs(delta_x_) >= active_start_threshold_ || slider_.get() ||
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      weak_factory_.HasWeakPtrs();
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::SetupSliderLayer() {
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui::Layer* parent = owner_->layer()->parent();
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parent->Add(slider_.get());
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (delta_x_ < 0)
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    parent->StackAbove(slider_.get(), owner_->layer());
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  else
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    parent->StackBelow(slider_.get(), owner_->layer());
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  slider_->SetBounds(owner_->layer()->bounds());
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  slider_->SetVisible(true);
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::UpdateForScroll(float x_offset, float y_offset) {
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  float old_delta = delta_x_;
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  delta_x_ += x_offset;
113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (fabs(delta_x_) < active_start_threshold_ && !slider_.get())
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if ((old_delta < 0 && delta_x_ > 0) ||
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      (old_delta > 0 && delta_x_ < 0)) {
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    slider_.reset();
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    shadow_.reset();
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  float translate = 0.f;
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui::Layer* translate_layer = NULL;
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!slider_.get()) {
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    slider_.reset(delta_x_ < 0 ? delegate_->CreateFrontLayer() :
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 delegate_->CreateBackLayer());
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!slider_.get())
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return;
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SetupSliderLayer();
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (delta_x_ <= -active_start_threshold_) {
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    translate = owner_->bounds().width() +
135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        std::max(delta_x_ + active_start_threshold_,
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 static_cast<float>(-owner_->bounds().width()));
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    translate_layer = slider_.get();
138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  } else if (delta_x_ >= active_start_threshold_) {
139424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    translate = std::min(delta_x_ - active_start_threshold_,
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         static_cast<float>(owner_->bounds().width()));
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    translate_layer = owner_->layer();
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  } else {
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!shadow_.get())
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    shadow_.reset(new ShadowLayerDelegate(translate_layer));
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Transform transform;
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  transform.Translate(translate, 0);
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  translate_layer->SetTransform(transform);
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::UpdateForFling(float x_velocity, float y_velocity) {
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!slider_.get())
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int width = owner_->bounds().width();
159424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  float ratio = (fabs(delta_x_) - active_start_threshold_) / width;
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (ratio < complete_threshold_) {
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ResetScroll();
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui::Layer* sliding = delta_x_ < 0 ? slider_.get() : owner_->layer();
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui::ScopedLayerAnimationSettings settings(sliding->GetAnimator());
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  settings.SetPreemptionStrategy(
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  settings.SetTweenType(gfx::Tween::EASE_OUT);
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  settings.AddObserver(new CallbackAnimationObserver(
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&WindowSlider::CompleteWindowSlideAfterAnimation,
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 weak_factory_.GetWeakPtr())));
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Transform transform;
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  transform.Translate(delta_x_ < 0 ? 0 : width, 0);
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  sliding->SetTransform(transform);
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::ResetScroll() {
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!slider_.get())
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Do not trigger any callbacks if this animation replaces any in-progress
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // animation.
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  weak_factory_.InvalidateWeakPtrs();
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Reset the state of the sliding layer.
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (slider_.get()) {
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ui::Layer* layer = slider_.release();
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ui::ScopedLayerAnimationSettings settings(layer->GetAnimator());
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    settings.SetPreemptionStrategy(
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
193d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    settings.SetTweenType(gfx::Tween::EASE_OUT);
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Delete the layer and the shadow at the end of the animation.
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    settings.AddObserver(new CallbackAnimationObserver(
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::Bind(&DeleteLayerAndShadow,
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                   base::Unretained(layer),
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                   base::Unretained(shadow_.release()))));
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    gfx::Transform transform;
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    transform.Translate(delta_x_ < 0 ? layer->bounds().width() : 0, 0);
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    layer->SetTransform(transform);
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Reset the state of the main layer.
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  {
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ui::ScopedLayerAnimationSettings settings(owner_->layer()->GetAnimator());
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    settings.SetPreemptionStrategy(
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    settings.SetTweenType(gfx::Tween::EASE_OUT);
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    settings.AddObserver(new CallbackAnimationObserver(
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::Bind(&WindowSlider::AbortWindowSlideAfterAnimation,
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                   weak_factory_.GetWeakPtr())));
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    owner_->layer()->SetTransform(gfx::Transform());
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    owner_->layer()->SetLayerBrightness(0.f);
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  delta_x_ = 0.f;
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::CancelScroll() {
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ResetScroll();
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::CompleteWindowSlideAfterAnimation() {
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  weak_factory_.InvalidateWeakPtrs();
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  shadow_.reset();
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  slider_.reset();
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  delta_x_ = 0.f;
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  delegate_->OnWindowSlideComplete();
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::AbortWindowSlideAfterAnimation() {
236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  weak_factory_.InvalidateWeakPtrs();
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  delegate_->OnWindowSlideAborted();
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::OnKeyEvent(ui::KeyEvent* event) {
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CancelScroll();
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::OnMouseEvent(ui::MouseEvent* event) {
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!(event->flags() & ui::EF_IS_SYNTHESIZED))
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    CancelScroll();
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::OnScrollEvent(ui::ScrollEvent* event) {
251424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  active_start_threshold_ = start_threshold_touchpad_;
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (event->type() == ui::ET_SCROLL)
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    UpdateForScroll(event->x_offset_ordinal(), event->y_offset_ordinal());
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  else if (event->type() == ui::ET_SCROLL_FLING_START)
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    UpdateForFling(event->x_offset_ordinal(), event->y_offset_ordinal());
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  else
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    CancelScroll();
2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  event->SetHandled();
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::OnGestureEvent(ui::GestureEvent* event) {
262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  active_start_threshold_ = start_threshold_touchscreen_;
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const ui::GestureEventDetails& details = event->details();
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch (event->type()) {
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_BEGIN:
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ResetScroll();
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_UPDATE:
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      UpdateForScroll(details.scroll_x(), details.scroll_y());
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_END:
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      UpdateForFling(0.f, 0.f);
2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case ui::ET_SCROLL_FLING_START:
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      UpdateForFling(details.velocity_x(), details.velocity_y());
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_BEGIN:
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_UPDATE:
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_END:
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CancelScroll();
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    default:
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  event->SetHandled();
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WindowSlider::OnWindowRemovingFromRootWindow(aura::Window* window) {
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (window == event_window_) {
2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    window->RemoveObserver(this);
2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    window->RemovePreTargetHandler(this);
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    event_window_ = NULL;
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  } else if (window == owner_) {
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    window->RemoveObserver(this);
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    owner_ = NULL;
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    delete this;
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  } else {
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    NOTREACHED();
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace content
309