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