1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_SC_INC_RANGENAM_HXX
21 #define INCLUDED_SC_INC_RANGENAM_HXX
24 #include "address.hxx"
25 #include <formula/grammar.hxx>
27 #include "calcmacros.hxx"
38 struct RefUpdateContext
;
39 struct RefUpdateInsertTabContext
;
40 struct RefUpdateDeleteTabContext
;
41 struct RefUpdateMoveTabContext
;
42 class CompileFormulaContext
;
49 enum class Type
//specialization to typed_flags outside of class
64 OUString aUpperName
; // #i62977# for faster searching (aName is never modified after ctor)
65 OUString maNewName
; ///< used for formulas after changing names in the dialog
66 std::unique_ptr
<ScTokenArray
>
71 formula::FormulaGrammar::Grammar eTempGrammar
; // needed for unresolved XML compiles
73 bool bModified
; // is set/cleared by UpdateReference
75 // max row and column to use for wrapping of references. If -1 use the
76 // application's default.
80 void CompileRangeData( const OUString
& rSymbol
, bool bSetError
);
84 typedef ::std::map
<sal_uInt16
, sal_uInt16
> IndexMap
;
86 SC_DLLPUBLIC
ScRangeData( ScDocument
* pDoc
,
87 const OUString
& rName
,
88 const OUString
& rSymbol
,
89 const ScAddress
& rAdr
= ScAddress(),
90 Type nType
= Type::Name
,
91 const formula::FormulaGrammar::Grammar eGrammar
= formula::FormulaGrammar::GRAM_DEFAULT
);
92 SC_DLLPUBLIC
ScRangeData( ScDocument
* pDoc
,
93 const OUString
& rName
,
94 const ScTokenArray
& rArr
,
95 const ScAddress
& rAdr
= ScAddress(),
96 Type nType
= Type::Name
);
97 SC_DLLPUBLIC
ScRangeData( ScDocument
* pDoc
,
98 const OUString
& rName
,
99 const ScAddress
& rTarget
);
100 // rTarget is ABSPOS jump label
102 /* Exact copy, not recompiled, no other index (!), nothing.. except if
103 * pDocument or pPos are passed, those values are assigned instead of the
105 ScRangeData( const ScRangeData
& rScRangeData
, ScDocument
* pDocument
= nullptr, const ScAddress
* pPos
= nullptr );
107 SC_DLLPUBLIC
~ScRangeData();
109 bool operator== (const ScRangeData
& rData
) const;
111 void GetName( OUString
& rName
) const { rName
= maNewName
.isEmpty() ? aName
: maNewName
; }
112 const OUString
& GetName() const { return maNewName
.isEmpty() ? aName
: maNewName
; }
113 const OUString
& GetUpperName() const { return aUpperName
; }
114 const ScAddress
& GetPos() const { return aPos
; }
115 // The index has to be unique. If index=0 a new index value is assigned.
116 void SetIndex( sal_uInt16 nInd
) { nIndex
= nInd
; }
117 sal_uInt16
GetIndex() const { return nIndex
; }
118 /// Does not change the name, but sets maNewName for formula update after dialog.
119 void SetNewName( const OUString
& rNewName
) { maNewName
= rNewName
; }
120 ScTokenArray
* GetCode() { return pCode
.get(); }
121 SC_DLLPUBLIC
void SetCode( ScTokenArray
& );
122 const ScTokenArray
* GetCode() const { return pCode
.get(); }
123 SC_DLLPUBLIC FormulaError
GetErrCode() const;
124 bool HasReferences() const;
125 void AddType( Type nType
);
126 Type
GetType() const { return eType
; }
127 bool HasType( Type nType
) const;
128 sal_uInt32
GetUnoType() const;
129 SC_DLLPUBLIC
void GetSymbol( OUString
& rSymbol
, const formula::FormulaGrammar::Grammar eGrammar
= formula::FormulaGrammar::GRAM_DEFAULT
) const;
130 SC_DLLPUBLIC
void GetSymbol( OUString
& rSymbol
, const ScAddress
& rPos
, const formula::FormulaGrammar::Grammar eGrammar
= formula::FormulaGrammar::GRAM_DEFAULT
) const;
131 void UpdateSymbol( OUStringBuffer
& rBuffer
, const ScAddress
& );
134 * @param nLocalTab sheet index where this name belongs, or -1 for global
137 void UpdateReference( sc::RefUpdateContext
& rCxt
, SCTAB nLocalTab
);
138 bool IsModified() const { return bModified
; }
140 SC_DLLPUBLIC
void GuessPosition();
142 void UpdateTranspose( const ScRange
& rSource
, const ScAddress
& rDest
);
143 void UpdateGrow( const ScRange
& rArea
, SCCOL nGrowX
, SCROW nGrowY
);
145 SC_DLLPUBLIC
bool IsReference( ScRange
& rRef
) const;
146 bool IsReference( ScRange
& rRef
, const ScAddress
& rPos
) const;
147 SC_DLLPUBLIC
bool IsValidReference( ScRange
& rRef
) const;
148 bool IsRangeAtBlock( const ScRange
& ) const;
150 void UpdateInsertTab( sc::RefUpdateInsertTabContext
& rCxt
, SCTAB nLocalTab
);
151 void UpdateDeleteTab( sc::RefUpdateDeleteTabContext
& rCxt
, SCTAB nLocalTab
);
152 void UpdateMoveTab( sc::RefUpdateMoveTabContext
& rCxt
, SCTAB nLocalTab
);
154 void ValidateTabRefs();
156 static void MakeValidName( OUString
& rName
);
157 SC_DLLPUBLIC
static bool IsNameValid( const OUString
& rName
, ScDocument
* pDoc
);
159 SCROW
GetMaxRow() const;
160 SCCOL
GetMaxCol() const;
162 void CompileUnresolvedXML( sc::CompileFormulaContext
& rCxt
);
164 #if DEBUG_FORMULA_COMPILER
170 template<> struct typed_flags
<ScRangeData::Type
> : is_typed_flags
<ScRangeData::Type
, 0xff> {};
174 inline void ScRangeData::AddType( Type nType
)
179 inline bool ScRangeData::HasType( Type nType
) const
181 return ( ( eType
& nType
) == nType
);
184 extern "C" int SAL_CALL
ScRangeData_QsortNameCompare( const void*, const void* );
189 typedef std::vector
<ScRangeData
*> IndexDataType
;
190 typedef ::std::map
<OUString
, std::unique_ptr
<ScRangeData
>> DataType
;
192 IndexDataType maIndexToData
;
195 /// Map that stores non-managed pointers to ScRangeName instances.
196 typedef ::std::map
<SCTAB
, const ScRangeName
*> TabNameCopyMap
;
198 typedef DataType::const_iterator const_iterator
;
199 typedef DataType::iterator iterator
;
202 SC_DLLPUBLIC
ScRangeName(const ScRangeName
& r
);
204 SC_DLLPUBLIC
const ScRangeData
* findByRange(const ScRange
& rRange
) const;
205 SC_DLLPUBLIC ScRangeData
* findByUpperName(const OUString
& rName
);
206 SC_DLLPUBLIC
const ScRangeData
* findByUpperName(const OUString
& rName
) const;
207 SC_DLLPUBLIC ScRangeData
* findByIndex(sal_uInt16 i
) const;
208 void UpdateReference( sc::RefUpdateContext
& rCxt
, SCTAB nLocalTab
= -1 );
209 void UpdateInsertTab( sc::RefUpdateInsertTabContext
& rCxt
, SCTAB nLocalTab
= -1 );
210 void UpdateDeleteTab( sc::RefUpdateDeleteTabContext
& rCxt
, SCTAB nLocalTab
= -1 );
211 void UpdateMoveTab( sc::RefUpdateMoveTabContext
& rCxt
, SCTAB nLocalTab
= -1 );
212 void UpdateTranspose(const ScRange
& rSource
, const ScAddress
& rDest
);
213 void UpdateGrow(const ScRange
& rArea
, SCCOL nGrowX
, SCROW nGrowY
);
215 /** Compile those names that couldn't be resolved during loading and
216 inserting because they may have referred a name that was inserted later.
218 void CompileUnresolvedXML( sc::CompileFormulaContext
& rCxt
);
220 /** Copy names while copying a sheet if they reference the sheet to be copied.
222 Assumes that new sheet was already inserted, global names have been
223 updated/adjusted, but sheet-local names on nOldTab are not, as is the
224 case in ScDocument::CopyTab()
227 -1 when operating on global names, else sheet/tab of
228 sheet-local name scope. The already adjusted tab on which to
232 The original unadjusted tab position.
235 The new tab position.
237 void CopyUsedNames( const SCTAB nLocalTab
, const SCTAB nOldTab
, const SCTAB nNewTab
,
238 const ScDocument
& rOldDoc
, ScDocument
& rNewDoc
, const bool bGlobalNamesToLocal
) const;
240 SC_DLLPUBLIC const_iterator
begin() const;
241 SC_DLLPUBLIC const_iterator
end() const;
242 SC_DLLPUBLIC iterator
begin();
243 SC_DLLPUBLIC iterator
end();
244 SC_DLLPUBLIC
size_t size() const;
247 /** Insert object into set.
248 @ATTENTION: The underlying ::std::map<std::unique_ptr>::insert(p) takes
249 ownership of p and if it can't insert it deletes the object! So, if
250 this insert here returns false the object where p pointed to is gone!
252 @param bReuseFreeIndex
253 If the ScRangeData p points to has an index value of 0:
254 If `TRUE` then reuse a free index slot if available.
255 If `FALSE` then assign a new index slot. The Manage Names
256 dialog uses this so that deleting and adding ranges in the same
257 run is guaranteed to not reuse previously assigned indexes.
259 SC_DLLPUBLIC
bool insert( ScRangeData
* p
, bool bReuseFreeIndex
= true );
261 void erase(const ScRangeData
& r
);
262 void erase(const OUString
& rName
);
265 * Erase by iterator position. Note that this method doesn't check for
266 * iterator's validity. The caller must make sure that the iterator is
269 void erase(const iterator
& itr
);
271 bool operator== (const ScRangeName
& r
) const;
276 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */