23 #include <uiitems.hxx>
28 #include <document.hxx>
31 #include <globstr.hrc>
32 #include <strings.hrc>
44 VclMessageType::Info, VclButtonsType::Ok,
57 void Set(
const OUString& rName,
const OUString& rArea )
70 :
ScAnyRefDlgController(pB, pCW, pParent,
"modules/scalc/ui/consolidatedialog.ui",
"ConsolidateDialog")
71 , aStrUndefined (
ScResId( SCSTR_UNDEFINED ) )
73 rArgSet.
Get( rArgSet.GetPool()->
79 GetViewData().GetDocument() )
80 , nAreaDataCount ( 0 )
81 , nWhichCons ( rArgSet.GetPool()->
GetWhich( SID_CONSOLIDATE ) )
82 , bDlgLostFocus ( false )
83 , m_xLbFunc(m_xBuilder->weld_combo_box(
"func"))
84 , m_xLbConsAreas(m_xBuilder->weld_tree_view(
"consareas"))
85 , m_xLbDataArea(m_xBuilder->weld_combo_box(
"lbdataarea"))
86 , m_xEdDataArea(new
formula::RefEdit(m_xBuilder->weld_entry(
"eddataarea")))
87 , m_xRbDataArea(new
formula::RefButton(m_xBuilder->weld_button(
"rbdataarea")))
88 , m_xLbDestArea(m_xBuilder->weld_combo_box(
"lbdestarea"))
89 , m_xEdDestArea(new
formula::RefEdit(m_xBuilder->weld_entry(
"eddestarea")))
90 , m_xRbDestArea(new
formula::RefButton(m_xBuilder->weld_button(
"rbdestarea")))
91 , m_xExpander(m_xBuilder->weld_expander(
"more"))
92 , m_xBtnByRow(m_xBuilder->weld_check_button(
"byrow"))
93 , m_xBtnByCol(m_xBuilder->weld_check_button(
"bycol"))
94 , m_xBtnRefs(m_xBuilder->weld_check_button(
"refs"))
95 , m_xBtnOk(m_xBuilder->weld_button(
"ok"))
96 , m_xBtnCancel(m_xBuilder->weld_button(
"cancel"))
97 , m_xBtnAdd(m_xBuilder->weld_button(
"add"))
98 , m_xBtnRemove(m_xBuilder->weld_button(
"delete"))
99 , m_xDataFT(m_xBuilder->weld_label(
"ftdataarea"))
100 , m_xDestFT(m_xBuilder->weld_label(
"ftdestarea"))
176 size_t nRangeCount = pRangeNames ? pRangeNames->
size() : 0;
190 while ( aIter.
Next( aStrName, aRange ) )
193 pAreaData[nAt++].Set( aStrName, aStrArea );
247 aStr = rRef.
Format(rDocP, nFmt, eConv);
257 DoClose( ScConsolidateDlgWrapper::GetChildWindowId() );
289 bool bEditOk =
false;
290 OUString theCompleteStr;
296 nTab, &theCompleteStr,
nullptr,
nullptr, eConv );
304 nTab, &theCompleteStr,
nullptr, eConv );
308 pEd->
SetText( theCompleteStr );
317 m_pRefInputEdit = &rControl;
322 if (&rControl == m_xLbDataArea.get())
323 m_pRefInputEdit = m_xEdDataArea.get();
324 else if (&rControl == m_xLbDestArea.get())
325 m_pRefInputEdit = m_xEdDestArea.get();
330 const sal_Int32 nDataAreaCount = m_xLbConsAreas->n_children();
332 if ( nDataAreaCount > 0 )
335 SCTAB nTab = rViewData.GetTabNo();
336 OUString aDestPosStr( m_xEdDestArea->GetText() );
342 std::unique_ptr<ScArea[]> pDataAreas(
new ScArea[nDataAreaCount]);
344 for ( sal_Int32
i=0;
i<nDataAreaCount; ++
i )
347 pDataAreas[
i], rDoc, nTab, eConv);
350 theOutParam.
nCol = aDestAddress.
Col();
351 theOutParam.
nRow = aDestAddress.
Row();
352 theOutParam.
nTab = aDestAddress.
Tab();
353 theOutParam.
eFunction = LbPosToFunc( m_xLbFunc->get_active() );
354 theOutParam.
bByCol = m_xBtnByCol->get_active();
355 theOutParam.
bByRow = m_xBtnByRow->get_active();
357 theOutParam.
SetAreas( std::move(pDataAreas), nDataAreaCount );
361 SetDispatcherLock(
false );
363 GetBindings().GetDispatcher()->ExecuteList(SID_CONSOLIDATE,
364 SfxCallMode::SLOT | SfxCallMode::RECORD,
371 m_xEdDestArea->GrabFocus();
380 if ( &rBtn == m_xBtnCancel.get() )
382 else if ( &rBtn == m_xBtnAdd.get() )
384 if ( !m_xEdDataArea->GetText().isEmpty() )
386 OUString aNewEntry( m_xEdDataArea->GetText() );
387 std::unique_ptr<ScArea[]> ppAreas;
388 sal_uInt16 nAreaCount = 0;
397 for ( sal_uInt16
i=0;
i<nAreaCount;
i++ )
399 const ScArea& rArea = ppAreas[
i];
404 if (m_xLbConsAreas->find_text(aNewArea) == -1)
406 m_xLbConsAreas->append_text( aNewArea );
410 else if ( VerifyEdit( m_xEdDataArea.get() ) )
412 OUString aNewArea( m_xEdDataArea->GetText() );
414 if (m_xLbConsAreas->find_text(aNewArea) == -1)
415 m_xLbConsAreas->append_text(aNewArea);
422 m_xEdDataArea->GrabFocus();
426 else if ( &rBtn == m_xBtnRemove.get() )
428 std::vector<int> aSelectedRows(m_xLbConsAreas->get_selected_rows());
429 std::sort(aSelectedRows.begin(), aSelectedRows.end());
430 for (
auto it = aSelectedRows.rbegin(); it != aSelectedRows.rend(); ++it)
431 m_xLbConsAreas->remove(*it);
432 m_xBtnRemove->set_sensitive(
false);
438 if (rLb.get_selected_index() != -1)
439 m_xBtnRemove->set_sensitive(
true);
441 m_xBtnRemove->set_sensitive(
false);
446 formula::RefEdit* pEd = (&rLb == m_xLbDataArea.get()) ? m_xEdDataArea.get() : m_xEdDestArea.get();
447 const sal_Int32 nSelPos = rLb.get_active();
450 && (nAreaDataCount > 0)
451 && (pAreaData !=
nullptr) )
455 OUString aString( pAreaData[nSelPos-1].aStrArea );
457 if ( &rLb == m_xLbDestArea.get() )
462 if ( pEd == m_xEdDataArea.get() )
463 m_xBtnAdd->set_sensitive(
true);
469 if ( pEd == m_xEdDataArea.get() )
470 m_xBtnAdd->set_sensitive(
true);
476 if ( &rEd == m_xEdDataArea.get() )
478 OUString aAreaStr( rEd.GetText() );
479 if ( !aAreaStr.isEmpty() )
480 m_xBtnAdd->set_sensitive(
true);
482 m_xBtnAdd->set_sensitive(
false);
484 else if ( &rEd == m_xEdDestArea.get() )
486 m_xLbDestArea->set_active(0);
bool Next(OUString &rName, ScRange &rRange)
#define LINK(Instance, Class, Member)
SC_DLLPUBLIC void Format(OStringBuffer &r, ScRefFlags nFlags, const ScDocument *pDocument=nullptr, const Details &rDetails=detailsOOOa1) const
std::unique_ptr< weld::CheckButton > m_xBtnRefs
SC_DLLPUBLIC ScDBCollection * GetDBCollection() const
std::unique_ptr< formula::RefEdit > m_xEdDestArea
void Set(const OUString &rName, const OUString &rArea)
std::unique_ptr< weld::Button > m_xBtnAdd
bool VerifyEdit(formula::RefEdit *pEd)
SC_DLLPUBLIC ScRangeName * GetRangeName(SCTAB nTab) const
void SetAreas(std::unique_ptr< ScArea[]> pAreas, sal_uInt16 nCount)
sal_uInt16 nDataAreaCount
std::unique_ptr< weld::Button > m_xBtnOk
std::unique_ptr< formula::RefEdit > m_xEdDataArea
virtual void SetReference(const ScRange &rRef, ScDocument &rDoc) override
std::unique_ptr< ScArea[]> pDataAreas
SC_DLLPUBLIC formula::FormulaGrammar::AddressConvention GetAddressConvention() const
IMPL_LINK_NOARG(ScConsolidateDlg, OkHdl, weld::Button &, void)
SC_DLLPUBLIC SCTAB GetTableCount() const
virtual void Deactivate() override
std::unique_ptr< ScAreaData[]> pAreaData
static ScSubTotalFunc LbPosToFunc(sal_Int32 nPos)
ScConsolidateParam theConsData
virtual void Close() override
static bool MakeArea(const OUString &rAreaStr, ScArea &rArea, const ScDocument &rDoc, SCTAB nTab, ScAddress::Details const &rDetails)
std::unique_ptr< weld::ComboBox > m_xLbDataArea
static sal_Int32 FuncToLbPos(ScSubTotalFunc eFunc)
std::unique_ptr< weld::ComboBox > m_xLbFunc
std::unique_ptr< weld::TreeView > m_xLbConsAreas
std::unique_ptr< weld::CheckButton > m_xBtnByRow
SC_DLLPUBLIC OUString Format(const ScDocument &rDocument, ScRefFlags nFlags=ScRefFlags::ZERO, const ScAddress::Details &rDetails=ScAddress::detailsOOOa1, bool bFullAddressNotation=false) const
Returns string with formatted cell range from aStart to aEnd, according to provided address conventio...
static bool IsAbsArea(const OUString &rAreaStr, const ScDocument &rDoc, SCTAB nTab, OUString *pCompleteStr, ScRefAddress *pStartPos=nullptr, ScRefAddress *pEndPos=nullptr, ScAddress::Details const &rDetails=ScAddress::detailsOOOa1)
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
static bool IsAbsPos(const OUString &rPosStr, const ScDocument &rDoc, SCTAB nTab, OUString *pCompleteStr, ScRefAddress *pPosTripel=nullptr, ScAddress::Details const &rDetails=ScAddress::detailsOOOa1)
OUString ScResId(const char *pId)
virtual void RefInputDone(bool bForced=false) override
static bool IsAbsTabArea(const OUString &rAreaStr, const ScDocument *pDoc, std::unique_ptr< ScArea[]> *ppAreas, sal_uInt16 *pAreaCount, bool bAcceptCellRef=false, ScAddress::Details const &rDetails=ScAddress::detailsOOOa1)
std::unique_ptr< formula::RefButton > m_xRbDataArea
virtual ~ScConsolidateDlg() override
std::unique_ptr< weld::CheckButton > m_xBtnByCol
std::unique_ptr< weld::ComboBox > m_xLbDestArea
std::unique_ptr< weld::Label > m_xDestFT
virtual void SetActive() override
std::unique_ptr< weld::Label > m_xDataFT
Reference< XExecutableDialog > m_xDialog
IMPL_LINK(ScConsolidateDlg, GetEditFocusHdl, formula::RefEdit &, rControl, void)
formula::RefEdit * m_pRefInputEdit
SC_DLLPUBLIC size_t size() const
SVXCORE_DLLPUBLIC MSO_SPT Get(const OUString &)
std::unique_ptr< weld::Button > m_xBtnCancel
bool DoClose(sal_uInt16 nId)
static void CutPosString(const OUString &theAreaStr, OUString &thePosStr)
static weld::MessageDialog * CreateMessageDialog(weld::Widget *pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString &rPrimaryMessage, bool bMobile=false)
std::unique_ptr< weld::Button > m_xBtnRemove
ScConsolidateDlg(SfxBindings *pB, SfxChildWindow *pCW, weld::Window *pParent, const SfxItemSet &rArgSet)
std::unique_ptr< formula::RefButton > m_xRbDestArea
virtual void RefInputStart(formula::RefEdit *pEdit, formula::RefButton *pButton=nullptr) override