Home | History | Annotate | Download | only in ash
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_VIEWS_ASH_TAB_SCRUBBER_H_
      6 #define CHROME_BROWSER_UI_VIEWS_ASH_TAB_SCRUBBER_H_
      7 
      8 #include "base/timer/timer.h"
      9 #include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
     10 #include "chrome/browser/ui/views/tabs/tab_strip_observer.h"
     11 #include "content/public/browser/notification_observer.h"
     12 #include "content/public/browser/notification_registrar.h"
     13 #include "ui/events/event_handler.h"
     14 
     15 class Browser;
     16 class TabStrip;
     17 
     18 namespace gfx {
     19 class Point;
     20 }
     21 
     22 // Class to enable quick tab switching via Ctrl-left-drag.
     23 // Notes: this is experimental, and disables ctrl-clicks. It should not be
     24 // enabled other than through flags until we implement 3 finger drag as the
     25 // mechanism to invoke it. At that point we will add test coverage.
     26 class TabScrubber : public ui::EventHandler,
     27                     public content::NotificationObserver,
     28                     public TabStripObserver {
     29  public:
     30   enum Direction {LEFT, RIGHT};
     31 
     32   // Returns a the single instance of a TabScrubber.
     33   static TabScrubber* GetInstance();
     34 
     35   // Returns the virtual position of a swipe starting in the tab at |index|,
     36   // base on the |direction|.
     37   static gfx::Point GetStartPoint(TabStrip* tab_strip,
     38                                   int index,
     39                                   TabScrubber::Direction direction);
     40 
     41   void set_activation_delay(int activation_delay) {
     42     activation_delay_ = activation_delay;
     43     use_default_activation_delay_ = false;
     44   }
     45   int activation_delay() const { return activation_delay_; }
     46   int highlighted_tab() const { return highlighted_tab_; }
     47   bool IsActivationPending();
     48 
     49  private:
     50   TabScrubber();
     51   virtual ~TabScrubber();
     52 
     53   // ui::EventHandler overrides:
     54   virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE;
     55 
     56   // content::NotificationObserver overrides:
     57   virtual void Observe(int type,
     58                        const content::NotificationSource& source,
     59                        const content::NotificationDetails& details) OVERRIDE;
     60 
     61   // TabStripObserver overrides.
     62   virtual void TabStripAddedTabAt(TabStrip* tab_strip, int index) OVERRIDE;
     63   virtual void TabStripMovedTab(TabStrip* tab_strip,
     64                                 int from_index,
     65                                 int to_index) OVERRIDE;
     66   virtual void TabStripRemovedTabAt(TabStrip* tab_strip, int index) OVERRIDE;
     67   virtual void TabStripDeleted(TabStrip* tab_strip) OVERRIDE;
     68 
     69   Browser* GetActiveBrowser();
     70   void FinishScrub(bool activate);
     71 
     72   // Are we currently scrubbing?.
     73   bool scrubbing_;
     74   // The last browser we used for scrubbing, NULL if |scrubbing_| is
     75   // false and there is no pending work.
     76   Browser* browser_;
     77   // The current accumulated x and y positions of a swipe, in
     78   // the coordinates of the TabStrip of |browser_|
     79   float swipe_x_;
     80   float swipe_y_;
     81   // The direction the current swipe is headed.
     82   Direction swipe_direction_;
     83   // The index of the tab that is currently highlighted.
     84   int highlighted_tab_;
     85   // Timer to control a delayed activation of the |highlighted_tab_|.
     86   base::Timer activate_timer_;
     87   // Time to wait in ms before newly selected tab becomes active.
     88   int activation_delay_;
     89   // Set if activation_delay had been explicitly set.
     90   bool use_default_activation_delay_;
     91   // Forces the tabs to be revealed if we are in immersive fullscreen.
     92   scoped_ptr<ImmersiveRevealedLock> immersive_reveal_lock_;
     93 
     94   content::NotificationRegistrar registrar_;
     95   base::WeakPtrFactory<TabScrubber> weak_ptr_factory_;
     96 
     97   DISALLOW_COPY_AND_ASSIGN(TabScrubber);
     98 };
     99 
    100 #endif  // CHROME_BROWSER_UI_VIEWS_ASH_TAB_SCRUBBER_H_
    101