// 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 #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& 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 SelectionModel::GetAllSelections() const { std::vector 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