blob: 353e881f2e075bbc4528730038c2dc7df63bd0a1 [file] [log] [blame]
// Copyright (c) 2012 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.
#ifndef CHROME_BROWSER_UI_VIEWS_ASH_TAB_SCRUBBER_H_
#define CHROME_BROWSER_UI_VIEWS_ASH_TAB_SCRUBBER_H_
#include "base/timer/timer.h"
#include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
#include "chrome/browser/ui/views/tabs/tab_strip_observer.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "ui/events/event_handler.h"
class Browser;
class TabStrip;
namespace gfx {
class Point;
}
// Class to enable quick tab switching via Ctrl-left-drag.
// Notes: this is experimental, and disables ctrl-clicks. It should not be
// enabled other than through flags until we implement 3 finger drag as the
// mechanism to invoke it. At that point we will add test coverage.
class TabScrubber : public ui::EventHandler,
public content::NotificationObserver,
public TabStripObserver {
public:
enum Direction {LEFT, RIGHT};
// Returns a the single instance of a TabScrubber.
static TabScrubber* GetInstance();
// Returns the virtual position of a swipe starting in the tab at |index|,
// base on the |direction|.
static gfx::Point GetStartPoint(TabStrip* tab_strip,
int index,
TabScrubber::Direction direction);
void set_activation_delay(int activation_delay) {
activation_delay_ = activation_delay;
use_default_activation_delay_ = false;
}
int activation_delay() const { return activation_delay_; }
int highlighted_tab() const { return highlighted_tab_; }
bool IsActivationPending();
private:
TabScrubber();
virtual ~TabScrubber();
// ui::EventHandler overrides:
virtual void OnScrollEvent(ui::ScrollEvent* event) override;
// content::NotificationObserver overrides:
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) override;
// TabStripObserver overrides.
virtual void TabStripAddedTabAt(TabStrip* tab_strip, int index) override;
virtual void TabStripMovedTab(TabStrip* tab_strip,
int from_index,
int to_index) override;
virtual void TabStripRemovedTabAt(TabStrip* tab_strip, int index) override;
virtual void TabStripDeleted(TabStrip* tab_strip) override;
Browser* GetActiveBrowser();
void FinishScrub(bool activate);
// Are we currently scrubbing?.
bool scrubbing_;
// The last browser we used for scrubbing, NULL if |scrubbing_| is
// false and there is no pending work.
Browser* browser_;
// The current accumulated x and y positions of a swipe, in
// the coordinates of the TabStrip of |browser_|
float swipe_x_;
float swipe_y_;
// The direction the current swipe is headed.
Direction swipe_direction_;
// The index of the tab that is currently highlighted.
int highlighted_tab_;
// Timer to control a delayed activation of the |highlighted_tab_|.
base::Timer activate_timer_;
// Time to wait in ms before newly selected tab becomes active.
int activation_delay_;
// Set if activation_delay had been explicitly set.
bool use_default_activation_delay_;
// Forces the tabs to be revealed if we are in immersive fullscreen.
scoped_ptr<ImmersiveRevealedLock> immersive_reveal_lock_;
content::NotificationRegistrar registrar_;
base::WeakPtrFactory<TabScrubber> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(TabScrubber);
};
#endif // CHROME_BROWSER_UI_VIEWS_ASH_TAB_SCRUBBER_H_