| // Copyright (c) 2012 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. |
| |
| #include "ui/gfx/selection_model.h" |
| |
| #include <ostream> |
| |
| #include "base/check.h" |
| #include "base/format_macros.h" |
| #include "base/strings/stringprintf.h" |
| |
| namespace gfx { |
| |
| SelectionModel::SelectionModel() |
| : selection_(0), |
| caret_affinity_(CURSOR_BACKWARD) {} |
| |
| SelectionModel::SelectionModel(size_t position, LogicalCursorDirection affinity) |
| : selection_(position), |
| caret_affinity_(affinity) {} |
| |
| SelectionModel::SelectionModel(const Range& selection, |
| LogicalCursorDirection affinity) |
| : selection_(selection), |
| caret_affinity_(affinity) {} |
| |
| SelectionModel::SelectionModel(const std::vector<Range>& selections, |
| LogicalCursorDirection affinity) |
| : selection_(selections[0]), caret_affinity_(affinity) { |
| for (size_t i = 1; i < selections.size(); ++i) |
| AddSecondarySelection(selections[i]); |
| } |
| |
| SelectionModel::SelectionModel(const SelectionModel& selection_model) = default; |
| |
| SelectionModel::~SelectionModel() = default; |
| |
| void SelectionModel::AddSecondarySelection(const Range& selection) { |
| for (auto s : GetAllSelections()) |
| DCHECK(!selection.Intersects(s)); |
| secondary_selections_.push_back(selection); |
| } |
| |
| std::vector<Range> SelectionModel::GetAllSelections() const { |
| std::vector<Range> selections = {selection()}; |
| selections.insert(selections.end(), secondary_selections_.begin(), |
| secondary_selections_.end()); |
| return selections; |
| } |
| |
| bool SelectionModel::operator==(const SelectionModel& sel) const { |
| return selection() == sel.selection() && |
| caret_affinity() == sel.caret_affinity() && |
| secondary_selections() == sel.secondary_selections(); |
| } |
| |
| std::string SelectionModel::ToString() const { |
| std::string str = "{"; |
| if (selection().is_empty()) |
| base::StringAppendF(&str, "%" PRIuS, caret_pos()); |
| else |
| str += selection().ToString(); |
| const bool backward = caret_affinity() == CURSOR_BACKWARD; |
| str += (backward ? ",BACKWARD" : ",FORWARD"); |
| for (auto selection : secondary_selections()) { |
| str += ","; |
| if (selection.is_empty()) |
| base::StringAppendF(&str, "%" PRIu32, selection.end()); |
| else |
| str += selection.ToString(); |
| } |
| return str + "}"; |
| } |
| |
| std::ostream& operator<<(std::ostream& out, const SelectionModel& model) { |
| out << model.ToString(); |
| return out; |
| } |
| |
| } // namespace gfx |