diff options
-rw-r--r-- | extras/source/glade/libreoffice-catalog.xml.in | 4 | ||||
-rw-r--r-- | sc/inc/scabstdlg.hxx | 8 | ||||
-rw-r--r-- | sc/source/ui/attrdlg/scdlgfact.cxx | 21 | ||||
-rw-r--r-- | sc/source/ui/attrdlg/scdlgfact.hxx | 16 | ||||
-rw-r--r-- | sc/source/ui/dbgui/PivotLayoutTreeListData.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/dbgui/pvfundlg.cxx | 274 | ||||
-rw-r--r-- | sc/source/ui/inc/pvfundlg.hxx | 57 | ||||
-rw-r--r-- | sc/uiconfig/scalc/ui/datafielddialog.ui | 40 | ||||
-rwxr-xr-x | solenv/bin/native-code.py | 1 |
9 files changed, 204 insertions, 219 deletions
diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in index 3bf825820cd8..1d98ea2862bf 100644 --- a/extras/source/glade/libreoffice-catalog.xml.in +++ b/extras/source/glade/libreoffice-catalog.xml.in @@ -469,10 +469,6 @@ generic-name="CondFormatList" parent="GtkDrawingArea" icon-name="widget-gtk-drawingarea"/> - <glade-widget-class title="ScDPFunctionListBox" name="scuilo-ScDPFunctionListBox" - generic-name="DPFunctionListBox" parent="GtkTreeView" - icon-name="widget-gtk-treeview"/> - <glade-widget-class title="OTableTreeListBox" name="dbulo-OTableTreeListBox" generic-name="OTableTreeListBox" parent="GtkTreeView" icon-name="widget-gtk-treeview"/> diff --git a/sc/inc/scabstdlg.hxx b/sc/inc/scabstdlg.hxx index 1d6e00d26c8f..9fc0bdbf32a7 100644 --- a/sc/inc/scabstdlg.hxx +++ b/sc/inc/scabstdlg.hxx @@ -471,10 +471,10 @@ public: virtual VclPtr<AbstractScPivotFilterDlg> CreateScPivotFilterDlg(vcl::Window* pParent, const SfxItemSet& rArgSet, sal_uInt16 nSourceTab) = 0; - virtual VclPtr<AbstractScDPFunctionDlg> CreateScDPFunctionDlg( vcl::Window* pParent, - const ScDPLabelDataVector& rLabelVec, - const ScDPLabelData& rLabelData, - const ScPivotFuncData& rFuncData ) = 0; + virtual VclPtr<AbstractScDPFunctionDlg> CreateScDPFunctionDlg(weld::Window* pParent, + const ScDPLabelDataVector& rLabelVec, + const ScDPLabelData& rLabelData, + const ScPivotFuncData& rFuncData ) = 0; virtual VclPtr<AbstractScDPSubtotalDlg> CreateScDPSubtotalDlg(weld::Window* pParent, ScDPObject& rDPObj, diff --git a/sc/source/ui/attrdlg/scdlgfact.cxx b/sc/source/ui/attrdlg/scdlgfact.cxx index e3125c60ce06..b99de9b218f8 100644 --- a/sc/source/ui/attrdlg/scdlgfact.cxx +++ b/sc/source/ui/attrdlg/scdlgfact.cxx @@ -166,7 +166,11 @@ short AbstractScNamePasteDlg_Impl::Execute() } IMPL_ABSTDLG_BASE(AbstractScPivotFilterDlg_Impl); -IMPL_ABSTDLG_BASE(AbstractScDPFunctionDlg_Impl); + +short AbstractScDPFunctionDlg_Impl::Execute() +{ + return m_xDlg->run(); +} short AbstractScDPSubtotalDlg_Impl::Execute() { @@ -609,12 +613,12 @@ const ScQueryItem& AbstractScPivotFilterDlg_Impl::GetOutputItem() PivotFunc AbstractScDPFunctionDlg_Impl::GetFuncMask() const { - return pDlg->GetFuncMask(); + return m_xDlg->GetFuncMask(); } css::sheet::DataPilotFieldReference AbstractScDPFunctionDlg_Impl::GetFieldRef() const { - return pDlg->GetFieldRef(); + return m_xDlg->GetFieldRef(); } PivotFunc AbstractScDPSubtotalDlg_Impl::GetFuncMask() const @@ -910,13 +914,12 @@ VclPtr<AbstractScPivotFilterDlg> ScAbstractDialogFactory_Impl::CreateScPivotFilt return VclPtr<AbstractScPivotFilterDlg_Impl>::Create(pDlg); } -VclPtr<AbstractScDPFunctionDlg> ScAbstractDialogFactory_Impl::CreateScDPFunctionDlg ( vcl::Window* pParent, - const ScDPLabelDataVector& rLabelVec, - const ScDPLabelData& rLabelData, - const ScPivotFuncData& rFuncData ) +VclPtr<AbstractScDPFunctionDlg> ScAbstractDialogFactory_Impl::CreateScDPFunctionDlg(weld::Window* pParent, + const ScDPLabelDataVector& rLabelVec, + const ScDPLabelData& rLabelData, + const ScPivotFuncData& rFuncData) { - VclPtr<ScDPFunctionDlg> pDlg = VclPtr<ScDPFunctionDlg>::Create( pParent, rLabelVec, rLabelData, rFuncData ); - return VclPtr<AbstractScDPFunctionDlg_Impl>::Create( pDlg ); + return VclPtr<AbstractScDPFunctionDlg_Impl>::Create(std::make_unique<ScDPFunctionDlg>(pParent, rLabelVec, rLabelData, rFuncData)); } VclPtr<AbstractScDPSubtotalDlg> ScAbstractDialogFactory_Impl::CreateScDPSubtotalDlg(weld::Window* pParent, diff --git a/sc/source/ui/attrdlg/scdlgfact.hxx b/sc/source/ui/attrdlg/scdlgfact.hxx index 1341de4450aa..ce82fa0bf333 100644 --- a/sc/source/ui/attrdlg/scdlgfact.hxx +++ b/sc/source/ui/attrdlg/scdlgfact.hxx @@ -392,7 +392,13 @@ class AbstractScPivotFilterDlg_Impl : public AbstractScPivotFilterDlg class AbstractScDPFunctionDlg_Impl : public AbstractScDPFunctionDlg { - DECL_ABSTDLG_BASE( AbstractScDPFunctionDlg_Impl, ScDPFunctionDlg) + std::unique_ptr<ScDPFunctionDlg> m_xDlg; +public: + explicit AbstractScDPFunctionDlg_Impl(std::unique_ptr<ScDPFunctionDlg> p) + : m_xDlg(std::move(p)) + { + } + virtual short Execute() override; virtual PivotFunc GetFuncMask() const override; virtual css::sheet::DataPilotFieldReference GetFieldRef() const override; }; @@ -665,10 +671,10 @@ public: virtual VclPtr<AbstractScPivotFilterDlg> CreateScPivotFilterDlg(vcl::Window* pParent, const SfxItemSet& rArgSet, sal_uInt16 nSourceTab) override; - virtual VclPtr<AbstractScDPFunctionDlg> CreateScDPFunctionDlg( vcl::Window* pParent, - const ScDPLabelDataVector& rLabelVec, - const ScDPLabelData& rLabelData, - const ScPivotFuncData& rFuncData ) override; + virtual VclPtr<AbstractScDPFunctionDlg> CreateScDPFunctionDlg(weld::Window* pParent, + const ScDPLabelDataVector& rLabelVec, + const ScDPLabelData& rLabelData, + const ScPivotFuncData& rFuncData ) override; virtual VclPtr<AbstractScDPSubtotalDlg> CreateScDPSubtotalDlg(weld::Window* pParent, ScDPObject& rDPObj, diff --git a/sc/source/ui/dbgui/PivotLayoutTreeListData.cxx b/sc/source/ui/dbgui/PivotLayoutTreeListData.cxx index 10fc31d77efc..187965ba78d0 100644 --- a/sc/source/ui/dbgui/PivotLayoutTreeListData.cxx +++ b/sc/source/ui/dbgui/PivotLayoutTreeListData.cxx @@ -85,7 +85,7 @@ bool ScPivotLayoutTreeListData::DoubleClickHdl() ScAbstractDialogFactory* pFactory = ScAbstractDialogFactory::Create(); ScopedVclPtr<AbstractScDPFunctionDlg> pDialog( - pFactory->CreateScDPFunctionDlg(this, mpParent->GetLabelDataVector(), rCurrentLabelData, rCurrentFunctionData)); + pFactory->CreateScDPFunctionDlg(GetFrameWeld(), mpParent->GetLabelDataVector(), rCurrentLabelData, rCurrentFunctionData)); if (pDialog->Execute() == RET_OK) { diff --git a/sc/source/ui/dbgui/pvfundlg.cxx b/sc/source/ui/dbgui/pvfundlg.cxx index e75b890a8fb4..9b77bbe28472 100644 --- a/sc/source/ui/dbgui/pvfundlg.cxx +++ b/sc/source/ui/dbgui/pvfundlg.cxx @@ -55,22 +55,6 @@ namespace { @return true = The passed string list contains an empty string entry. */ -template< typename ListBoxType > -bool lclFillListBox( ListBoxType& rLBox, const Sequence< OUString >& rStrings, sal_Int32 nEmptyPos = LISTBOX_APPEND ) -{ - bool bEmpty = false; - for (const OUString& str : rStrings) - { - if (!str.isEmpty()) - rLBox.InsertEntry(str); - else - { - rLBox.InsertEntry(ScResId(STR_EMPTYDATA), nEmptyPos); - bEmpty = true; - } - } - return bEmpty; -} bool lclFillListBox(weld::ComboBox& rLBox, const Sequence< OUString >& rStrings) { @@ -88,18 +72,18 @@ bool lclFillListBox(weld::ComboBox& rLBox, const Sequence< OUString >& rStrings) return bEmpty; } -template< typename ListBoxType > -bool lclFillListBox( ListBoxType& rLBox, const vector<ScDPLabelData::Member>& rMembers, sal_Int32 nEmptyPos = LISTBOX_APPEND ) +bool lclFillListBox(weld::ComboBox& rLBox, const vector<ScDPLabelData::Member>& rMembers, int nEmptyPos) { bool bEmpty = false; - for (const auto& rMember : rMembers) + vector<ScDPLabelData::Member>::const_iterator itr = rMembers.begin(), itrEnd = rMembers.end(); + for (; itr != itrEnd; ++itr) { - OUString aName = rMember.getDisplayName(); + OUString aName = itr->getDisplayName(); if (!aName.isEmpty()) - rLBox.InsertEntry(aName); + rLBox.append_text(aName); else { - rLBox.InsertEntry(ScResId(STR_EMPTYDATA), nEmptyPos); + rLBox.insert_text(nEmptyPos, ScResId(STR_EMPTYDATA)); bEmpty = true; } } @@ -153,63 +137,15 @@ 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 }, - { WRAPPER_LISTBOX_ENTRY_NOTFOUND, DataPilotFieldReferenceType::NONE } -}; - } // namespace -ScDPFunctionListBox::ScDPFunctionListBox(vcl::Window* pParent, WinBits nStyle) - : ListBox(pParent, nStyle) -{ - FillFunctionNames(); -} - -VCL_BUILDER_FACTORY_CONSTRUCTOR(ScDPFunctionListBox, WB_LEFT|WB_VCENTER|WB_3DLOOK|WB_SIMPLEMODE) - -void ScDPFunctionListBox::SetSelection( PivotFunc nFuncMask ) -{ - if( (nFuncMask == PivotFunc::NONE) || (nFuncMask == PivotFunc::Auto) ) - SetNoSelection(); - else - for( sal_Int32 nEntry = 0, nCount = GetEntryCount(); nEntry < nCount; ++nEntry ) - SelectEntryPos( nEntry, bool(nFuncMask & spnFunctions[ nEntry ]) ); -} - -PivotFunc ScDPFunctionListBox::GetSelection() const -{ - PivotFunc nFuncMask = PivotFunc::NONE; - for( sal_Int32 nSel = 0, nCount = GetSelectedEntryCount(); nSel < nCount; ++nSel ) - nFuncMask |= spnFunctions[ GetSelectedEntryPos( nSel ) ]; - return nFuncMask; -} - -void ScDPFunctionListBox::FillFunctionNames() -{ - OSL_ENSURE( !GetEntryCount(), "ScDPMultiFuncListBox::FillFunctionNames - do not add texts to resource" ); - Clear(); - for (size_t nIndex = 0; nIndex < SAL_N_ELEMENTS(SCSTR_DPFUNCLISTBOX); ++nIndex) - InsertEntry(ScResId(SCSTR_DPFUNCLISTBOX[nIndex])); - assert(GetEntryCount() == SAL_N_ELEMENTS(spnFunctions)); -} - -DPFunctionListBox::DPFunctionListBox(std::unique_ptr<weld::TreeView> xControl) +ScDPFunctionListBox::ScDPFunctionListBox(std::unique_ptr<weld::TreeView> xControl) : m_xControl(std::move(xControl)) { FillFunctionNames(); } -void DPFunctionListBox::SetSelection( PivotFunc nFuncMask ) +void ScDPFunctionListBox::SetSelection( PivotFunc nFuncMask ) { if( (nFuncMask == PivotFunc::NONE) || (nFuncMask == PivotFunc::Auto) ) m_xControl->unselect_all(); @@ -225,7 +161,7 @@ void DPFunctionListBox::SetSelection( PivotFunc nFuncMask ) } } -PivotFunc DPFunctionListBox::GetSelection() const +PivotFunc ScDPFunctionListBox::GetSelection() const { PivotFunc nFuncMask = PivotFunc::NONE; std::vector<int> aRows = m_xControl->get_selected_rows(); @@ -234,7 +170,7 @@ PivotFunc DPFunctionListBox::GetSelection() const return nFuncMask; } -void DPFunctionListBox::FillFunctionNames() +void ScDPFunctionListBox::FillFunctionNames() { OSL_ENSURE( !m_xControl->n_children(), "ScDPMultiFuncListBox::FillFunctionNames - do not add texts to resource" ); m_xControl->clear(); @@ -245,60 +181,99 @@ void DPFunctionListBox::FillFunctionNames() assert(m_xControl->n_children() == SAL_N_ELEMENTS(spnFunctions)); } +namespace +{ + int FromDataPilotFieldReferenceType(int eMode) + { + switch (eMode) + { + case DataPilotFieldReferenceType::NONE: + return 0; + case DataPilotFieldReferenceType::ITEM_DIFFERENCE: + return 1; + case DataPilotFieldReferenceType::ITEM_PERCENTAGE: + return 2; + case DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE: + return 3; + case DataPilotFieldReferenceType::RUNNING_TOTAL: + return 4; + case DataPilotFieldReferenceType::ROW_PERCENTAGE: + return 5; + case DataPilotFieldReferenceType::COLUMN_PERCENTAGE: + return 6; + case DataPilotFieldReferenceType::TOTAL_PERCENTAGE: + return 7; + case DataPilotFieldReferenceType::INDEX: + return 8; + } + return -1; + } + + int ToDataPilotFieldReferenceType(int nPos) + { + switch (nPos) + { + case 0: + return DataPilotFieldReferenceType::NONE; + case 1: + return DataPilotFieldReferenceType::ITEM_DIFFERENCE; + case 2: + return DataPilotFieldReferenceType::ITEM_PERCENTAGE; + case 3: + return DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE; + case 4: + return DataPilotFieldReferenceType::RUNNING_TOTAL; + case 5: + return DataPilotFieldReferenceType::ROW_PERCENTAGE; + case 6: + return DataPilotFieldReferenceType::COLUMN_PERCENTAGE; + case 7: + return DataPilotFieldReferenceType::TOTAL_PERCENTAGE; + case 8: + return DataPilotFieldReferenceType::INDEX; + } + return DataPilotFieldReferenceType::NONE; + + } +} + ScDPFunctionDlg::ScDPFunctionDlg( - vcl::Window* pParent, const ScDPLabelDataVector& rLabelVec, + weld::Window* pParent, const ScDPLabelDataVector& rLabelVec, const ScDPLabelData& rLabelData, const ScPivotFuncData& rFuncData) - : ModalDialog(pParent, "DataFieldDialog", - "modules/scalc/ui/datafielddialog.ui") + : GenericDialogController(pParent, "modules/scalc/ui/datafielddialog.ui", "DataFieldDialog") + , mxLbFunc(new ScDPFunctionListBox(m_xBuilder->weld_tree_view("functions"))) + , mxFtName(m_xBuilder->weld_label("name")) + , mxLbType(m_xBuilder->weld_combo_box("type")) + , mxFtBaseField(m_xBuilder->weld_label("basefieldft")) + , mxLbBaseField(m_xBuilder->weld_combo_box("basefield")) + , mxFtBaseItem(m_xBuilder->weld_label("baseitemft")) + , mxLbBaseItem(m_xBuilder->weld_combo_box("baseitem")) + , mxBtnOk(m_xBuilder->weld_button("ok")) , mrLabelVec(rLabelVec) , mbEmptyItem(false) { - get(mpFtName, "name"); - get(mpLbType, "type"); - mxLbTypeWrp.reset(new ScDPListBoxWrapper(*mpLbType, spRefTypeMap)); - get(mpLbFunc, "functions"); - mpLbFunc->set_height_request(mpLbFunc->GetTextHeight() * 8); - get(mpFtBaseField, "basefieldft"); - get(mpLbBaseField, "basefield"); - get(mpFtBaseItem, "baseitemft"); - get(mpLbBaseItem, "baseitem"); - get(mpBtnOk, "ok"); + mxLbFunc->set_size_request(-1, mxLbFunc->get_height_rows(8)); - Init( rLabelData, rFuncData ); + Init(rLabelData, rFuncData); } ScDPFunctionDlg::~ScDPFunctionDlg() { - disposeOnce(); -} - -void ScDPFunctionDlg::dispose() -{ - mpLbFunc.clear(); - mpFtName.clear(); - mpLbType.clear(); - mpFtBaseField.clear(); - mpLbBaseField.clear(); - mpFtBaseItem.clear(); - mpLbBaseItem.clear(); - mpBtnOk.clear(); - ModalDialog::dispose(); } - PivotFunc ScDPFunctionDlg::GetFuncMask() const { - return mpLbFunc->GetSelection(); + return mxLbFunc->GetSelection(); } DataPilotFieldReference ScDPFunctionDlg::GetFieldRef() const { DataPilotFieldReference aRef; - aRef.ReferenceType = mxLbTypeWrp->GetControlValue(); - aRef.ReferenceField = GetBaseFieldName(mpLbBaseField->GetSelectedEntry()); + aRef.ReferenceType = ToDataPilotFieldReferenceType(mxLbType->get_active()); + aRef.ReferenceField = GetBaseFieldName(mxLbBaseField->get_active_text()); - sal_Int32 nBaseItemPos = mpLbBaseItem->GetSelectedEntryPos(); + sal_Int32 nBaseItemPos = mxLbBaseItem->get_active(); switch( nBaseItemPos ) { case SC_BASEITEM_PREV_POS: @@ -311,7 +286,7 @@ DataPilotFieldReference ScDPFunctionDlg::GetFieldRef() const { aRef.ReferenceItemType = DataPilotFieldReferenceItemType::NAMED; if( !mbEmptyItem || (nBaseItemPos > SC_BASEITEM_USER_POS) ) - aRef.ReferenceItemName = GetBaseItemName(mpLbBaseItem->GetSelectedEntry()); + aRef.ReferenceItemName = GetBaseItemName(mxLbBaseItem->get_active_text()); } } @@ -322,62 +297,59 @@ void ScDPFunctionDlg::Init( const ScDPLabelData& rLabelData, const ScPivotFuncDa { // list box PivotFunc nFuncMask = (rFuncData.mnFuncMask == PivotFunc::NONE) ? PivotFunc::Sum : rFuncData.mnFuncMask; - mpLbFunc->SetSelection( nFuncMask ); + mxLbFunc->SetSelection( nFuncMask ); // field name - mpFtName->SetText(rLabelData.getDisplayName()); + mxFtName->set_label(rLabelData.getDisplayName()); // handlers - mpLbFunc->SetDoubleClickHdl( LINK( this, ScDPFunctionDlg, DblClickHdl ) ); - mpLbType->SetSelectHdl( LINK( this, ScDPFunctionDlg, SelectHdl ) ); - mpLbBaseField->SetSelectHdl( LINK( this, ScDPFunctionDlg, SelectHdl ) ); + mxLbFunc->connect_row_activated( LINK( this, ScDPFunctionDlg, DblClickHdl ) ); + mxLbType->connect_changed( LINK( this, ScDPFunctionDlg, SelectHdl ) ); + mxLbBaseField->connect_changed( LINK( this, ScDPFunctionDlg, SelectHdl ) ); // base field list box OUString aSelectedEntry; for( const auto& rxLabel : mrLabelVec ) { - mpLbBaseField->InsertEntry(rxLabel->getDisplayName()); + mxLbBaseField->append_text(rxLabel->getDisplayName()); maBaseFieldNameMap.emplace(rxLabel->getDisplayName(), rxLabel->maName); if (rxLabel->maName == rFuncData.maFieldRef.ReferenceField) aSelectedEntry = rxLabel->getDisplayName(); } - // base item list box - mpLbBaseItem->SetSeparatorPos( SC_BASEITEM_USER_POS - 1 ); - // select field reference type - mxLbTypeWrp->SetControlValue( rFuncData.maFieldRef.ReferenceType ); - SelectHdl( *mpLbType ); // enables base field/item list boxes + mxLbType->set_active(FromDataPilotFieldReferenceType(rFuncData.maFieldRef.ReferenceType)); + SelectHdl( *mxLbType ); // enables base field/item list boxes // select base field - mpLbBaseField->SelectEntry(aSelectedEntry); - if( mpLbBaseField->GetSelectedEntryPos() >= mpLbBaseField->GetEntryCount() ) - mpLbBaseField->SelectEntryPos( 0 ); - SelectHdl( *mpLbBaseField ); // fills base item list, selects base item + mxLbBaseField->set_active_text(aSelectedEntry); + if (mxLbBaseField->get_active() == -1) + mxLbBaseField->set_active(0); + SelectHdl( *mxLbBaseField ); // fills base item list, selects base item // select base item switch( rFuncData.maFieldRef.ReferenceItemType ) { case DataPilotFieldReferenceItemType::PREVIOUS: - mpLbBaseItem->SelectEntryPos( SC_BASEITEM_PREV_POS ); + mxLbBaseItem->set_active( SC_BASEITEM_PREV_POS ); break; case DataPilotFieldReferenceItemType::NEXT: - mpLbBaseItem->SelectEntryPos( SC_BASEITEM_NEXT_POS ); + mxLbBaseItem->set_active( SC_BASEITEM_NEXT_POS ); break; default: { if( mbEmptyItem && rFuncData.maFieldRef.ReferenceItemName.isEmpty() ) { // select special "(empty)" entry added before other items - mpLbBaseItem->SelectEntryPos( SC_BASEITEM_USER_POS ); + mxLbBaseItem->set_active( SC_BASEITEM_USER_POS ); } else { sal_Int32 nStartPos = mbEmptyItem ? (SC_BASEITEM_USER_POS + 1) : SC_BASEITEM_USER_POS; sal_Int32 nPos = FindBaseItemPos( rFuncData.maFieldRef.ReferenceItemName, nStartPos ); - if( nPos >= mpLbBaseItem->GetEntryCount() ) - nPos = (mpLbBaseItem->GetEntryCount() > SC_BASEITEM_USER_POS) ? SC_BASEITEM_USER_POS : SC_BASEITEM_PREV_POS; - mpLbBaseItem->SelectEntryPos( nPos ); + if( nPos == -1) + nPos = (mxLbBaseItem->get_count() > SC_BASEITEM_USER_POS) ? SC_BASEITEM_USER_POS : SC_BASEITEM_PREV_POS; + mxLbBaseItem->set_active( nPos ); } } } @@ -399,10 +371,10 @@ sal_Int32 ScDPFunctionDlg::FindBaseItemPos( const OUString& rEntry, sal_Int32 nS { sal_Int32 nPos = nStartPos; bool bFound = false; - while (nPos < mpLbBaseItem->GetEntryCount()) + while (nPos < mxLbBaseItem->get_count()) { // translate the displayed field name back to its original field name. - const OUString& rInName = mpLbBaseItem->GetEntry(nPos); + const OUString& rInName = mxLbBaseItem->get_text(nPos); const OUString& rName = GetBaseItemName(rInName); if (rName == rEntry) { @@ -411,15 +383,15 @@ sal_Int32 ScDPFunctionDlg::FindBaseItemPos( const OUString& rEntry, sal_Int32 nS } ++nPos; } - return bFound ? nPos : LISTBOX_ENTRY_NOTFOUND; + return bFound ? nPos : -1; } -IMPL_LINK( ScDPFunctionDlg, SelectHdl, ListBox&, rLBox, void ) +IMPL_LINK( ScDPFunctionDlg, SelectHdl, weld::ComboBox&, rLBox, void ) { - if( &rLBox == mpLbType ) + if (&rLBox == mxLbType.get()) { bool bEnableField, bEnableItem; - switch( mxLbTypeWrp->GetControlValue() ) + switch (ToDataPilotFieldReferenceType(mxLbType->get_active())) { case DataPilotFieldReferenceType::ITEM_DIFFERENCE: case DataPilotFieldReferenceType::ITEM_PERCENTAGE: @@ -436,27 +408,27 @@ IMPL_LINK( ScDPFunctionDlg, SelectHdl, ListBox&, rLBox, void ) bEnableField = bEnableItem = false; } - bEnableField &= mpLbBaseField->GetEntryCount() > 0; - mpFtBaseField->Enable( bEnableField ); - mpLbBaseField->Enable( bEnableField ); + bEnableField &= (mxLbBaseField->get_count() > 0); + mxFtBaseField->set_sensitive( bEnableField ); + mxLbBaseField->set_sensitive( bEnableField ); bEnableItem &= bEnableField; - mpFtBaseItem->Enable( bEnableItem ); - mpLbBaseItem->Enable( bEnableItem ); + mxFtBaseItem->set_sensitive( bEnableItem ); + mxLbBaseItem->set_sensitive( bEnableItem ); } - else if( &rLBox == mpLbBaseField ) + else if (&rLBox == mxLbBaseField.get()) { // keep "previous" and "next" entries - while( mpLbBaseItem->GetEntryCount() > SC_BASEITEM_USER_POS ) - mpLbBaseItem->RemoveEntry( SC_BASEITEM_USER_POS ); + while (mxLbBaseItem->get_count() > SC_BASEITEM_USER_POS) + mxLbBaseItem->remove(SC_BASEITEM_USER_POS); // update item list for current base field mbEmptyItem = false; - size_t nBasePos = mpLbBaseField->GetSelectedEntryPos(); - if( nBasePos < mrLabelVec.size() ) + size_t nBasePos = mxLbBaseField->get_active(); + if (nBasePos < mrLabelVec.size()) { const vector<ScDPLabelData::Member>& rMembers = mrLabelVec[nBasePos]->maMembers; - mbEmptyItem = lclFillListBox(*mpLbBaseItem, rMembers, SC_BASEITEM_USER_POS); + mbEmptyItem = lclFillListBox(*mxLbBaseItem, rMembers, SC_BASEITEM_USER_POS); // build cache for base names. NameMapType aMap; for (const auto& rMember : rMembers) @@ -465,14 +437,14 @@ IMPL_LINK( ScDPFunctionDlg, SelectHdl, ListBox&, rLBox, void ) } // select base item - sal_uInt16 nItemPos = (mpLbBaseItem->GetEntryCount() > SC_BASEITEM_USER_POS) ? SC_BASEITEM_USER_POS : SC_BASEITEM_PREV_POS; - mpLbBaseItem->SelectEntryPos( nItemPos ); + sal_uInt16 nItemPos = (mxLbBaseItem->get_count() > SC_BASEITEM_USER_POS) ? SC_BASEITEM_USER_POS : SC_BASEITEM_PREV_POS; + mxLbBaseItem->set_active( nItemPos ); } } -IMPL_LINK_NOARG(ScDPFunctionDlg, DblClickHdl, ListBox&, void) +IMPL_LINK_NOARG(ScDPFunctionDlg, DblClickHdl, weld::TreeView&, void) { - mpBtnOk->Click(); + m_xDialog->response(RET_OK); } ScDPSubtotalDlg::ScDPSubtotalDlg(weld::Window* pParent, ScDPObject& rDPObj, @@ -486,7 +458,7 @@ ScDPSubtotalDlg::ScDPSubtotalDlg(weld::Window* pParent, ScDPObject& rDPObj, , mxRbNone(m_xBuilder->weld_radio_button("none")) , mxRbAuto(m_xBuilder->weld_radio_button("auto")) , mxRbUser(m_xBuilder->weld_radio_button("user")) - , mxLbFunc(new DPFunctionListBox(m_xBuilder->weld_tree_view("functions"))) + , mxLbFunc(new ScDPFunctionListBox(m_xBuilder->weld_tree_view("functions"))) , mxFtName(m_xBuilder->weld_label("name")) , mxCbShowAll(m_xBuilder->weld_check_button("showall")) , mxBtnOk(m_xBuilder->weld_button("ok")) diff --git a/sc/source/ui/inc/pvfundlg.hxx b/sc/source/ui/inc/pvfundlg.hxx index 258bf0a5349b..2193043e0cd1 100644 --- a/sc/source/ui/inc/pvfundlg.hxx +++ b/sc/source/ui/inc/pvfundlg.hxx @@ -23,40 +23,18 @@ #include <com/sun/star/sheet/DataPilotFieldReference.hpp> #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp> -#include <vcl/fixed.hxx> -#include <vcl/layout.hxx> -#include <vcl/lstbox.hxx> -#include <vcl/dialog.hxx> -#include <vcl/button.hxx> -#include <vcl/field.hxx> #include <vcl/weld.hxx> -#include <svx/checklbx.hxx> -#include <sfx2/controlwrapper.hxx> #include <pivot.hxx> #include <memory> #include <unordered_map> -typedef sfx::ListBoxWrapper< sal_Int32 > ScDPListBoxWrapper; - class ScDPObject; -class ScDPFunctionListBox : public ListBox +class ScDPFunctionListBox { public: - ScDPFunctionListBox(vcl::Window* pParent, WinBits nStyle); - - void SetSelection( PivotFunc nFuncMask ); - PivotFunc GetSelection() const; - -private: - void FillFunctionNames(); -}; - -class DPFunctionListBox -{ -public: - DPFunctionListBox(std::unique_ptr<weld::TreeView> xControl); + ScDPFunctionListBox(std::unique_ptr<weld::TreeView> xControl); void SetSelection( PivotFunc nFuncMask ); PivotFunc GetSelection() const; @@ -72,14 +50,13 @@ private: void FillFunctionNames(); }; -class ScDPFunctionDlg : public ModalDialog +class ScDPFunctionDlg : public weld::GenericDialogController { typedef std::unordered_map< OUString, OUString > NameMapType; public: - explicit ScDPFunctionDlg( vcl::Window* pParent, const ScDPLabelDataVector& rLabelVec, - const ScDPLabelData& rLabelData, const ScPivotFuncData& rFuncData ); + explicit ScDPFunctionDlg(weld::Window* pParent, const ScDPLabelDataVector& rLabelVec, + const ScDPLabelData& rLabelData, const ScPivotFuncData& rFuncData ); virtual ~ScDPFunctionDlg() override; - virtual void dispose() override; PivotFunc GetFuncMask() const; css::sheet::DataPilotFieldReference GetFieldRef() const; @@ -92,24 +69,22 @@ private: /** Searches for a listbox entry, starts search at specified position. */ sal_Int32 FindBaseItemPos( const OUString& rEntry, sal_Int32 nStartPos ) const; - DECL_LINK( SelectHdl, ListBox&, void ); - DECL_LINK( DblClickHdl, ListBox&, void ); + DECL_LINK(SelectHdl, weld::ComboBox&, void); + DECL_LINK(DblClickHdl, weld::TreeView&, void); private: - VclPtr<ScDPFunctionListBox> mpLbFunc; - VclPtr<FixedText> mpFtName; - VclPtr<ListBox> mpLbType; - VclPtr<FixedText> mpFtBaseField; - VclPtr<ListBox> mpLbBaseField; - VclPtr<FixedText> mpFtBaseItem; - VclPtr<ListBox> mpLbBaseItem; - VclPtr<OKButton> mpBtnOk; + std::unique_ptr<ScDPFunctionListBox> mxLbFunc; + std::unique_ptr<weld::Label> mxFtName; + std::unique_ptr<weld::ComboBox> mxLbType; + std::unique_ptr<weld::Label> mxFtBaseField; + std::unique_ptr<weld::ComboBox> mxLbBaseField; + std::unique_ptr<weld::Label> mxFtBaseItem; + std::unique_ptr<weld::ComboBox> mxLbBaseItem; + std::unique_ptr<weld::Button> mxBtnOk; NameMapType maBaseFieldNameMap; // cache for base field display -> original name. NameMapType maBaseItemNameMap; // cache for base item display -> original name. - std::unique_ptr<ScDPListBoxWrapper> mxLbTypeWrp; /// Wrapper for direct usage of API constants. - const ScDPLabelDataVector& mrLabelVec; /// Data of all labels. bool mbEmptyItem; /// true = Empty base item in listbox. }; @@ -142,7 +117,7 @@ private: std::unique_ptr<weld::RadioButton> mxRbNone; std::unique_ptr<weld::RadioButton> mxRbAuto; std::unique_ptr<weld::RadioButton> mxRbUser; - std::unique_ptr<DPFunctionListBox> mxLbFunc; + std::unique_ptr<ScDPFunctionListBox> mxLbFunc; std::unique_ptr<weld::Label> mxFtName; std::unique_ptr<weld::CheckButton> mxCbShowAll; std::unique_ptr<weld::Button> mxBtnOk; diff --git a/sc/uiconfig/scalc/ui/datafielddialog.ui b/sc/uiconfig/scalc/ui/datafielddialog.ui index f35fb6ef510b..ca5c24f0949d 100644 --- a/sc/uiconfig/scalc/ui/datafielddialog.ui +++ b/sc/uiconfig/scalc/ui/datafielddialog.ui @@ -2,6 +2,14 @@ <!-- Generated with glade 3.18.3 --> <interface domain="sc"> <requires lib="gtk+" version="3.18"/> + <object class="GtkTreeStore" id="liststore2"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> <object class="GtkDialog" id="DataFieldDialog"> <property name="can_focus">False</property> <property name="border_width">6</property> @@ -105,13 +113,39 @@ <property name="vexpand">True</property> <property name="row_spacing">6</property> <child> - <object class="scuilo-ScDPFunctionListBox" id="functions:border"> + <object class="GtkScrolledWindow"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hexpand">True</property> <property name="vexpand">True</property> - <child internal-child="selection"> - <object class="GtkTreeSelection" id="treeview-selection1"/> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="functions"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore2</property> + <property name="headers_visible">False</property> + <property name="search_column">1</property> + <property name="show_expanders">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="Macro Library List-selection2"/> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn5"> + <property name="resizable">True</property> + <property name="spacing">6</property> + <child> + <object class="GtkCellRendererText" id="cellrenderer4"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + </object> </child> </object> <packing> diff --git a/solenv/bin/native-code.py b/solenv/bin/native-code.py index a84945d15c1e..c95a0a48d51a 100755 --- a/solenv/bin/native-code.py +++ b/solenv/bin/native-code.py @@ -478,7 +478,6 @@ custom_widgets = [ 'ScCondFormatList', 'ScCsvTableBox', 'ScCursorRefEdit', - 'ScDPFunctionListBox', 'ScDataTableView', 'ScDoubleField', 'ScEditWindow', |