15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef UI_BASE_MODELS_LIST_SELECTION_MODEL_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define UI_BASE_MODELS_LIST_SELECTION_MODEL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_export.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ui {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Selection model represented as a list of ints. Used by the TabStrip. In
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// addition to the set of selected indices ListSelectionModel maintains the
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// following:
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// active: the index of the currently visible tab in the tab strip.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// anchor: the index of the last tab the user clicked on. Extending the
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// selection extends it from this index.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Typically there is only one selected item, in which case the anchor and
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// active index correspond to the same thing.
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT ListSelectionModel {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<int> SelectedIndices;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to identify no selection.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kUnselectedIndex;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ListSelectionModel();
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~ListSelectionModel();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See class description for details of the anchor.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_anchor(int anchor) { anchor_ = anchor; }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int anchor() const { return anchor_; }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See class description for details of active.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_active(int active) { active_ = active; }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int active() const { return active_; }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if nothing is selected.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool empty() const { return selected_indices_.empty(); }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Number of selected indices.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size() const { return selected_indices_.size(); }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increments all indices >= |index|. For example, if the selection consists
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of [0, 1, 5] and this is invoked with 1, it results in [0, 2, 6]. This also
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates the anchor and active indices.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is used when a new tab is inserted into the tabstrip.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IncrementFrom(int index);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Shifts all indices > |index| down by 1. If |index| is selected, it is
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // removed. For example, if the selection consists of [0, 1, 5] and this is
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invoked with 1, it results in [0, 4]. This is used when a tab is removed
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from the tabstrip.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DecrementFrom(int index);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the anchor, active and selection to |index|.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSelectedIndex(int index);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if |index| is selected.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsSelected(int index) const;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds |index| to the selection. This does not change the active or anchor
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // indices.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddIndexToSelection(int index);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes |index| from the selection. This does not change the active or
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // anchor indices.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveIndexFromSelection(int index);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extends the selection from the anchor to |index|. If the anchor is empty,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this sets the anchor, selection and active indices to |index|.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSelectionFromAnchorTo(int index);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes sure the indices from the anchor to |index| are selected. This only
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // adds to the selection.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddSelectionFromAnchorTo(int index);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when an item moves. |from| is the original index, and |to| the
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // target index.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: this matches the TabStripModel API. If moving to a greater index,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |to| should be the index *after* removing |from|. For example, consider
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // three tabs 'A B C', to move A to the end of the list, this should be
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invoked with '0, 2'.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Move(int from, int to);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the anchor and active to kUnselectedIndex, and removes all the
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // selected indices.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Clear();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the selected indices. The selection is always ordered in acending
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // order.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SelectedIndices& selected_indices() const { return selected_indices_; }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies the selection from |source| to this.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Copy(const ListSelectionModel& source);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compares this selection with |rhs|.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool Equals(const ListSelectionModel& rhs) const;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SelectedIndices selected_indices_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int active_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int anchor_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ListSelectionModel);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ui
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // UI_BASE_MODELS_LIST_SELECTION_MODEL_H_
117