22 #include <com/sun/star/beans/PropertyAttribute.hpp>
23 #include <com/sun/star/beans/PropertyVetoException.hpp>
24 #include <com/sun/star/beans/UnknownPropertyException.hpp>
25 #include <com/sun/star/beans/XPropertySet.hpp>
26 #include <com/sun/star/lang/IllegalArgumentException.hpp>
27 #include <com/sun/star/lang/XServiceInfo.hpp>
28 #include <com/sun/star/style/VerticalAlignment.hpp>
29 #include <com/sun/star/text/ColumnSeparatorStyle.hpp>
30 #include <com/sun/star/text/XTextColumns.hpp>
31 #include <com/sun/star/uno/Any.h>
32 #include <com/sun/star/util/Color.hpp>
47 WID_TXTCOL_IS_AUTOMATIC,
48 WID_TXTCOL_AUTO_DISTANCE,
49 WID_TXTCOL_LINE_WIDTH,
50 WID_TXTCOL_LINE_COLOR,
51 WID_TXTCOL_LINE_REL_HGT,
52 WID_TXTCOL_LINE_ALIGN,
53 WID_TXTCOL_LINE_IS_ON,
54 WID_TXTCOL_LINE_STYLE,
59 css::beans::PropertyAttribute::READONLY, 0 },
62 {
u"SeparatorLineColor", WID_TXTCOL_LINE_COLOR,
66 {
u"SeparatorLineVerticalAlignment", WID_TXTCOL_LINE_ALIGN,
70 {
u"", 0, css::uno::Type(), 0, 0 },
73 class SvxXTextColumns final
74 :
public cppu::WeakImplHelper<css::beans::XPropertySet, css::text::XTextColumns,
75 css::lang::XServiceInfo>
78 SvxXTextColumns() =
default;
81 virtual sal_Int32 SAL_CALL getReferenceValue()
override;
82 virtual sal_Int16 SAL_CALL getColumnCount()
override;
83 virtual void SAL_CALL setColumnCount(sal_Int16 nColumns)
override;
84 virtual css::uno::Sequence<css::text::TextColumn> SAL_CALL getColumns()
override;
86 setColumns(
const css::uno::Sequence<css::text::TextColumn>&
Columns)
override;
89 virtual css::uno::Reference<css::beans::XPropertySetInfo>
90 SAL_CALL getPropertySetInfo()
override;
92 const css::uno::Any& aValue)
override;
93 virtual css::uno::Any SAL_CALL
getPropertyValue(
const OUString& PropertyName)
override;
94 virtual void SAL_CALL addPropertyChangeListener(
95 const OUString& aPropertyName,
96 const css::uno::Reference<css::beans::XPropertyChangeListener>& xListener)
override;
97 virtual void SAL_CALL removePropertyChangeListener(
98 const OUString& aPropertyName,
99 const css::uno::Reference<css::beans::XPropertyChangeListener>& aListener)
override;
100 virtual void SAL_CALL addVetoableChangeListener(
101 const OUString& PropertyName,
102 const css::uno::Reference<css::beans::XVetoableChangeListener>& aListener)
override;
103 virtual void SAL_CALL removeVetoableChangeListener(
104 const OUString& PropertyName,
105 const css::uno::Reference<css::beans::XVetoableChangeListener>& aListener)
override;
113 sal_Int32 m_nReference = USHRT_MAX;
114 css::uno::Sequence<css::text::TextColumn> m_aTextColumns;
115 bool m_bIsAutomaticWidth =
true;
116 sal_Int32 m_nAutoDistance = 0;
121 sal_Int32 m_nSepLineWidth = 0;
122 com::sun::star::util::Color m_nSepLineColor = 0;
123 sal_Int32 m_nSepLineHeightRelative = 100;
124 css::style::VerticalAlignment m_nSepLineVertAlign = css::style::VerticalAlignment_MIDDLE;
125 bool m_bSepLineIsOn =
false;
126 sal_Int16 m_nSepLineStyle = css::text::ColumnSeparatorStyle::NONE;
129 OUString SvxXTextColumns::getImplementationName() {
return "com.sun.star.comp.svx.TextColumns"; }
131 sal_Bool SvxXTextColumns::supportsService(
const OUString& rServiceName)
136 css::uno::Sequence<OUString> SvxXTextColumns::getSupportedServiceNames()
138 return {
"com.sun.star.text.TextColumns" };
141 sal_Int32 SvxXTextColumns::getReferenceValue()
147 sal_Int16 SvxXTextColumns::getColumnCount()
150 return o3tl::narrowing<sal_Int16>(m_aTextColumns.getLength());
153 void SvxXTextColumns::setColumnCount(sal_Int16 nColumns)
157 throw css::uno::RuntimeException();
158 m_bIsAutomaticWidth =
true;
159 m_aTextColumns.realloc(nColumns);
160 css::text::TextColumn* pCols = m_aTextColumns.getArray();
161 m_nReference = USHRT_MAX;
162 sal_Int32 nWidth = m_nReference / nColumns;
163 sal_Int32 nDiff = m_nReference - nWidth * nColumns;
164 sal_Int32 nDist = m_nAutoDistance / 2;
165 for (sal_Int16 i = 0;
i < nColumns;
i++)
167 pCols[
i].Width = nWidth;
168 pCols[
i].LeftMargin =
i == 0 ? 0 : nDist;
169 pCols[
i].RightMargin =
i == nColumns - 1 ? 0 : nDist;
171 pCols[nColumns - 1].Width += nDiff;
174 css::uno::Sequence<css::text::TextColumn> SvxXTextColumns::getColumns()
177 return m_aTextColumns;
180 void SvxXTextColumns::setColumns(
const css::uno::Sequence<css::text::TextColumn>& rColumns)
183 sal_Int32 nReferenceTemp = std::accumulate(
184 rColumns.begin(), rColumns.end(), sal_Int32(0),
185 [](
const sal_Int32 nSum,
const css::text::TextColumn& rCol) {
return nSum + rCol.Width; });
186 m_bIsAutomaticWidth =
false;
187 m_nReference = !nReferenceTemp ? USHRT_MAX : nReferenceTemp;
188 m_aTextColumns = rColumns;
191 css::uno::Reference<css::beans::XPropertySetInfo> SvxXTextColumns::getPropertySetInfo()
193 return m_aPropSet.getPropertySetInfo();
196 void SvxXTextColumns::setPropertyValue(
const OUString& rPropertyName,
const css::uno::Any& aValue)
200 throw css::beans::UnknownPropertyException(
"Unknown property: " + rPropertyName,
201 static_cast<cppu::OWeakObject*>(
this));
202 if (pEntry->
nFlags & css::beans::PropertyAttribute::READONLY)
203 throw css::beans::PropertyVetoException(
"Property is read-only: " + rPropertyName,
204 static_cast<cppu::OWeakObject*>(
this));
206 switch (pEntry->
nWID)
208 case WID_TXTCOL_LINE_WIDTH:
211 if (!(aValue >>= nTmp) || nTmp < 0)
212 throw css::lang::IllegalArgumentException();
216 case WID_TXTCOL_LINE_COLOR:
217 if (!(aValue >>= m_nSepLineColor))
218 throw css::lang::IllegalArgumentException();
220 case WID_TXTCOL_LINE_STYLE:
221 if (!(aValue >>= m_nSepLineStyle))
222 throw css::lang::IllegalArgumentException();
224 case WID_TXTCOL_LINE_REL_HGT:
227 if (!(aValue >>= nTmp) || nTmp < 0)
228 throw css::lang::IllegalArgumentException();
229 m_nSepLineHeightRelative = nTmp;
232 case WID_TXTCOL_LINE_ALIGN:
233 if (css::style::VerticalAlignment eAlign; aValue >>= eAlign)
234 m_nSepLineVertAlign = eAlign;
235 else if (
sal_Int8 nTmp; aValue >>= nTmp)
236 m_nSepLineVertAlign = static_cast<css::style::VerticalAlignment>(nTmp);
238 throw css::lang::IllegalArgumentException();
240 case WID_TXTCOL_LINE_IS_ON:
241 if (!(aValue >>= m_bSepLineIsOn))
242 throw css::lang::IllegalArgumentException();
244 case WID_TXTCOL_AUTO_DISTANCE:
247 if (!(aValue >>= nTmp) || nTmp < 0 || nTmp >= m_nReference)
248 throw css::lang::IllegalArgumentException();
249 m_nAutoDistance = nTmp;
250 sal_Int32 nColumns = m_aTextColumns.getLength();
251 css::text::TextColumn* pCols = m_aTextColumns.getArray();
252 sal_Int32 nDist = m_nAutoDistance / 2;
253 for (sal_Int32 i = 0;
i < nColumns;
i++)
255 pCols[
i].LeftMargin =
i == 0 ? 0 : nDist;
256 pCols[
i].RightMargin =
i == nColumns - 1 ? 0 : nDist;
263 css::uno::Any SvxXTextColumns::getPropertyValue(
const OUString& rPropertyName)
267 throw css::beans::UnknownPropertyException(
"Unknown property: " + rPropertyName,
268 static_cast<cppu::OWeakObject*>(
this));
271 switch (pEntry->
nWID)
273 case WID_TXTCOL_LINE_WIDTH:
276 case WID_TXTCOL_LINE_COLOR:
277 aRet <<= m_nSepLineColor;
279 case WID_TXTCOL_LINE_STYLE:
280 aRet <<= m_nSepLineStyle;
282 case WID_TXTCOL_LINE_REL_HGT:
283 aRet <<= m_nSepLineHeightRelative;
285 case WID_TXTCOL_LINE_ALIGN:
286 aRet <<= m_nSepLineVertAlign;
288 case WID_TXTCOL_LINE_IS_ON:
289 aRet <<= m_bSepLineIsOn;
291 case WID_TXTCOL_IS_AUTOMATIC:
292 aRet <<= m_bIsAutomaticWidth;
294 case WID_TXTCOL_AUTO_DISTANCE:
295 aRet <<= m_nAutoDistance;
301 void SvxXTextColumns::addPropertyChangeListener(
303 const css::uno::Reference<css::beans::XPropertyChangeListener>& )
307 void SvxXTextColumns::removePropertyChangeListener(
309 const css::uno::Reference<css::beans::XPropertyChangeListener>& )
313 void SvxXTextColumns::addVetoableChangeListener(
315 const css::uno::Reference<css::beans::XVetoableChangeListener>& )
319 void SvxXTextColumns::removeVetoableChangeListener(
321 const css::uno::Reference<css::beans::XVetoableChangeListener>& )
333 css::uno::Sequence<css::uno::Any>
const&)
335 return cppu::acquire(
new SvxXTextColumns);
constexpr auto toTwips(N number, Length from)
SVXCORE_DLLPUBLIC css::uno::XInterface * com_sun_star_comp_svx_TextColumns_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
css::uno::Reference< css::uno::XInterface > SvxXTextColumns_createInstance() noexcept
constexpr auto convertTwipToMm100(N n)
bool getPropertyValue(ValueType &rValue, css::uno::Reference< css::beans::XPropertySet > const &xPropSet, OUString const &propName)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
css::uno::Type const & get()
bool setPropertyValue(uno::Sequence< beans::PropertyValue > &aProp, const OUString &aName, const uno::Any &aValue)
#define SVXCORE_DLLPUBLIC