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