xref: /AOO41X/main/sc/source/core/tool/queryparam.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
1*b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*b3f79822SAndrew Rist  * distributed with this work for additional information
6*b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9*b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15*b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17*b3f79822SAndrew Rist  * specific language governing permissions and limitations
18*b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*b3f79822SAndrew Rist  *************************************************************/
21*b3f79822SAndrew Rist 
22*b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "queryparam.hxx"
30cdf0e10cSrcweir 
31cdf0e10cSrcweir using ::std::vector;
32cdf0e10cSrcweir 
33cdf0e10cSrcweir // ============================================================================
34cdf0e10cSrcweir 
ScQueryParamBase()35cdf0e10cSrcweir ScQueryParamBase::ScQueryParamBase()
36cdf0e10cSrcweir {
37cdf0e10cSrcweir     Resize( MAXQUERY );
38cdf0e10cSrcweir     for (sal_uInt16 i=0; i<MAXQUERY; i++)
39cdf0e10cSrcweir         maEntries[i].Clear();
40cdf0e10cSrcweir }
41cdf0e10cSrcweir 
ScQueryParamBase(const ScQueryParamBase & r)42cdf0e10cSrcweir ScQueryParamBase::ScQueryParamBase(const ScQueryParamBase& r) :
43cdf0e10cSrcweir     bHasHeader(r.bHasHeader), bByRow(r.bByRow), bInplace(r.bInplace), bCaseSens(r.bCaseSens),
44cdf0e10cSrcweir     bRegExp(r.bRegExp), bDuplicate(r.bDuplicate), bMixedComparison(r.bMixedComparison),
45cdf0e10cSrcweir     maEntries(r.maEntries)
46cdf0e10cSrcweir {
47cdf0e10cSrcweir }
48cdf0e10cSrcweir 
~ScQueryParamBase()49cdf0e10cSrcweir ScQueryParamBase::~ScQueryParamBase()
50cdf0e10cSrcweir {
51cdf0e10cSrcweir }
52cdf0e10cSrcweir 
GetEntryCount() const53cdf0e10cSrcweir SCSIZE ScQueryParamBase::GetEntryCount() const
54cdf0e10cSrcweir {
55cdf0e10cSrcweir     return maEntries.size();
56cdf0e10cSrcweir }
57cdf0e10cSrcweir 
GetEntry(SCSIZE n) const58cdf0e10cSrcweir ScQueryEntry& ScQueryParamBase::GetEntry(SCSIZE n) const
59cdf0e10cSrcweir {
60cdf0e10cSrcweir     return maEntries[n];
61cdf0e10cSrcweir }
62cdf0e10cSrcweir 
Resize(SCSIZE nNew)63cdf0e10cSrcweir void ScQueryParamBase::Resize(SCSIZE nNew)
64cdf0e10cSrcweir {
65cdf0e10cSrcweir     if ( nNew < MAXQUERY )
66cdf0e10cSrcweir         nNew = MAXQUERY;                // nie weniger als MAXQUERY
67cdf0e10cSrcweir 
68cdf0e10cSrcweir     vector<ScQueryEntry> aNewEntries(nNew);
69cdf0e10cSrcweir     SCSIZE nCopy = ::std::min(maEntries.size(), nNew);
70cdf0e10cSrcweir     for (SCSIZE i=0; i<nCopy; i++)
71cdf0e10cSrcweir         aNewEntries[i] = maEntries[i];
72cdf0e10cSrcweir 
73cdf0e10cSrcweir     maEntries.swap(aNewEntries);
74cdf0e10cSrcweir }
75cdf0e10cSrcweir 
DeleteQuery(SCSIZE nPos)76cdf0e10cSrcweir void ScQueryParamBase::DeleteQuery( SCSIZE nPos )
77cdf0e10cSrcweir {
78cdf0e10cSrcweir     if (nPos >= maEntries.size())
79cdf0e10cSrcweir         return;
80cdf0e10cSrcweir 
81cdf0e10cSrcweir     size_t n = maEntries.size();
82cdf0e10cSrcweir     vector<ScQueryEntry> aNewEntries;
83cdf0e10cSrcweir     aNewEntries.reserve(n);
84cdf0e10cSrcweir     for (size_t i = 0; i < n; ++i)
85cdf0e10cSrcweir         if (i != nPos)
86cdf0e10cSrcweir             aNewEntries.push_back(maEntries[i]);
87cdf0e10cSrcweir 
88cdf0e10cSrcweir     // Don't forget to append an empty entry to make up for the removed one.
89cdf0e10cSrcweir     // The size of the entries is not supposed to change.
90cdf0e10cSrcweir     aNewEntries.push_back(ScQueryEntry());
91cdf0e10cSrcweir 
92cdf0e10cSrcweir     maEntries.swap(aNewEntries);
93cdf0e10cSrcweir }
94cdf0e10cSrcweir 
FillInExcelSyntax(String & aCellStr,SCSIZE nIndex)95cdf0e10cSrcweir void ScQueryParamBase::FillInExcelSyntax(String& aCellStr, SCSIZE nIndex)
96cdf0e10cSrcweir {
97cdf0e10cSrcweir     if (aCellStr.Len() > 0)
98cdf0e10cSrcweir     {
99cdf0e10cSrcweir         if ( nIndex >= maEntries.size() )
100cdf0e10cSrcweir             Resize( nIndex+1 );
101cdf0e10cSrcweir 
102cdf0e10cSrcweir         ScQueryEntry& rEntry = GetEntry(nIndex);
103cdf0e10cSrcweir 
104cdf0e10cSrcweir         rEntry.bDoQuery = sal_True;
105cdf0e10cSrcweir         // Operatoren herausfiltern
106cdf0e10cSrcweir         if (aCellStr.GetChar(0) == '<')
107cdf0e10cSrcweir         {
108cdf0e10cSrcweir             if (aCellStr.GetChar(1) == '>')
109cdf0e10cSrcweir             {
110cdf0e10cSrcweir                 *rEntry.pStr = aCellStr.Copy(2);
111cdf0e10cSrcweir                 rEntry.eOp   = SC_NOT_EQUAL;
112cdf0e10cSrcweir             }
113cdf0e10cSrcweir             else if (aCellStr.GetChar(1) == '=')
114cdf0e10cSrcweir             {
115cdf0e10cSrcweir                 *rEntry.pStr = aCellStr.Copy(2);
116cdf0e10cSrcweir                 rEntry.eOp   = SC_LESS_EQUAL;
117cdf0e10cSrcweir             }
118cdf0e10cSrcweir             else
119cdf0e10cSrcweir             {
120cdf0e10cSrcweir                 *rEntry.pStr = aCellStr.Copy(1);
121cdf0e10cSrcweir                 rEntry.eOp   = SC_LESS;
122cdf0e10cSrcweir             }
123cdf0e10cSrcweir         }
124cdf0e10cSrcweir         else if (aCellStr.GetChar(0) == '>')
125cdf0e10cSrcweir         {
126cdf0e10cSrcweir             if (aCellStr.GetChar(1) == '=')
127cdf0e10cSrcweir             {
128cdf0e10cSrcweir                 *rEntry.pStr = aCellStr.Copy(2);
129cdf0e10cSrcweir                 rEntry.eOp   = SC_GREATER_EQUAL;
130cdf0e10cSrcweir             }
131cdf0e10cSrcweir             else
132cdf0e10cSrcweir             {
133cdf0e10cSrcweir                 *rEntry.pStr = aCellStr.Copy(1);
134cdf0e10cSrcweir                 rEntry.eOp   = SC_GREATER;
135cdf0e10cSrcweir             }
136cdf0e10cSrcweir         }
137cdf0e10cSrcweir         else
138cdf0e10cSrcweir         {
139cdf0e10cSrcweir             if (aCellStr.GetChar(0) == '=')
140cdf0e10cSrcweir                 *rEntry.pStr = aCellStr.Copy(1);
141cdf0e10cSrcweir             else
142cdf0e10cSrcweir                 *rEntry.pStr = aCellStr;
143cdf0e10cSrcweir             rEntry.eOp = SC_EQUAL;
144cdf0e10cSrcweir         }
145cdf0e10cSrcweir     }
146cdf0e10cSrcweir }
147cdf0e10cSrcweir 
148cdf0e10cSrcweir // ============================================================================
149cdf0e10cSrcweir 
ScQueryParamTable()150cdf0e10cSrcweir ScQueryParamTable::ScQueryParamTable()
151cdf0e10cSrcweir {
152cdf0e10cSrcweir }
153cdf0e10cSrcweir 
ScQueryParamTable(const ScQueryParamTable & r)154cdf0e10cSrcweir ScQueryParamTable::ScQueryParamTable(const ScQueryParamTable& r) :
155cdf0e10cSrcweir     nCol1(r.nCol1),nRow1(r.nRow1),nCol2(r.nCol2),nRow2(r.nRow2),nTab(r.nTab)
156cdf0e10cSrcweir {
157cdf0e10cSrcweir }
158cdf0e10cSrcweir 
~ScQueryParamTable()159cdf0e10cSrcweir ScQueryParamTable::~ScQueryParamTable()
160cdf0e10cSrcweir {
161cdf0e10cSrcweir }
162cdf0e10cSrcweir 
163cdf0e10cSrcweir // ============================================================================
164cdf0e10cSrcweir 
ScQueryParam()165cdf0e10cSrcweir ScQueryParam::ScQueryParam() :
166cdf0e10cSrcweir     ScQueryParamBase(),
167cdf0e10cSrcweir     ScQueryParamTable(),
168cdf0e10cSrcweir     bDestPers(true),
169cdf0e10cSrcweir     nDestTab(0),
170cdf0e10cSrcweir     nDestCol(0),
171cdf0e10cSrcweir     nDestRow(0)
172cdf0e10cSrcweir {
173cdf0e10cSrcweir     Clear();
174cdf0e10cSrcweir }
175cdf0e10cSrcweir 
176cdf0e10cSrcweir //------------------------------------------------------------------------
177cdf0e10cSrcweir 
ScQueryParam(const ScQueryParam & r)178cdf0e10cSrcweir ScQueryParam::ScQueryParam( const ScQueryParam& r ) :
179cdf0e10cSrcweir     ScQueryParamBase(r),
180cdf0e10cSrcweir     ScQueryParamTable(r),
181cdf0e10cSrcweir     bDestPers(r.bDestPers), nDestTab(r.nDestTab), nDestCol(r.nDestCol), nDestRow(r.nDestRow)
182cdf0e10cSrcweir {
183cdf0e10cSrcweir }
184cdf0e10cSrcweir 
ScQueryParam(const ScDBQueryParamInternal & r)185cdf0e10cSrcweir ScQueryParam::ScQueryParam( const ScDBQueryParamInternal& r ) :
186cdf0e10cSrcweir     ScQueryParamBase(r),
187cdf0e10cSrcweir     ScQueryParamTable(r),
188cdf0e10cSrcweir     bDestPers(true),
189cdf0e10cSrcweir     nDestTab(0),
190cdf0e10cSrcweir     nDestCol(0),
191cdf0e10cSrcweir     nDestRow(0)
192cdf0e10cSrcweir {
193cdf0e10cSrcweir }
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 
196cdf0e10cSrcweir //------------------------------------------------------------------------
197cdf0e10cSrcweir 
~ScQueryParam()198cdf0e10cSrcweir ScQueryParam::~ScQueryParam()
199cdf0e10cSrcweir {
200cdf0e10cSrcweir }
201cdf0e10cSrcweir 
202cdf0e10cSrcweir //------------------------------------------------------------------------
203cdf0e10cSrcweir 
Clear()204cdf0e10cSrcweir void ScQueryParam::Clear()
205cdf0e10cSrcweir {
206cdf0e10cSrcweir     nCol1=nCol2 = 0;
207cdf0e10cSrcweir     nRow1=nRow2 = 0;
208cdf0e10cSrcweir     nTab = SCTAB_MAX;
209cdf0e10cSrcweir     bHasHeader = bCaseSens = bRegExp = bMixedComparison = sal_False;
210cdf0e10cSrcweir     bInplace = bByRow = bDuplicate = sal_True;
211cdf0e10cSrcweir 
212cdf0e10cSrcweir     Resize( MAXQUERY );
213cdf0e10cSrcweir     for (sal_uInt16 i=0; i<MAXQUERY; i++)
214cdf0e10cSrcweir         maEntries[i].Clear();
215cdf0e10cSrcweir 
216cdf0e10cSrcweir     ClearDestParams();
217cdf0e10cSrcweir }
218cdf0e10cSrcweir 
ClearDestParams()219cdf0e10cSrcweir void ScQueryParam::ClearDestParams()
220cdf0e10cSrcweir {
221cdf0e10cSrcweir     bDestPers = true;
222cdf0e10cSrcweir     nDestTab = 0;
223cdf0e10cSrcweir     nDestCol = 0;
224cdf0e10cSrcweir     nDestRow = 0;
225cdf0e10cSrcweir }
226cdf0e10cSrcweir 
227cdf0e10cSrcweir //------------------------------------------------------------------------
228cdf0e10cSrcweir 
operator =(const ScQueryParam & r)229cdf0e10cSrcweir ScQueryParam& ScQueryParam::operator=( const ScQueryParam& r )
230cdf0e10cSrcweir {
231cdf0e10cSrcweir     nCol1       = r.nCol1;
232cdf0e10cSrcweir     nRow1       = r.nRow1;
233cdf0e10cSrcweir     nCol2       = r.nCol2;
234cdf0e10cSrcweir     nRow2       = r.nRow2;
235cdf0e10cSrcweir     nTab        = r.nTab;
236cdf0e10cSrcweir     nDestTab    = r.nDestTab;
237cdf0e10cSrcweir     nDestCol    = r.nDestCol;
238cdf0e10cSrcweir     nDestRow    = r.nDestRow;
239cdf0e10cSrcweir     bHasHeader  = r.bHasHeader;
240cdf0e10cSrcweir     bInplace    = r.bInplace;
241cdf0e10cSrcweir     bCaseSens   = r.bCaseSens;
242cdf0e10cSrcweir     bRegExp     = r.bRegExp;
243cdf0e10cSrcweir     bMixedComparison = r.bMixedComparison;
244cdf0e10cSrcweir     bDuplicate  = r.bDuplicate;
245cdf0e10cSrcweir     bByRow      = r.bByRow;
246cdf0e10cSrcweir     bDestPers   = r.bDestPers;
247cdf0e10cSrcweir 
248cdf0e10cSrcweir     maEntries = r.maEntries;
249cdf0e10cSrcweir 
250cdf0e10cSrcweir     return *this;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir //------------------------------------------------------------------------
254cdf0e10cSrcweir 
operator ==(const ScQueryParam & rOther) const255cdf0e10cSrcweir sal_Bool ScQueryParam::operator==( const ScQueryParam& rOther ) const
256cdf0e10cSrcweir {
257cdf0e10cSrcweir     sal_Bool bEqual = sal_False;
258cdf0e10cSrcweir 
259cdf0e10cSrcweir     // Anzahl der Queries gleich?
260cdf0e10cSrcweir     SCSIZE nUsed      = 0;
261cdf0e10cSrcweir     SCSIZE nOtherUsed = 0;
262cdf0e10cSrcweir     SCSIZE nEntryCount = GetEntryCount();
263cdf0e10cSrcweir     SCSIZE nOtherEntryCount = rOther.GetEntryCount();
264cdf0e10cSrcweir 
265cdf0e10cSrcweir     while ( nUsed<nEntryCount && maEntries[nUsed].bDoQuery ) ++nUsed;
266cdf0e10cSrcweir     while ( nOtherUsed<nOtherEntryCount && rOther.maEntries[nOtherUsed].bDoQuery )
267cdf0e10cSrcweir         ++nOtherUsed;
268cdf0e10cSrcweir 
269cdf0e10cSrcweir     if (   (nUsed       == nOtherUsed)
270cdf0e10cSrcweir         && (nCol1       == rOther.nCol1)
271cdf0e10cSrcweir         && (nRow1       == rOther.nRow1)
272cdf0e10cSrcweir         && (nCol2       == rOther.nCol2)
273cdf0e10cSrcweir         && (nRow2       == rOther.nRow2)
274cdf0e10cSrcweir         && (nTab        == rOther.nTab)
275cdf0e10cSrcweir         && (bHasHeader  == rOther.bHasHeader)
276cdf0e10cSrcweir         && (bByRow      == rOther.bByRow)
277cdf0e10cSrcweir         && (bInplace    == rOther.bInplace)
278cdf0e10cSrcweir         && (bCaseSens   == rOther.bCaseSens)
279cdf0e10cSrcweir         && (bRegExp     == rOther.bRegExp)
280cdf0e10cSrcweir         && (bMixedComparison == rOther.bMixedComparison)
281cdf0e10cSrcweir         && (bDuplicate  == rOther.bDuplicate)
282cdf0e10cSrcweir         && (bDestPers   == rOther.bDestPers)
283cdf0e10cSrcweir         && (nDestTab    == rOther.nDestTab)
284cdf0e10cSrcweir         && (nDestCol    == rOther.nDestCol)
285cdf0e10cSrcweir         && (nDestRow    == rOther.nDestRow) )
286cdf0e10cSrcweir     {
287cdf0e10cSrcweir         bEqual = sal_True;
288cdf0e10cSrcweir         for ( SCSIZE i=0; i<nUsed && bEqual; i++ )
289cdf0e10cSrcweir             bEqual = maEntries[i] == rOther.maEntries[i];
290cdf0e10cSrcweir     }
291cdf0e10cSrcweir     return bEqual;
292cdf0e10cSrcweir }
293cdf0e10cSrcweir 
294cdf0e10cSrcweir //------------------------------------------------------------------------
295cdf0e10cSrcweir 
MoveToDest()296cdf0e10cSrcweir void ScQueryParam::MoveToDest()
297cdf0e10cSrcweir {
298cdf0e10cSrcweir     if (!bInplace)
299cdf0e10cSrcweir     {
300cdf0e10cSrcweir         SCsCOL nDifX = ((SCsCOL) nDestCol) - ((SCsCOL) nCol1);
301cdf0e10cSrcweir         SCsROW nDifY = ((SCsROW) nDestRow) - ((SCsROW) nRow1);
302cdf0e10cSrcweir         SCsTAB nDifZ = ((SCsTAB) nDestTab) - ((SCsTAB) nTab);
303cdf0e10cSrcweir 
304cdf0e10cSrcweir         nCol1 = sal::static_int_cast<SCCOL>( nCol1 + nDifX );
305cdf0e10cSrcweir         nRow1 = sal::static_int_cast<SCROW>( nRow1 + nDifY );
306cdf0e10cSrcweir         nCol2 = sal::static_int_cast<SCCOL>( nCol2 + nDifX );
307cdf0e10cSrcweir         nRow2 = sal::static_int_cast<SCROW>( nRow2 + nDifY );
308cdf0e10cSrcweir         nTab  = sal::static_int_cast<SCTAB>( nTab  + nDifZ );
309cdf0e10cSrcweir         size_t n = maEntries.size();
310cdf0e10cSrcweir         for (size_t i=0; i<n; i++)
311cdf0e10cSrcweir             maEntries[i].nField += nDifX;
312cdf0e10cSrcweir 
313cdf0e10cSrcweir         bInplace = sal_True;
314cdf0e10cSrcweir     }
315cdf0e10cSrcweir     else
316cdf0e10cSrcweir     {
317cdf0e10cSrcweir         DBG_ERROR("MoveToDest, bInplace == TRUE");
318cdf0e10cSrcweir     }
319cdf0e10cSrcweir }
320cdf0e10cSrcweir 
321cdf0e10cSrcweir // ============================================================================
322cdf0e10cSrcweir 
ScDBQueryParamBase(DataType eType)323cdf0e10cSrcweir ScDBQueryParamBase::ScDBQueryParamBase(DataType eType) :
324cdf0e10cSrcweir     ScQueryParamBase(),
325cdf0e10cSrcweir     mnField(-1),
326cdf0e10cSrcweir     mbSkipString(true),
327cdf0e10cSrcweir     meType(eType)
328cdf0e10cSrcweir {
329cdf0e10cSrcweir }
330cdf0e10cSrcweir 
~ScDBQueryParamBase()331cdf0e10cSrcweir ScDBQueryParamBase::~ScDBQueryParamBase()
332cdf0e10cSrcweir {
333cdf0e10cSrcweir }
334cdf0e10cSrcweir 
GetType() const335cdf0e10cSrcweir ScDBQueryParamBase::DataType ScDBQueryParamBase::GetType() const
336cdf0e10cSrcweir {
337cdf0e10cSrcweir     return meType;
338cdf0e10cSrcweir }
339cdf0e10cSrcweir 
340cdf0e10cSrcweir // ============================================================================
341cdf0e10cSrcweir 
ScDBQueryParamInternal()342cdf0e10cSrcweir ScDBQueryParamInternal::ScDBQueryParamInternal() :
343cdf0e10cSrcweir     ScDBQueryParamBase(ScDBQueryParamBase::INTERNAL),
344cdf0e10cSrcweir     ScQueryParamTable()
345cdf0e10cSrcweir {
346cdf0e10cSrcweir }
347cdf0e10cSrcweir 
~ScDBQueryParamInternal()348cdf0e10cSrcweir ScDBQueryParamInternal::~ScDBQueryParamInternal()
349cdf0e10cSrcweir {
350cdf0e10cSrcweir }
351cdf0e10cSrcweir 
352cdf0e10cSrcweir // ============================================================================
353cdf0e10cSrcweir 
ScDBQueryParamMatrix()354cdf0e10cSrcweir ScDBQueryParamMatrix::ScDBQueryParamMatrix() :
355cdf0e10cSrcweir     ScDBQueryParamBase(ScDBQueryParamBase::MATRIX)
356cdf0e10cSrcweir {
357cdf0e10cSrcweir }
358cdf0e10cSrcweir 
~ScDBQueryParamMatrix()359cdf0e10cSrcweir ScDBQueryParamMatrix::~ScDBQueryParamMatrix()
360cdf0e10cSrcweir {
361cdf0e10cSrcweir }
362cdf0e10cSrcweir 
363