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