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