33 #include <globstr.hrc>
35 #include <compiler.hxx>
57 VclMessageType::Warning, VclButtonsType::Ok,
70 static void printAddressFlags(
ScRefFlags nFlag)
72 if ((nFlag &
ScRefFlags::COL_ABS ) == ScRefFlags::COL_ABS ) printf(
"ScRefFlags::COL_ABS \n");
73 if ((nFlag &
ScRefFlags::ROW_ABS ) == ScRefFlags::ROW_ABS ) printf(
"ScRefFlags::ROW_ABS \n");
74 if ((nFlag &
ScRefFlags::TAB_ABS ) == ScRefFlags::TAB_ABS ) printf(
"ScRefFlags::TAB_ABS \n");
75 if ((nFlag &
ScRefFlags::TAB_3D ) == ScRefFlags::TAB_3D ) printf(
"ScRefFlags::TAB_3D \n");
79 if ((nFlag &
ScRefFlags::TAB2_3D ) == ScRefFlags::TAB2_3D ) printf(
"ScRefFlags::TAB2_3D \n");
87 if ((nFlag &
ScRefFlags::VALID ) == ScRefFlags::VALID ) printf(
"ScRefFlags::VALID \n");
98 , bDlgLostFocus(false)
102 , m_xLbPrintArea(m_xBuilder->weld_combo_box(
"lbprintarea"))
103 , m_xEdPrintArea(new
formula::RefEdit(m_xBuilder->weld_entry(
"edprintarea")))
104 , m_xRbPrintArea(new
formula::RefButton(m_xBuilder->weld_button(
"rbprintarea")))
105 , m_xLbRepeatRow(m_xBuilder->weld_combo_box(
"lbrepeatrow"))
106 , m_xEdRepeatRow(new
formula::RefEdit(m_xBuilder->weld_entry(
"edrepeatrow")))
107 , m_xRbRepeatRow(new
formula::RefButton(m_xBuilder->weld_button(
"rbrepeatrow")))
108 , m_xLbRepeatCol(m_xBuilder->weld_combo_box(
"lbrepeatcol"))
109 , m_xEdRepeatCol(new
formula::RefEdit(m_xBuilder->weld_entry(
"edrepeatcol")))
110 , m_xRbRepeatCol(new
formula::RefButton(m_xBuilder->weld_button(
"rbrepeatcol")))
111 , m_xBtnOk(m_xBuilder->weld_button(
"ok"))
112 , m_xBtnCancel(m_xBuilder->weld_button(
"cancel"))
113 , m_xPrintFrame(m_xBuilder->weld_frame(
"printframe"))
114 , m_xRowFrame(m_xBuilder->weld_frame(
"rowframe"))
115 , m_xColFrame(m_xBuilder->weld_frame(
"colframe"))
116 , m_xPrintFrameFT(m_xPrintFrame->weld_label_widget())
117 , m_xRowFrameFT(m_xRowFrame->weld_label_widget())
118 , m_xColFrameFT(m_xColFrame->weld_label_widget())
132 assert(pScDocSh &&
"Current DocumentShell not found :-(");
154 DoClose( ScPrintAreasDlgWrapper::GetChildWindowId() );
178 aStr = rRef.
Format(*
pDoc, ScRefFlags::RANGE_ABS, eConv);
182 aVal = aVal.replaceAt( aSel.
Min(), aSel.
Len(), aStr );
204 sal_Int32 nLen = aVal.getLength();
263 for (sal_uInt16
i=0;
i<nRangeCount;
i++)
268 if ( !aStrRange.isEmpty() )
269 aStrRange += OUStringChar(sep);
270 aStrRange += pPrintRange->
Format(*
pDoc, ScRefFlags::RANGE_ABS, eConv);
298 OUString aRangeStr = pEd->
GetText();
306 aRangeStr = aRange.
Format(*
pDoc, ScRefFlags::RANGE_ABS, eConv);
321 bool bPrintAreaOk =
true;
322 if ( !aStrPrintArea.isEmpty() )
331 for ( sal_Int32 nIdx = 0; nIdx >= 0; )
333 const OUString aOne = aStrPrintArea.getToken(0, sep, nIdx);
335 if ((nResult & nValidRange) != nValidRange)
338 if ((nAddrResult & nValidAddr) != nValidAddr)
340 bPrintAreaOk =
false;
347 bool bRepeatRowOk = aStrRepeatRow.isEmpty();
351 bool bRepeatColOk = aStrRepeatCol.isEmpty();
357 bOk = (bPrintAreaOk && bRepeatRowOk && bRepeatColOk);
393 aStrRange = aRange.
Format(*
pDoc, ScRefFlags::RANGE_ABS, eConv);
398 aList->
Format(aStrRange, ScRefFlags::RANGE_ABS, *
pDoc, eConv);
407 if (!pRangeNames || pRangeNames->
empty())
411 for (
const auto& rEntry : *pRangeNames)
418 OUString
aName = rEntry.second->GetName();
420 rEntry.second->GetSymbol(aSymbol);
425 aSymbol = aRange.
Format(*
pDoc, ScRefFlags::RANGE_ABS, eConv);
448 if (m_xBtnOk.get() == &rBtn)
450 if ( Impl_CheckRefStrings() )
460 SfxBoolItem aEntireSheet( FN_PARAM_4, bEntireSheet );
462 bool bDataChanged = bEntireSheet != pDoc->IsPrintEntireSheet( nCurTab );
466 bDataChanged |= Impl_GetItem( m_xEdPrintArea.get(), aPrintArea );
471 bDataChanged |= Impl_GetItem( m_xEdRepeatRow.get(), aRepeatRow );
475 bDataChanged |= Impl_GetItem( m_xEdRepeatCol.get(), aRepeatCol );
479 SetDispatcherLock(
false );
481 GetBindings().GetDispatcher()->ExecuteList(SID_CHANGE_PRINTAREA,
482 SfxCallMode::SLOT | SfxCallMode::RECORD,
483 { &aPrintArea, &aRepeatRow, &aRepeatCol, &aEntireSheet });
489 else if (m_xBtnCancel.get() == &rBtn)
495 m_pRefInputEdit = &rCtrl;
500 if (&rCtrl == m_xLbPrintArea.get())
501 m_pRefInputEdit = m_xEdPrintArea.get();
502 else if (&rCtrl == m_xLbRepeatRow.get())
503 m_pRefInputEdit = m_xEdRepeatRow.get();
504 else if (&rCtrl == m_xLbRepeatCol.get())
505 m_pRefInputEdit = m_xEdRepeatCol.get();
510 const sal_Int32 nSelPos = rLb.get_active();
518 if (&rLb == m_xLbPrintArea.get())
520 pEd = m_xEdPrintArea.get();
524 else if (&rLb == m_xLbRepeatCol.get())
525 pEd = m_xEdRepeatCol.get();
526 else if (&rLb == m_xLbRepeatRow.get())
527 pEd = m_xEdRepeatRow.get();
532 if( (nSelPos == 0) || (nSelPos == nAllSheetPos) )
534 else if( nSelPos >= nFirstCustomPos )
535 pEd->
SetText(rLb.get_id(nSelPos));
546 if( &rEd == m_xEdPrintArea.get() )
548 pLb = m_xLbPrintArea.get();
552 else if( &rEd == m_xEdRepeatCol.get() )
553 pLb = m_xLbRepeatCol.get();
554 else if( &rEd == m_xEdRepeatRow.get() )
555 pLb = m_xLbRepeatRow.get();
560 const sal_Int32 nEntryCount = pLb->
get_count();
561 OUString aStrEd( rEd.GetText() );
562 OUString aEdUpper = aStrEd.toAsciiUpperCase();
564 if ( (nEntryCount > nFirstCustomPos) && !aStrEd.isEmpty() )
569 for ( i=nFirstCustomPos; i<nEntryCount && !bFound; i++ )
571 const OUString& rSymbol = pLb->
get_id(i);
572 bFound = (rSymbol == aStrEd || rSymbol == aEdUpper);
575 pLb->
set_active( bFound ? i-1 : nUserDefPos );
578 pLb->
set_active( !aStrEd.isEmpty() ? nUserDefPos : 0 );
591 OUString
aStr = rStr;
592 sal_Int32 nLen = aStr.getLength();
594 bool bStrOk = ( nLen > 0 ) && ( bIsRow ? ( nLen < 6 ) : ( nLen < 4 ) );
598 if (
'$' == aStr[0] )
599 aStr = aStr.copy( 1 );
607 sal_Int32
n = aStr.toInt32();
611 nNum =
static_cast<SCCOLROW>(n - 1);
636 sal_Int32 nLen = rStr.getLength();
643 if (rStr[0] != preUpper && rStr[0] != preLower)
646 OUString aNumStr = rStr.copy(1);
650 sal_Int32 nNum = aNumStr.toInt32();
659 rVal =
static_cast<SCCOLROW>(nNum-1);
700 sal_Int32 nLen = rStr.getLength();
701 bool bEndPos =
false;
702 for( sal_Int32
i = 0;
i < nLen; ++
i )
724 pRange->
aEnd.
SetRow(static_cast<SCROW>(nVal));
729 pRange->
aEnd.
SetCol(static_cast<SCCOL>(nVal));
737 aBuf += OUStringChar(c);
752 pRange->
aEnd.
SetRow(static_cast<SCROW>(nVal));
758 pRange->
aEnd.
SetCol(static_cast<SCCOL>(nVal));
778 : (ScRefFlags::COL_VALID | ScRefFlags::COL_ABS);
779 rStr += rStart.
Format(nFmt, &rDoc, eConv);
780 if ((bIsRow && rStart.
Row() != rEnd.
Row()) || (!bIsRow && rStart.
Col() != rEnd.
Col()))
783 rStr += rEnd.
Format(nFmt, &rDoc, eConv);
ScMarkData & GetMarkData()
SC_DLLPUBLIC ScRefFlags ParseAny(const OUString &, const ScDocument &, const ScAddress::Details &rDetails=ScAddress::detailsOOOa1)
#define LINK(Instance, Class, Member)
virtual ~ScPrintAreasDlg() override
std::unique_ptr< weld::Label > m_xRowFrameFT
SC_DLLPUBLIC void Format(OStringBuffer &r, ScRefFlags nFlags, const ScDocument *pDocument=nullptr, const Details &rDetails=detailsOOOa1) const
virtual bool IsTableLocked() const override
static void lcl_GetRepeatRangeString(const ScRange *pRange, const ScDocument &rDoc, bool bIsRow, OUString &rStr)
SC_DLLPUBLIC const ScRange * GetRepeatColRange(SCTAB nTab)
std::unique_ptr< weld::ComboBox > m_xLbRepeatCol
std::unique_ptr< weld::Label > m_xColFrameFT
static bool lcl_CheckRepeatOne(const ScDocument &rDoc, const OUString &rStr, formula::FormulaGrammar::AddressConvention eConv, bool bIsRow, SCCOLROW &rVal)
void Format(OUString &, ScRefFlags nFlags, const ScDocument &, formula::FormulaGrammar::AddressConvention eConv=formula::FormulaGrammar::CONV_OOO, sal_Unicode cDelimiter=0, bool bFullAddressNotation=false) const
SCCOL GetMaxColCount() const
SC_DLLPUBLIC ScRangeName * GetRangeName(SCTAB nTab) const
bool Impl_CheckRefStrings()
void FillRangeListWithMarks(ScRangeList *pList, bool bClear, SCTAB nForTab=-1) const
Create a range list of marks.
std::unique_ptr< weld::ComboBox > m_xLbPrintArea
std::unique_ptr< weld::Button > m_xBtnOk
static SfxObjectShell * Current()
bool Impl_GetItem(const formula::RefEdit *pEd, SfxStringItem &rItem)
SCROW GetMaxRowCount() const
std::unique_ptr< weld::ComboBox > m_xLbRepeatRow
SC_DLLPUBLIC formula::FormulaGrammar::AddressConvention GetAddressConvention() const
virtual int get_count() const =0
std::unique_ptr< formula::RefEdit > m_xEdRepeatCol
std::unique_ptr< formula::RefEdit > m_xEdRepeatRow
void SetValue(const OUString &rTheValue)
sal_Int32 SCCOLROW
a type capable of holding either SCCOL or SCROW
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
static SfxViewShell * Current()
SC_DLLPUBLIC const ScRange * GetPrintRange(SCTAB nTab, sal_uInt16 nPos)
bool IsPrintEntireSheet(SCTAB nTab) const
Returns true, if the specified sheet is always printed.
ScViewData & GetViewData()
ScPrintAreasDlg(SfxBindings *pB, SfxChildWindow *pCW, weld::Window *pParent)
std::unique_ptr< weld::Button > m_xBtnCancel
SC_DLLPUBLIC sal_uInt16 GetPrintRangeCount(SCTAB nTab)
virtual void AddRefEntry() override
std::unique_ptr< formula::RefButton > m_xRbPrintArea
static bool lcl_CheckOne_XL_A1(const ScDocument &rDoc, const OUString &rStr, bool bIsRow, SCCOLROW &rVal)
virtual void Close() override
ScSheetLimits & GetSheetLimits() const
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...
OUString ScResId(const char *pId)
ScMarkType GetSimpleArea(SCCOL &rStartCol, SCROW &rStartRow, SCTAB &rStartTab, SCCOL &rEndCol, SCROW &rEndRow, SCTAB &rEndTab) const
std::unique_ptr< formula::RefButton > m_xRbRepeatRow
virtual void RefInputDone(bool bForced=false) override
virtual void set_active(int pos)=0
IMPL_LINK(ScPrintAreasDlg, Impl_BtnHdl, weld::Button &, rBtn, void)
formula::RefEdit * m_pRefInputEdit
bool AlphaToCol(const ScDocument &rDoc, SCCOL &rCol, const OUString &rStr)
get column number of A..IV... string
std::unique_ptr< formula::RefEdit > m_xEdPrintArea
static bool lcl_CheckRepeatString(const OUString &rStr, const ScDocument &rDoc, bool bIsRow, ScRange *pRange)
static bool lcl_CheckOne_OOO(const ScDocument &rDoc, const OUString &rStr, bool bIsRow, SCCOLROW &rVal)
virtual void Deactivate() override
SC_DLLPUBLIC const ScRange * GetRepeatRowRange(SCTAB nTab)
std::unique_ptr< formula::RefButton > m_xRbRepeatCol
SC_DLLPUBLIC ScRefFlags Parse(const OUString &, const ScDocument &, const ScAddress::Details &rDetails=ScAddress::detailsOOOa1, ScAddress::ExternalInfo *pExtInfo=nullptr, const css::uno::Sequence< css::sheet::ExternalLinkInfo > *pExternalLinks=nullptr, const OUString *pErrRef=nullptr)
virtual void SetActive() override
Reference< XExecutableDialog > m_xDialog
const ScDocument & GetDocument() const
virtual OUString get_id(int pos) const =0
static bool isAsciiNumeric(const OUString &rStr)
std::unique_ptr< weld::Label > m_xPrintFrameFT
SC_DLLPUBLIC ScRefFlags Parse(const OUString &, const ScDocument &, const Details &rDetails=detailsOOOa1, ExternalInfo *pExtInfo=nullptr, const css::uno::Sequence< css::sheet::ExternalLinkInfo > *pExternalLinks=nullptr, sal_Int32 *pSheetEndPos=nullptr, const OUString *pErrRef=nullptr)
virtual void SetReference(const ScRange &rRef, ScDocument &rDoc) override
bool DoClose(sal_uInt16 nId)
static weld::MessageDialog * CreateMessageDialog(weld::Widget *pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString &rPrimaryMessage, bool bMobile=false)
static bool lcl_CheckOne_XL_R1C1(const ScDocument &rDoc, const OUString &rStr, bool bIsRow, SCCOLROW &rVal)
virtual void RefInputStart(formula::RefEdit *pEdit, formula::RefButton *pButton=nullptr) override