xlnt
selection.hpp
1 // Copyright (c) 2014-2022 Thomas Fussell
2 // Copyright (c) 2024-2025 xlnt-community
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining a copy
5 // of this software and associated documentation files (the "Software"), to deal
6 // in the Software without restriction, including without limitation the rights
7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 // copies of the Software, and to permit persons to whom the Software is
9 // furnished to do so, subject to the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be included in
12 // all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 // THE SOFTWARE
21 //
22 // @license: http://www.opensource.org/licenses/mit-license.php
23 // @author: see AUTHORS file
24 
25 #pragma once
26 
27 #include <vector>
28 
29 #include <xlnt/xlnt_config.hpp>
30 #include <xlnt/cell/cell_reference.hpp>
31 #include <xlnt/worksheet/pane.hpp>
32 #include <xlnt/worksheet/range_reference.hpp>
33 #include <xlnt/utils/exceptions.hpp>
34 #include <xlnt/utils/optional.hpp>
35 
36 namespace xlnt {
37 
41 class XLNT_API selection
42 {
43 public:
47  explicit selection() = default;
48 
53  explicit selection(pane_corner quadrant, cell_reference active_cell)
54  : active_cell_(active_cell), sqref_({range_reference(active_cell, active_cell)}), pane_(quadrant)
55  {
56  }
57 
62  explicit selection(pane_corner quadrant, cell_reference active_cell, range_reference selected)
63  : active_cell_(active_cell), sqref_({selected}), pane_(quadrant)
64  {
65  }
66 
70  bool has_active_cell() const
71  {
72  return active_cell_.is_set();
73  }
74 
79  {
80  return active_cell_.get();
81  }
82 
86  void active_cell(const cell_reference &ref)
87  {
88  active_cell_ = ref;
89  }
90 
94  bool has_sqref() const
95  {
96  return !sqref_.empty();
97  }
98 
107  XLNT_DEPRECATED range_reference sqref() const
108  {
109  if (!has_sqref())
110  throw invalid_attribute();
111 
112  return sqref_.front();
113  }
114 
118  const std::vector<range_reference>& sqrefs() const
119  {
120  return sqref_;
121  }
122 
126  void sqref(const range_reference &ref)
127  {
128  sqref_ = {ref};
129  }
130 
134  void sqref(const std::vector<range_reference> &ref)
135  {
136  sqref_ = ref;
137  }
138 
144  void sqref(const std::string &ref);
145 
150  {
151  return pane_;
152  }
153 
157  void pane(pane_corner corner)
158  {
159  pane_ = corner;
160  }
161 
166  bool operator==(const selection &rhs) const
167  {
168  return active_cell_ == rhs.active_cell_
169  && sqref_ == rhs.sqref_
170  && pane_ == rhs.pane_;
171  }
172 
173 private:
177  optional<cell_reference> active_cell_;
178 
183  std::vector<range_reference> sqref_;
184 
188  pane_corner pane_ = pane_corner::top_left;
189 };
190 
191 } // namespace xlnt
void sqref(const range_reference &ref)
Sets the range encompassed by this selection.
Definition: selection.hpp:126
bool has_sqref() const
Returns true if this selection has a defined sqref.
Definition: selection.hpp:94
pane_corner pane() const
Returns the sheet quadrant of this selection.
Definition: selection.hpp:149
void pane(pane_corner corner)
Sets the sheet quadrant of this selection to corner.
Definition: selection.hpp:157
The selected area of a worksheet.
Definition: selection.hpp:41
Enumerates the possible types a cell can be determined by it&#39;s current value.
Definition: cell.hpp:37
const std::vector< range_reference > & sqrefs() const
Returns the range encompassed by this selection.
Definition: selection.hpp:118
selection(pane_corner quadrant, cell_reference active_cell, range_reference selected)
ctor with selected range sqref must contain active_cell
Definition: selection.hpp:62
An object used to refer to a cell. References have two parts, the column and the row. In Excel, the reference string A1 refers to the top-left-most cell. A cell_reference can be initialized from a string of this form or a 1-indexed ordered pair of the form column, row.
Definition: cell_reference.hpp:60
Exception when setting a class&#39;s attribute to an invalid value
Definition: exceptions.hpp:240
void active_cell(const cell_reference &ref)
Sets the active cell to that pointed to by ref.
Definition: selection.hpp:86
pane_corner
Enumeration of the four quadrants of a worksheet
Definition: pane.hpp:48
Many settings in xlnt are allowed to not have a value set. This class encapsulates a value which may ...
Definition: format.hpp:44
bool has_active_cell() const
Returns true if this selection has a defined active cell.
Definition: selection.hpp:70
bool operator==(const selection &rhs) const
Returns true if this selection is equal to rhs based on its active cell, sqref, and pane...
Definition: selection.hpp:166
selection(pane_corner quadrant, cell_reference active_cell)
ctor when no range selected sqref == active_cell
Definition: selection.hpp:53
A range_reference describes a rectangular area of a worksheet with positive width and height defined ...
Definition: range_reference.hpp:36
cell_reference active_cell() const
Returns the cell reference of the active cell.
Definition: selection.hpp:78
void sqref(const std::vector< range_reference > &ref)
Sets the range encompassed by this selection.
Definition: selection.hpp:134
XLNT_DEPRECATED range_reference sqref() const
Returns the range encompassed by this selection. If the range contains multiple (non-contiguous) regi...
Definition: selection.hpp:107