Home | History | Annotate | Download | only in overview
      1 // Copyright 2013 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 ASH_WM_OVERVIEW_WINDOW_SELECTOR_H_
      6 #define ASH_WM_OVERVIEW_WINDOW_SELECTOR_H_
      7 
      8 #include <set>
      9 #include <vector>
     10 
     11 #include "ash/ash_export.h"
     12 #include "base/compiler_specific.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "base/memory/scoped_vector.h"
     15 #include "base/time/time.h"
     16 #include "ui/aura/window_observer.h"
     17 #include "ui/aura/window_tracker.h"
     18 #include "ui/events/event_handler.h"
     19 #include "ui/gfx/display_observer.h"
     20 #include "ui/views/controls/textfield/textfield_controller.h"
     21 #include "ui/wm/public/activation_change_observer.h"
     22 
     23 namespace aura {
     24 class RootWindow;
     25 class Window;
     26 }
     27 
     28 namespace gfx {
     29 class Rect;
     30 }
     31 
     32 namespace ui {
     33 class LocatedEvent;
     34 }
     35 
     36 namespace views {
     37 class Textfield;
     38 class Widget;
     39 }
     40 
     41 namespace ash {
     42 class WindowSelectorDelegate;
     43 class WindowSelectorItem;
     44 class WindowSelectorTest;
     45 class WindowGrid;
     46 
     47 // The WindowSelector shows a grid of all of your windows, allowing to select
     48 // one by clicking or tapping on it.
     49 class ASH_EXPORT WindowSelector
     50     : public gfx::DisplayObserver,
     51       public aura::WindowObserver,
     52       public aura::client::ActivationChangeObserver,
     53       public views::TextfieldController {
     54  public:
     55   // The distance between the top edge of the screen and the bottom edge of
     56   // the text filtering textfield.
     57   static const int kTextFilterBottomEdge;
     58 
     59   enum Direction {
     60     LEFT,
     61     UP,
     62     RIGHT,
     63     DOWN
     64   };
     65 
     66   typedef std::vector<aura::Window*> WindowList;
     67   typedef ScopedVector<WindowSelectorItem> WindowSelectorItemList;
     68 
     69   WindowSelector(const WindowList& windows,
     70                  WindowSelectorDelegate* delegate);
     71   virtual ~WindowSelector();
     72 
     73   // Cancels window selection.
     74   void CancelSelection();
     75 
     76   // Called when the last window selector item from a grid is deleted.
     77   void OnGridEmpty(WindowGrid* grid);
     78 
     79   // gfx::DisplayObserver:
     80   virtual void OnDisplayAdded(const gfx::Display& display) OVERRIDE;
     81   virtual void OnDisplayRemoved(const gfx::Display& display) OVERRIDE;
     82   virtual void OnDisplayMetricsChanged(const gfx::Display& display,
     83                                        uint32_t metrics) OVERRIDE;
     84 
     85   // aura::WindowObserver:
     86   virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE;
     87   virtual void OnWindowDestroying(aura::Window* window) OVERRIDE;
     88 
     89   // aura::client::ActivationChangeObserver:
     90   virtual void OnWindowActivated(aura::Window* gained_active,
     91                                  aura::Window* lost_active) OVERRIDE;
     92   virtual void OnAttemptToReactivateWindow(
     93       aura::Window* request_active,
     94       aura::Window* actual_active) OVERRIDE;
     95 
     96   // views::TextfieldController:
     97   virtual void ContentsChanged(views::Textfield* sender,
     98                                const base::string16& new_contents) OVERRIDE;
     99   virtual bool HandleKeyEvent(views::Textfield* sender,
    100                               const ui::KeyEvent& key_event) OVERRIDE;
    101 
    102  private:
    103   friend class WindowSelectorTest;
    104 
    105   // Begins positioning windows such that all windows are visible on the screen.
    106   void StartOverview();
    107 
    108   // Position all of the windows in the overview.
    109   void PositionWindows(bool animate);
    110 
    111   // Hide and track all hidden windows not in the overview item list.
    112   void HideAndTrackNonOverviewWindows();
    113 
    114   // |focus|, restores focus to the stored window.
    115   void ResetFocusRestoreWindow(bool focus);
    116 
    117   // Helper function that moves the selection widget to |direction| on the
    118   // corresponding window grid.
    119   void Move(Direction direction, bool animate);
    120 
    121   // Tracks observed windows.
    122   std::set<aura::Window*> observed_windows_;
    123 
    124   // Weak pointer to the selector delegate which will be called when a
    125   // selection is made.
    126   WindowSelectorDelegate* delegate_;
    127 
    128   // A weak pointer to the window which was focused on beginning window
    129   // selection. If window selection is canceled the focus should be restored to
    130   // this window.
    131   aura::Window* restore_focus_window_;
    132 
    133   // True when performing operations that may cause window activations. This is
    134   // used to prevent handling the resulting expected activation.
    135   bool ignore_activations_;
    136 
    137   // List of all the window overview grids, one for each root window.
    138   ScopedVector<WindowGrid> grid_list_;
    139 
    140   // Tracks windows which were hidden because they were not part of the
    141   // overview.
    142   aura::WindowTracker hidden_windows_;
    143 
    144   // Tracks the index of the root window the selection widget is in.
    145   size_t selected_grid_index_;
    146 
    147   // The following variables are used for metric collection purposes. All of
    148   // them refer to this particular overview session and are not cumulative:
    149   // The time when overview was started.
    150   base::Time overview_start_time_;
    151 
    152   // The number of arrow key presses.
    153   size_t num_key_presses_;
    154 
    155   // The number of items in the overview.
    156   size_t num_items_;
    157 
    158   // Indicates if we are showing the selection widget.
    159   bool showing_selection_widget_;
    160 
    161   // Window text filter widget. As the user writes on it, we filter the items
    162   // in the overview. It is also responsible for handling overview key events,
    163   // such as enter key to select.
    164   scoped_ptr<views::Widget> text_filter_widget_;
    165 
    166   // The current length of the string entered into the text filtering textfield.
    167   size_t text_filter_string_length_;
    168 
    169   // The number of times the text filtering textfield has been cleared of text
    170   // during this overview mode session.
    171   size_t num_times_textfield_cleared_;
    172 
    173   DISALLOW_COPY_AND_ASSIGN(WindowSelector);
    174 };
    175 
    176 }  // namespace ash
    177 
    178 #endif  // ASH_WM_OVERVIEW_WINDOW_SELECTOR_H_
    179