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
10*b3f79822SAndrew Rist *
11*b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*b3f79822SAndrew Rist *
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.
19*b3f79822SAndrew Rist *
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
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include "sortparam.hxx"
30cdf0e10cSrcweir #include "global.hxx"
31cdf0e10cSrcweir #include "address.hxx"
32cdf0e10cSrcweir #include "queryparam.hxx"
33cdf0e10cSrcweir #include <tools/debug.hxx>
34cdf0e10cSrcweir
35cdf0e10cSrcweir
36cdf0e10cSrcweir //------------------------------------------------------------------------
37cdf0e10cSrcweir
ScSortParam()38cdf0e10cSrcweir ScSortParam::ScSortParam()
39cdf0e10cSrcweir {
40cdf0e10cSrcweir Clear();
41cdf0e10cSrcweir }
42cdf0e10cSrcweir
43cdf0e10cSrcweir //------------------------------------------------------------------------
44cdf0e10cSrcweir
ScSortParam(const ScSortParam & r)45cdf0e10cSrcweir ScSortParam::ScSortParam( const ScSortParam& r ) :
46cdf0e10cSrcweir nCol1(r.nCol1),nRow1(r.nRow1),nCol2(r.nCol2),nRow2(r.nRow2),
47cdf0e10cSrcweir bHasHeader(r.bHasHeader),bByRow(r.bByRow),bCaseSens(r.bCaseSens),
48cdf0e10cSrcweir bUserDef(r.bUserDef),nUserIndex(r.nUserIndex),bIncludePattern(r.bIncludePattern),
49cdf0e10cSrcweir bInplace(r.bInplace),
50cdf0e10cSrcweir nDestTab(r.nDestTab),nDestCol(r.nDestCol),nDestRow(r.nDestRow),
51cdf0e10cSrcweir aCollatorLocale( r.aCollatorLocale ), aCollatorAlgorithm( r.aCollatorAlgorithm )
52cdf0e10cSrcweir {
53cdf0e10cSrcweir for (sal_uInt16 i=0; i<MAXSORT; i++)
54cdf0e10cSrcweir {
55cdf0e10cSrcweir bDoSort[i] = r.bDoSort[i];
56cdf0e10cSrcweir nField[i] = r.nField[i];
57cdf0e10cSrcweir bAscending[i] = r.bAscending[i];
58cdf0e10cSrcweir }
59cdf0e10cSrcweir }
60cdf0e10cSrcweir
61cdf0e10cSrcweir //------------------------------------------------------------------------
62cdf0e10cSrcweir
Clear()63cdf0e10cSrcweir void ScSortParam::Clear()
64cdf0e10cSrcweir {
65cdf0e10cSrcweir nCol1=nCol2=nDestCol = 0;
66cdf0e10cSrcweir nRow1=nRow2=nDestRow = 0;
67cdf0e10cSrcweir nCompatHeader = 2;
68cdf0e10cSrcweir nDestTab = 0;
69cdf0e10cSrcweir nUserIndex = 0;
70cdf0e10cSrcweir bHasHeader=bCaseSens=bUserDef = sal_False;
71cdf0e10cSrcweir bByRow=bIncludePattern=bInplace = sal_True;
72cdf0e10cSrcweir aCollatorLocale = ::com::sun::star::lang::Locale();
73cdf0e10cSrcweir aCollatorAlgorithm.Erase();
74cdf0e10cSrcweir
75cdf0e10cSrcweir for (sal_uInt16 i=0; i<MAXSORT; i++)
76cdf0e10cSrcweir {
77cdf0e10cSrcweir bDoSort[i] = sal_False;
78cdf0e10cSrcweir nField[i] = 0;
79cdf0e10cSrcweir bAscending[i] = sal_True;
80cdf0e10cSrcweir }
81cdf0e10cSrcweir }
82cdf0e10cSrcweir
83cdf0e10cSrcweir //------------------------------------------------------------------------
84cdf0e10cSrcweir
operator =(const ScSortParam & r)85cdf0e10cSrcweir ScSortParam& ScSortParam::operator=( const ScSortParam& r )
86cdf0e10cSrcweir {
87cdf0e10cSrcweir nCol1 = r.nCol1;
88cdf0e10cSrcweir nRow1 = r.nRow1;
89cdf0e10cSrcweir nCol2 = r.nCol2;
90cdf0e10cSrcweir nRow2 = r.nRow2;
91cdf0e10cSrcweir bHasHeader = r.bHasHeader;
92cdf0e10cSrcweir bCaseSens = r.bCaseSens;
93cdf0e10cSrcweir bByRow = r.bByRow;
94cdf0e10cSrcweir bUserDef = r.bUserDef;
95cdf0e10cSrcweir nUserIndex = r.nUserIndex;
96cdf0e10cSrcweir bIncludePattern = r.bIncludePattern;
97cdf0e10cSrcweir bInplace = r.bInplace;
98cdf0e10cSrcweir nDestTab = r.nDestTab;
99cdf0e10cSrcweir nDestCol = r.nDestCol;
100cdf0e10cSrcweir nDestRow = r.nDestRow;
101cdf0e10cSrcweir aCollatorLocale = r.aCollatorLocale;
102cdf0e10cSrcweir aCollatorAlgorithm = r.aCollatorAlgorithm;
103cdf0e10cSrcweir
104cdf0e10cSrcweir for (sal_uInt16 i=0; i<MAXSORT; i++)
105cdf0e10cSrcweir {
106cdf0e10cSrcweir bDoSort[i] = r.bDoSort[i];
107cdf0e10cSrcweir nField[i] = r.nField[i];
108cdf0e10cSrcweir bAscending[i] = r.bAscending[i];
109cdf0e10cSrcweir }
110cdf0e10cSrcweir
111cdf0e10cSrcweir return *this;
112cdf0e10cSrcweir }
113cdf0e10cSrcweir
114cdf0e10cSrcweir //------------------------------------------------------------------------
115cdf0e10cSrcweir
operator ==(const ScSortParam & rOther) const116cdf0e10cSrcweir sal_Bool ScSortParam::operator==( const ScSortParam& rOther ) const
117cdf0e10cSrcweir {
118cdf0e10cSrcweir sal_Bool bEqual = sal_False;
119cdf0e10cSrcweir // Anzahl der Sorts gleich?
120cdf0e10cSrcweir sal_uInt16 nLast = 0;
121cdf0e10cSrcweir sal_uInt16 nOtherLast = 0;
122cdf0e10cSrcweir while ( bDoSort[nLast++] && nLast < MAXSORT ) ;
123cdf0e10cSrcweir while ( rOther.bDoSort[nOtherLast++] && nOtherLast < MAXSORT ) ;
124cdf0e10cSrcweir nLast--;
125cdf0e10cSrcweir nOtherLast--;
126cdf0e10cSrcweir if ( (nLast == nOtherLast)
127cdf0e10cSrcweir && (nCol1 == rOther.nCol1)
128cdf0e10cSrcweir && (nRow1 == rOther.nRow1)
129cdf0e10cSrcweir && (nCol2 == rOther.nCol2)
130cdf0e10cSrcweir && (nRow2 == rOther.nRow2)
131cdf0e10cSrcweir && (bHasHeader == rOther.bHasHeader)
132cdf0e10cSrcweir && (bByRow == rOther.bByRow)
133cdf0e10cSrcweir && (bCaseSens == rOther.bCaseSens)
134cdf0e10cSrcweir && (bUserDef == rOther.bUserDef)
135cdf0e10cSrcweir && (nUserIndex == rOther.nUserIndex)
136cdf0e10cSrcweir && (bIncludePattern == rOther.bIncludePattern)
137cdf0e10cSrcweir && (bInplace == rOther.bInplace)
138cdf0e10cSrcweir && (nDestTab == rOther.nDestTab)
139cdf0e10cSrcweir && (nDestCol == rOther.nDestCol)
140cdf0e10cSrcweir && (nDestRow == rOther.nDestRow)
141cdf0e10cSrcweir && (aCollatorLocale.Language == rOther.aCollatorLocale.Language)
142cdf0e10cSrcweir && (aCollatorLocale.Country == rOther.aCollatorLocale.Country)
143cdf0e10cSrcweir && (aCollatorLocale.Variant == rOther.aCollatorLocale.Variant)
144cdf0e10cSrcweir && (aCollatorAlgorithm == rOther.aCollatorAlgorithm)
145cdf0e10cSrcweir )
146cdf0e10cSrcweir {
147cdf0e10cSrcweir bEqual = sal_True;
148cdf0e10cSrcweir for ( sal_uInt16 i=0; i<=nLast && bEqual; i++ )
149cdf0e10cSrcweir {
150cdf0e10cSrcweir bEqual = (nField[i] == rOther.nField[i]) && (bAscending[i] == rOther.bAscending[i]);
151cdf0e10cSrcweir }
152cdf0e10cSrcweir }
153cdf0e10cSrcweir return bEqual;
154cdf0e10cSrcweir }
155cdf0e10cSrcweir
156cdf0e10cSrcweir //------------------------------------------------------------------------
157cdf0e10cSrcweir
ScSortParam(const ScSubTotalParam & rSub,const ScSortParam & rOld)158cdf0e10cSrcweir ScSortParam::ScSortParam( const ScSubTotalParam& rSub, const ScSortParam& rOld ) :
159cdf0e10cSrcweir nCol1(rSub.nCol1),nRow1(rSub.nRow1),nCol2(rSub.nCol2),nRow2(rSub.nRow2),
160cdf0e10cSrcweir bHasHeader(sal_True),bByRow(sal_True),bCaseSens(rSub.bCaseSens),
161cdf0e10cSrcweir bUserDef(rSub.bUserDef),nUserIndex(rSub.nUserIndex),bIncludePattern(rSub.bIncludePattern),
162cdf0e10cSrcweir bInplace(sal_True),
163cdf0e10cSrcweir nDestTab(0),nDestCol(0),nDestRow(0),
164cdf0e10cSrcweir aCollatorLocale( rOld.aCollatorLocale ), aCollatorAlgorithm( rOld.aCollatorAlgorithm )
165cdf0e10cSrcweir {
166cdf0e10cSrcweir sal_uInt16 nNewCount = 0;
167cdf0e10cSrcweir sal_uInt16 i;
168cdf0e10cSrcweir
169cdf0e10cSrcweir // zuerst die Gruppen aus den Teilergebnissen
170cdf0e10cSrcweir if (rSub.bDoSort)
171cdf0e10cSrcweir for (i=0; i<MAXSUBTOTAL; i++)
172cdf0e10cSrcweir if (rSub.bGroupActive[i])
173cdf0e10cSrcweir {
174cdf0e10cSrcweir if (nNewCount < MAXSORT)
175cdf0e10cSrcweir {
176cdf0e10cSrcweir bDoSort[nNewCount] = sal_True;
177cdf0e10cSrcweir nField[nNewCount] = rSub.nField[i];
178cdf0e10cSrcweir bAscending[nNewCount] = rSub.bAscending;
179cdf0e10cSrcweir ++nNewCount;
180cdf0e10cSrcweir }
181cdf0e10cSrcweir }
182cdf0e10cSrcweir
183cdf0e10cSrcweir // dann dahinter die alten Einstellungen
184cdf0e10cSrcweir for (i=0; i<MAXSORT; i++)
185cdf0e10cSrcweir if (rOld.bDoSort[i])
186cdf0e10cSrcweir {
187cdf0e10cSrcweir SCCOLROW nThisField = rOld.nField[i];
188cdf0e10cSrcweir sal_Bool bDouble = sal_False;
189cdf0e10cSrcweir for (sal_uInt16 j=0; j<nNewCount; j++)
190cdf0e10cSrcweir if ( nField[j] == nThisField )
191cdf0e10cSrcweir bDouble = sal_True;
192cdf0e10cSrcweir if (!bDouble) // ein Feld nicht zweimal eintragen
193cdf0e10cSrcweir {
194cdf0e10cSrcweir if (nNewCount < MAXSORT)
195cdf0e10cSrcweir {
196cdf0e10cSrcweir bDoSort[nNewCount] = sal_True;
197cdf0e10cSrcweir nField[nNewCount] = nThisField;
198cdf0e10cSrcweir bAscending[nNewCount] = rOld.bAscending[i];
199cdf0e10cSrcweir ++nNewCount;
200cdf0e10cSrcweir }
201cdf0e10cSrcweir }
202cdf0e10cSrcweir }
203cdf0e10cSrcweir
204cdf0e10cSrcweir for (i=nNewCount; i<MAXSORT; i++) // Rest loeschen
205cdf0e10cSrcweir {
206cdf0e10cSrcweir bDoSort[i] = sal_False;
207cdf0e10cSrcweir nField[i] = 0;
208cdf0e10cSrcweir bAscending[i] = sal_True;
209cdf0e10cSrcweir }
210cdf0e10cSrcweir }
211cdf0e10cSrcweir
212cdf0e10cSrcweir //------------------------------------------------------------------------
213cdf0e10cSrcweir
ScSortParam(const ScQueryParam & rParam,SCCOL nCol)214cdf0e10cSrcweir ScSortParam::ScSortParam( const ScQueryParam& rParam, SCCOL nCol ) :
215cdf0e10cSrcweir nCol1(nCol),nRow1(rParam.nRow1),nCol2(nCol),nRow2(rParam.nRow2),
216cdf0e10cSrcweir bHasHeader(rParam.bHasHeader),bByRow(sal_True),bCaseSens(rParam.bCaseSens),
217cdf0e10cSrcweir //! TODO: what about Locale and Algorithm?
218cdf0e10cSrcweir bUserDef(sal_False),nUserIndex(0),bIncludePattern(sal_False),
219cdf0e10cSrcweir bInplace(sal_True),
220cdf0e10cSrcweir nDestTab(0),nDestCol(0),nDestRow(0)
221cdf0e10cSrcweir {
222cdf0e10cSrcweir bDoSort[0] = sal_True;
223cdf0e10cSrcweir nField[0] = nCol;
224cdf0e10cSrcweir bAscending[0] = sal_True;
225cdf0e10cSrcweir for (sal_uInt16 i=1; i<MAXSORT; i++)
226cdf0e10cSrcweir {
227cdf0e10cSrcweir bDoSort[i] = sal_False;
228cdf0e10cSrcweir nField[i] = 0;
229cdf0e10cSrcweir bAscending[i] = sal_True;
230cdf0e10cSrcweir }
231cdf0e10cSrcweir }
232cdf0e10cSrcweir
233cdf0e10cSrcweir //------------------------------------------------------------------------
234cdf0e10cSrcweir
MoveToDest()235cdf0e10cSrcweir void ScSortParam::MoveToDest()
236cdf0e10cSrcweir {
237cdf0e10cSrcweir if (!bInplace)
238cdf0e10cSrcweir {
239cdf0e10cSrcweir SCsCOL nDifX = ((SCsCOL) nDestCol) - ((SCsCOL) nCol1);
240cdf0e10cSrcweir SCsROW nDifY = ((SCsROW) nDestRow) - ((SCsROW) nRow1);
241cdf0e10cSrcweir
242cdf0e10cSrcweir nCol1 = sal::static_int_cast<SCCOL>( nCol1 + nDifX );
243cdf0e10cSrcweir nRow1 = sal::static_int_cast<SCROW>( nRow1 + nDifY );
244cdf0e10cSrcweir nCol2 = sal::static_int_cast<SCCOL>( nCol2 + nDifX );
245cdf0e10cSrcweir nRow2 = sal::static_int_cast<SCROW>( nRow2 + nDifY );
246cdf0e10cSrcweir for (sal_uInt16 i=0; i<MAXSORT; i++)
247cdf0e10cSrcweir if (bByRow)
248cdf0e10cSrcweir nField[i] += nDifX;
249cdf0e10cSrcweir else
250cdf0e10cSrcweir nField[i] += nDifY;
251cdf0e10cSrcweir
252cdf0e10cSrcweir bInplace = sal_True;
253cdf0e10cSrcweir }
254cdf0e10cSrcweir else
255cdf0e10cSrcweir {
256cdf0e10cSrcweir DBG_ERROR("MoveToDest, bInplace == TRUE");
257cdf0e10cSrcweir }
258cdf0e10cSrcweir }
259cdf0e10cSrcweir
260