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