20 #undef SC_DLLIMPLEMENTATION
23 #include <uiitems.hxx>
27 #include <document.hxx>
30 #include <strings.hrc>
31 #include <subtotals.hrc>
37 #include <osl/diagnose.h>
42 :
SfxTabPage(pPage, pController,
"modules/scalc/ui/subtotalgrppage.ui",
"SubTotalGrpPage", &rArgSet)
44 , aStrColumn(
ScResId(SCSTR_COLUMN))
47 , nWhichSubTotals(rArgSet.GetPool()->
GetWhich(SID_SUBTOTALS))
48 , rSubTotalData(static_cast<const
ScSubTotalItem&>(rArgSet.
Get(nWhichSubTotals)).GetSubTotalData())
50 , mxLbGroup(m_xBuilder->weld_combo_box(
"group_by"))
51 , mxLbColumns(m_xBuilder->weld_tree_view(
"columns"))
52 , mxLbFunctions(m_xBuilder->weld_tree_view(
"functions"))
53 , mxLbSelectAllColumns(m_xBuilder->weld_check_button(
"select_all_columns_button"))
77 assert(
pViewData &&
"CreateScSubTotalDlg aArgSet must contain a ScSubTotalItem with ViewData set");
111 sal_uInt16 nGroupIdx = 0;
113 OSL_ENSURE( (nGroupNo<=3) && (nGroupNo>0),
"Invalid group" );
115 if ( (nGroupNo > 3) || (nGroupNo == 0) )
118 nGroupIdx = nGroupNo-1;
132 if ( theSubTotalData.bGroupActive[nGroupIdx] )
135 SCCOL nSubTotals = theSubTotalData.nSubTotals[nGroupIdx];
136 SCCOL* pSubTotals = theSubTotalData.pSubTotals[nGroupIdx];
137 ScSubTotalFunc* pFunctions = theSubTotalData.pFunctions[nGroupIdx];
141 sal_uInt16 nFirstChecked = 0;
142 for ( sal_uInt16
i=0;
i<nSubTotals;
i++ )
149 if (i == 0 || nCheckPos < nFirstChecked)
150 nFirstChecked = nCheckPos;
157 mxLbGroup->set_active( (nGroupNo == 1) ? 1 : 0 );
173 sal_uInt16 nGroupIdx = 0;
175 OSL_ENSURE( (nGroupNo<=3) && (nGroupNo>0),
"Invalid group" );
179 "Non-initialized Lists" );
181 if ( (nGroupNo > 3) || (nGroupNo == 0)
188 nGroupIdx = nGroupNo-1;
196 theSubTotalData = static_cast<const ScSubTotalItem*>(pItem)->GetSubTotalData();
199 std::unique_ptr<ScSubTotalFunc[]> pFunctions;
200 std::unique_ptr<SCCOL[]> pSubTotals;
201 const sal_Int32 nGroup =
mxLbGroup->get_active();
202 const sal_Int32 nEntryCount =
mxLbColumns->n_children();
203 const sal_Int32 nCheckCount = GetCheckedEntryCount(*
mxLbColumns);
209 theSubTotalData.
bGroupActive[nGroupIdx] = (nGroup != 0);
210 theSubTotalData.
nField[nGroupIdx] = (nGroup != 0)
212 : static_cast<SCCOL>(0);
214 if ( nEntryCount>0 && nCheckCount>0 && nGroup!=0 )
216 sal_uInt16 nFunction = 0;
218 pSubTotals.reset(
new SCCOL [nCheckCount]);
221 for ( sal_Int32
i=0, nCheck=0;
i<nEntryCount;
i++ )
225 OSL_ENSURE( nCheck <= nCheckCount,
247 assert(
pViewData &&
pDoc &&
"CreateScSubTotalDlg aArgSet must contain a ScSubTotalItem with ViewData set");
264 if ( aFieldName.isEmpty() )
282 sal_uInt16 nFieldPos = 0;
314 OSL_FAIL(
"ScTpSubTotalGroup::LbPosToFunc" );
336 OSL_FAIL(
"ScTpSubTotalGroup::FuncToLbPos" );
347 if ( mxLbColumns->n_children() == GetCheckedEntryCount(*mxLbColumns) )
348 mxLbSelectAllColumns->set_active(
true );
350 mxLbSelectAllColumns->set_active(
false );
360 const sal_Int32 nColumn =
mxLbColumns->get_selected_index();
364 const sal_Int32 nFunction =
mxLbFunctions->get_selected_index();
365 sal_uInt16 nOldFunction =
mxLbColumns->get_id(nColumn).toUInt32();
373 mxLbColumns->set_id(nColumn, OUString::number(nFunction));
380 mxLbColumns->select(rRowCol.first);
381 SelectHdl(mxLbColumns.get());
383 if ( mxLbColumns->n_children() == GetCheckedEntryCount(*mxLbColumns) )
384 mxLbSelectAllColumns->set_active(
true );
386 mxLbSelectAllColumns->set_active(
false );
394 return std::make_unique<ScTpSubTotalGroup1>( pPage, pController, *rArgSet );
400 return std::make_unique<ScTpSubTotalGroup2>( pPage, pController, *rArgSet );
406 return std::make_unique<ScTpSubTotalGroup3>( pPage, pController, *rArgSet );
421 #define RESET(i) (ScTpSubTotalGroup::DoReset( (i), *rArgSet ))
427 #define FILLSET(i) (ScTpSubTotalGroup::DoFillItemSet( (i), *rArgSet ))
438 "modules/scalc/ui/subtotaloptionspage.ui",
"SubTotalOptionsPage",
440 pViewData ( nullptr ),
442 nWhichSubTotals ( rArgSet.GetPool()->
GetWhich( SID_SUBTOTALS ) ),
444 rArgSet.
Get( nWhichSubTotals )).
446 , m_xBtnPagebreak(m_xBuilder->weld_check_button(
"pagebreak"))
447 , m_xBtnCase(m_xBuilder->weld_check_button(
"case"))
448 , m_xBtnSort(m_xBuilder->weld_check_button(
"sort"))
449 , m_xFlSort(m_xBuilder->weld_label(
"label2"))
450 , m_xBtnAscending(m_xBuilder->weld_radio_button(
"ascending"))
451 , m_xBtnDescending(m_xBuilder->weld_radio_button(
"descending"))
452 , m_xBtnFormats(m_xBuilder->weld_check_button(
"formats"))
453 , m_xBtnUserDef(m_xBuilder->weld_check_button(
"btnuserdef"))
454 , m_xLbUserDef(m_xBuilder->weld_combo_box(
"lbuserdef"))
469 assert(
pViewData &&
"CreateScSubTotalDlg aArgSet must contain a ScSubTotalItem with ViewData set");
482 return std::make_unique<ScTpSubTotalOptions>(pPage, pController, *rArgSet);
518 theSubTotalData = static_cast<const ScSubTotalItem*>(pItem)->GetSubTotalData();
546 for (
size_t i=0;
i<nCount; ++
i )
556 if (&rBox == m_xBtnSort.get())
558 if ( m_xBtnSort->get_active() )
560 m_xFlSort->set_sensitive(
true);
561 m_xBtnFormats->set_sensitive(
true);
562 m_xBtnUserDef->set_sensitive(
true);
563 m_xBtnAscending->set_sensitive(
true);
564 m_xBtnDescending->set_sensitive(
true);
566 if ( m_xBtnUserDef->get_active() )
567 m_xLbUserDef->set_sensitive(
true);
571 m_xFlSort->set_sensitive(
false);
572 m_xBtnFormats->set_sensitive(
false);
573 m_xBtnUserDef->set_sensitive(
false);
574 m_xBtnAscending->set_sensitive(
false);
575 m_xBtnDescending->set_sensitive(
false);
576 m_xLbUserDef->set_sensitive(
false);
579 else if (&rBox == m_xBtnUserDef.get())
581 if ( m_xBtnUserDef->get_active() )
583 m_xLbUserDef->set_sensitive(
true);
584 m_xLbUserDef->grab_focus();
587 m_xLbUserDef->set_sensitive(
false);
593 if (&rBox != mxLbSelectAllColumns.get())
596 bool bChecked = mxLbSelectAllColumns->get_active();
bool bGroupActive[MAXSUBTOTAL]
active groups
#define LINK(Instance, Class, Member)
static sal_uInt16 FuncToLbPos(ScSubTotalFunc eFunc)
Collection of user-defined sort lists.
static SC_DLLPUBLIC OUString ReplaceOrAppend(const OUString &rString, std::u16string_view rPlaceholder, const OUString &rReplacement)
Replaces the first occurrence of rPlaceholder in rString with rReplacement, or if rPlaceholder is not...
SCCOL nField[MAXSUBTOTAL]
associated field
bool bUserDef
sort user defined
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rArgSet)
virtual ~ScTpSubTotalGroup() override
std::unique_ptr< weld::CheckButton > m_xBtnPagebreak
std::vector< SCCOL > mnFieldArr
ScTpSubTotalGroup2(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rArgSet)
void ScColToAlpha(OUStringBuffer &rBuf, SCCOL nCol)
append alpha representation of column to buffer
virtual ~ScTpSubTotalGroup1() override
virtual void Reset(const SfxItemSet *rArgSet) override
ScDocument & GetDocument() const
virtual void Reset(const SfxItemSet *rArgSet) override
virtual bool FillItemSet(SfxItemSet *rArgSet) override
bool bPagebreak
page break at change of group
ScViewData * GetViewData() const
virtual TriState get_toggle(int row, int col=-1) const =0
ScTpSubTotalGroup(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rArgSet)
std::unique_ptr< weld::CheckButton > m_xBtnCase
sal_uInt16 nUserIndex
index into list
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rArgSet)
std::pair< const TreeIter &, int > iter_col
SC_DLLPUBLIC OUString GetString(SCCOL nCol, SCROW nRow, SCTAB nTab, const ScInterpreterContext *pContext=nullptr) const
void SelectHdl(const weld::Widget *)
virtual ~ScTpSubTotalGroup3() override
std::unique_ptr< weld::RadioButton > m_xBtnAscending
const SfxItemSet & GetItemSet() const
#define SAL_N_ELEMENTS(arr)
bool DoFillItemSet(sal_uInt16 nGroupNo, SfxItemSet &rArgSet)
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rArgSet)
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
void FillUserSortListBox()
const OUString aStrColumn
std::unique_ptr< weld::CheckButton > m_xBtnFormats
void SetSubTotals(sal_uInt16 nGroup, const SCCOL *ptrSubTotals, const ScSubTotalFunc *ptrFunctions, sal_uInt16 nCount)
ScTpSubTotalGroup3(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rArgSet)
sal_uInt16 GetFieldSelPos(SCCOL nField)
ScSheetLimits & GetSheetLimits() const
OUString ScResId(const char *pId)
static SC_DLLPUBLIC ScUserList * GetUserList()
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rArgSet)
std::unique_ptr< weld::CheckButton > m_xBtnUserDef
bool DoReset(sal_uInt16 nGroupNo, const SfxItemSet &rArgSet)
std::unique_ptr< weld::TreeView > mxLbColumns
std::unique_ptr< weld::CheckButton > m_xBtnSort
const SfxItemSet * GetDialogExampleSet() const
IMPL_LINK(ScTpSubTotalGroup, SelectTreeListBoxHdl, weld::TreeView &, rLb, void)
virtual bool FillItemSet(SfxItemSet *rArgSet) override
bool bReplace
replace existing results
virtual ~ScTpSubTotalGroup2() override
static ScSubTotalFunc LbPosToFunc(sal_uInt16 nPos)
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
virtual void all_foreach(const std::function< bool(TreeIter &)> &func)=0
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
std::unique_ptr< weld::RadioButton > m_xBtnDescending
std::unique_ptr< weld::CheckButton > mxLbSelectAllColumns
std::unique_ptr< weld::ComboBox > m_xLbUserDef
bool bIncludePattern
sort formats
virtual bool FillItemSet(SfxItemSet *rArgSet) override
std::unique_ptr< weld::TreeView > mxLbFunctions
virtual void Reset(const SfxItemSet *rArgSet) override
ScTpSubTotalGroup1(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rArgSet)
SCCOL SC_MAXFIELDS(const ScSheetLimits &rLimits)
virtual bool FillItemSet(SfxItemSet *rArgSet) override
const sal_uInt16 nWhichSubTotals
const ScSubTotalParam & rSubTotalData
const sal_uInt16 nWhichSubTotals
SVXCORE_DLLPUBLIC MSO_SPT Get(const OUString &)
ScTpSubTotalOptions(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rArgSet)
virtual ~ScTpSubTotalOptions() override
const ScSubTotalParam & rSubTotalData
virtual void Reset(const SfxItemSet *rArgSet) override
bool bAscending
sort ascending
std::unique_ptr< weld::ComboBox > mxLbGroup