blob: ec9b0565753b50b6f154fec4266e26f0deed3dbf [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
#undef SC_DLLIMPLEMENTATION
#include "pvfundlg.hxx"
#include <com/sun/star/sheet/DataPilotFieldReferenceType.hpp>
#include <com/sun/star/sheet/DataPilotFieldReferenceItemType.hpp>
#include <com/sun/star/sheet/DataPilotFieldLayoutMode.hpp>
#include <com/sun/star/sheet/DataPilotFieldSortMode.hpp>
#include <com/sun/star/sheet/DataPilotFieldShowItemsMode.hpp>
#include <tools/resary.hxx>
#include <vcl/msgbox.hxx>
#include "scresid.hxx"
#include "dpobject.hxx"
#include "dpsave.hxx"
#include "pvfundlg.hrc"
#include "globstr.hrc"
#include <vector>
// ============================================================================
using namespace ::com::sun::star::sheet;
using ::rtl::OUString;
using ::com::sun::star::uno::Sequence;
using ::std::vector;
// ============================================================================
namespace {
/** Appends all strings from the Sequence to the list box.
Empty strings are replaced by a localized "(empty)" entry and inserted at
the specified position.
@return true = The passed string list contains an empty string entry.
*/
template< typename ListBoxType >
bool lclFillListBox( ListBoxType& rLBox, const Sequence< OUString >& rStrings, sal_uInt16 nEmptyPos = LISTBOX_APPEND )
{
bool bEmpty = false;
if( const OUString* pStr = rStrings.getConstArray() )
{
for( const OUString* pEnd = pStr + rStrings.getLength(); pStr != pEnd; ++pStr )
{
if( pStr->getLength() )
rLBox.InsertEntry( *pStr );
else
{
rLBox.InsertEntry( ScGlobal::GetRscString( STR_EMPTYDATA ), nEmptyPos );
bEmpty = true;
}
}
}
return bEmpty;
}
template< typename ListBoxType >
bool lclFillListBox( ListBoxType& rLBox, const vector<ScDPLabelData::Member>& rMembers, sal_uInt16 nEmptyPos = LISTBOX_APPEND )
{
bool bEmpty = false;
vector<ScDPLabelData::Member>::const_iterator itr = rMembers.begin(), itrEnd = rMembers.end();
for (; itr != itrEnd; ++itr)
{
OUString aName = itr->getDisplayName();
if (aName.getLength())
rLBox.InsertEntry(aName);
else
{
rLBox.InsertEntry(ScGlobal::GetRscString(STR_EMPTYDATA), nEmptyPos);
bEmpty = true;
}
}
return bEmpty;
}
/** Searches for a listbox entry, starts search at specified position. */
sal_uInt16 lclFindListBoxEntry( const ListBox& rLBox, const String& rEntry, sal_uInt16 nStartPos )
{
sal_uInt16 nPos = nStartPos;
while( (nPos < rLBox.GetEntryCount()) && (rLBox.GetEntry( nPos ) != rEntry) )
++nPos;
return (nPos < rLBox.GetEntryCount()) ? nPos : LISTBOX_ENTRY_NOTFOUND;
}
/** This table represents the order of the strings in the resource string array. */
static const sal_uInt16 spnFunctions[] =
{
PIVOT_FUNC_SUM,
PIVOT_FUNC_COUNT,
PIVOT_FUNC_AVERAGE,
PIVOT_FUNC_MAX,
PIVOT_FUNC_MIN,
PIVOT_FUNC_PRODUCT,
PIVOT_FUNC_COUNT_NUM,
PIVOT_FUNC_STD_DEV,
PIVOT_FUNC_STD_DEVP,
PIVOT_FUNC_STD_VAR,
PIVOT_FUNC_STD_VARP
};
const sal_uInt16 SC_BASEITEM_PREV_POS = 0;
const sal_uInt16 SC_BASEITEM_NEXT_POS = 1;
const sal_uInt16 SC_BASEITEM_USER_POS = 2;
const sal_uInt16 SC_SORTNAME_POS = 0;
const sal_uInt16 SC_SORTDATA_POS = 1;
const long SC_SHOW_DEFAULT = 10;
static const ScDPListBoxWrapper::MapEntryType spRefTypeMap[] =
{
{ 0, DataPilotFieldReferenceType::NONE },
{ 1, DataPilotFieldReferenceType::ITEM_DIFFERENCE },
{ 2, DataPilotFieldReferenceType::ITEM_PERCENTAGE },
{ 3, DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE },
{ 4, DataPilotFieldReferenceType::RUNNING_TOTAL },
{ 5, DataPilotFieldReferenceType::ROW_PERCENTAGE },
{ 6, DataPilotFieldReferenceType::COLUMN_PERCENTAGE },
{ 7, DataPilotFieldReferenceType::TOTAL_PERCENTAGE },
{ 8, DataPilotFieldReferenceType::INDEX },
{ LISTBOX_ENTRY_NOTFOUND, DataPilotFieldReferenceType::NONE }
};
static const ScDPListBoxWrapper::MapEntryType spLayoutMap[] =
{
{ 0, DataPilotFieldLayoutMode::TABULAR_LAYOUT },
{ 1, DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_TOP },
{ 2, DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_BOTTOM },
{ LISTBOX_ENTRY_NOTFOUND, DataPilotFieldLayoutMode::TABULAR_LAYOUT }
};
static const ScDPListBoxWrapper::MapEntryType spShowFromMap[] =
{
{ 0, DataPilotFieldShowItemsMode::FROM_TOP },
{ 1, DataPilotFieldShowItemsMode::FROM_BOTTOM },
{ LISTBOX_ENTRY_NOTFOUND, DataPilotFieldShowItemsMode::FROM_TOP }
};
} // namespace
// ============================================================================
ScDPFunctionListBox::ScDPFunctionListBox( Window* pParent, const ResId& rResId ) :
MultiListBox( pParent, rResId )
{
FillFunctionNames();
}
void ScDPFunctionListBox::SetSelection( sal_uInt16 nFuncMask )
{
if( (nFuncMask == PIVOT_FUNC_NONE) || (nFuncMask == PIVOT_FUNC_AUTO) )
SetNoSelection();
else
for( sal_uInt16 nEntry = 0, nCount = GetEntryCount(); nEntry < nCount; ++nEntry )
SelectEntryPos( nEntry, (nFuncMask & spnFunctions[ nEntry ]) != 0 );
}
sal_uInt16 ScDPFunctionListBox::GetSelection() const
{
sal_uInt16 nFuncMask = PIVOT_FUNC_NONE;
for( sal_uInt16 nSel = 0, nCount = GetSelectEntryCount(); nSel < nCount; ++nSel )
nFuncMask |= spnFunctions[ GetSelectEntryPos( nSel ) ];
return nFuncMask;
}
void ScDPFunctionListBox::FillFunctionNames()
{
DBG_ASSERT( !GetEntryCount(), "ScDPFunctionListBox::FillFunctionNames - do not add texts to resource" );
Clear();
ResStringArray aArr( ScResId( SCSTR_DPFUNCLISTBOX ) );
for( sal_uInt16 nIndex = 0, nCount = sal::static_int_cast<sal_uInt16>(aArr.Count()); nIndex < nCount; ++nIndex )
InsertEntry( aArr.GetString( nIndex ) );
}
// ============================================================================
ScDPFunctionDlg::ScDPFunctionDlg(
Window* pParent, const ScDPLabelDataVector& rLabelVec,
const ScDPLabelData& rLabelData, const ScPivotFuncData& rFuncData ) :
ModalDialog ( pParent, ScResId( RID_SCDLG_DPDATAFIELD ) ),
maFlFunc ( this, ScResId( FL_FUNC ) ),
maLbFunc ( this, ScResId( LB_FUNC ) ),
maFtNameLabel ( this, ScResId( FT_NAMELABEL ) ),
maFtName ( this, ScResId( FT_NAME ) ),
maFlDisplay ( this, ScResId( FL_DISPLAY ) ),
maFtType ( this, ScResId( FT_TYPE ) ),
maLbType ( this, ScResId( LB_TYPE ) ),
maFtBaseField ( this, ScResId( FT_BASEFIELD ) ),
maLbBaseField ( this, ScResId( LB_BASEFIELD ) ),
maFtBaseItem ( this, ScResId( FT_BASEITEM ) ),
maLbBaseItem ( this, ScResId( LB_BASEITEM ) ),
maBtnOk ( this, ScResId( BTN_OK ) ),
maBtnCancel ( this, ScResId( BTN_CANCEL ) ),
maBtnHelp ( this, ScResId( BTN_HELP ) ),
maBtnMore ( this, ScResId( BTN_MORE ) ),
maLbTypeWrp ( maLbType, spRefTypeMap ),
mrLabelVec ( rLabelVec ),
mbEmptyItem ( false )
{
FreeResource();
Init( rLabelData, rFuncData );
}
sal_uInt16 ScDPFunctionDlg::GetFuncMask() const
{
return maLbFunc.GetSelection();
}
DataPilotFieldReference ScDPFunctionDlg::GetFieldRef() const
{
DataPilotFieldReference aRef;
aRef.ReferenceType = maLbTypeWrp.GetControlValue();
aRef.ReferenceField = maLbBaseField.GetSelectEntry();
sal_uInt16 nBaseItemPos = maLbBaseItem.GetSelectEntryPos();
switch( nBaseItemPos )
{
case SC_BASEITEM_PREV_POS:
aRef.ReferenceItemType = DataPilotFieldReferenceItemType::PREVIOUS;
break;
case SC_BASEITEM_NEXT_POS:
aRef.ReferenceItemType = DataPilotFieldReferenceItemType::NEXT;
break;
default:
{
aRef.ReferenceItemType = DataPilotFieldReferenceItemType::NAMED;
if( !mbEmptyItem || (nBaseItemPos > SC_BASEITEM_USER_POS) )
aRef.ReferenceItemName = maLbBaseItem.GetSelectEntry();
}
}
return aRef;
}
void ScDPFunctionDlg::Init( const ScDPLabelData& rLabelData, const ScPivotFuncData& rFuncData )
{
// list box
sal_uInt16 nFuncMask = (rFuncData.mnFuncMask == PIVOT_FUNC_NONE) ? PIVOT_FUNC_SUM : rFuncData.mnFuncMask;
maLbFunc.SetSelection( nFuncMask );
// field name
maFtName.SetText(rLabelData.getDisplayName());
// "More button" controls
maBtnMore.AddWindow( &maFlDisplay );
maBtnMore.AddWindow( &maFtType );
maBtnMore.AddWindow( &maLbType );
maBtnMore.AddWindow( &maFtBaseField );
maBtnMore.AddWindow( &maLbBaseField );
maBtnMore.AddWindow( &maFtBaseItem );
maBtnMore.AddWindow( &maLbBaseItem );
// handlers
maLbFunc.SetDoubleClickHdl( LINK( this, ScDPFunctionDlg, DblClickHdl ) );
maLbType.SetSelectHdl( LINK( this, ScDPFunctionDlg, SelectHdl ) );
maLbBaseField.SetSelectHdl( LINK( this, ScDPFunctionDlg, SelectHdl ) );
// base field list box
for( ScDPLabelDataVector::const_iterator aIt = mrLabelVec.begin(), aEnd = mrLabelVec.end(); aIt != aEnd; ++aIt )
maLbBaseField.InsertEntry(aIt->getDisplayName());
// base item list box
maLbBaseItem.SetSeparatorPos( SC_BASEITEM_USER_POS - 1 );
// select field reference type
maLbTypeWrp.SetControlValue( rFuncData.maFieldRef.ReferenceType );
SelectHdl( &maLbType ); // enables base field/item list boxes
// select base field
maLbBaseField.SelectEntry( rFuncData.maFieldRef.ReferenceField );
if( maLbBaseField.GetSelectEntryPos() >= maLbBaseField.GetEntryCount() )
maLbBaseField.SelectEntryPos( 0 );
SelectHdl( &maLbBaseField ); // fills base item list, selects base item
// select base item
switch( rFuncData.maFieldRef.ReferenceItemType )
{
case DataPilotFieldReferenceItemType::PREVIOUS:
maLbBaseItem.SelectEntryPos( SC_BASEITEM_PREV_POS );
break;
case DataPilotFieldReferenceItemType::NEXT:
maLbBaseItem.SelectEntryPos( SC_BASEITEM_NEXT_POS );
break;
default:
{
if( mbEmptyItem && !rFuncData.maFieldRef.ReferenceItemName.getLength() )
{
// select special "(empty)" entry added before other items
maLbBaseItem.SelectEntryPos( SC_BASEITEM_USER_POS );
}
else
{
sal_uInt16 nStartPos = mbEmptyItem ? (SC_BASEITEM_USER_POS + 1) : SC_BASEITEM_USER_POS;
sal_uInt16 nPos = lclFindListBoxEntry( maLbBaseItem, rFuncData.maFieldRef.ReferenceItemName, nStartPos );
if( nPos >= maLbBaseItem.GetEntryCount() )
nPos = (maLbBaseItem.GetEntryCount() > SC_BASEITEM_USER_POS) ? SC_BASEITEM_USER_POS : SC_BASEITEM_PREV_POS;
maLbBaseItem.SelectEntryPos( nPos );
}
}
}
}
IMPL_LINK( ScDPFunctionDlg, SelectHdl, ListBox*, pLBox )
{
if( pLBox == &maLbType )
{
bool bEnableField, bEnableItem;
switch( maLbTypeWrp.GetControlValue() )
{
case DataPilotFieldReferenceType::ITEM_DIFFERENCE:
case DataPilotFieldReferenceType::ITEM_PERCENTAGE:
case DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE:
bEnableField = bEnableItem = true;
break;
case DataPilotFieldReferenceType::RUNNING_TOTAL:
bEnableField = true;
bEnableItem = false;
break;
default:
bEnableField = bEnableItem = false;
}
bEnableField &= maLbBaseField.GetEntryCount() > 0;
maFtBaseField.Enable( bEnableField );
maLbBaseField.Enable( bEnableField );
bEnableItem &= bEnableField;
maFtBaseItem.Enable( bEnableItem );
maLbBaseItem.Enable( bEnableItem );
}
else if( pLBox == &maLbBaseField )
{
// keep "previous" and "next" entries
while( maLbBaseItem.GetEntryCount() > SC_BASEITEM_USER_POS )
maLbBaseItem.RemoveEntry( SC_BASEITEM_USER_POS );
// update item list for current base field
mbEmptyItem = false;
size_t nBasePos = maLbBaseField.GetSelectEntryPos();
if( nBasePos < mrLabelVec.size() )
mbEmptyItem = lclFillListBox( maLbBaseItem, mrLabelVec[ nBasePos ].maMembers, SC_BASEITEM_USER_POS );
// select base item
sal_uInt16 nItemPos = (maLbBaseItem.GetEntryCount() > SC_BASEITEM_USER_POS) ? SC_BASEITEM_USER_POS : SC_BASEITEM_PREV_POS;
maLbBaseItem.SelectEntryPos( nItemPos );
}
return 0;
}
IMPL_LINK( ScDPFunctionDlg, DblClickHdl, MultiListBox*, EMPTYARG )
{
maBtnOk.Click();
return 0;
}
// ============================================================================
ScDPSubtotalDlg::ScDPSubtotalDlg( Window* pParent, ScDPObject& rDPObj,
const ScDPLabelData& rLabelData, const ScPivotFuncData& rFuncData,
const ScDPNameVec& rDataFields, bool bEnableLayout ) :
ModalDialog ( pParent, ScResId( RID_SCDLG_PIVOTSUBT ) ),
maFlSubt ( this, ScResId( FL_FUNC ) ),
maRbNone ( this, ScResId( RB_NONE ) ),
maRbAuto ( this, ScResId( RB_AUTO ) ),
maRbUser ( this, ScResId( RB_USER ) ),
maLbFunc ( this, ScResId( LB_FUNC ) ),
maFtNameLabel ( this, ScResId( FT_NAMELABEL ) ),
maFtName ( this, ScResId( FT_NAME ) ),
maCbShowAll ( this, ScResId( CB_SHOWALL ) ),
maBtnOk ( this, ScResId( BTN_OK ) ),
maBtnCancel ( this, ScResId( BTN_CANCEL ) ),
maBtnHelp ( this, ScResId( BTN_HELP ) ),
maBtnOptions ( this, ScResId( BTN_OPTIONS ) ),
mrDPObj ( rDPObj ),
mrDataFields ( rDataFields ),
maLabelData ( rLabelData ),
mbEnableLayout ( bEnableLayout )
{
FreeResource();
Init( rLabelData, rFuncData );
}
sal_uInt16 ScDPSubtotalDlg::GetFuncMask() const
{
sal_uInt16 nFuncMask = PIVOT_FUNC_NONE;
if( maRbAuto.IsChecked() )
nFuncMask = PIVOT_FUNC_AUTO;
else if( maRbUser.IsChecked() )
nFuncMask = maLbFunc.GetSelection();
return nFuncMask;
}
void ScDPSubtotalDlg::FillLabelData( ScDPLabelData& rLabelData ) const
{
rLabelData.mnFuncMask = GetFuncMask();
rLabelData.mnUsedHier = maLabelData.mnUsedHier;
rLabelData.mbShowAll = maCbShowAll.IsChecked();
rLabelData.maMembers = maLabelData.maMembers;
rLabelData.maSortInfo = maLabelData.maSortInfo;
rLabelData.maLayoutInfo = maLabelData.maLayoutInfo;
rLabelData.maShowInfo = maLabelData.maShowInfo;
}
void ScDPSubtotalDlg::Init( const ScDPLabelData& rLabelData, const ScPivotFuncData& rFuncData )
{
// field name
maFtName.SetText(rLabelData.getDisplayName());
// radio buttons
maRbNone.SetClickHdl( LINK( this, ScDPSubtotalDlg, RadioClickHdl ) );
maRbAuto.SetClickHdl( LINK( this, ScDPSubtotalDlg, RadioClickHdl ) );
maRbUser.SetClickHdl( LINK( this, ScDPSubtotalDlg, RadioClickHdl ) );
RadioButton* pRBtn = 0;
switch( rFuncData.mnFuncMask )
{
case PIVOT_FUNC_NONE: pRBtn = &maRbNone; break;
case PIVOT_FUNC_AUTO: pRBtn = &maRbAuto; break;
default: pRBtn = &maRbUser;
}
pRBtn->Check();
RadioClickHdl( pRBtn );
// list box
maLbFunc.SetSelection( rFuncData.mnFuncMask );
maLbFunc.SetDoubleClickHdl( LINK( this, ScDPSubtotalDlg, DblClickHdl ) );
// show all
maCbShowAll.Check( rLabelData.mbShowAll );
// options
maBtnOptions.SetClickHdl( LINK( this, ScDPSubtotalDlg, ClickHdl ) );
}
// ----------------------------------------------------------------------------
IMPL_LINK( ScDPSubtotalDlg, RadioClickHdl, RadioButton*, pBtn )
{
maLbFunc.Enable( pBtn == &maRbUser );
return 0;
}
IMPL_LINK( ScDPSubtotalDlg, DblClickHdl, MultiListBox*, EMPTYARG )
{
maBtnOk.Click();
return 0;
}
IMPL_LINK( ScDPSubtotalDlg, ClickHdl, PushButton*, pBtn )
{
if( pBtn == &maBtnOptions )
{
ScDPSubtotalOptDlg* pDlg = new ScDPSubtotalOptDlg( this, mrDPObj, maLabelData, mrDataFields, mbEnableLayout );
if( pDlg->Execute() == RET_OK )
pDlg->FillLabelData( maLabelData );
delete pDlg;
}
return 0;
}
// ============================================================================
ScDPSubtotalOptDlg::ScDPSubtotalOptDlg( Window* pParent, ScDPObject& rDPObj,
const ScDPLabelData& rLabelData, const ScDPNameVec& rDataFields,
bool bEnableLayout ) :
ModalDialog ( pParent, ScResId( RID_SCDLG_DPSUBTOTAL_OPT ) ),
maFlSortBy ( this, ScResId( FL_SORT_BY ) ),
maLbSortBy ( this, ScResId( LB_SORT_BY ) ),
maRbSortAsc ( this, ScResId( RB_SORT_ASC ) ),
maRbSortDesc ( this, ScResId( RB_SORT_DESC ) ),
maRbSortMan ( this, ScResId( RB_SORT_MAN ) ),
maFlLayout ( this, ScResId( FL_LAYOUT ) ),
maFtLayout ( this, ScResId( FT_LAYOUT ) ),
maLbLayout ( this, ScResId( LB_LAYOUT ) ),
maCbLayoutEmpty ( this, ScResId( CB_LAYOUT_EMPTY ) ),
maFlAutoShow ( this, ScResId( FL_AUTOSHOW ) ),
maCbShow ( this, ScResId( CB_SHOW ) ),
maNfShow ( this, ScResId( NF_SHOW ) ),
maFtShow ( this, ScResId( FT_SHOW ) ),
maFtShowFrom ( this, ScResId( FT_SHOW_FROM ) ),
maLbShowFrom ( this, ScResId( LB_SHOW_FROM ) ),
maFtShowUsing ( this, ScResId( FT_SHOW_USING ) ),
maLbShowUsing ( this, ScResId( LB_SHOW_USING ) ),
maFlHide ( this, ScResId( FL_HIDE ) ),
maLbHide ( this, ScResId( CT_HIDE ) ),
maFtHierarchy ( this, ScResId( FT_HIERARCHY ) ),
maLbHierarchy ( this, ScResId( LB_HIERARCHY ) ),
maBtnOk ( this, ScResId( BTN_OK ) ),
maBtnCancel ( this, ScResId( BTN_CANCEL ) ),
maBtnHelp ( this, ScResId( BTN_HELP ) ),
maLbLayoutWrp ( maLbLayout, spLayoutMap ),
maLbShowFromWrp ( maLbShowFrom, spShowFromMap ),
mrDPObj ( rDPObj ),
maLabelData ( rLabelData )
{
FreeResource();
Init( rDataFields, bEnableLayout );
}
void ScDPSubtotalOptDlg::FillLabelData( ScDPLabelData& rLabelData ) const
{
// *** SORTING ***
if( maRbSortMan.IsChecked() )
rLabelData.maSortInfo.Mode = DataPilotFieldSortMode::MANUAL;
else if( maLbSortBy.GetSelectEntryPos() == SC_SORTNAME_POS )
rLabelData.maSortInfo.Mode = DataPilotFieldSortMode::NAME;
else
rLabelData.maSortInfo.Mode = DataPilotFieldSortMode::DATA;
rLabelData.maSortInfo.Field = maLbSortBy.GetSelectEntry();
rLabelData.maSortInfo.IsAscending = maRbSortAsc.IsChecked();
// *** LAYOUT MODE ***
rLabelData.maLayoutInfo.LayoutMode = maLbLayoutWrp.GetControlValue();
rLabelData.maLayoutInfo.AddEmptyLines = maCbLayoutEmpty.IsChecked();
// *** AUTO SHOW ***
rLabelData.maShowInfo.IsEnabled = maCbShow.IsChecked();
rLabelData.maShowInfo.ShowItemsMode = maLbShowFromWrp.GetControlValue();
rLabelData.maShowInfo.ItemCount = sal::static_int_cast<sal_Int32>( maNfShow.GetValue() );
rLabelData.maShowInfo.DataField = maLbShowUsing.GetSelectEntry();
// *** HIDDEN ITEMS ***
rLabelData.maMembers = maLabelData.maMembers;
sal_uLong nVisCount = maLbHide.GetEntryCount();
for( sal_uInt16 nPos = 0; nPos < nVisCount; ++nPos )
rLabelData.maMembers[nPos].mbVisible = !maLbHide.IsChecked(nPos);
// *** HIERARCHY ***
rLabelData.mnUsedHier = maLbHierarchy.GetSelectEntryCount() ? maLbHierarchy.GetSelectEntryPos() : 0;
}
void ScDPSubtotalOptDlg::Init( const ScDPNameVec& rDataFields, bool bEnableLayout )
{
// *** SORTING ***
sal_Int32 nSortMode = maLabelData.maSortInfo.Mode;
// sort fields list box
maLbSortBy.InsertEntry(maLabelData.getDisplayName());
for( ScDPNameVec::const_iterator aIt = rDataFields.begin(), aEnd = rDataFields.end(); aIt != aEnd; ++aIt )
{
maLbSortBy.InsertEntry( *aIt );
maLbShowUsing.InsertEntry( *aIt ); // for AutoShow
}
if( maLbSortBy.GetEntryCount() > SC_SORTDATA_POS )
maLbSortBy.SetSeparatorPos( SC_SORTDATA_POS - 1 );
sal_uInt16 nSortPos = SC_SORTNAME_POS;
if( nSortMode == DataPilotFieldSortMode::DATA )
{
nSortPos = lclFindListBoxEntry( maLbSortBy, maLabelData.maSortInfo.Field, SC_SORTDATA_POS );
if( nSortPos >= maLbSortBy.GetEntryCount() )
{
nSortPos = SC_SORTNAME_POS;
nSortMode = DataPilotFieldSortMode::MANUAL;
}
}
maLbSortBy.SelectEntryPos( nSortPos );
// sorting mode
maRbSortAsc.SetClickHdl( LINK( this, ScDPSubtotalOptDlg, RadioClickHdl ) );
maRbSortDesc.SetClickHdl( LINK( this, ScDPSubtotalOptDlg, RadioClickHdl ) );
maRbSortMan.SetClickHdl( LINK( this, ScDPSubtotalOptDlg, RadioClickHdl ) );
RadioButton* pRBtn = 0;
switch( nSortMode )
{
case DataPilotFieldSortMode::NONE:
case DataPilotFieldSortMode::MANUAL:
pRBtn = &maRbSortMan;
break;
default:
pRBtn = maLabelData.maSortInfo.IsAscending ? &maRbSortAsc : &maRbSortDesc;
}
pRBtn->Check();
RadioClickHdl( pRBtn );
// *** LAYOUT MODE ***
maFlLayout.Enable( bEnableLayout );
maFtLayout.Enable( bEnableLayout );
maLbLayout.Enable( bEnableLayout );
maCbLayoutEmpty.Enable( bEnableLayout );
maLbLayoutWrp.SetControlValue( maLabelData.maLayoutInfo.LayoutMode );
maCbLayoutEmpty.Check( maLabelData.maLayoutInfo.AddEmptyLines );
// *** AUTO SHOW ***
maCbShow.Check( maLabelData.maShowInfo.IsEnabled );
maCbShow.SetClickHdl( LINK( this, ScDPSubtotalOptDlg, CheckHdl ) );
maLbShowFromWrp.SetControlValue( maLabelData.maShowInfo.ShowItemsMode );
long nCount = static_cast< long >( maLabelData.maShowInfo.ItemCount );
if( nCount < 1 )
nCount = SC_SHOW_DEFAULT;
maNfShow.SetValue( nCount );
// maLbShowUsing already filled above
maLbShowUsing.SelectEntry( maLabelData.maShowInfo.DataField );
if( maLbShowUsing.GetSelectEntryPos() >= maLbShowUsing.GetEntryCount() )
maLbShowUsing.SelectEntryPos( 0 );
CheckHdl( &maCbShow ); // enable/disable dependent controls
// *** HIDDEN ITEMS ***
maLbHide.SetHelpId( HID_SC_DPSUBT_HIDE );
InitHideListBox();
// *** HIERARCHY ***
if( maLabelData.maHiers.getLength() > 1 )
{
lclFillListBox( maLbHierarchy, maLabelData.maHiers );
sal_Int32 nHier = maLabelData.mnUsedHier;
if( (nHier < 0) || (nHier >= maLabelData.maHiers.getLength()) ) nHier = 0;
maLbHierarchy.SelectEntryPos( static_cast< sal_uInt16 >( nHier ) );
maLbHierarchy.SetSelectHdl( LINK( this, ScDPSubtotalOptDlg, SelectHdl ) );
}
else
{
maFtHierarchy.Disable();
maLbHierarchy.Disable();
}
}
void ScDPSubtotalOptDlg::InitHideListBox()
{
maLbHide.Clear();
lclFillListBox( maLbHide, maLabelData.maMembers );
size_t n = maLabelData.maMembers.size();
for (size_t i = 0; i < n; ++i)
maLbHide.CheckEntryPos(static_cast<sal_uInt16>(i), !maLabelData.maMembers[i].mbVisible);
bool bEnable = maLbHide.GetEntryCount() > 0;
maFlHide.Enable( bEnable );
maLbHide.Enable( bEnable );
}
IMPL_LINK( ScDPSubtotalOptDlg, RadioClickHdl, RadioButton*, pBtn )
{
maLbSortBy.Enable( pBtn != &maRbSortMan );
return 0;
}
IMPL_LINK( ScDPSubtotalOptDlg, CheckHdl, CheckBox*, pCBox )
{
if( pCBox == &maCbShow )
{
bool bEnable = maCbShow.IsChecked();
maNfShow.Enable( bEnable );
maFtShow.Enable( bEnable );
maFtShowFrom.Enable( bEnable );
maLbShowFrom.Enable( bEnable );
bool bEnableUsing = bEnable && (maLbShowUsing.GetEntryCount() > 0);
maFtShowUsing.Enable( bEnableUsing );
maLbShowUsing.Enable( bEnableUsing );
}
return 0;
}
IMPL_LINK( ScDPSubtotalOptDlg, SelectHdl, ListBox*, pLBox )
{
if( pLBox == &maLbHierarchy )
{
mrDPObj.GetMembers(maLabelData.mnCol, maLbHierarchy.GetSelectEntryPos(), maLabelData.maMembers);
InitHideListBox();
}
return 0;
}
// ============================================================================
ScDPShowDetailDlg::ScDPShowDetailDlg( Window* pParent, ScDPObject& rDPObj, sal_uInt16 nOrient ) :
ModalDialog ( pParent, ScResId( RID_SCDLG_DPSHOWDETAIL ) ),
maFtDims ( this, ScResId( FT_DIMS ) ),
maLbDims ( this, ScResId( LB_DIMS ) ),
maBtnOk ( this, ScResId( BTN_OK ) ),
maBtnCancel ( this, ScResId( BTN_CANCEL ) ),
maBtnHelp ( this, ScResId( BTN_HELP ) ),
mrDPObj(rDPObj)
{
FreeResource();
ScDPSaveData* pSaveData = rDPObj.GetSaveData();
long nDimCount = rDPObj.GetDimCount();
for (long nDim=0; nDim<nDimCount; nDim++)
{
sal_Bool bIsDataLayout;
sal_Int32 nDimFlags = 0;
String aName = rDPObj.GetDimName( nDim, bIsDataLayout, &nDimFlags );
if ( !bIsDataLayout && !rDPObj.IsDuplicated( nDim ) && ScDPObject::IsOrientationAllowed( nOrient, nDimFlags ) )
{
const ScDPSaveDimension* pDimension = pSaveData ? pSaveData->GetExistingDimensionByName(aName) : 0;
if ( !pDimension || (pDimension->GetOrientation() != nOrient) )
{
if (pDimension)
{
const OUString* pLayoutName = pDimension->GetLayoutName();
if (pLayoutName)
aName = *pLayoutName;
}
if ( aName.Len() )
{
maLbDims.InsertEntry( aName );
maNameIndexMap.insert(DimNameIndexMap::value_type(aName, nDim));
}
}
}
}
if( maLbDims.GetEntryCount() )
maLbDims.SelectEntryPos( 0 );
maLbDims.SetDoubleClickHdl( LINK( this, ScDPShowDetailDlg, DblClickHdl ) );
}
short ScDPShowDetailDlg::Execute()
{
return maLbDims.GetEntryCount() ? ModalDialog::Execute() : RET_CANCEL;
}
String ScDPShowDetailDlg::GetDimensionName() const
{
// Look up the internal dimension name which may be different from the
// displayed field name.
String aSelectedName = maLbDims.GetSelectEntry();
DimNameIndexMap::const_iterator itr = maNameIndexMap.find(aSelectedName);
if (itr == maNameIndexMap.end())
// This should never happen!
return aSelectedName;
long nDim = itr->second;
sal_Bool bIsDataLayout = false;
return mrDPObj.GetDimName(nDim, bIsDataLayout);
}
IMPL_LINK( ScDPShowDetailDlg, DblClickHdl, ListBox*, pLBox )
{
if( pLBox == &maLbDims )
maBtnOk.Click();
return 0;
}
// ============================================================================