1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 #include "ParaPropertyPanel.hxx"
20 #include <sfx2/dispatch.hxx>
21 #include <sfx2/module.hxx>
22 #include <sfx2/viewfrm.hxx>
23 #include <sfx2/weldutils.hxx>
24 #include <editeng/lrspitem.hxx>
25 #include <editeng/ulspitem.hxx>
26 #include <svx/dlgctrl.hxx>
27 #include <svx/svxids.hrc>
28 #include <svl/intitem.hxx>
29 #include <sfx2/objsh.hxx>
30 #include <svtools/unitconv.hxx>
31 #include <sal/log.hxx>
32 
33 #include <com/sun/star/lang/IllegalArgumentException.hpp>
34 
35 using namespace css;
36 using namespace css::uno;
37 
38 namespace svx::sidebar {
39 #define DEFAULT_VALUE          0
40 
41 #define MAX_DURCH             5670
42 
43 #define MAX_SW                  1709400
44 #define MAX_SC_SD               116220200
45 #define NEGA_MAXVALUE          -10000000
46 
Create(weld::Widget * pParent,const css::uno::Reference<css::frame::XFrame> & rxFrame,SfxBindings * pBindings,const css::uno::Reference<css::ui::XSidebar> & rxSidebar)47 std::unique_ptr<PanelLayout> ParaPropertyPanel::Create (
48     weld::Widget* pParent,
49     const css::uno::Reference<css::frame::XFrame>& rxFrame,
50     SfxBindings* pBindings,
51     const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
52 {
53     if (pParent == nullptr)
54         throw lang::IllegalArgumentException("no parent Window given to ParaPropertyPanel::Create", nullptr, 0);
55     if ( ! rxFrame.is())
56         throw lang::IllegalArgumentException("no XFrame given to ParaPropertyPanel::Create", nullptr, 1);
57     if (pBindings == nullptr)
58         throw lang::IllegalArgumentException("no SfxBindings given to ParaPropertyPanel::Create", nullptr, 2);
59 
60     return std::make_unique<ParaPropertyPanel>(pParent, rxFrame, pBindings, rxSidebar);
61 }
62 
HandleContextChange(const vcl::EnumContext & rContext)63 void ParaPropertyPanel::HandleContextChange (
64     const vcl::EnumContext& rContext)
65 {
66     if (maContext == rContext)
67     {
68         // Nothing to do.
69         return;
70     }
71 
72     maContext = rContext;
73     switch (maContext.GetCombinedContext_DI())
74     {
75         case CombinedEnumContext(Application::Calc, Context::DrawText):
76         case CombinedEnumContext(Application::WriterVariants, Context::DrawText):
77             mxTBxVertAlign->show();
78             mxTBxBackColor->hide();
79             mxTBxNumBullet->hide();
80             ReSize();
81             break;
82 
83         case CombinedEnumContext(Application::DrawImpress, Context::Draw):
84         case CombinedEnumContext(Application::DrawImpress, Context::TextObject):
85         case CombinedEnumContext(Application::DrawImpress, Context::Graphic):
86         case CombinedEnumContext(Application::DrawImpress, Context::DrawText):
87         case CombinedEnumContext(Application::DrawImpress, Context::Table):
88             mxTBxVertAlign->show();
89             mxTBxBackColor->hide();
90             mxTBxNumBullet->hide();
91             ReSize();
92             break;
93 
94         case CombinedEnumContext(Application::WriterVariants, Context::Default):
95         case CombinedEnumContext(Application::WriterVariants, Context::Text):
96             mxTBxVertAlign->hide();
97             mxTBxBackColor->show();
98             mxTBxNumBullet->show();
99             ReSize();
100             break;
101 
102         case CombinedEnumContext(Application::WriterVariants, Context::Table):
103             mxTBxVertAlign->show();
104             mxTBxBackColor->show();
105             mxTBxNumBullet->show();
106             ReSize();
107             break;
108 
109         case CombinedEnumContext(Application::WriterVariants, Context::Annotation):
110             mxTBxVertAlign->hide();
111             mxTBxBackColor->hide();
112             mxTBxNumBullet->hide();
113             ReSize();
114             break;
115 
116         case CombinedEnumContext(Application::Calc, Context::EditCell):
117         case CombinedEnumContext(Application::Calc, Context::Cell):
118         case CombinedEnumContext(Application::Calc, Context::Pivot):
119         case CombinedEnumContext(Application::DrawImpress, Context::Text):
120         case CombinedEnumContext(Application::DrawImpress, Context::OutlineText):
121             break;
122 
123         default:
124             break;
125     }
126 }
127 
ReSize()128 void ParaPropertyPanel::ReSize()
129 {
130     if (mxSidebar.is())
131         mxSidebar->requestLayout();
132 }
133 
InitToolBoxIndent()134 void ParaPropertyPanel::InitToolBoxIndent()
135 {
136     Link<weld::MetricSpinButton&,void> aLink = LINK( this, ParaPropertyPanel, ModifyIndentHdl_Impl );
137     mxLeftIndent->connect_value_changed( aLink );
138     mxRightIndent->connect_value_changed( aLink );
139     mxFLineIndent->connect_value_changed( aLink );
140 
141     m_eLRSpaceUnit = maLRSpaceControl.GetCoreMetric();
142 }
143 
InitToolBoxSpacing()144 void ParaPropertyPanel::InitToolBoxSpacing()
145 {
146     Link<weld::MetricSpinButton&,void> aLink = LINK( this, ParaPropertyPanel, ULSpaceHdl_Impl );
147     mxTopDist->connect_value_changed(aLink);
148     mxBottomDist->connect_value_changed( aLink );
149 
150     m_eULSpaceUnit = maULSpaceControl.GetCoreMetric();
151 }
152 
initial()153 void ParaPropertyPanel::initial()
154 {
155     limitMetricWidths();
156 
157     //toolbox
158     InitToolBoxIndent();
159     InitToolBoxSpacing();
160 }
161 
162 // for Paragraph Indent
IMPL_LINK_NOARG(ParaPropertyPanel,ModifyIndentHdl_Impl,weld::MetricSpinButton &,void)163 IMPL_LINK_NOARG( ParaPropertyPanel, ModifyIndentHdl_Impl, weld::MetricSpinButton&, void)
164 {
165     SvxLRSpaceItem aMargin( SID_ATTR_PARA_LRSPACE );
166     aMargin.SetTextLeft(mxLeftIndent->GetCoreValue(m_eLRSpaceUnit));
167     aMargin.SetRight(mxRightIndent->GetCoreValue(m_eLRSpaceUnit));
168     aMargin.SetTextFirstLineOffset(static_cast<short>(mxFLineIndent->GetCoreValue(m_eLRSpaceUnit)));
169 
170     GetBindings()->GetDispatcher()->ExecuteList(
171         SID_ATTR_PARA_LRSPACE, SfxCallMode::RECORD, { &aMargin });
172 }
173 
174 
175 // for Paragraph Spacing
IMPL_LINK_NOARG(ParaPropertyPanel,ULSpaceHdl_Impl,weld::MetricSpinButton &,void)176 IMPL_LINK_NOARG( ParaPropertyPanel, ULSpaceHdl_Impl, weld::MetricSpinButton&, void)
177 {
178     SvxULSpaceItem aMargin( SID_ATTR_PARA_ULSPACE );
179     aMargin.SetUpper( static_cast<sal_uInt16>(mxTopDist->GetCoreValue(m_eULSpaceUnit)));
180     aMargin.SetLower( static_cast<sal_uInt16>(mxBottomDist->GetCoreValue(m_eULSpaceUnit)));
181 
182     GetBindings()->GetDispatcher()->ExecuteList(
183         SID_ATTR_PARA_ULSPACE, SfxCallMode::RECORD, { &aMargin });
184 }
185 
186 // for Paragraph State change
NotifyItemUpdate(sal_uInt16 nSID,SfxItemState eState,const SfxPoolItem * pState)187 void ParaPropertyPanel::NotifyItemUpdate(
188     sal_uInt16 nSID,
189     SfxItemState eState,
190     const SfxPoolItem* pState)
191 {
192     switch (nSID)
193     {
194     case SID_ATTR_METRIC:
195         {
196             m_eMetricUnit = GetCurrentUnit(eState,pState);
197             if( m_eMetricUnit!=m_last_eMetricUnit )
198             {
199                 mxLeftIndent->SetFieldUnit(m_eMetricUnit);
200                 mxRightIndent->SetFieldUnit(m_eMetricUnit);
201                 mxFLineIndent->SetFieldUnit(m_eMetricUnit);
202                 mxTopDist->SetFieldUnit(m_eMetricUnit);
203                 mxBottomDist->SetFieldUnit(m_eMetricUnit);
204 
205                 limitMetricWidths();
206             }
207             m_last_eMetricUnit = m_eMetricUnit;
208         }
209         break;
210 
211     case SID_ATTR_PARA_LRSPACE:
212         StateChangedIndentImpl( eState, pState );
213         break;
214 
215     case SID_ATTR_PARA_ULSPACE:
216         StateChangedULImpl( eState, pState );
217         break;
218     }
219 }
220 
StateChangedIndentImpl(SfxItemState eState,const SfxPoolItem * pState)221 void ParaPropertyPanel::StateChangedIndentImpl( SfxItemState eState, const SfxPoolItem* pState )
222 {
223     switch (maContext.GetCombinedContext_DI())
224     {
225 
226     case CombinedEnumContext(Application::WriterVariants, Context::DrawText):
227     case CombinedEnumContext(Application::WriterVariants, Context::Annotation):
228     case CombinedEnumContext(Application::Calc, Context::DrawText):
229     case CombinedEnumContext(Application::DrawImpress, Context::DrawText):
230     case CombinedEnumContext(Application::DrawImpress, Context::Draw):
231     case CombinedEnumContext(Application::DrawImpress, Context::TextObject):
232     case CombinedEnumContext(Application::DrawImpress, Context::Graphic):
233     case CombinedEnumContext(Application::DrawImpress, Context::Table):
234         {
235             mxLeftIndent->set_min( DEFAULT_VALUE, FieldUnit::NONE );
236             mxRightIndent->set_min( DEFAULT_VALUE, FieldUnit::NONE );
237             mxFLineIndent->set_min( DEFAULT_VALUE, FieldUnit::NONE );
238         }
239         break;
240     case CombinedEnumContext(Application::WriterVariants, Context::Default):
241     case CombinedEnumContext(Application::WriterVariants, Context::Text):
242     case CombinedEnumContext(Application::WriterVariants, Context::Table):
243         {
244             mxLeftIndent->set_min( NEGA_MAXVALUE, FieldUnit::MM_100TH );
245             mxRightIndent->set_min( NEGA_MAXVALUE, FieldUnit::MM_100TH );
246             mxFLineIndent->set_min( NEGA_MAXVALUE, FieldUnit::MM_100TH );
247         }
248         break;
249     }
250 
251     bool bDisabled = eState == SfxItemState::DISABLED;
252     mxLeftIndent->set_sensitive(!bDisabled);
253     mxRightIndent->set_sensitive(!bDisabled);
254     mxFLineIndent->set_sensitive(!bDisabled);
255 
256     if (pState && eState >= SfxItemState::DEFAULT)
257     {
258         const SvxLRSpaceItem* pSpace = static_cast<const SvxLRSpaceItem*>(pState);
259         maTxtLeft = pSpace->GetTextLeft();
260         maTxtLeft = OutputDevice::LogicToLogic( maTxtLeft, m_eLRSpaceUnit, MapUnit::Map100thMM );
261         maTxtLeft = OutputDevice::LogicToLogic( maTxtLeft, MapUnit::Map100thMM, MapUnit::MapTwip );
262 
263         tools::Long aTxtRight = pSpace->GetRight();
264         aTxtRight = OutputDevice::LogicToLogic( aTxtRight, m_eLRSpaceUnit, MapUnit::Map100thMM );
265         aTxtRight = OutputDevice::LogicToLogic( aTxtRight, MapUnit::Map100thMM, MapUnit::MapTwip );
266 
267         tools::Long aTxtFirstLineOfst = pSpace->GetTextFirstLineOffset();
268         aTxtFirstLineOfst = OutputDevice::LogicToLogic( aTxtFirstLineOfst, m_eLRSpaceUnit, MapUnit::Map100thMM );
269         aTxtFirstLineOfst = OutputDevice::LogicToLogic( aTxtFirstLineOfst, MapUnit::Map100thMM, MapUnit::MapTwip );
270 
271         tools::Long nVal = OutputDevice::LogicToLogic( maTxtLeft, MapUnit::MapTwip, MapUnit::Map100thMM );
272         nVal = static_cast<tools::Long>(mxLeftIndent->normalize( nVal ));
273 
274         if ( maContext.GetCombinedContext_DI() != CombinedEnumContext(Application::WriterVariants, Context::Text)
275              && maContext.GetCombinedContext_DI() != CombinedEnumContext(Application::WriterVariants, Context::Default)
276              && maContext.GetCombinedContext_DI() != CombinedEnumContext(Application::WriterVariants, Context::Table))
277         {
278             mxFLineIndent->set_min( nVal*-1, FieldUnit::MM_100TH );
279         }
280 
281         tools::Long nrVal = OutputDevice::LogicToLogic( aTxtRight, MapUnit::MapTwip, MapUnit::Map100thMM );
282         nrVal = static_cast<tools::Long>(mxRightIndent->normalize( nrVal ));
283 
284         switch (maContext.GetCombinedContext_DI())
285         {
286         case CombinedEnumContext(Application::WriterVariants, Context::DrawText):
287         case CombinedEnumContext(Application::WriterVariants, Context::Text):
288         case CombinedEnumContext(Application::WriterVariants, Context::Default):
289         case CombinedEnumContext(Application::WriterVariants, Context::Table):
290         case CombinedEnumContext(Application::WriterVariants, Context::Annotation):
291             {
292                 mxLeftIndent->set_max( MAX_SW - nrVal, FieldUnit::MM_100TH );
293                 mxRightIndent->set_max( MAX_SW - nVal, FieldUnit::MM_100TH );
294                 mxFLineIndent->set_max( MAX_SW - nVal - nrVal, FieldUnit::MM_100TH );
295             }
296             break;
297         case CombinedEnumContext(Application::DrawImpress, Context::DrawText):
298         case CombinedEnumContext(Application::DrawImpress, Context::Draw):
299         case CombinedEnumContext(Application::DrawImpress, Context::Table):
300         case CombinedEnumContext(Application::DrawImpress, Context::TextObject):
301         case CombinedEnumContext(Application::DrawImpress, Context::Graphic):
302             {
303                 mxLeftIndent->set_max( MAX_SC_SD - nrVal, FieldUnit::MM_100TH );
304                 mxRightIndent->set_max( MAX_SC_SD - nVal, FieldUnit::MM_100TH );
305                 mxFLineIndent->set_max( MAX_SC_SD - nVal - nrVal, FieldUnit::MM_100TH );
306             }
307         }
308 
309         mxLeftIndent->set_value( nVal, FieldUnit::MM_100TH );
310         mxRightIndent->set_value( nrVal, FieldUnit::MM_100TH );
311 
312         tools::Long nfVal = OutputDevice::LogicToLogic( aTxtFirstLineOfst, MapUnit::MapTwip, MapUnit::Map100thMM );
313         nfVal = static_cast<tools::Long>(mxFLineIndent->normalize( nfVal ));
314         mxFLineIndent->set_value( nfVal, FieldUnit::MM_100TH );
315     }
316     else if (eState != SfxItemState::DISABLED )
317     {
318         mxLeftIndent->set_text("");
319         mxRightIndent->set_text("");
320         mxFLineIndent->set_text("");
321     }
322 
323     limitMetricWidths();
324 }
325 
StateChangedULImpl(SfxItemState eState,const SfxPoolItem * pState)326 void ParaPropertyPanel::StateChangedULImpl( SfxItemState eState, const SfxPoolItem* pState )
327 {
328     mxTopDist->set_max( mxTopDist->normalize( MAX_DURCH ), MapToFieldUnit(m_eULSpaceUnit) );
329     mxBottomDist->set_max( mxBottomDist->normalize( MAX_DURCH ), MapToFieldUnit(m_eULSpaceUnit) );
330 
331     bool bDisabled = eState == SfxItemState::DISABLED;
332     mxTopDist->set_sensitive(!bDisabled);
333     mxBottomDist->set_sensitive(!bDisabled);
334 
335     if( pState && eState >= SfxItemState::DEFAULT )
336     {
337         const SvxULSpaceItem* pOldItem = static_cast<const SvxULSpaceItem*>(pState);
338 
339         maUpper = pOldItem->GetUpper();
340         maUpper = OutputDevice::LogicToLogic( maUpper, m_eULSpaceUnit, MapUnit::Map100thMM );
341         maUpper = OutputDevice::LogicToLogic( maUpper, MapUnit::Map100thMM, MapUnit::MapTwip );
342 
343         maLower = pOldItem->GetLower();
344         maLower = OutputDevice::LogicToLogic( maLower, m_eULSpaceUnit, MapUnit::Map100thMM );
345         maLower = OutputDevice::LogicToLogic( maLower, MapUnit::Map100thMM, MapUnit::MapTwip );
346 
347         sal_Int64 nVal = OutputDevice::LogicToLogic( maUpper, MapUnit::MapTwip, MapUnit::Map100thMM );
348         nVal = mxTopDist->normalize( nVal );
349         mxTopDist->set_value( nVal, FieldUnit::MM_100TH );
350 
351         nVal = OutputDevice::LogicToLogic( maLower, MapUnit::MapTwip, MapUnit::Map100thMM );
352         nVal = mxBottomDist->normalize( nVal );
353         mxBottomDist->set_value( nVal, FieldUnit::MM_100TH );
354     }
355     else if (eState != SfxItemState::DISABLED )
356     {
357         mxTopDist->set_text("");
358         mxBottomDist->set_text("");
359     }
360     limitMetricWidths();
361 }
362 
GetCurrentUnit(SfxItemState eState,const SfxPoolItem * pState)363 FieldUnit ParaPropertyPanel::GetCurrentUnit( SfxItemState eState, const SfxPoolItem* pState )
364 {
365     FieldUnit eUnit = FieldUnit::NONE;
366 
367     if ( pState && eState >= SfxItemState::DEFAULT )
368         eUnit = static_cast<FieldUnit>(static_cast<const SfxUInt16Item*>(pState)->GetValue());
369     else
370     {
371         SfxViewFrame* pFrame = SfxViewFrame::Current();
372         SfxObjectShell* pSh = nullptr;
373         if ( pFrame )
374             pSh = pFrame->GetObjectShell();
375         if ( pSh )  //the object shell is not always available during reload
376         {
377             SfxModule* pModule = pSh->GetModule();
378             if ( pModule )
379             {
380                 const SfxPoolItem* pItem = pModule->GetItem( SID_ATTR_METRIC );
381                 if ( pItem )
382                     eUnit = static_cast<FieldUnit>(static_cast<const SfxUInt16Item*>(pItem)->GetValue());
383             }
384             else
385             {
386                 SAL_WARN("svx.sidebar", "GetModuleFieldUnit(): no module found");
387             }
388         }
389     }
390 
391     return eUnit;
392 }
393 
ParaPropertyPanel(weld::Widget * pParent,const css::uno::Reference<css::frame::XFrame> & rxFrame,SfxBindings * pBindings,const css::uno::Reference<css::ui::XSidebar> & rxSidebar)394 ParaPropertyPanel::ParaPropertyPanel(weld::Widget* pParent,
395     const css::uno::Reference<css::frame::XFrame>& rxFrame,
396     SfxBindings* pBindings,
397     const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
398     : PanelLayout(pParent, "ParaPropertyPanel", "svx/ui/sidebarparagraph.ui"),
399       //Alignment
400       mxTBxHorzAlign(m_xBuilder->weld_toolbar("horizontalalignment")),
401       mxHorzAlignDispatch(new ToolbarUnoDispatcher(*mxTBxHorzAlign, *m_xBuilder, rxFrame)),
402       mxTBxVertAlign(m_xBuilder->weld_toolbar("verticalalignment")),
403       mxVertAlignDispatch(new ToolbarUnoDispatcher(*mxTBxVertAlign, *m_xBuilder, rxFrame)),
404       //NumBullet&Backcolor
405       mxTBxNumBullet(m_xBuilder->weld_toolbar("numberbullet")),
406       mxNumBulletDispatch(new ToolbarUnoDispatcher(*mxTBxNumBullet, *m_xBuilder, rxFrame)),
407       mxTBxBackColor(m_xBuilder->weld_toolbar("backgroundcolor")),
408       mxBackColorDispatch(new ToolbarUnoDispatcher(*mxTBxBackColor, *m_xBuilder, rxFrame)),
409       mxTBxWriteDirection(m_xBuilder->weld_toolbar("writedirection")),
410       mxWriteDirectionDispatch(new ToolbarUnoDispatcher(*mxTBxWriteDirection, *m_xBuilder, rxFrame)),
411       mxTBxParaSpacing(m_xBuilder->weld_toolbar("paraspacing")),
412       mxParaSpacingDispatch(new ToolbarUnoDispatcher(*mxTBxParaSpacing, *m_xBuilder, rxFrame)),
413       mxTBxLineSpacing(m_xBuilder->weld_toolbar("linespacing")),
414       mxLineSpacingDispatch(new ToolbarUnoDispatcher(*mxTBxLineSpacing, *m_xBuilder, rxFrame)),
415       mxTBxIndent(m_xBuilder->weld_toolbar("indent")),
416       mxIndentDispatch(new ToolbarUnoDispatcher(*mxTBxIndent, *m_xBuilder, rxFrame)),
417       //Paragraph spacing
418       mxTopDist(new SvxRelativeField(m_xBuilder->weld_metric_spin_button("aboveparaspacing", FieldUnit::CM))),
419       mxBottomDist(new SvxRelativeField(m_xBuilder->weld_metric_spin_button("belowparaspacing", FieldUnit::CM))),
420       mxLeftIndent(new SvxRelativeField(m_xBuilder->weld_metric_spin_button("beforetextindent", FieldUnit::CM))),
421       mxRightIndent(new SvxRelativeField(m_xBuilder->weld_metric_spin_button("aftertextindent", FieldUnit::CM))),
422       mxFLineIndent(new SvxRelativeField(m_xBuilder->weld_metric_spin_button("firstlineindent", FieldUnit::CM))),
423       maTxtLeft (0),
424       maUpper (0),
425       maLower (0),
426       m_eMetricUnit(FieldUnit::NONE),
427       m_last_eMetricUnit(FieldUnit::NONE),
428       m_eLRSpaceUnit(),
429       m_eULSpaceUnit(),
430       maLRSpaceControl (SID_ATTR_PARA_LRSPACE,*pBindings,*this),
431       maULSpaceControl (SID_ATTR_PARA_ULSPACE, *pBindings,*this),
432       m_aMetricCtl (SID_ATTR_METRIC, *pBindings,*this),
433       maContext(),
434       mpBindings(pBindings),
435       mxSidebar(rxSidebar)
436 {
437     // tdf#130197 We want to give this toolbar a width as if it had 5 entries
438     // (the parent grid has homogeneous width set so both columns will have the
439     // same width).  This ParaPropertyPanel is a default panel in writer, so
440     // subsequent panels, e.g. the TableEditPanel panel can have up to 5
441     // entries in each of its column and remain in alignment with this panel
442     padWidthForSidebar(*mxTBxIndent, rxFrame);
443 
444     initial();
445     m_aMetricCtl.RequestUpdate();
446 }
447 
limitMetricWidths()448 void ParaPropertyPanel::limitMetricWidths()
449 {
450     limitWidthForSidebar(*mxTopDist);
451     limitWidthForSidebar(*mxBottomDist);
452     limitWidthForSidebar(*mxLeftIndent);
453     limitWidthForSidebar(*mxRightIndent);
454     limitWidthForSidebar(*mxFLineIndent);
455 }
456 
~ParaPropertyPanel()457 ParaPropertyPanel::~ParaPropertyPanel()
458 {
459     mxHorzAlignDispatch.reset();
460     mxTBxHorzAlign.reset();
461 
462     mxVertAlignDispatch.reset();
463     mxTBxVertAlign.reset();
464 
465     mxNumBulletDispatch.reset();
466     mxTBxNumBullet.reset();
467 
468     mxBackColorDispatch.reset();
469     mxTBxBackColor.reset();
470 
471     mxWriteDirectionDispatch.reset();
472     mxTBxWriteDirection.reset();
473 
474     mxParaSpacingDispatch.reset();
475     mxTBxParaSpacing.reset();
476 
477     mxLineSpacingDispatch.reset();
478     mxTBxLineSpacing.reset();
479 
480     mxIndentDispatch.reset();
481     mxTBxIndent.reset();
482 
483     mxTopDist.reset();
484     mxBottomDist.reset();
485     mxLeftIndent.reset();
486     mxRightIndent.reset();
487     mxFLineIndent.reset();
488 
489     maLRSpaceControl.dispose();
490     maULSpaceControl.dispose();
491     m_aMetricCtl.dispose();
492 }
493 
494 } // end of namespace svx::sidebar
495 
496 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
497