23 #include <ooo/vba/excel/XWorksheet.hpp>
24 #include <com/sun/star/beans/XPropertySet.hpp>
25 #include <com/sun/star/sheet/XSheetPageBreak.hpp>
26 #include <com/sun/star/table/XColumnRowRange.hpp>
27 #include <com/sun/star/uno/XComponentContext.hpp>
34 class RangePageBreaks :
public ::cppu::WeakImplHelper<container::XIndexAccess >
37 uno::Reference< XHelperInterface >
mxParent;
38 uno::Reference< uno::XComponentContext >
mxContext;
39 uno::Reference< sheet::XSheetPageBreak > mxSheetPageBreak;
43 RangePageBreaks(
const uno::Reference< XHelperInterface >& xParent,
44 const uno::Reference< uno::XComponentContext >& xContext,
45 const uno::Reference< sheet::XSheetPageBreak >& xSheetPageBreak,
46 bool bColumn ) : mxParent( xParent ), mxContext( xContext ), mxSheetPageBreak( xSheetPageBreak ), m_bColumn( bColumn )
51 sal_Int32 getAPIStartofRange(
const uno::Reference< excel::XRange >& xRange )
54 return xRange->getColumn() - 1;
55 return xRange->getRow() - 1;
59 sal_Int32 getAPIEndIndexofRange(
const uno::Reference< excel::XRange >& xRange, sal_Int32 nUsedStart )
62 return nUsedStart + xRange->Columns(
uno::Any() )->getCount() - 1;
63 return nUsedStart + xRange->Rows(
uno::Any() )->getCount();
67 uno::Sequence<sheet::TablePageBreakData> getAllPageBreaks()
70 return mxSheetPageBreak->getColumnPageBreaks();
71 return mxSheetPageBreak->getRowPageBreaks();
75 uno::Reference<container::XIndexAccess> getRowColContainer()
const
77 uno::Reference< table::XColumnRowRange > xColumnRowRange( mxSheetPageBreak, uno::UNO_QUERY_THROW );
78 uno::Reference<container::XIndexAccess> xIndexAccess;
80 xIndexAccess.set( xColumnRowRange->getColumns(), uno::UNO_QUERY_THROW );
82 xIndexAccess.set( xColumnRowRange->getRows(), uno::UNO_QUERY_THROW );
87 sheet::TablePageBreakData getTablePageBreakData( sal_Int32 nAPIItemIndex );
93 virtual sal_Int32 SAL_CALL getCount( )
override;
94 virtual uno::Any SAL_CALL getByIndex( sal_Int32
Index )
override;
95 virtual uno::Type SAL_CALL getElementType( )
override
101 virtual sal_Bool SAL_CALL hasElements( )
override
114 sal_Int32 SAL_CALL RangePageBreaks::getCount( )
116 uno::Reference< excel::XWorksheet > xWorksheet( mxParent, uno::UNO_QUERY_THROW );
117 uno::Reference< excel::XRange > xRange = xWorksheet->getUsedRange();
118 sal_Int32 nUsedStart = getAPIStartofRange( xRange );
119 sal_Int32 nUsedEnd = getAPIEndIndexofRange( xRange, nUsedStart );
120 const uno::Sequence<sheet::TablePageBreakData> aTablePageBreakData = getAllPageBreaks();
122 auto pPageBreak = std::find_if(aTablePageBreakData.begin(), aTablePageBreakData.end(),
123 [nUsedEnd](
const sheet::TablePageBreakData& rPageBreak) {
return rPageBreak.Position > nUsedEnd + 1; });
125 return static_cast<sal_Int32
>(std::distance(aTablePageBreakData.begin(), pPageBreak));
128 uno::Any SAL_CALL RangePageBreaks::getByIndex( sal_Int32
Index )
130 if( (Index < getCount()) && ( Index >= 0 ))
132 sheet::TablePageBreakData aTablePageBreakData = getTablePageBreakData( Index );
133 uno::Reference< container::XIndexAccess > xIndexAccess = getRowColContainer();
134 sal_Int32
nPos = aTablePageBreakData.Position;
135 if( (nPos < xIndexAccess->getCount()) && (nPos > -1) )
137 uno::Reference< beans::XPropertySet > xRowColPropertySet( xIndexAccess->getByIndex(nPos), uno::UNO_QUERY_THROW );
139 return uno::makeAny( uno::Reference< excel::XVPageBreak >(
new ScVbaVPageBreak( mxParent, mxContext, xRowColPropertySet, aTablePageBreakData) ));
140 return uno::makeAny( uno::Reference< excel::XHPageBreak >(
new ScVbaHPageBreak( mxParent, mxContext, xRowColPropertySet, aTablePageBreakData) ));
143 throw lang::IndexOutOfBoundsException();
146 sheet::TablePageBreakData RangePageBreaks::getTablePageBreakData( sal_Int32 nAPIItemIndex )
148 sal_Int32
index = -1;
149 sheet::TablePageBreakData aTablePageBreakData;
150 uno::Reference< excel::XWorksheet > xWorksheet( mxParent, uno::UNO_QUERY_THROW );
151 uno::Reference< excel::XRange > xRange = xWorksheet->getUsedRange();
152 sal_Int32 nUsedStart = getAPIStartofRange( xRange );
153 sal_Int32 nUsedEnd = getAPIEndIndexofRange( xRange, nUsedStart );
154 const uno::Sequence<sheet::TablePageBreakData> aTablePageBreakDataList = getAllPageBreaks();
156 for(
const auto& rTablePageBreakData : aTablePageBreakDataList )
158 aTablePageBreakData = rTablePageBreakData;
159 sal_Int32 nPos = aTablePageBreakData.Position;
160 if( nPos > nUsedEnd + 1 )
161 DebugHelper::runtimeexception(ERRCODE_BASIC_METHOD_FAILED);
163 if( index == nAPIItemIndex )
164 return aTablePageBreakData;
167 return aTablePageBreakData;
170 uno::Any RangePageBreaks::Add(
const css::uno::Any& Before )
172 uno::Reference< excel::XRange > xRange;
176 DebugHelper::basicexception(ERRCODE_BASIC_BAD_ARGUMENT, {});
179 sal_Int32 nAPIRowColIndex = getAPIStartofRange( xRange );
180 uno::Reference< container::XIndexAccess > xIndexAccess = getRowColContainer();
181 uno::Reference< beans::XPropertySet > xRowColPropertySet( xIndexAccess->getByIndex(nAPIRowColIndex), uno::UNO_QUERY_THROW );
182 xRowColPropertySet->setPropertyValue(
"IsStartOfNewPage", uno::makeAny(
true));
183 sheet::TablePageBreakData aTablePageBreakData;
184 aTablePageBreakData.ManualBreak =
true;
185 aTablePageBreakData.Position = nAPIRowColIndex;
187 return uno::makeAny( uno::Reference< excel::XVPageBreak >(
new ScVbaVPageBreak( mxParent, mxContext, xRowColPropertySet, aTablePageBreakData) ));
188 return uno::makeAny( uno::Reference< excel::XHPageBreak >(
new ScVbaHPageBreak( mxParent, mxContext, xRowColPropertySet, aTablePageBreakData) ));
195 uno::Reference<container::XIndexAccess > m_xIndexAccess;
198 explicit RangePageBreaksEnumWrapper(
const uno::Reference< container::XIndexAccess >& xIndexAccess ) : m_xIndexAccess( xIndexAccess ), nIndex( 0 ) {}
199 virtual sal_Bool SAL_CALL hasMoreElements( )
override
201 return ( nIndex < m_xIndexAccess->getCount() );
204 virtual uno::Any SAL_CALL nextElement( )
override
206 if ( nIndex < m_xIndexAccess->getCount() )
207 return m_xIndexAccess->getByIndex( nIndex++ );
208 throw container::NoSuchElementException();
215 const uno::Reference< uno::XComponentContext >& xContext,
216 const uno::Reference< sheet::XSheetPageBreak >& xSheetPageBreak):
217 ScVbaHPageBreaks_BASE( xParent,xContext, new RangePageBreaks( xParent, xContext, xSheetPageBreak, false ))
223 RangePageBreaks* pPageBreaks =
dynamic_cast< RangePageBreaks*
>( m_xIndexAccess.get() );
226 return pPageBreaks->Add( Before );
231 uno::Reference< container::XEnumeration >
234 return new RangePageBreaksEnumWrapper( m_xIndexAccess );
252 return "ScVbaHPageBreaks";
255 uno::Sequence< OUString >
260 "ooo.vba.excel.HPageBreaks"
267 const uno::Reference< uno::XComponentContext >& xContext,
268 const uno::Reference< sheet::XSheetPageBreak >& xSheetPageBreak )
269 :
ScVbaVPageBreaks_BASE( xParent, xContext, new RangePageBreaks( xParent, xContext, xSheetPageBreak, true ) )
280 RangePageBreaks* pPageBreaks =
dynamic_cast< RangePageBreaks*
>( m_xIndexAccess.get() );
283 return pPageBreaks->Add( Before );
288 uno::Reference< container::XEnumeration >
291 return new RangePageBreaksEnumWrapper( m_xIndexAccess );
309 return "ScVbaVPageBreaks";
312 uno::Sequence< OUString >
317 "ooo.vba.excel.VPageBreaks"
virtual css::uno::Any SAL_CALL Add(const css::uno::Any &Before) override
ScVbaHPageBreaks(const css::uno::Reference< ov::XHelperInterface > &xParent, const css::uno::Reference< css::uno::XComponentContext > &xContext, const css::uno::Reference< css::sheet::XSheetPageBreak > &xSheetPageBreak)
WeakReference< XInterface > mxParent
virtual css::uno::Type SAL_CALL getElementType() override
Sequence< OUString > aServiceNames
::cppu::WeakImplHelper< css::container::XEnumeration > EnumerationHelper_BASE
virtual css::uno::Sequence< OUString > getServiceNames() override
virtual css::uno::Sequence< OUString > getServiceNames() override
ScVbaVPageBreaks(const css::uno::Reference< ov::XHelperInterface > &xParent, const css::uno::Reference< css::uno::XComponentContext > &xContext, const css::uno::Reference< css::sheet::XSheetPageBreak > &xSheetPageBreak)
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() override
virtual css::uno::Type SAL_CALL getElementType() override
virtual OUString getServiceImplName() override
css::uno::Type const & get()
virtual OUString getServiceImplName() override
virtual ~ScVbaVPageBreaks() override
virtual css::uno::Any SAL_CALL Add(const css::uno::Any &Before) override
virtual css::uno::Any createCollectionObject(const css::uno::Any &) override
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() override
virtual css::uno::Any createCollectionObject(const css::uno::Any &) override