1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sc.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #undef SC_DLLIMPLEMENTATION 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir #include "pvfundlg.hxx" 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldReferenceType.hpp> 36*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldReferenceItemType.hpp> 37*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldLayoutMode.hpp> 38*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldSortMode.hpp> 39*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldShowItemsMode.hpp> 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #include <tools/resary.hxx> 42*cdf0e10cSrcweir #include <vcl/msgbox.hxx> 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir #include "scresid.hxx" 45*cdf0e10cSrcweir #include "dpobject.hxx" 46*cdf0e10cSrcweir #include "dpsave.hxx" 47*cdf0e10cSrcweir #include "pvfundlg.hrc" 48*cdf0e10cSrcweir #include "globstr.hrc" 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir #include <vector> 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir // ============================================================================ 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir using namespace ::com::sun::star::sheet; 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir using ::rtl::OUString; 57*cdf0e10cSrcweir using ::com::sun::star::uno::Sequence; 58*cdf0e10cSrcweir using ::std::vector; 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir // ============================================================================ 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir namespace { 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir /** Appends all strings from the Sequence to the list box. 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir Empty strings are replaced by a localized "(empty)" entry and inserted at 67*cdf0e10cSrcweir the specified position. 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir @return true = The passed string list contains an empty string entry. 70*cdf0e10cSrcweir */ 71*cdf0e10cSrcweir template< typename ListBoxType > 72*cdf0e10cSrcweir bool lclFillListBox( ListBoxType& rLBox, const Sequence< OUString >& rStrings, sal_uInt16 nEmptyPos = LISTBOX_APPEND ) 73*cdf0e10cSrcweir { 74*cdf0e10cSrcweir bool bEmpty = false; 75*cdf0e10cSrcweir if( const OUString* pStr = rStrings.getConstArray() ) 76*cdf0e10cSrcweir { 77*cdf0e10cSrcweir for( const OUString* pEnd = pStr + rStrings.getLength(); pStr != pEnd; ++pStr ) 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir if( pStr->getLength() ) 80*cdf0e10cSrcweir rLBox.InsertEntry( *pStr ); 81*cdf0e10cSrcweir else 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir rLBox.InsertEntry( ScGlobal::GetRscString( STR_EMPTYDATA ), nEmptyPos ); 84*cdf0e10cSrcweir bEmpty = true; 85*cdf0e10cSrcweir } 86*cdf0e10cSrcweir } 87*cdf0e10cSrcweir } 88*cdf0e10cSrcweir return bEmpty; 89*cdf0e10cSrcweir } 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir template< typename ListBoxType > 92*cdf0e10cSrcweir bool lclFillListBox( ListBoxType& rLBox, const vector<ScDPLabelData::Member>& rMembers, sal_uInt16 nEmptyPos = LISTBOX_APPEND ) 93*cdf0e10cSrcweir { 94*cdf0e10cSrcweir bool bEmpty = false; 95*cdf0e10cSrcweir vector<ScDPLabelData::Member>::const_iterator itr = rMembers.begin(), itrEnd = rMembers.end(); 96*cdf0e10cSrcweir for (; itr != itrEnd; ++itr) 97*cdf0e10cSrcweir { 98*cdf0e10cSrcweir OUString aName = itr->getDisplayName(); 99*cdf0e10cSrcweir if (aName.getLength()) 100*cdf0e10cSrcweir rLBox.InsertEntry(aName); 101*cdf0e10cSrcweir else 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir rLBox.InsertEntry(ScGlobal::GetRscString(STR_EMPTYDATA), nEmptyPos); 104*cdf0e10cSrcweir bEmpty = true; 105*cdf0e10cSrcweir } 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir return bEmpty; 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir /** Searches for a listbox entry, starts search at specified position. */ 111*cdf0e10cSrcweir sal_uInt16 lclFindListBoxEntry( const ListBox& rLBox, const String& rEntry, sal_uInt16 nStartPos ) 112*cdf0e10cSrcweir { 113*cdf0e10cSrcweir sal_uInt16 nPos = nStartPos; 114*cdf0e10cSrcweir while( (nPos < rLBox.GetEntryCount()) && (rLBox.GetEntry( nPos ) != rEntry) ) 115*cdf0e10cSrcweir ++nPos; 116*cdf0e10cSrcweir return (nPos < rLBox.GetEntryCount()) ? nPos : LISTBOX_ENTRY_NOTFOUND; 117*cdf0e10cSrcweir } 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir /** This table represents the order of the strings in the resource string array. */ 120*cdf0e10cSrcweir static const sal_uInt16 spnFunctions[] = 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir PIVOT_FUNC_SUM, 123*cdf0e10cSrcweir PIVOT_FUNC_COUNT, 124*cdf0e10cSrcweir PIVOT_FUNC_AVERAGE, 125*cdf0e10cSrcweir PIVOT_FUNC_MAX, 126*cdf0e10cSrcweir PIVOT_FUNC_MIN, 127*cdf0e10cSrcweir PIVOT_FUNC_PRODUCT, 128*cdf0e10cSrcweir PIVOT_FUNC_COUNT_NUM, 129*cdf0e10cSrcweir PIVOT_FUNC_STD_DEV, 130*cdf0e10cSrcweir PIVOT_FUNC_STD_DEVP, 131*cdf0e10cSrcweir PIVOT_FUNC_STD_VAR, 132*cdf0e10cSrcweir PIVOT_FUNC_STD_VARP 133*cdf0e10cSrcweir }; 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir const sal_uInt16 SC_BASEITEM_PREV_POS = 0; 136*cdf0e10cSrcweir const sal_uInt16 SC_BASEITEM_NEXT_POS = 1; 137*cdf0e10cSrcweir const sal_uInt16 SC_BASEITEM_USER_POS = 2; 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir const sal_uInt16 SC_SORTNAME_POS = 0; 140*cdf0e10cSrcweir const sal_uInt16 SC_SORTDATA_POS = 1; 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir const long SC_SHOW_DEFAULT = 10; 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir static const ScDPListBoxWrapper::MapEntryType spRefTypeMap[] = 145*cdf0e10cSrcweir { 146*cdf0e10cSrcweir { 0, DataPilotFieldReferenceType::NONE }, 147*cdf0e10cSrcweir { 1, DataPilotFieldReferenceType::ITEM_DIFFERENCE }, 148*cdf0e10cSrcweir { 2, DataPilotFieldReferenceType::ITEM_PERCENTAGE }, 149*cdf0e10cSrcweir { 3, DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE }, 150*cdf0e10cSrcweir { 4, DataPilotFieldReferenceType::RUNNING_TOTAL }, 151*cdf0e10cSrcweir { 5, DataPilotFieldReferenceType::ROW_PERCENTAGE }, 152*cdf0e10cSrcweir { 6, DataPilotFieldReferenceType::COLUMN_PERCENTAGE }, 153*cdf0e10cSrcweir { 7, DataPilotFieldReferenceType::TOTAL_PERCENTAGE }, 154*cdf0e10cSrcweir { 8, DataPilotFieldReferenceType::INDEX }, 155*cdf0e10cSrcweir { LISTBOX_ENTRY_NOTFOUND, DataPilotFieldReferenceType::NONE } 156*cdf0e10cSrcweir }; 157*cdf0e10cSrcweir 158*cdf0e10cSrcweir static const ScDPListBoxWrapper::MapEntryType spLayoutMap[] = 159*cdf0e10cSrcweir { 160*cdf0e10cSrcweir { 0, DataPilotFieldLayoutMode::TABULAR_LAYOUT }, 161*cdf0e10cSrcweir { 1, DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_TOP }, 162*cdf0e10cSrcweir { 2, DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_BOTTOM }, 163*cdf0e10cSrcweir { LISTBOX_ENTRY_NOTFOUND, DataPilotFieldLayoutMode::TABULAR_LAYOUT } 164*cdf0e10cSrcweir }; 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir static const ScDPListBoxWrapper::MapEntryType spShowFromMap[] = 167*cdf0e10cSrcweir { 168*cdf0e10cSrcweir { 0, DataPilotFieldShowItemsMode::FROM_TOP }, 169*cdf0e10cSrcweir { 1, DataPilotFieldShowItemsMode::FROM_BOTTOM }, 170*cdf0e10cSrcweir { LISTBOX_ENTRY_NOTFOUND, DataPilotFieldShowItemsMode::FROM_TOP } 171*cdf0e10cSrcweir }; 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir } // namespace 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir // ============================================================================ 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir ScDPFunctionListBox::ScDPFunctionListBox( Window* pParent, const ResId& rResId ) : 178*cdf0e10cSrcweir MultiListBox( pParent, rResId ) 179*cdf0e10cSrcweir { 180*cdf0e10cSrcweir FillFunctionNames(); 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir void ScDPFunctionListBox::SetSelection( sal_uInt16 nFuncMask ) 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir if( (nFuncMask == PIVOT_FUNC_NONE) || (nFuncMask == PIVOT_FUNC_AUTO) ) 186*cdf0e10cSrcweir SetNoSelection(); 187*cdf0e10cSrcweir else 188*cdf0e10cSrcweir for( sal_uInt16 nEntry = 0, nCount = GetEntryCount(); nEntry < nCount; ++nEntry ) 189*cdf0e10cSrcweir SelectEntryPos( nEntry, (nFuncMask & spnFunctions[ nEntry ]) != 0 ); 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir sal_uInt16 ScDPFunctionListBox::GetSelection() const 193*cdf0e10cSrcweir { 194*cdf0e10cSrcweir sal_uInt16 nFuncMask = PIVOT_FUNC_NONE; 195*cdf0e10cSrcweir for( sal_uInt16 nSel = 0, nCount = GetSelectEntryCount(); nSel < nCount; ++nSel ) 196*cdf0e10cSrcweir nFuncMask |= spnFunctions[ GetSelectEntryPos( nSel ) ]; 197*cdf0e10cSrcweir return nFuncMask; 198*cdf0e10cSrcweir } 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir void ScDPFunctionListBox::FillFunctionNames() 201*cdf0e10cSrcweir { 202*cdf0e10cSrcweir DBG_ASSERT( !GetEntryCount(), "ScDPFunctionListBox::FillFunctionNames - do not add texts to resource" ); 203*cdf0e10cSrcweir Clear(); 204*cdf0e10cSrcweir ResStringArray aArr( ScResId( SCSTR_DPFUNCLISTBOX ) ); 205*cdf0e10cSrcweir for( sal_uInt16 nIndex = 0, nCount = sal::static_int_cast<sal_uInt16>(aArr.Count()); nIndex < nCount; ++nIndex ) 206*cdf0e10cSrcweir InsertEntry( aArr.GetString( nIndex ) ); 207*cdf0e10cSrcweir } 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir // ============================================================================ 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir ScDPFunctionDlg::ScDPFunctionDlg( 212*cdf0e10cSrcweir Window* pParent, const ScDPLabelDataVector& rLabelVec, 213*cdf0e10cSrcweir const ScDPLabelData& rLabelData, const ScPivotFuncData& rFuncData ) : 214*cdf0e10cSrcweir ModalDialog ( pParent, ScResId( RID_SCDLG_DPDATAFIELD ) ), 215*cdf0e10cSrcweir maFlFunc ( this, ScResId( FL_FUNC ) ), 216*cdf0e10cSrcweir maLbFunc ( this, ScResId( LB_FUNC ) ), 217*cdf0e10cSrcweir maFtNameLabel ( this, ScResId( FT_NAMELABEL ) ), 218*cdf0e10cSrcweir maFtName ( this, ScResId( FT_NAME ) ), 219*cdf0e10cSrcweir maFlDisplay ( this, ScResId( FL_DISPLAY ) ), 220*cdf0e10cSrcweir maFtType ( this, ScResId( FT_TYPE ) ), 221*cdf0e10cSrcweir maLbType ( this, ScResId( LB_TYPE ) ), 222*cdf0e10cSrcweir maFtBaseField ( this, ScResId( FT_BASEFIELD ) ), 223*cdf0e10cSrcweir maLbBaseField ( this, ScResId( LB_BASEFIELD ) ), 224*cdf0e10cSrcweir maFtBaseItem ( this, ScResId( FT_BASEITEM ) ), 225*cdf0e10cSrcweir maLbBaseItem ( this, ScResId( LB_BASEITEM ) ), 226*cdf0e10cSrcweir maBtnOk ( this, ScResId( BTN_OK ) ), 227*cdf0e10cSrcweir maBtnCancel ( this, ScResId( BTN_CANCEL ) ), 228*cdf0e10cSrcweir maBtnHelp ( this, ScResId( BTN_HELP ) ), 229*cdf0e10cSrcweir maBtnMore ( this, ScResId( BTN_MORE ) ), 230*cdf0e10cSrcweir maLbTypeWrp ( maLbType, spRefTypeMap ), 231*cdf0e10cSrcweir mrLabelVec ( rLabelVec ), 232*cdf0e10cSrcweir mbEmptyItem ( false ) 233*cdf0e10cSrcweir { 234*cdf0e10cSrcweir FreeResource(); 235*cdf0e10cSrcweir Init( rLabelData, rFuncData ); 236*cdf0e10cSrcweir } 237*cdf0e10cSrcweir 238*cdf0e10cSrcweir sal_uInt16 ScDPFunctionDlg::GetFuncMask() const 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir return maLbFunc.GetSelection(); 241*cdf0e10cSrcweir } 242*cdf0e10cSrcweir 243*cdf0e10cSrcweir DataPilotFieldReference ScDPFunctionDlg::GetFieldRef() const 244*cdf0e10cSrcweir { 245*cdf0e10cSrcweir DataPilotFieldReference aRef; 246*cdf0e10cSrcweir 247*cdf0e10cSrcweir aRef.ReferenceType = maLbTypeWrp.GetControlValue(); 248*cdf0e10cSrcweir aRef.ReferenceField = maLbBaseField.GetSelectEntry(); 249*cdf0e10cSrcweir 250*cdf0e10cSrcweir sal_uInt16 nBaseItemPos = maLbBaseItem.GetSelectEntryPos(); 251*cdf0e10cSrcweir switch( nBaseItemPos ) 252*cdf0e10cSrcweir { 253*cdf0e10cSrcweir case SC_BASEITEM_PREV_POS: 254*cdf0e10cSrcweir aRef.ReferenceItemType = DataPilotFieldReferenceItemType::PREVIOUS; 255*cdf0e10cSrcweir break; 256*cdf0e10cSrcweir case SC_BASEITEM_NEXT_POS: 257*cdf0e10cSrcweir aRef.ReferenceItemType = DataPilotFieldReferenceItemType::NEXT; 258*cdf0e10cSrcweir break; 259*cdf0e10cSrcweir default: 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir aRef.ReferenceItemType = DataPilotFieldReferenceItemType::NAMED; 262*cdf0e10cSrcweir if( !mbEmptyItem || (nBaseItemPos > SC_BASEITEM_USER_POS) ) 263*cdf0e10cSrcweir aRef.ReferenceItemName = maLbBaseItem.GetSelectEntry(); 264*cdf0e10cSrcweir } 265*cdf0e10cSrcweir } 266*cdf0e10cSrcweir 267*cdf0e10cSrcweir return aRef; 268*cdf0e10cSrcweir } 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir void ScDPFunctionDlg::Init( const ScDPLabelData& rLabelData, const ScPivotFuncData& rFuncData ) 271*cdf0e10cSrcweir { 272*cdf0e10cSrcweir // list box 273*cdf0e10cSrcweir sal_uInt16 nFuncMask = (rFuncData.mnFuncMask == PIVOT_FUNC_NONE) ? PIVOT_FUNC_SUM : rFuncData.mnFuncMask; 274*cdf0e10cSrcweir maLbFunc.SetSelection( nFuncMask ); 275*cdf0e10cSrcweir 276*cdf0e10cSrcweir // field name 277*cdf0e10cSrcweir maFtName.SetText(rLabelData.getDisplayName()); 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir // "More button" controls 280*cdf0e10cSrcweir maBtnMore.AddWindow( &maFlDisplay ); 281*cdf0e10cSrcweir maBtnMore.AddWindow( &maFtType ); 282*cdf0e10cSrcweir maBtnMore.AddWindow( &maLbType ); 283*cdf0e10cSrcweir maBtnMore.AddWindow( &maFtBaseField ); 284*cdf0e10cSrcweir maBtnMore.AddWindow( &maLbBaseField ); 285*cdf0e10cSrcweir maBtnMore.AddWindow( &maFtBaseItem ); 286*cdf0e10cSrcweir maBtnMore.AddWindow( &maLbBaseItem ); 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir // handlers 289*cdf0e10cSrcweir maLbFunc.SetDoubleClickHdl( LINK( this, ScDPFunctionDlg, DblClickHdl ) ); 290*cdf0e10cSrcweir maLbType.SetSelectHdl( LINK( this, ScDPFunctionDlg, SelectHdl ) ); 291*cdf0e10cSrcweir maLbBaseField.SetSelectHdl( LINK( this, ScDPFunctionDlg, SelectHdl ) ); 292*cdf0e10cSrcweir 293*cdf0e10cSrcweir // base field list box 294*cdf0e10cSrcweir for( ScDPLabelDataVector::const_iterator aIt = mrLabelVec.begin(), aEnd = mrLabelVec.end(); aIt != aEnd; ++aIt ) 295*cdf0e10cSrcweir maLbBaseField.InsertEntry(aIt->getDisplayName()); 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir // base item list box 298*cdf0e10cSrcweir maLbBaseItem.SetSeparatorPos( SC_BASEITEM_USER_POS - 1 ); 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir // select field reference type 301*cdf0e10cSrcweir maLbTypeWrp.SetControlValue( rFuncData.maFieldRef.ReferenceType ); 302*cdf0e10cSrcweir SelectHdl( &maLbType ); // enables base field/item list boxes 303*cdf0e10cSrcweir 304*cdf0e10cSrcweir // select base field 305*cdf0e10cSrcweir maLbBaseField.SelectEntry( rFuncData.maFieldRef.ReferenceField ); 306*cdf0e10cSrcweir if( maLbBaseField.GetSelectEntryPos() >= maLbBaseField.GetEntryCount() ) 307*cdf0e10cSrcweir maLbBaseField.SelectEntryPos( 0 ); 308*cdf0e10cSrcweir SelectHdl( &maLbBaseField ); // fills base item list, selects base item 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir // select base item 311*cdf0e10cSrcweir switch( rFuncData.maFieldRef.ReferenceItemType ) 312*cdf0e10cSrcweir { 313*cdf0e10cSrcweir case DataPilotFieldReferenceItemType::PREVIOUS: 314*cdf0e10cSrcweir maLbBaseItem.SelectEntryPos( SC_BASEITEM_PREV_POS ); 315*cdf0e10cSrcweir break; 316*cdf0e10cSrcweir case DataPilotFieldReferenceItemType::NEXT: 317*cdf0e10cSrcweir maLbBaseItem.SelectEntryPos( SC_BASEITEM_NEXT_POS ); 318*cdf0e10cSrcweir break; 319*cdf0e10cSrcweir default: 320*cdf0e10cSrcweir { 321*cdf0e10cSrcweir if( mbEmptyItem && !rFuncData.maFieldRef.ReferenceItemName.getLength() ) 322*cdf0e10cSrcweir { 323*cdf0e10cSrcweir // select special "(empty)" entry added before other items 324*cdf0e10cSrcweir maLbBaseItem.SelectEntryPos( SC_BASEITEM_USER_POS ); 325*cdf0e10cSrcweir } 326*cdf0e10cSrcweir else 327*cdf0e10cSrcweir { 328*cdf0e10cSrcweir sal_uInt16 nStartPos = mbEmptyItem ? (SC_BASEITEM_USER_POS + 1) : SC_BASEITEM_USER_POS; 329*cdf0e10cSrcweir sal_uInt16 nPos = lclFindListBoxEntry( maLbBaseItem, rFuncData.maFieldRef.ReferenceItemName, nStartPos ); 330*cdf0e10cSrcweir if( nPos >= maLbBaseItem.GetEntryCount() ) 331*cdf0e10cSrcweir nPos = (maLbBaseItem.GetEntryCount() > SC_BASEITEM_USER_POS) ? SC_BASEITEM_USER_POS : SC_BASEITEM_PREV_POS; 332*cdf0e10cSrcweir maLbBaseItem.SelectEntryPos( nPos ); 333*cdf0e10cSrcweir } 334*cdf0e10cSrcweir } 335*cdf0e10cSrcweir } 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir IMPL_LINK( ScDPFunctionDlg, SelectHdl, ListBox*, pLBox ) 339*cdf0e10cSrcweir { 340*cdf0e10cSrcweir if( pLBox == &maLbType ) 341*cdf0e10cSrcweir { 342*cdf0e10cSrcweir bool bEnableField, bEnableItem; 343*cdf0e10cSrcweir switch( maLbTypeWrp.GetControlValue() ) 344*cdf0e10cSrcweir { 345*cdf0e10cSrcweir case DataPilotFieldReferenceType::ITEM_DIFFERENCE: 346*cdf0e10cSrcweir case DataPilotFieldReferenceType::ITEM_PERCENTAGE: 347*cdf0e10cSrcweir case DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE: 348*cdf0e10cSrcweir bEnableField = bEnableItem = true; 349*cdf0e10cSrcweir break; 350*cdf0e10cSrcweir 351*cdf0e10cSrcweir case DataPilotFieldReferenceType::RUNNING_TOTAL: 352*cdf0e10cSrcweir bEnableField = true; 353*cdf0e10cSrcweir bEnableItem = false; 354*cdf0e10cSrcweir break; 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir default: 357*cdf0e10cSrcweir bEnableField = bEnableItem = false; 358*cdf0e10cSrcweir } 359*cdf0e10cSrcweir 360*cdf0e10cSrcweir bEnableField &= maLbBaseField.GetEntryCount() > 0; 361*cdf0e10cSrcweir maFtBaseField.Enable( bEnableField ); 362*cdf0e10cSrcweir maLbBaseField.Enable( bEnableField ); 363*cdf0e10cSrcweir 364*cdf0e10cSrcweir bEnableItem &= bEnableField; 365*cdf0e10cSrcweir maFtBaseItem.Enable( bEnableItem ); 366*cdf0e10cSrcweir maLbBaseItem.Enable( bEnableItem ); 367*cdf0e10cSrcweir } 368*cdf0e10cSrcweir else if( pLBox == &maLbBaseField ) 369*cdf0e10cSrcweir { 370*cdf0e10cSrcweir // keep "previous" and "next" entries 371*cdf0e10cSrcweir while( maLbBaseItem.GetEntryCount() > SC_BASEITEM_USER_POS ) 372*cdf0e10cSrcweir maLbBaseItem.RemoveEntry( SC_BASEITEM_USER_POS ); 373*cdf0e10cSrcweir 374*cdf0e10cSrcweir // update item list for current base field 375*cdf0e10cSrcweir mbEmptyItem = false; 376*cdf0e10cSrcweir size_t nBasePos = maLbBaseField.GetSelectEntryPos(); 377*cdf0e10cSrcweir if( nBasePos < mrLabelVec.size() ) 378*cdf0e10cSrcweir mbEmptyItem = lclFillListBox( maLbBaseItem, mrLabelVec[ nBasePos ].maMembers, SC_BASEITEM_USER_POS ); 379*cdf0e10cSrcweir 380*cdf0e10cSrcweir // select base item 381*cdf0e10cSrcweir sal_uInt16 nItemPos = (maLbBaseItem.GetEntryCount() > SC_BASEITEM_USER_POS) ? SC_BASEITEM_USER_POS : SC_BASEITEM_PREV_POS; 382*cdf0e10cSrcweir maLbBaseItem.SelectEntryPos( nItemPos ); 383*cdf0e10cSrcweir } 384*cdf0e10cSrcweir return 0; 385*cdf0e10cSrcweir } 386*cdf0e10cSrcweir 387*cdf0e10cSrcweir IMPL_LINK( ScDPFunctionDlg, DblClickHdl, MultiListBox*, EMPTYARG ) 388*cdf0e10cSrcweir { 389*cdf0e10cSrcweir maBtnOk.Click(); 390*cdf0e10cSrcweir return 0; 391*cdf0e10cSrcweir } 392*cdf0e10cSrcweir 393*cdf0e10cSrcweir // ============================================================================ 394*cdf0e10cSrcweir 395*cdf0e10cSrcweir ScDPSubtotalDlg::ScDPSubtotalDlg( Window* pParent, ScDPObject& rDPObj, 396*cdf0e10cSrcweir const ScDPLabelData& rLabelData, const ScPivotFuncData& rFuncData, 397*cdf0e10cSrcweir const ScDPNameVec& rDataFields, bool bEnableLayout ) : 398*cdf0e10cSrcweir ModalDialog ( pParent, ScResId( RID_SCDLG_PIVOTSUBT ) ), 399*cdf0e10cSrcweir maFlSubt ( this, ScResId( FL_FUNC ) ), 400*cdf0e10cSrcweir maRbNone ( this, ScResId( RB_NONE ) ), 401*cdf0e10cSrcweir maRbAuto ( this, ScResId( RB_AUTO ) ), 402*cdf0e10cSrcweir maRbUser ( this, ScResId( RB_USER ) ), 403*cdf0e10cSrcweir maLbFunc ( this, ScResId( LB_FUNC ) ), 404*cdf0e10cSrcweir maFtNameLabel ( this, ScResId( FT_NAMELABEL ) ), 405*cdf0e10cSrcweir maFtName ( this, ScResId( FT_NAME ) ), 406*cdf0e10cSrcweir maCbShowAll ( this, ScResId( CB_SHOWALL ) ), 407*cdf0e10cSrcweir maBtnOk ( this, ScResId( BTN_OK ) ), 408*cdf0e10cSrcweir maBtnCancel ( this, ScResId( BTN_CANCEL ) ), 409*cdf0e10cSrcweir maBtnHelp ( this, ScResId( BTN_HELP ) ), 410*cdf0e10cSrcweir maBtnOptions ( this, ScResId( BTN_OPTIONS ) ), 411*cdf0e10cSrcweir mrDPObj ( rDPObj ), 412*cdf0e10cSrcweir mrDataFields ( rDataFields ), 413*cdf0e10cSrcweir maLabelData ( rLabelData ), 414*cdf0e10cSrcweir mbEnableLayout ( bEnableLayout ) 415*cdf0e10cSrcweir { 416*cdf0e10cSrcweir FreeResource(); 417*cdf0e10cSrcweir Init( rLabelData, rFuncData ); 418*cdf0e10cSrcweir } 419*cdf0e10cSrcweir 420*cdf0e10cSrcweir sal_uInt16 ScDPSubtotalDlg::GetFuncMask() const 421*cdf0e10cSrcweir { 422*cdf0e10cSrcweir sal_uInt16 nFuncMask = PIVOT_FUNC_NONE; 423*cdf0e10cSrcweir 424*cdf0e10cSrcweir if( maRbAuto.IsChecked() ) 425*cdf0e10cSrcweir nFuncMask = PIVOT_FUNC_AUTO; 426*cdf0e10cSrcweir else if( maRbUser.IsChecked() ) 427*cdf0e10cSrcweir nFuncMask = maLbFunc.GetSelection(); 428*cdf0e10cSrcweir 429*cdf0e10cSrcweir return nFuncMask; 430*cdf0e10cSrcweir } 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir void ScDPSubtotalDlg::FillLabelData( ScDPLabelData& rLabelData ) const 433*cdf0e10cSrcweir { 434*cdf0e10cSrcweir rLabelData.mnFuncMask = GetFuncMask(); 435*cdf0e10cSrcweir rLabelData.mnUsedHier = maLabelData.mnUsedHier; 436*cdf0e10cSrcweir rLabelData.mbShowAll = maCbShowAll.IsChecked(); 437*cdf0e10cSrcweir rLabelData.maMembers = maLabelData.maMembers; 438*cdf0e10cSrcweir rLabelData.maSortInfo = maLabelData.maSortInfo; 439*cdf0e10cSrcweir rLabelData.maLayoutInfo = maLabelData.maLayoutInfo; 440*cdf0e10cSrcweir rLabelData.maShowInfo = maLabelData.maShowInfo; 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir 443*cdf0e10cSrcweir void ScDPSubtotalDlg::Init( const ScDPLabelData& rLabelData, const ScPivotFuncData& rFuncData ) 444*cdf0e10cSrcweir { 445*cdf0e10cSrcweir // field name 446*cdf0e10cSrcweir maFtName.SetText(rLabelData.getDisplayName()); 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir // radio buttons 449*cdf0e10cSrcweir maRbNone.SetClickHdl( LINK( this, ScDPSubtotalDlg, RadioClickHdl ) ); 450*cdf0e10cSrcweir maRbAuto.SetClickHdl( LINK( this, ScDPSubtotalDlg, RadioClickHdl ) ); 451*cdf0e10cSrcweir maRbUser.SetClickHdl( LINK( this, ScDPSubtotalDlg, RadioClickHdl ) ); 452*cdf0e10cSrcweir 453*cdf0e10cSrcweir RadioButton* pRBtn = 0; 454*cdf0e10cSrcweir switch( rFuncData.mnFuncMask ) 455*cdf0e10cSrcweir { 456*cdf0e10cSrcweir case PIVOT_FUNC_NONE: pRBtn = &maRbNone; break; 457*cdf0e10cSrcweir case PIVOT_FUNC_AUTO: pRBtn = &maRbAuto; break; 458*cdf0e10cSrcweir default: pRBtn = &maRbUser; 459*cdf0e10cSrcweir } 460*cdf0e10cSrcweir pRBtn->Check(); 461*cdf0e10cSrcweir RadioClickHdl( pRBtn ); 462*cdf0e10cSrcweir 463*cdf0e10cSrcweir // list box 464*cdf0e10cSrcweir maLbFunc.SetSelection( rFuncData.mnFuncMask ); 465*cdf0e10cSrcweir maLbFunc.SetDoubleClickHdl( LINK( this, ScDPSubtotalDlg, DblClickHdl ) ); 466*cdf0e10cSrcweir 467*cdf0e10cSrcweir // show all 468*cdf0e10cSrcweir maCbShowAll.Check( rLabelData.mbShowAll ); 469*cdf0e10cSrcweir 470*cdf0e10cSrcweir // options 471*cdf0e10cSrcweir maBtnOptions.SetClickHdl( LINK( this, ScDPSubtotalDlg, ClickHdl ) ); 472*cdf0e10cSrcweir } 473*cdf0e10cSrcweir 474*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 475*cdf0e10cSrcweir 476*cdf0e10cSrcweir IMPL_LINK( ScDPSubtotalDlg, RadioClickHdl, RadioButton*, pBtn ) 477*cdf0e10cSrcweir { 478*cdf0e10cSrcweir maLbFunc.Enable( pBtn == &maRbUser ); 479*cdf0e10cSrcweir return 0; 480*cdf0e10cSrcweir } 481*cdf0e10cSrcweir 482*cdf0e10cSrcweir IMPL_LINK( ScDPSubtotalDlg, DblClickHdl, MultiListBox*, EMPTYARG ) 483*cdf0e10cSrcweir { 484*cdf0e10cSrcweir maBtnOk.Click(); 485*cdf0e10cSrcweir return 0; 486*cdf0e10cSrcweir } 487*cdf0e10cSrcweir 488*cdf0e10cSrcweir IMPL_LINK( ScDPSubtotalDlg, ClickHdl, PushButton*, pBtn ) 489*cdf0e10cSrcweir { 490*cdf0e10cSrcweir if( pBtn == &maBtnOptions ) 491*cdf0e10cSrcweir { 492*cdf0e10cSrcweir ScDPSubtotalOptDlg* pDlg = new ScDPSubtotalOptDlg( this, mrDPObj, maLabelData, mrDataFields, mbEnableLayout ); 493*cdf0e10cSrcweir if( pDlg->Execute() == RET_OK ) 494*cdf0e10cSrcweir pDlg->FillLabelData( maLabelData ); 495*cdf0e10cSrcweir delete pDlg; 496*cdf0e10cSrcweir } 497*cdf0e10cSrcweir return 0; 498*cdf0e10cSrcweir } 499*cdf0e10cSrcweir 500*cdf0e10cSrcweir // ============================================================================ 501*cdf0e10cSrcweir 502*cdf0e10cSrcweir ScDPSubtotalOptDlg::ScDPSubtotalOptDlg( Window* pParent, ScDPObject& rDPObj, 503*cdf0e10cSrcweir const ScDPLabelData& rLabelData, const ScDPNameVec& rDataFields, 504*cdf0e10cSrcweir bool bEnableLayout ) : 505*cdf0e10cSrcweir ModalDialog ( pParent, ScResId( RID_SCDLG_DPSUBTOTAL_OPT ) ), 506*cdf0e10cSrcweir maFlSortBy ( this, ScResId( FL_SORT_BY ) ), 507*cdf0e10cSrcweir maLbSortBy ( this, ScResId( LB_SORT_BY ) ), 508*cdf0e10cSrcweir maRbSortAsc ( this, ScResId( RB_SORT_ASC ) ), 509*cdf0e10cSrcweir maRbSortDesc ( this, ScResId( RB_SORT_DESC ) ), 510*cdf0e10cSrcweir maRbSortMan ( this, ScResId( RB_SORT_MAN ) ), 511*cdf0e10cSrcweir maFlLayout ( this, ScResId( FL_LAYOUT ) ), 512*cdf0e10cSrcweir maFtLayout ( this, ScResId( FT_LAYOUT ) ), 513*cdf0e10cSrcweir maLbLayout ( this, ScResId( LB_LAYOUT ) ), 514*cdf0e10cSrcweir maCbLayoutEmpty ( this, ScResId( CB_LAYOUT_EMPTY ) ), 515*cdf0e10cSrcweir maFlAutoShow ( this, ScResId( FL_AUTOSHOW ) ), 516*cdf0e10cSrcweir maCbShow ( this, ScResId( CB_SHOW ) ), 517*cdf0e10cSrcweir maNfShow ( this, ScResId( NF_SHOW ) ), 518*cdf0e10cSrcweir maFtShow ( this, ScResId( FT_SHOW ) ), 519*cdf0e10cSrcweir maFtShowFrom ( this, ScResId( FT_SHOW_FROM ) ), 520*cdf0e10cSrcweir maLbShowFrom ( this, ScResId( LB_SHOW_FROM ) ), 521*cdf0e10cSrcweir maFtShowUsing ( this, ScResId( FT_SHOW_USING ) ), 522*cdf0e10cSrcweir maLbShowUsing ( this, ScResId( LB_SHOW_USING ) ), 523*cdf0e10cSrcweir maFlHide ( this, ScResId( FL_HIDE ) ), 524*cdf0e10cSrcweir maLbHide ( this, ScResId( CT_HIDE ) ), 525*cdf0e10cSrcweir maFtHierarchy ( this, ScResId( FT_HIERARCHY ) ), 526*cdf0e10cSrcweir maLbHierarchy ( this, ScResId( LB_HIERARCHY ) ), 527*cdf0e10cSrcweir maBtnOk ( this, ScResId( BTN_OK ) ), 528*cdf0e10cSrcweir maBtnCancel ( this, ScResId( BTN_CANCEL ) ), 529*cdf0e10cSrcweir maBtnHelp ( this, ScResId( BTN_HELP ) ), 530*cdf0e10cSrcweir maLbLayoutWrp ( maLbLayout, spLayoutMap ), 531*cdf0e10cSrcweir maLbShowFromWrp ( maLbShowFrom, spShowFromMap ), 532*cdf0e10cSrcweir mrDPObj ( rDPObj ), 533*cdf0e10cSrcweir maLabelData ( rLabelData ) 534*cdf0e10cSrcweir { 535*cdf0e10cSrcweir FreeResource(); 536*cdf0e10cSrcweir Init( rDataFields, bEnableLayout ); 537*cdf0e10cSrcweir } 538*cdf0e10cSrcweir 539*cdf0e10cSrcweir void ScDPSubtotalOptDlg::FillLabelData( ScDPLabelData& rLabelData ) const 540*cdf0e10cSrcweir { 541*cdf0e10cSrcweir // *** SORTING *** 542*cdf0e10cSrcweir 543*cdf0e10cSrcweir if( maRbSortMan.IsChecked() ) 544*cdf0e10cSrcweir rLabelData.maSortInfo.Mode = DataPilotFieldSortMode::MANUAL; 545*cdf0e10cSrcweir else if( maLbSortBy.GetSelectEntryPos() == SC_SORTNAME_POS ) 546*cdf0e10cSrcweir rLabelData.maSortInfo.Mode = DataPilotFieldSortMode::NAME; 547*cdf0e10cSrcweir else 548*cdf0e10cSrcweir rLabelData.maSortInfo.Mode = DataPilotFieldSortMode::DATA; 549*cdf0e10cSrcweir 550*cdf0e10cSrcweir rLabelData.maSortInfo.Field = maLbSortBy.GetSelectEntry(); 551*cdf0e10cSrcweir rLabelData.maSortInfo.IsAscending = maRbSortAsc.IsChecked(); 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir // *** LAYOUT MODE *** 554*cdf0e10cSrcweir 555*cdf0e10cSrcweir rLabelData.maLayoutInfo.LayoutMode = maLbLayoutWrp.GetControlValue(); 556*cdf0e10cSrcweir rLabelData.maLayoutInfo.AddEmptyLines = maCbLayoutEmpty.IsChecked(); 557*cdf0e10cSrcweir 558*cdf0e10cSrcweir // *** AUTO SHOW *** 559*cdf0e10cSrcweir 560*cdf0e10cSrcweir rLabelData.maShowInfo.IsEnabled = maCbShow.IsChecked(); 561*cdf0e10cSrcweir rLabelData.maShowInfo.ShowItemsMode = maLbShowFromWrp.GetControlValue(); 562*cdf0e10cSrcweir rLabelData.maShowInfo.ItemCount = sal::static_int_cast<sal_Int32>( maNfShow.GetValue() ); 563*cdf0e10cSrcweir rLabelData.maShowInfo.DataField = maLbShowUsing.GetSelectEntry(); 564*cdf0e10cSrcweir 565*cdf0e10cSrcweir // *** HIDDEN ITEMS *** 566*cdf0e10cSrcweir 567*cdf0e10cSrcweir rLabelData.maMembers = maLabelData.maMembers; 568*cdf0e10cSrcweir sal_uLong nVisCount = maLbHide.GetEntryCount(); 569*cdf0e10cSrcweir for( sal_uInt16 nPos = 0; nPos < nVisCount; ++nPos ) 570*cdf0e10cSrcweir rLabelData.maMembers[nPos].mbVisible = !maLbHide.IsChecked(nPos); 571*cdf0e10cSrcweir 572*cdf0e10cSrcweir // *** HIERARCHY *** 573*cdf0e10cSrcweir 574*cdf0e10cSrcweir rLabelData.mnUsedHier = maLbHierarchy.GetSelectEntryCount() ? maLbHierarchy.GetSelectEntryPos() : 0; 575*cdf0e10cSrcweir } 576*cdf0e10cSrcweir 577*cdf0e10cSrcweir void ScDPSubtotalOptDlg::Init( const ScDPNameVec& rDataFields, bool bEnableLayout ) 578*cdf0e10cSrcweir { 579*cdf0e10cSrcweir // *** SORTING *** 580*cdf0e10cSrcweir 581*cdf0e10cSrcweir sal_Int32 nSortMode = maLabelData.maSortInfo.Mode; 582*cdf0e10cSrcweir 583*cdf0e10cSrcweir // sort fields list box 584*cdf0e10cSrcweir maLbSortBy.InsertEntry(maLabelData.getDisplayName()); 585*cdf0e10cSrcweir 586*cdf0e10cSrcweir for( ScDPNameVec::const_iterator aIt = rDataFields.begin(), aEnd = rDataFields.end(); aIt != aEnd; ++aIt ) 587*cdf0e10cSrcweir { 588*cdf0e10cSrcweir maLbSortBy.InsertEntry( *aIt ); 589*cdf0e10cSrcweir maLbShowUsing.InsertEntry( *aIt ); // for AutoShow 590*cdf0e10cSrcweir } 591*cdf0e10cSrcweir if( maLbSortBy.GetEntryCount() > SC_SORTDATA_POS ) 592*cdf0e10cSrcweir maLbSortBy.SetSeparatorPos( SC_SORTDATA_POS - 1 ); 593*cdf0e10cSrcweir 594*cdf0e10cSrcweir sal_uInt16 nSortPos = SC_SORTNAME_POS; 595*cdf0e10cSrcweir if( nSortMode == DataPilotFieldSortMode::DATA ) 596*cdf0e10cSrcweir { 597*cdf0e10cSrcweir nSortPos = lclFindListBoxEntry( maLbSortBy, maLabelData.maSortInfo.Field, SC_SORTDATA_POS ); 598*cdf0e10cSrcweir if( nSortPos >= maLbSortBy.GetEntryCount() ) 599*cdf0e10cSrcweir { 600*cdf0e10cSrcweir nSortPos = SC_SORTNAME_POS; 601*cdf0e10cSrcweir nSortMode = DataPilotFieldSortMode::MANUAL; 602*cdf0e10cSrcweir } 603*cdf0e10cSrcweir } 604*cdf0e10cSrcweir maLbSortBy.SelectEntryPos( nSortPos ); 605*cdf0e10cSrcweir 606*cdf0e10cSrcweir // sorting mode 607*cdf0e10cSrcweir maRbSortAsc.SetClickHdl( LINK( this, ScDPSubtotalOptDlg, RadioClickHdl ) ); 608*cdf0e10cSrcweir maRbSortDesc.SetClickHdl( LINK( this, ScDPSubtotalOptDlg, RadioClickHdl ) ); 609*cdf0e10cSrcweir maRbSortMan.SetClickHdl( LINK( this, ScDPSubtotalOptDlg, RadioClickHdl ) ); 610*cdf0e10cSrcweir 611*cdf0e10cSrcweir RadioButton* pRBtn = 0; 612*cdf0e10cSrcweir switch( nSortMode ) 613*cdf0e10cSrcweir { 614*cdf0e10cSrcweir case DataPilotFieldSortMode::NONE: 615*cdf0e10cSrcweir case DataPilotFieldSortMode::MANUAL: 616*cdf0e10cSrcweir pRBtn = &maRbSortMan; 617*cdf0e10cSrcweir break; 618*cdf0e10cSrcweir default: 619*cdf0e10cSrcweir pRBtn = maLabelData.maSortInfo.IsAscending ? &maRbSortAsc : &maRbSortDesc; 620*cdf0e10cSrcweir } 621*cdf0e10cSrcweir pRBtn->Check(); 622*cdf0e10cSrcweir RadioClickHdl( pRBtn ); 623*cdf0e10cSrcweir 624*cdf0e10cSrcweir // *** LAYOUT MODE *** 625*cdf0e10cSrcweir 626*cdf0e10cSrcweir maFlLayout.Enable( bEnableLayout ); 627*cdf0e10cSrcweir maFtLayout.Enable( bEnableLayout ); 628*cdf0e10cSrcweir maLbLayout.Enable( bEnableLayout ); 629*cdf0e10cSrcweir maCbLayoutEmpty.Enable( bEnableLayout ); 630*cdf0e10cSrcweir 631*cdf0e10cSrcweir maLbLayoutWrp.SetControlValue( maLabelData.maLayoutInfo.LayoutMode ); 632*cdf0e10cSrcweir maCbLayoutEmpty.Check( maLabelData.maLayoutInfo.AddEmptyLines ); 633*cdf0e10cSrcweir 634*cdf0e10cSrcweir // *** AUTO SHOW *** 635*cdf0e10cSrcweir 636*cdf0e10cSrcweir maCbShow.Check( maLabelData.maShowInfo.IsEnabled ); 637*cdf0e10cSrcweir maCbShow.SetClickHdl( LINK( this, ScDPSubtotalOptDlg, CheckHdl ) ); 638*cdf0e10cSrcweir 639*cdf0e10cSrcweir maLbShowFromWrp.SetControlValue( maLabelData.maShowInfo.ShowItemsMode ); 640*cdf0e10cSrcweir long nCount = static_cast< long >( maLabelData.maShowInfo.ItemCount ); 641*cdf0e10cSrcweir if( nCount < 1 ) 642*cdf0e10cSrcweir nCount = SC_SHOW_DEFAULT; 643*cdf0e10cSrcweir maNfShow.SetValue( nCount ); 644*cdf0e10cSrcweir 645*cdf0e10cSrcweir // maLbShowUsing already filled above 646*cdf0e10cSrcweir maLbShowUsing.SelectEntry( maLabelData.maShowInfo.DataField ); 647*cdf0e10cSrcweir if( maLbShowUsing.GetSelectEntryPos() >= maLbShowUsing.GetEntryCount() ) 648*cdf0e10cSrcweir maLbShowUsing.SelectEntryPos( 0 ); 649*cdf0e10cSrcweir 650*cdf0e10cSrcweir CheckHdl( &maCbShow ); // enable/disable dependent controls 651*cdf0e10cSrcweir 652*cdf0e10cSrcweir // *** HIDDEN ITEMS *** 653*cdf0e10cSrcweir 654*cdf0e10cSrcweir maLbHide.SetHelpId( HID_SC_DPSUBT_HIDE ); 655*cdf0e10cSrcweir InitHideListBox(); 656*cdf0e10cSrcweir 657*cdf0e10cSrcweir // *** HIERARCHY *** 658*cdf0e10cSrcweir 659*cdf0e10cSrcweir if( maLabelData.maHiers.getLength() > 1 ) 660*cdf0e10cSrcweir { 661*cdf0e10cSrcweir lclFillListBox( maLbHierarchy, maLabelData.maHiers ); 662*cdf0e10cSrcweir sal_Int32 nHier = maLabelData.mnUsedHier; 663*cdf0e10cSrcweir if( (nHier < 0) || (nHier >= maLabelData.maHiers.getLength()) ) nHier = 0; 664*cdf0e10cSrcweir maLbHierarchy.SelectEntryPos( static_cast< sal_uInt16 >( nHier ) ); 665*cdf0e10cSrcweir maLbHierarchy.SetSelectHdl( LINK( this, ScDPSubtotalOptDlg, SelectHdl ) ); 666*cdf0e10cSrcweir } 667*cdf0e10cSrcweir else 668*cdf0e10cSrcweir { 669*cdf0e10cSrcweir maFtHierarchy.Disable(); 670*cdf0e10cSrcweir maLbHierarchy.Disable(); 671*cdf0e10cSrcweir } 672*cdf0e10cSrcweir } 673*cdf0e10cSrcweir 674*cdf0e10cSrcweir void ScDPSubtotalOptDlg::InitHideListBox() 675*cdf0e10cSrcweir { 676*cdf0e10cSrcweir maLbHide.Clear(); 677*cdf0e10cSrcweir lclFillListBox( maLbHide, maLabelData.maMembers ); 678*cdf0e10cSrcweir size_t n = maLabelData.maMembers.size(); 679*cdf0e10cSrcweir for (size_t i = 0; i < n; ++i) 680*cdf0e10cSrcweir maLbHide.CheckEntryPos(static_cast<sal_uInt16>(i), !maLabelData.maMembers[i].mbVisible); 681*cdf0e10cSrcweir bool bEnable = maLbHide.GetEntryCount() > 0; 682*cdf0e10cSrcweir maFlHide.Enable( bEnable ); 683*cdf0e10cSrcweir maLbHide.Enable( bEnable ); 684*cdf0e10cSrcweir } 685*cdf0e10cSrcweir 686*cdf0e10cSrcweir IMPL_LINK( ScDPSubtotalOptDlg, RadioClickHdl, RadioButton*, pBtn ) 687*cdf0e10cSrcweir { 688*cdf0e10cSrcweir maLbSortBy.Enable( pBtn != &maRbSortMan ); 689*cdf0e10cSrcweir return 0; 690*cdf0e10cSrcweir } 691*cdf0e10cSrcweir 692*cdf0e10cSrcweir IMPL_LINK( ScDPSubtotalOptDlg, CheckHdl, CheckBox*, pCBox ) 693*cdf0e10cSrcweir { 694*cdf0e10cSrcweir if( pCBox == &maCbShow ) 695*cdf0e10cSrcweir { 696*cdf0e10cSrcweir bool bEnable = maCbShow.IsChecked(); 697*cdf0e10cSrcweir maNfShow.Enable( bEnable ); 698*cdf0e10cSrcweir maFtShow.Enable( bEnable ); 699*cdf0e10cSrcweir maFtShowFrom.Enable( bEnable ); 700*cdf0e10cSrcweir maLbShowFrom.Enable( bEnable ); 701*cdf0e10cSrcweir 702*cdf0e10cSrcweir bool bEnableUsing = bEnable && (maLbShowUsing.GetEntryCount() > 0); 703*cdf0e10cSrcweir maFtShowUsing.Enable( bEnableUsing ); 704*cdf0e10cSrcweir maLbShowUsing.Enable( bEnableUsing ); 705*cdf0e10cSrcweir } 706*cdf0e10cSrcweir return 0; 707*cdf0e10cSrcweir } 708*cdf0e10cSrcweir 709*cdf0e10cSrcweir IMPL_LINK( ScDPSubtotalOptDlg, SelectHdl, ListBox*, pLBox ) 710*cdf0e10cSrcweir { 711*cdf0e10cSrcweir if( pLBox == &maLbHierarchy ) 712*cdf0e10cSrcweir { 713*cdf0e10cSrcweir mrDPObj.GetMembers(maLabelData.mnCol, maLbHierarchy.GetSelectEntryPos(), maLabelData.maMembers); 714*cdf0e10cSrcweir InitHideListBox(); 715*cdf0e10cSrcweir } 716*cdf0e10cSrcweir return 0; 717*cdf0e10cSrcweir } 718*cdf0e10cSrcweir 719*cdf0e10cSrcweir // ============================================================================ 720*cdf0e10cSrcweir 721*cdf0e10cSrcweir ScDPShowDetailDlg::ScDPShowDetailDlg( Window* pParent, ScDPObject& rDPObj, sal_uInt16 nOrient ) : 722*cdf0e10cSrcweir ModalDialog ( pParent, ScResId( RID_SCDLG_DPSHOWDETAIL ) ), 723*cdf0e10cSrcweir maFtDims ( this, ScResId( FT_DIMS ) ), 724*cdf0e10cSrcweir maLbDims ( this, ScResId( LB_DIMS ) ), 725*cdf0e10cSrcweir maBtnOk ( this, ScResId( BTN_OK ) ), 726*cdf0e10cSrcweir maBtnCancel ( this, ScResId( BTN_CANCEL ) ), 727*cdf0e10cSrcweir maBtnHelp ( this, ScResId( BTN_HELP ) ), 728*cdf0e10cSrcweir 729*cdf0e10cSrcweir mrDPObj(rDPObj) 730*cdf0e10cSrcweir { 731*cdf0e10cSrcweir FreeResource(); 732*cdf0e10cSrcweir 733*cdf0e10cSrcweir ScDPSaveData* pSaveData = rDPObj.GetSaveData(); 734*cdf0e10cSrcweir long nDimCount = rDPObj.GetDimCount(); 735*cdf0e10cSrcweir for (long nDim=0; nDim<nDimCount; nDim++) 736*cdf0e10cSrcweir { 737*cdf0e10cSrcweir sal_Bool bIsDataLayout; 738*cdf0e10cSrcweir sal_Int32 nDimFlags = 0; 739*cdf0e10cSrcweir String aName = rDPObj.GetDimName( nDim, bIsDataLayout, &nDimFlags ); 740*cdf0e10cSrcweir if ( !bIsDataLayout && !rDPObj.IsDuplicated( nDim ) && ScDPObject::IsOrientationAllowed( nOrient, nDimFlags ) ) 741*cdf0e10cSrcweir { 742*cdf0e10cSrcweir const ScDPSaveDimension* pDimension = pSaveData ? pSaveData->GetExistingDimensionByName(aName) : 0; 743*cdf0e10cSrcweir if ( !pDimension || (pDimension->GetOrientation() != nOrient) ) 744*cdf0e10cSrcweir { 745*cdf0e10cSrcweir if (pDimension) 746*cdf0e10cSrcweir { 747*cdf0e10cSrcweir const OUString* pLayoutName = pDimension->GetLayoutName(); 748*cdf0e10cSrcweir if (pLayoutName) 749*cdf0e10cSrcweir aName = *pLayoutName; 750*cdf0e10cSrcweir } 751*cdf0e10cSrcweir if ( aName.Len() ) 752*cdf0e10cSrcweir { 753*cdf0e10cSrcweir maLbDims.InsertEntry( aName ); 754*cdf0e10cSrcweir maNameIndexMap.insert(DimNameIndexMap::value_type(aName, nDim)); 755*cdf0e10cSrcweir } 756*cdf0e10cSrcweir } 757*cdf0e10cSrcweir } 758*cdf0e10cSrcweir } 759*cdf0e10cSrcweir if( maLbDims.GetEntryCount() ) 760*cdf0e10cSrcweir maLbDims.SelectEntryPos( 0 ); 761*cdf0e10cSrcweir 762*cdf0e10cSrcweir maLbDims.SetDoubleClickHdl( LINK( this, ScDPShowDetailDlg, DblClickHdl ) ); 763*cdf0e10cSrcweir } 764*cdf0e10cSrcweir 765*cdf0e10cSrcweir short ScDPShowDetailDlg::Execute() 766*cdf0e10cSrcweir { 767*cdf0e10cSrcweir return maLbDims.GetEntryCount() ? ModalDialog::Execute() : RET_CANCEL; 768*cdf0e10cSrcweir } 769*cdf0e10cSrcweir 770*cdf0e10cSrcweir String ScDPShowDetailDlg::GetDimensionName() const 771*cdf0e10cSrcweir { 772*cdf0e10cSrcweir // Look up the internal dimension name which may be different from the 773*cdf0e10cSrcweir // displayed field name. 774*cdf0e10cSrcweir String aSelectedName = maLbDims.GetSelectEntry(); 775*cdf0e10cSrcweir DimNameIndexMap::const_iterator itr = maNameIndexMap.find(aSelectedName); 776*cdf0e10cSrcweir if (itr == maNameIndexMap.end()) 777*cdf0e10cSrcweir // This should never happen! 778*cdf0e10cSrcweir return aSelectedName; 779*cdf0e10cSrcweir 780*cdf0e10cSrcweir long nDim = itr->second; 781*cdf0e10cSrcweir sal_Bool bIsDataLayout = false; 782*cdf0e10cSrcweir return mrDPObj.GetDimName(nDim, bIsDataLayout); 783*cdf0e10cSrcweir } 784*cdf0e10cSrcweir 785*cdf0e10cSrcweir IMPL_LINK( ScDPShowDetailDlg, DblClickHdl, ListBox*, pLBox ) 786*cdf0e10cSrcweir { 787*cdf0e10cSrcweir if( pLBox == &maLbDims ) 788*cdf0e10cSrcweir maBtnOk.Click(); 789*cdf0e10cSrcweir return 0; 790*cdf0e10cSrcweir } 791*cdf0e10cSrcweir 792*cdf0e10cSrcweir // ============================================================================ 793*cdf0e10cSrcweir 794