// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_TABS_TAB_STRIP_SELECTION_MODEL_H_ #define CHROME_BROWSER_TABS_TAB_STRIP_SELECTION_MODEL_H_ #pragma once #include <vector> #include "base/basictypes.h" // Selection model used by the tab strip. In addition to the set of selected // indices TabStripSelectionModel maintains the following: // active: the index of the currently visible tab in the tab strip. // anchor: the index of the last tab the user clicked on. Extending the // selection extends it from this index. // // Typically there is only one selected tab in the tabstrip, in which case the // anchor and active index correspond to the same thing. class TabStripSelectionModel { public: typedef std::vector<int> SelectedIndices; // Used to identify no selection. static const int kUnselectedIndex; TabStripSelectionModel(); ~TabStripSelectionModel(); // See class description for details of the anchor. void set_anchor(int anchor) { anchor_ = anchor; } int anchor() const { return anchor_; } // See class description for details of active. void set_active(int active) { active_ = active; } int active() const { return active_; } // True if nothing is selected. bool empty() const { return selected_indices_.empty(); } // Number of selected indices. size_t size() const { return selected_indices_.size(); } // Increments all indices >= |index|. For example, if the selection consists // of [0, 1, 5] and this is invoked with 1, it results in [0, 2, 6]. This also // updates the anchor and active indices. // This is used when a new tab is inserted into the tabstrip. void IncrementFrom(int index); // Shifts all indices < |index| down by 1. If |index| is selected, it is // removed. For example, if the selection consists of [0, 1, 5] and this is // invoked with 1, it results in [0, 4]. This is used when a tab is removed // from the tabstrip. void DecrementFrom(int index); // Sets the anchor, active and selection to |index|. void SetSelectedIndex(int index); // Returns true if |index| is selected. bool IsSelected(int index) const; // Adds |index| to the selection. This does not change the active or anchor // indices. void AddIndexToSelection(int index); // Removes |index| from the selection. This does not change the active or // anchor indices. void RemoveIndexFromSelection(int index); // Extends the selection from the anchor to |index|. If the anchor is empty, // this sets the anchor, selection and active indices to |index|. void SetSelectionFromAnchorTo(int index); // Makes sure the indices from the anchor to |index| are selected. This only // adds to the selection. void AddSelectionFromAnchorTo(int index); // Invoked when an item moves. |from| is the original index, and |to| the // target index. // NOTE: this matches the TabStripModel API. If moving to a greater index, // |to| should be the index *after* removing |from|. For example, consider // three tabs 'A B C', to move A to the end of the list, this should be // invoked with '0, 2'. void Move(int from, int to); // Sets the anchor and active to kUnselectedIndex, and removes all the // selected indices. void Clear(); // Returns the selected indices. The selection is always ordered in acending // order. const SelectedIndices& selected_indices() const { return selected_indices_; } // Copies the selection from |source| to this. void Copy(const TabStripSelectionModel& source); private: SelectedIndices selected_indices_; int active_; int anchor_; DISALLOW_COPY_AND_ASSIGN(TabStripSelectionModel); }; #endif // CHROME_BROWSER_TABS_TAB_STRIP_SELECTION_MODEL_H_