xref: /aoo41x/main/sc/source/core/data/sortparam.cxx (revision b3f79822)
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