xref: /trunk/main/sc/source/ui/dbgui/tpsubt.cxx (revision b77af630)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_scui.hxx"
26 
27 #undef SC_DLLIMPLEMENTATION
28 
29 
30 
31 #include "scitems.hxx"
32 #include "uiitems.hxx"
33 #include "global.hxx"
34 #include "userlist.hxx"
35 #include "viewdata.hxx"
36 #include "document.hxx"
37 #include "scresid.hxx"
38 #include "sc.hrc"       // -> Slot IDs
39 
40 #include "subtdlg.hxx"
41 #include "subtdlg.hrc"
42 #include "tpsubt.hxx"
43 
44 // STATIC DATA -----------------------------------------------------------
45 
46 static sal_uInt16 pSubTotalsRanges[] =
47 {
48 	SID_SUBTOTALS,
49 	SID_SUBTOTALS,
50 	0
51 };
52 
53 //========================================================================
54 // Zwischenergebnisgruppen-Tabpage:
55 
56 ScTpSubTotalGroup::ScTpSubTotalGroup( Window* pParent, sal_uInt16 nResId,
57 									  const SfxItemSet& rArgSet )
58 		:	SfxTabPage		( pParent,
59 							  ScResId( nResId ),
60 							  rArgSet ),
61 			//
62 			aFtGroup		( this, ScResId( FT_GROUP ) ),
63 			aLbGroup		( this, ScResId( LB_GROUP ) ),
64 			aFtColumns		( this, ScResId( FT_COLUMNS ) ),
65 			aLbColumns		( this, ScResId( WND_COLUMNS ) ),
66 			aFtFunctions	( this, ScResId( FT_FUNCTIONS ) ),
67 			aLbFunctions	( this, ScResId( LB_FUNCTIONS ) ),
68 			aStrNone		( ScResId( SCSTR_NONE ) ),
69 			aStrColumn		( ScResId( SCSTR_COLUMN ) ),
70 			//
71 			pViewData		( NULL ),
72 			pDoc			( NULL ),
73 			nWhichSubTotals ( rArgSet.GetPool()->GetWhich( SID_SUBTOTALS ) ),
74 			rSubTotalData	( ((const ScSubTotalItem&)
75 							  rArgSet.Get( nWhichSubTotals )).
76 								GetSubTotalData() ),
77 			nFieldCount 	( 0 )
78 {
79 	// Font is correctly initialized by SvTreeListBox ctor
80 	aLbColumns.SetSelectionMode( SINGLE_SELECTION );
81 	aLbColumns.SetDragDropMode( SV_DRAGDROP_NONE );
82 	aLbColumns.SetSpaceBetweenEntries( 0 );
83 	aLbColumns.Show();
84 
85 	Init ();
86 	FreeResource();
87 }
88 
89 // -----------------------------------------------------------------------
90 
91 __EXPORT ScTpSubTotalGroup::~ScTpSubTotalGroup()
92 {
93 	sal_uInt16	nCount = (sal_uInt16)aLbColumns.GetEntryCount();
94 
95 	if ( nCount > 0 )
96 	{
97 		sal_uInt16* pData = NULL;
98 
99 		for ( sal_uInt16 i=0; i<nCount; i++ )
100 		{
101 			pData = (sal_uInt16*)(aLbColumns.GetEntryData( i ));
102 			DBG_ASSERT( pData, "EntryData not found" );
103 
104 			delete pData;
105 		}
106 	}
107 }
108 
109 // -----------------------------------------------------------------------
110 
111 void ScTpSubTotalGroup::Init()
112 {
113 	const ScSubTotalItem& rSubTotalItem = (const ScSubTotalItem&)
114 										  GetItemSet().Get( nWhichSubTotals );
115 
116 	pViewData	= rSubTotalItem.GetViewData();
117 	pDoc		= ( pViewData ) ? pViewData->GetDocument() : NULL;
118 
119 	DBG_ASSERT( pViewData && pDoc, "ViewData or Document not found :-(" );
120 
121 	aLbGroup.SetSelectHdl		( LINK( this, ScTpSubTotalGroup, SelectHdl ) );
122 	aLbColumns.SetSelectHdl		( LINK( this, ScTpSubTotalGroup, SelectHdl ) );
123 	aLbColumns.SetCheckButtonHdl	( LINK( this, ScTpSubTotalGroup, CheckHdl ) );
124 	aLbFunctions.SetSelectHdl	( LINK( this, ScTpSubTotalGroup, SelectHdl ) );
125 
126 	nFieldArr[0] = 0;
127 	FillListBoxes();
128 }
129 
130 //------------------------------------------------------------------------
131 
132 sal_uInt16* __EXPORT ScTpSubTotalGroup::GetRanges()
133 {
134 	return pSubTotalsRanges;
135 }
136 
137 // -----------------------------------------------------------------------
138 
139 sal_Bool ScTpSubTotalGroup::DoReset( sal_uInt16 			nGroupNo,
140 								 const SfxItemSet&	rArgSet  )
141 {
142 	sal_uInt16 nGroupIdx = 0;
143 
144 	DBG_ASSERT( (nGroupNo<=3) && (nGroupNo>0), "Invalid group" );
145 
146 	if ( (nGroupNo > 3) || (nGroupNo == 0) )
147 		return sal_False;
148 	else
149 		nGroupIdx = nGroupNo-1;
150 
151 	//----------------------------------------------------------
152 
153     // #79058# first we have to clear the listboxes...
154     for ( sal_uInt16 nLbEntry = 0; nLbEntry < aLbColumns.GetEntryCount(); ++nLbEntry )
155     {
156         aLbColumns.CheckEntryPos( nLbEntry, sal_False );
157         *((sal_uInt16*)aLbColumns.GetEntryData( nLbEntry )) = 0;
158     }
159     aLbFunctions.SelectEntryPos( 0 );
160 
161 	ScSubTotalParam theSubTotalData( ((const ScSubTotalItem&)
162 									  rArgSet.Get( nWhichSubTotals )).
163 											GetSubTotalData() );
164 
165 	if ( theSubTotalData.bGroupActive[nGroupIdx] )
166 	{
167 		SCCOL			nField		= theSubTotalData.nField[nGroupIdx];
168 		SCCOL			nSubTotals	= theSubTotalData.nSubTotals[nGroupIdx];
169 		SCCOL* 		    pSubTotals	= theSubTotalData.pSubTotals[nGroupIdx];
170 		ScSubTotalFunc* pFunctions	= theSubTotalData.pFunctions[nGroupIdx];
171 
172 		aLbGroup.SelectEntryPos( GetFieldSelPos( nField )+1 );
173 
174 		for ( sal_uInt16 i=0; i<nSubTotals; i++ )
175 		{
176 			sal_uInt16	nCheckPos = GetFieldSelPos( pSubTotals[i] );
177 			sal_uInt16* pFunction = (sal_uInt16*)aLbColumns.GetEntryData( nCheckPos );
178 
179 			aLbColumns.CheckEntryPos( nCheckPos );
180 			*pFunction = FuncToLbPos( pFunctions[i] );
181 		}
182         aLbColumns.SelectEntryPos( 0 );
183 	}
184 	else
185 	{
186 		aLbGroup.SelectEntryPos( (nGroupNo == 1) ? 1 : 0 );
187 		aLbColumns.SelectEntryPos( 0 );
188 		aLbFunctions.SelectEntryPos( 0 );
189 	}
190 
191 	return sal_True;
192 }
193 
194 // -----------------------------------------------------------------------
195 
196 sal_Bool ScTpSubTotalGroup::DoFillItemSet( sal_uInt16		nGroupNo,
197 									   SfxItemSet&	rArgSet  )
198 {
199 	sal_uInt16 nGroupIdx = 0;
200 
201 	DBG_ASSERT( (nGroupNo<=3) && (nGroupNo>0), "Invalid group" );
202 	DBG_ASSERT(    (aLbGroup.GetEntryCount() > 0)
203 				&& (aLbColumns.GetEntryCount() > 0)
204 				&& (aLbFunctions.GetEntryCount() > 0),
205 				"Non-initialized Lists" );
206 
207 
208 	if (  (nGroupNo > 3) || (nGroupNo == 0)
209 		|| (aLbGroup.GetEntryCount() == 0)
210 		|| (aLbColumns.GetEntryCount() == 0)
211 		|| (aLbFunctions.GetEntryCount() == 0)
212 	   )
213 		return sal_False;
214 	else
215 		nGroupIdx = nGroupNo-1;
216 
217 	//----------------------------------------------------------
218 
219 	ScSubTotalParam theSubTotalData;			// auslesen, wenn schon teilweise gefuellt
220 	SfxTabDialog* pDlg = GetTabDialog();
221 	if ( pDlg )
222 	{
223 		const SfxItemSet* pExample = pDlg->GetExampleSet();
224 		const SfxPoolItem* pItem;
225 		if ( pExample && pExample->GetItemState( nWhichSubTotals, sal_True, &pItem ) == SFX_ITEM_SET )
226 			theSubTotalData = ((const ScSubTotalItem*)pItem)->GetSubTotalData();
227 	}
228 
229 	ScSubTotalFunc* pFunctions	= NULL;
230 	SCCOL* 		    pSubTotals	= NULL;
231 	sal_uInt16			nGroup		= aLbGroup.GetSelectEntryPos();
232 	sal_uInt16			nEntryCount = (sal_uInt16)aLbColumns.GetEntryCount();
233 	sal_uInt16			nCheckCount = aLbColumns.GetCheckedEntryCount();
234 
235 	theSubTotalData.nCol1					= rSubTotalData.nCol1;
236 	theSubTotalData.nRow1					= rSubTotalData.nRow1;
237 	theSubTotalData.nCol2					= rSubTotalData.nCol2;
238 	theSubTotalData.nRow2					= rSubTotalData.nRow2;
239 	theSubTotalData.bGroupActive[nGroupIdx] = (nGroup != 0);
240 	theSubTotalData.nField[nGroupIdx]		= (nGroup != 0)
241 												? nFieldArr[nGroup-1]
242 												: static_cast<SCCOL>(0);
243 
244 	if ( nEntryCount>0 && nCheckCount>0 && nGroup!=0 )
245 	{
246 		sal_uInt16 nFunction	= 0;
247 
248 		pSubTotals = new SCCOL  		[nCheckCount];
249 		pFunctions = new ScSubTotalFunc [nCheckCount];
250 
251 		for ( sal_uInt16 i=0, nCheck=0; i<nEntryCount; i++ )
252 		{
253 			if ( aLbColumns.IsChecked( i ) )
254 			{
255 				DBG_ASSERT( nCheck <= nCheckCount,
256 							"Range error :-(" );
257 				nFunction = *((sal_uInt16*)aLbColumns.GetEntryData( i ));
258 				pSubTotals[nCheck] = nFieldArr[i];
259 				pFunctions[nCheck] = LbPosToFunc( nFunction );
260 				nCheck++;
261 			}
262 		}
263 		theSubTotalData.SetSubTotals( nGroupNo, 	 // Gruppen-Nr.
264 									  pSubTotals,
265 									  pFunctions,
266 									  nCheckCount ); // Anzahl der Array-Elemente
267 
268 	}
269 
270 	rArgSet.Put( ScSubTotalItem( SCITEM_SUBTDATA, &theSubTotalData ) );
271 
272 	if ( pSubTotals ) delete [] pSubTotals;
273 	if ( pFunctions ) delete [] pFunctions;
274 
275 	return sal_True;
276 }
277 
278 // -----------------------------------------------------------------------
279 
280 void ScTpSubTotalGroup::FillListBoxes()
281 {
282 	DBG_ASSERT( pViewData && pDoc, "ViewData or Document not found :-/" );
283 
284 	if ( pViewData && pDoc )
285 	{
286 		SCCOL	nFirstCol	= rSubTotalData.nCol1;
287 		SCROW	nFirstRow	= rSubTotalData.nRow1;
288 		SCTAB	nTab		= pViewData->GetTabNo();
289 		SCCOL	nMaxCol 	= rSubTotalData.nCol2;
290 		SCCOL	col;
291 		sal_uInt16	i=0;
292 		String	aFieldName;
293 
294 		aLbGroup.Clear();
295 		aLbColumns.Clear();
296 		aLbGroup.InsertEntry( aStrNone, 0 );
297 
298 		i=0;
299 		for ( col=nFirstCol; col<=nMaxCol && i<SC_MAXFIELDS; col++ )
300 		{
301 			pDoc->GetString( col, nFirstRow, nTab, aFieldName );
302 			if ( aFieldName.Len() == 0 )
303 			{
304                 aFieldName = aStrColumn;
305                 aFieldName += ' ';
306                 aFieldName += ::ScColToAlpha( col );  // from global.hxx
307 			}
308 			nFieldArr[i] = col;
309 			aLbGroup.InsertEntry( aFieldName, i+1 );
310 			aLbColumns.InsertEntry( aFieldName, i );
311 			aLbColumns.SetEntryData( i, new sal_uInt16(0) );
312 			i++;
313 		}
314 		// Nachtraegliche "Konstanteninitialisierung":
315 		(sal_uInt16&)nFieldCount = i;
316 	}
317 }
318 
319 // -----------------------------------------------------------------------
320 
321 sal_uInt16 ScTpSubTotalGroup::GetFieldSelPos( SCCOL nField )
322 {
323 	sal_uInt16	nFieldPos	= 0;
324 	sal_Bool	bFound		= sal_False;
325 
326 	for ( sal_uInt16 n=0; n<nFieldCount && !bFound; n++ )
327 	{
328 		if ( nFieldArr[n] == nField )
329 		{
330 			nFieldPos = n;
331 			bFound = sal_True;
332 		}
333 	}
334 
335 	return nFieldPos;
336 }
337 
338 // -----------------------------------------------------------------------
339 
340 ScSubTotalFunc ScTpSubTotalGroup::LbPosToFunc( sal_uInt16 nPos )
341 {
342 	switch ( nPos )
343 	{
344 //		case  0:	return SUBTOTAL_FUNC_NONE;
345 		case  2:	return SUBTOTAL_FUNC_AVE;
346 		case  6:	return SUBTOTAL_FUNC_CNT;
347 		case  1:	return SUBTOTAL_FUNC_CNT2;
348 		case  3:	return SUBTOTAL_FUNC_MAX;
349 		case  4:	return SUBTOTAL_FUNC_MIN;
350 		case  5:	return SUBTOTAL_FUNC_PROD;
351 		case  7:	return SUBTOTAL_FUNC_STD;
352 		case  8:	return SUBTOTAL_FUNC_STDP;
353 		case  0:	return SUBTOTAL_FUNC_SUM;
354 		case  9:	return SUBTOTAL_FUNC_VAR;
355 		case 10:	return SUBTOTAL_FUNC_VARP;
356 		default:
357 			DBG_ERROR( "ScTpSubTotalGroup::LbPosToFunc" );
358 			return SUBTOTAL_FUNC_NONE;
359 	}
360 }
361 
362 // -----------------------------------------------------------------------
363 
364 sal_uInt16 ScTpSubTotalGroup::FuncToLbPos( ScSubTotalFunc eFunc )
365 {
366 	switch ( eFunc )
367 	{
368 //		case SUBTOTAL_FUNC_NONE:	return 0;
369 		case SUBTOTAL_FUNC_AVE: 	return 2;
370 		case SUBTOTAL_FUNC_CNT: 	return 6;
371 		case SUBTOTAL_FUNC_CNT2:	return 1;
372 		case SUBTOTAL_FUNC_MAX: 	return 3;
373 		case SUBTOTAL_FUNC_MIN: 	return 4;
374 		case SUBTOTAL_FUNC_PROD:	return 5;
375 		case SUBTOTAL_FUNC_STD: 	return 7;
376 		case SUBTOTAL_FUNC_STDP:	return 8;
377 		case SUBTOTAL_FUNC_SUM: 	return 0;
378 		case SUBTOTAL_FUNC_VAR: 	return 9;
379 		case SUBTOTAL_FUNC_VARP:	return 10;
380 		default:
381 			DBG_ERROR( "ScTpSubTotalGroup::FuncToLbPos" );
382 			return 0;
383 	}
384 }
385 
386 // -----------------------------------------------------------------------
387 // Handler:
388 //---------
389 
390 IMPL_LINK( ScTpSubTotalGroup, SelectHdl, ListBox *, pLb )
391 {
392 	if (   (aLbColumns.GetEntryCount() > 0)
393 		&& (aLbColumns.GetSelectionCount() > 0) )
394 	{
395 		sal_uInt16		nFunction	= aLbFunctions.GetSelectEntryPos();
396 		sal_uInt16		nColumn 	= aLbColumns.GetSelectEntryPos();
397 		sal_uInt16* 	pFunction	= (sal_uInt16*)aLbColumns.GetEntryData( nColumn );
398 
399 		DBG_ASSERT( pFunction, "EntryData nicht gefunden!" );
400 		if ( !pFunction )
401 			return 0;
402 
403 		if ( ((SvxCheckListBox*)pLb) == &aLbColumns )
404 		{
405 			aLbFunctions.SelectEntryPos( *pFunction );
406 		}
407 		else if ( pLb == &aLbFunctions )
408 		{
409 			*pFunction = nFunction;
410 //			aLbColumns.CheckEntryPos( nColumn, (nFunction != 0) );//XXX
411 			aLbColumns.CheckEntryPos( nColumn, sal_True );
412 		}
413 	}
414 	return 0;
415 }
416 
417 // -----------------------------------------------------------------------
418 
419 IMPL_LINK( ScTpSubTotalGroup, CheckHdl, ListBox *, pLb )
420 {
421 	if ( ((SvxCheckListBox*)pLb) == &aLbColumns )
422 	{
423 		SvLBoxEntry* pEntry = aLbColumns.GetHdlEntry();
424 
425 		if ( pEntry )
426 		{
427 			aLbColumns.SelectEntryPos( (sal_uInt16)aLbColumns.GetModel()->GetAbsPos( pEntry ) );
428 			SelectHdl( pLb );
429 		}
430 	}
431 	return 0;
432 }
433 
434 //========================================================================
435 // Abgeleitete Gruppen-TabPages:
436 
437 SfxTabPage* __EXPORT ScTpSubTotalGroup1::Create( Window*			pParent,
438 												 const SfxItemSet&	rArgSet )
439 	{ return ( new ScTpSubTotalGroup1( pParent, rArgSet ) ); }
440 
441 // -----------------------------------------------------------------------
442 
443 SfxTabPage* __EXPORT ScTpSubTotalGroup2::Create( Window*			 pParent,
444 									   const SfxItemSet&	rArgSet )
445 	{ return ( new ScTpSubTotalGroup2( pParent, rArgSet ) ); }
446 
447 // -----------------------------------------------------------------------
448 
449 SfxTabPage* __EXPORT ScTpSubTotalGroup3::Create( Window*			 pParent,
450 									   const SfxItemSet&	rArgSet )
451 	{ return ( new ScTpSubTotalGroup3( pParent, rArgSet ) ); }
452 
453 // -----------------------------------------------------------------------
454 
455 ScTpSubTotalGroup1::ScTpSubTotalGroup1( Window* pParent, const SfxItemSet& rArgSet ) :
456 	ScTpSubTotalGroup( pParent, RID_SCPAGE_SUBT_GROUP1, rArgSet )
457 {}
458 
459 ScTpSubTotalGroup2::ScTpSubTotalGroup2( Window* pParent, const SfxItemSet& rArgSet ) :
460 	ScTpSubTotalGroup( pParent, RID_SCPAGE_SUBT_GROUP2, rArgSet )
461 {}
462 
463 ScTpSubTotalGroup3::ScTpSubTotalGroup3( Window* pParent, const SfxItemSet& rArgSet ) :
464 	ScTpSubTotalGroup( pParent, RID_SCPAGE_SUBT_GROUP3, rArgSet )
465 {}
466 
467 // -----------------------------------------------------------------------
468 
469 
470 #define RESET(i) (ScTpSubTotalGroup::DoReset( (i), rArgSet ))
471 
472 void __EXPORT ScTpSubTotalGroup1::Reset( const SfxItemSet& rArgSet ) { RESET(1); }
473 
474 void __EXPORT ScTpSubTotalGroup2::Reset( const SfxItemSet& rArgSet ) { RESET(2); }
475 
476 void __EXPORT ScTpSubTotalGroup3::Reset( const SfxItemSet& rArgSet ) { RESET(3); }
477 
478 #undef RESET
479 
480 // -----------------------------------------------------------------------
481 
482 #define FILLSET(i) (ScTpSubTotalGroup::DoFillItemSet( (i), rArgSet ))
483 
484 sal_Bool __EXPORT ScTpSubTotalGroup1::FillItemSet( SfxItemSet& rArgSet ) { return FILLSET(1); }
485 
486 sal_Bool __EXPORT ScTpSubTotalGroup2::FillItemSet( SfxItemSet& rArgSet ) { return FILLSET(2); }
487 
488 sal_Bool __EXPORT ScTpSubTotalGroup3::FillItemSet( SfxItemSet& rArgSet ) { return FILLSET(3); }
489 
490 #undef FILL
491 
492 //========================================================================
493 // Optionen-Tabpage:
494 
495 ScTpSubTotalOptions::ScTpSubTotalOptions( Window*				pParent,
496 										  const SfxItemSet& 	rArgSet )
497 
498 		:	SfxTabPage		( pParent,
499 							  ScResId( RID_SCPAGE_SUBT_OPTIONS ),
500 							  rArgSet ),
501 			//
502             aFlGroup        ( this, ScResId( FL_GROUP ) ),
503 			aBtnPagebreak	( this, ScResId( BTN_PAGEBREAK ) ),
504 			aBtnCase		( this, ScResId( BTN_CASE ) ),
505 			aBtnSort		( this, ScResId( BTN_SORT ) ),
506             aFlSort         ( this, ScResId( FL_SORT ) ),
507 			aBtnAscending	( this, ScResId( BTN_ASCENDING ) ),
508 			aBtnDescending	( this, ScResId( BTN_DESCENDING ) ),
509 			aBtnFormats 	( this, ScResId( BTN_FORMATS ) ),
510 			aBtnUserDef 	( this, ScResId( BTN_USERDEF ) ),
511 			aLbUserDef		( this, ScResId( LB_USERDEF ) ),
512 			//
513 			pViewData		( NULL ),
514 			pDoc			( NULL ),
515 			nWhichSubTotals ( rArgSet.GetPool()->GetWhich( SID_SUBTOTALS ) ),
516 			rSubTotalData	( ((const ScSubTotalItem&)
517 							  rArgSet.Get( nWhichSubTotals )).
518 								GetSubTotalData() )
519 {
520 	Init();
521 	FreeResource();
522 
523 	aLbUserDef.SetAccessibleRelationLabeledBy(&aBtnUserDef);
524 	aLbUserDef.SetAccessibleName(aBtnUserDef.GetText());
525 }
526 
527 // -----------------------------------------------------------------------
528 
529 __EXPORT ScTpSubTotalOptions::~ScTpSubTotalOptions()
530 {
531 }
532 
533 // -----------------------------------------------------------------------
534 
535 void ScTpSubTotalOptions::Init()
536 {
537 	const ScSubTotalItem& rSubTotalItem = (const ScSubTotalItem&)
538 										  GetItemSet().Get( nWhichSubTotals );
539 
540 	pViewData	= rSubTotalItem.GetViewData();
541 	pDoc		= ( pViewData ) ? pViewData->GetDocument() : NULL;
542 
543 	DBG_ASSERT( pViewData && pDoc, "ViewData oder Document nicht gefunden!" );
544 
545 	aBtnSort.SetClickHdl 	( LINK( this, ScTpSubTotalOptions, CheckHdl ) );
546 	aBtnUserDef.SetClickHdl	( LINK( this, ScTpSubTotalOptions, CheckHdl ) );
547 
548 	FillUserSortListBox();
549 }
550 
551 // -----------------------------------------------------------------------
552 
553 SfxTabPage* __EXPORT ScTpSubTotalOptions::Create( Window*				 pParent,
554 										  const SfxItemSet& 	rArgSet )
555 {
556 	return ( new ScTpSubTotalOptions( pParent, rArgSet ) );
557 }
558 
559 // -----------------------------------------------------------------------
560 
561 void __EXPORT ScTpSubTotalOptions::Reset( const SfxItemSet& /* rArgSet */ )
562 {
563 	aBtnPagebreak.Check ( rSubTotalData.bPagebreak );
564 	aBtnCase.Check		( rSubTotalData.bCaseSens );
565 	aBtnFormats.Check	( rSubTotalData.bIncludePattern );
566 	aBtnSort.Check		( rSubTotalData.bDoSort );
567 	aBtnAscending.Check ( rSubTotalData.bAscending );
568 	aBtnDescending.Check( !rSubTotalData.bAscending );
569 
570 	if ( rSubTotalData.bUserDef )
571 	{
572 		aBtnUserDef.Check( sal_True );
573 		aLbUserDef.Enable();
574 		aLbUserDef.SelectEntryPos( rSubTotalData.nUserIndex );
575 	}
576 	else
577 	{
578 		aBtnUserDef.Check( sal_False );
579 		aLbUserDef.Disable();
580 		aLbUserDef.SelectEntryPos( 0 );
581 	}
582 
583 	CheckHdl( &aBtnSort );
584 }
585 
586 // -----------------------------------------------------------------------
587 
588 sal_Bool __EXPORT ScTpSubTotalOptions::FillItemSet( SfxItemSet& rArgSet )
589 {
590 	ScSubTotalParam theSubTotalData;			// auslesen, wenn schon teilweise gefuellt
591 	SfxTabDialog* pDlg = GetTabDialog();
592 	if ( pDlg )
593 	{
594 		const SfxItemSet* pExample = pDlg->GetExampleSet();
595 		const SfxPoolItem* pItem;
596 		if ( pExample && pExample->GetItemState( nWhichSubTotals, sal_True, &pItem ) == SFX_ITEM_SET )
597 			theSubTotalData = ((const ScSubTotalItem*)pItem)->GetSubTotalData();
598 	}
599 
600 	theSubTotalData.bPagebreak		= aBtnPagebreak.IsChecked();
601 	theSubTotalData.bReplace		= sal_True;
602 	theSubTotalData.bCaseSens		= aBtnCase.IsChecked();
603 	theSubTotalData.bIncludePattern = aBtnFormats.IsChecked();
604 	theSubTotalData.bDoSort 		= aBtnSort.IsChecked();
605 	theSubTotalData.bAscending		= aBtnAscending.IsChecked();
606 	theSubTotalData.bUserDef		= aBtnUserDef.IsChecked();
607 	theSubTotalData.nUserIndex		= (aBtnUserDef.IsChecked())
608 									? aLbUserDef.GetSelectEntryPos()
609 									: 0;
610 
611 	rArgSet.Put( ScSubTotalItem( nWhichSubTotals, &theSubTotalData ) );
612 
613 	return sal_True;
614 }
615 
616 // -----------------------------------------------------------------------
617 
618 void ScTpSubTotalOptions::FillUserSortListBox()
619 {
620 	ScUserList* pUserLists = ScGlobal::GetUserList();
621 
622 	aLbUserDef.Clear();
623 	if ( pUserLists )
624 	{
625 		sal_uInt16 nCount = pUserLists->GetCount();
626 		if ( nCount > 0 )
627 			for ( sal_uInt16 i=0; i<nCount; i++ )
628 				aLbUserDef.InsertEntry( (*pUserLists)[i]->GetString() );
629 	}
630 }
631 
632 // -----------------------------------------------------------------------
633 // Handler:
634 
635 IMPL_LINK( ScTpSubTotalOptions, CheckHdl, CheckBox *, pBox )
636 {
637 	if ( pBox == &aBtnSort )
638 	{
639 		if ( aBtnSort.IsChecked() )
640 		{
641             aFlSort         .Enable();
642 			aBtnFormats 	.Enable();
643 			aBtnUserDef 	.Enable();
644 			aBtnAscending	.Enable();
645 			aBtnDescending	.Enable();
646 
647 			if ( aBtnUserDef.IsChecked() )
648 				aLbUserDef.Enable();
649 		}
650 		else
651 		{
652             aFlSort         .Disable();
653 			aBtnFormats 	.Disable();
654 			aBtnUserDef 	.Disable();
655 			aBtnAscending	.Disable();
656 			aBtnDescending	.Disable();
657 			aLbUserDef		.Disable();
658 		}
659 	}
660 	else if ( pBox == &aBtnUserDef )
661 	{
662 		if ( aBtnUserDef.IsChecked() )
663 		{
664 			aLbUserDef.Enable();
665 			aLbUserDef.GrabFocus();
666 		}
667 		else
668 			aLbUserDef.Disable();
669 	}
670 
671 	return 0;
672 }
673 
674 __EXPORT ScTpSubTotalGroup1::~ScTpSubTotalGroup1()
675 {
676 }
677 
678 __EXPORT ScTpSubTotalGroup2::~ScTpSubTotalGroup2()
679 {
680 }
681 
682 __EXPORT ScTpSubTotalGroup3::~ScTpSubTotalGroup3()
683 {
684 }
685 
686