• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 UI_BASE_MODELS_LIST_SELECTION_MODEL_H_
6 #define UI_BASE_MODELS_LIST_SELECTION_MODEL_H_
7 
8 #include <vector>
9 
10 #include "base/basictypes.h"
11 #include "ui/base/ui_base_export.h"
12 
13 namespace ui {
14 
15 // Selection model represented as a list of ints. Used by the TabStrip. In
16 // addition to the set of selected indices ListSelectionModel maintains the
17 // following:
18 // active: the index of the currently visible tab in the tab strip.
19 // anchor: the index of the last tab the user clicked on. Extending the
20 // selection extends it from this index.
21 //
22 // Typically there is only one selected item, in which case the anchor and
23 // active index correspond to the same thing.
24 class UI_BASE_EXPORT ListSelectionModel {
25  public:
26   typedef std::vector<int> SelectedIndices;
27 
28   // Used to identify no selection.
29   static const int kUnselectedIndex;
30 
31   ListSelectionModel();
32   ~ListSelectionModel();
33 
34   // See class description for details of the anchor.
set_anchor(int anchor)35   void set_anchor(int anchor) { anchor_ = anchor; }
anchor()36   int anchor() const { return anchor_; }
37 
38   // See class description for details of active.
set_active(int active)39   void set_active(int active) { active_ = active; }
active()40   int active() const { return active_; }
41 
42   // True if nothing is selected.
empty()43   bool empty() const { return selected_indices_.empty(); }
44 
45   // Number of selected indices.
size()46   size_t size() const { return selected_indices_.size(); }
47 
48   // Increments all indices >= |index|. For example, if the selection consists
49   // of [0, 1, 5] and this is invoked with 1, it results in [0, 2, 6]. This also
50   // updates the anchor and active indices.
51   // This is used when a new tab is inserted into the tabstrip.
52   void IncrementFrom(int index);
53 
54   // Shifts all indices > |index| down by 1. If |index| is selected, it is
55   // removed. For example, if the selection consists of [0, 1, 5] and this is
56   // invoked with 1, it results in [0, 4]. This is used when a tab is removed
57   // from the tabstrip.
58   void DecrementFrom(int index);
59 
60   // Sets the anchor, active and selection to |index|.
61   void SetSelectedIndex(int index);
62 
63   // Returns true if |index| is selected.
64   bool IsSelected(int index) const;
65 
66   // Adds |index| to the selection. This does not change the active or anchor
67   // indices.
68   void AddIndexToSelection(int index);
69 
70   // Removes |index| from the selection. This does not change the active or
71   // anchor indices.
72   void RemoveIndexFromSelection(int index);
73 
74   // Extends the selection from the anchor to |index|. If the anchor is empty,
75   // this sets the anchor, selection and active indices to |index|.
76   void SetSelectionFromAnchorTo(int index);
77 
78   // Makes sure the indices from the anchor to |index| are selected. This only
79   // adds to the selection.
80   void AddSelectionFromAnchorTo(int index);
81 
82   // Invoked when an item moves. |from| is the original index, and |to| the
83   // target index.
84   // NOTE: this matches the TabStripModel API. If moving to a greater index,
85   // |to| should be the index *after* removing |from|. For example, consider
86   // three tabs 'A B C', to move A to the end of the list, this should be
87   // invoked with '0, 2'.
88   void Move(int from, int to);
89 
90   // Sets the anchor and active to kUnselectedIndex, and removes all the
91   // selected indices.
92   void Clear();
93 
94   // Returns the selected indices. The selection is always ordered in acending
95   // order.
selected_indices()96   const SelectedIndices& selected_indices() const { return selected_indices_; }
97 
98   // Copies the selection from |source| to this.
99   void Copy(const ListSelectionModel& source);
100 
101   // Compares this selection with |rhs|.
102   bool Equals(const ListSelectionModel& rhs) const;
103 
104  private:
105   SelectedIndices selected_indices_;
106 
107   int active_;
108 
109   int anchor_;
110 
111   DISALLOW_COPY_AND_ASSIGN(ListSelectionModel);
112 };
113 
114 }  // namespace ui
115 
116 #endif  // UI_BASE_MODELS_LIST_SELECTION_MODEL_H_
117