Home | History | Annotate | Download | only in overview
      1 // Copyright 2014 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_GRID_H_
      6 #define ASH_WM_OVERVIEW_WINDOW_GRID_H_
      7 
      8 #include <vector>
      9 
     10 #include "ash/wm/overview/window_selector.h"
     11 #include "base/macros.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "ui/aura/window_observer.h"
     14 
     15 namespace aura {
     16 class Window;
     17 }
     18 
     19 namespace views {
     20 class Widget;
     21 }
     22 
     23 namespace ash {
     24 
     25 class WindowSelectorItem;
     26 
     27 // Represents a grid of windows in the Overview Mode in a particular root
     28 // window, and manages a selection widget that can be moved with the arrow keys.
     29 // The idea behind the movement strategy is that it should be possible to access
     30 // any window pressing a given arrow key repeatedly.
     31 // +-------+  +-------+  +-------+
     32 // |   0   |  |   1   |  |   2   |
     33 // +-------+  +-------+  +-------+
     34 // +-------+  +-------+  +-------+
     35 // |   3   |  |   4   |  |   5   |
     36 // +-------+  +-------+  +-------+
     37 // +-------+
     38 // |   6   |
     39 // +-------+
     40 // Example sequences:
     41 //  - Going right to left
     42 //    0, 1, 2, 3, 4, 5, 6
     43 //  - Going "top" to "bottom"
     44 //    0, 3, 6, 1, 4, 2, 5
     45 // The selector is switched to the next window grid (if available) or wrapped if
     46 // it reaches the end of its movement sequence.
     47 class ASH_EXPORT WindowGrid : public aura::WindowObserver {
     48  public:
     49   WindowGrid(aura::Window* root_window,
     50              const std::vector<aura::Window*>& window_list,
     51              WindowSelector* window_selector);
     52   virtual ~WindowGrid();
     53 
     54   // Prepares the windows in this grid for overview. This will restore all
     55   // minimized windows and ensure they are visible.
     56   void PrepareForOverview();
     57 
     58   // Positions all the windows in the grid.
     59   void PositionWindows(bool animate);
     60 
     61   // Updates |selected_index_| according to the specified |direction| and calls
     62   // MoveSelectionWidget(). Returns |true| if the new selection index is out of
     63   // this window grid bounds.
     64   bool Move(WindowSelector::Direction direction);
     65 
     66   // Returns the target selected window, or NULL if there is none selected.
     67   WindowSelectorItem* SelectedWindow() const;
     68 
     69   // Returns true if a window is contained in any of the WindowSelectorItems
     70   // this grid owns.
     71   bool Contains(const aura::Window* window) const;
     72 
     73   // Returns true if the grid has no more windows.
     74   bool empty() const { return window_list_.empty(); }
     75 
     76   // Returns how many window selector items are in the grid.
     77   size_t size() const { return window_list_.size(); }
     78 
     79   // Returns true if the selection widget is active.
     80   bool is_selecting() const { return selection_widget_ != NULL; }
     81 
     82   // Returns the root window in which the grid displays the windows.
     83   const aura::Window* root_window() const { return root_window_; }
     84 
     85   const std::vector<WindowSelectorItem*>& window_list() const {
     86     return window_list_.get();
     87   }
     88 
     89   // aura::WindowObserver:
     90   virtual void OnWindowDestroying(aura::Window* window) OVERRIDE;
     91   // TODO(nsatragno): Handle window bounds changed in WindowSelectorItem.
     92   virtual void OnWindowBoundsChanged(aura::Window* window,
     93                                      const gfx::Rect& old_bounds,
     94                                      const gfx::Rect& new_bounds) OVERRIDE;
     95 
     96  private:
     97   friend class WindowSelectorTest;
     98 
     99   // Internal function to initialize the selection widget.
    100   void InitSelectionWidget(WindowSelector::Direction direction);
    101 
    102   // Moves the selection widget to the specified |direction|.
    103   void MoveSelectionWidget(WindowSelector::Direction direction,
    104                            bool recreate_selection_widget,
    105                            bool out_of_bounds);
    106 
    107   // Moves the selection widget to the targeted window.
    108   void MoveSelectionWidgetToTarget(bool animate);
    109 
    110   // Returns the target bounds of the currently selected item.
    111   const gfx::Rect GetSelectionBounds() const;
    112 
    113   // Root window the grid is in.
    114   aura::Window* root_window_;
    115 
    116   // Pointer to the window selector that spawned this grid.
    117   WindowSelector* window_selector_;
    118 
    119   // Vector containing all the windows in this grid.
    120   ScopedVector<WindowSelectorItem> window_list_;
    121 
    122   // Vector containing the observed windows.
    123   std::set<aura::Window*> observed_windows_;
    124 
    125   // Widget that indicates to the user which is the selected window.
    126   scoped_ptr<views::Widget> selection_widget_;
    127 
    128   // Current selected window position.
    129   size_t selected_index_;
    130 
    131   // Number of columns in the grid.
    132   size_t num_columns_;
    133 
    134   DISALLOW_COPY_AND_ASSIGN(WindowGrid);
    135 };
    136 
    137 }  // namespace ash
    138 
    139 #endif  // ASH_WM_OVERVIEW_WINDOW_GRID_H_
    140