xref: /trunk/main/svx/source/sidebar/paragraph/ParaPropertyPanel.cxx (revision 37bc8009dcb952eb69b19204cbb7defb9df94773)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 #include "precompiled_svx.hxx"
23 #include <svx/sidebar/ColorControl.hxx>
24 
25 #include "ParaPropertyPanel.hxx"
26 #include "ParaPropertyPanel.hrc"
27 
28 #include "ParaLineSpacingPopup.hxx"
29 #include "ParaLineSpacingControl.hxx"
30 #include "ParaBulletsPopup.hxx"
31 #include "ParaBulletsControl.hxx"
32 #include "ParaNumberingPopup.hxx"
33 #include "ParaNumberingControl.hxx"
34 #include <sfx2/sidebar/Theme.hxx>
35 #include <sfx2/sidebar/ResourceDefinitions.hrc>
36 #include <sfx2/sidebar/ControlFactory.hxx>
37 #include <sfx2/sidebar/Tools.hxx>
38 #include <svx/sidebar/PopupContainer.hxx>
39 #include <sfx2/dispatch.hxx>
40 #include <editeng/colritem.hxx>
41 #include <editeng/brshitem.hxx>
42 #include <editeng/lrspitem.hxx>
43 #include <editeng/ulspitem.hxx>
44 #include <vcl/toolbox.hxx>
45 #include <vcl/fixed.hxx>
46 #include <vcl/svapp.hxx>
47 #include <svx/svxids.hrc>
48 #include <svl/intitem.hxx>
49 #include "svx/dialmgr.hxx"
50 #include <sfx2/objsh.hxx>
51 #include <svtools/unitconv.hxx>
52 #include <boost/bind.hpp>
53 using namespace css;
54 using namespace cssu;
55 using ::sfx2::sidebar::Theme;
56 using ::sfx2::sidebar::ControlFactory;
57 
58 namespace svx {namespace sidebar {
59 #define DEFAULT_VALUE          0
60 #define TOOLBOX_ITEM1          1
61 #define TOOLBOX_ITEM2          2
62 #define TOOLBOX_ITEM3          3
63 #define TOOLBOX_ITEM4          4
64 
65 #define MAX_DURCH             5670
66 
67 #define INDENT_INCREMENT       1
68 #define INDENT_DECREMENT       2
69 #define INDENT_STEP            706
70 #define UL_STEP                58
71 
72 #define NEGATIVE_MAX_VALUE              -9999
73 #define BEGIN_VALUE            28
74 #define MAX_SW                  1709400
75 #define MAX_SC_SD               116220200
76 #define NEGA_MAXVALUE          -10000000
77 
78 #define POS_FT_PARA_SPACE                               Point(LogicToPixel(Point(FT_PARA_SPACE_X,FT_PARA_SPACE_Y), MAP_APPFONT))
79 #define POS_FT_PARA_SPACE2                              Point(LogicToPixel(Point(FT_PARA_SPACE_X,FT_PARA_SPACE_Y2), MAP_APPFONT))
80 #define POS_TBX_PARA_SPACE_INC_DEC                      Point(LogicToPixel(Point(TBX_PARA_SPACE_INC_DEC_X,TBX_PARA_SPACE_INC_DEC_Y), MAP_APPFONT))
81 #define POS_TBX_PARA_SPACE_INC_DEC2                     Point(LogicToPixel(Point(TBX_PARA_SPACE_INC_DEC_X,TBX_PARA_SPACE_INC_DEC_Y2), MAP_APPFONT))
82 #define POS_FT_PARA_INDENT                              Point(LogicToPixel(Point(FT_PARA_INDENT_X,FT_PARA_INDENT_Y), MAP_APPFONT))
83 #define POS_FT_PARA_INDENT2                             Point(LogicToPixel(Point(FT_PARA_INDENT_X,FT_PARA_INDENT_Y2), MAP_APPFONT))
84 #define POS_TBX_PARA_INDENT_INC_DEC                     Point(LogicToPixel(Point(TBX_PARA_INDENT_INC_DEC_X,TBX_PARA_INDENT_INC_DEC_Y), MAP_APPFONT))
85 #define POS_TBX_PARA_INDENT_INC_DEC2                    Point(LogicToPixel(Point(TBX_PARA_INDENT_INC_DEC_X,TBX_PARA_INDENT_INC_DEC_Y2), MAP_APPFONT))
86 #define POS_MBX_TOP_DIST                                Point(LogicToPixel(Point(MBX_TOP_DIST_X,MBX_TOP_DIST_Y), MAP_APPFONT))
87 #define POS_MBX_TOP_DIST2                               Point(LogicToPixel(Point(MBX_TOP_DIST_X,MBX_TOP_DIST_Y2), MAP_APPFONT))
88 #define POS_MBX_BOT_DIST                                Point(LogicToPixel(Point(MBX_BOT_DIST_X,MBX_BOT_DIST_Y), MAP_APPFONT))
89 #define POS_MBX_BOT_DIST2                               Point(LogicToPixel(Point(MBX_BOT_DIST_X,MBX_BOT_DIST_Y2), MAP_APPFONT))
90 #define POS_MBX_LEFT_DIST                               Point(LogicToPixel(Point(MBX_LEFT_DIST_X,MBX_LEFT_DIST_Y), MAP_APPFONT))
91 #define POS_MBX_LEFT_DIST2                              Point(LogicToPixel(Point(MBX_LEFT_DIST_X,MBX_LEFT_DIST_Y2), MAP_APPFONT))
92 #define POS_MBX_RIGHT_DIST                              Point(LogicToPixel(Point(MBX_RIGHT_DIST_X,MBX_RIGHT_DIST_Y), MAP_APPFONT))
93 #define POS_MBX_RIGHT_DIST2                             Point(LogicToPixel(Point(MBX_RIGHT_DIST_X,MBX_RIGHT_DIST_Y2), MAP_APPFONT))
94 #define POS_MBX_FLINE_DIST                              Point(LogicToPixel(Point(MBX_FLINE_DIST_X,MBX_FLINE_DIST_Y), MAP_APPFONT))
95 #define POS_MBX_FLINE_DIST2                             Point(LogicToPixel(Point(MBX_FLINE_DIST_X,MBX_FLINE_DIST_Y2), MAP_APPFONT))
96 #define POS_IMG_SPACE1                                  Point(LogicToPixel(Point(IMG_SPACE_X,IMG_SPACE1_Y), MAP_APPFONT))
97 #define POS_IMG_SPACE12                                 Point(LogicToPixel(Point(IMG_SPACE_X,IMG_SPACE1_Y2), MAP_APPFONT))
98 #define POS_IMG_SPACE2                                  Point(LogicToPixel(Point(IMG_SPACE_X,IMG_SPACE2_Y), MAP_APPFONT))
99 #define POS_IMG_SPACE22                                 Point(LogicToPixel(Point(IMG_SPACE_X,IMG_SPACE2_Y2), MAP_APPFONT))
100 #define POS_IMG_INDENT1                                 Point(LogicToPixel(Point(IMG_INDENT_X,IMG_INDENT1_Y), MAP_APPFONT))
101 #define POS_IMG_INDENT12                                Point(LogicToPixel(Point(IMG_INDENT_X,IMG_INDENT1_Y2), MAP_APPFONT))
102 #define POS_IMG_INDENT2                                 Point(LogicToPixel(Point(IMG_INDENT_X,IMG_INDENT2_Y), MAP_APPFONT))
103 #define POS_IMG_INDENT22                                Point(LogicToPixel(Point(IMG_INDENT_X,IMG_INDENT2_Y2), MAP_APPFONT))
104 #define POS_IMG_INDENT3                                 Point(LogicToPixel(Point(IMG_INDENT_X,IMG_INDENT3_Y), MAP_APPFONT))
105 #define POS_IMG_INDENT32                                Point(LogicToPixel(Point(IMG_INDENT_X,IMG_INDENT3_Y2), MAP_APPFONT))
106 #define TBX_LINE_SPACE                                  Point(LogicToPixel(Point(TBX_LINE_SPACE_X,TBX_LINE_SPACE_Y), MAP_APPFONT))
107 #define TBX_LINE_SPACE2                                 Point(LogicToPixel(Point(TBX_LINE_SPACE_X,TBX_LINE_SPACE_Y2), MAP_APPFONT))
108 
109 #define LINE_POINT1_WHITE                               Point(LogicToPixel(Point(LINE_X_WHITE,LINE_TOP_Y), MAP_APPFONT))
110 #define LINE_POINT2_WHITE                               Point(LogicToPixel(Point(LINE_X_WHITE,LINE_BOT_Y), MAP_APPFONT))
111 #define LINE_POINT3_WHITE                               Point(LogicToPixel(Point(LINE_X_WHITE,LINE_TOP_Y2), MAP_APPFONT))
112 #define LINE_POINT4_WHITE                               Point(LogicToPixel(Point(LINE_X_WHITE,LINE_BOT_Y2), MAP_APPFONT))
113 
114 ParaPropertyPanel* ParaPropertyPanel::Create (
115     Window* pParent,
116     const cssu::Reference<css::frame::XFrame>& rxFrame,
117     SfxBindings* pBindings,
118     const cssu::Reference<css::ui::XSidebar>& rxSidebar)
119 {
120     if (pParent == NULL)
121         throw lang::IllegalArgumentException(A2S("no parent Window given to ParaPropertyPanel::Create"), NULL, 0);
122     if ( ! rxFrame.is())
123         throw lang::IllegalArgumentException(A2S("no XFrame given to ParaPropertyPanel::Create"), NULL, 1);
124     if (pBindings == NULL)
125         throw lang::IllegalArgumentException(A2S("no SfxBindings given to ParaPropertyPanel::Create"), NULL, 2);
126 
127     return new ParaPropertyPanel(
128         pParent,
129         rxFrame,
130         pBindings,
131         rxSidebar);
132 }
133 
134 void ParaPropertyPanel::HandleContextChange (
135     const ::sfx2::sidebar::EnumContext aContext)
136 {
137     if (maContext == aContext)
138     {
139         // Nothing to do.
140         return;
141     }
142 
143     maContext = aContext;
144     switch (maContext.GetCombinedContext_DI())
145     {
146         case CombinedEnumContext(Application_Calc, Context_DrawText):
147             mpTBxVertAlign->Show();
148             mpTBxVertAlignBackground->Show();
149             mpTBxBackColor->Hide();
150             mpTBxBackColorBackground->Hide();
151             mpTBxNumBullet->Hide();
152             mpTBxNumBulletBackground->Hide();
153             ReSize(false);
154             mpTbxIndent_IncDec->Show();
155             mpTbxIndent_IncDecBackground->Show();
156             mpTbxProDemote->Hide();
157             mpTbxProDemoteBackground->Hide();
158             break;
159 
160         case CombinedEnumContext(Application_DrawImpress, Context_Draw):
161         case CombinedEnumContext(Application_DrawImpress, Context_TextObject):
162         case CombinedEnumContext(Application_DrawImpress, Context_Graphic):
163             mpTBxVertAlign->Hide();
164             mpTBxVertAlignBackground->Hide();
165             mpTBxBackColor->Hide();
166             mpTBxBackColorBackground->Hide();
167             mpTBxNumBullet->Show();
168             mpTBxNumBulletBackground->Show();
169             ReSize(true);
170             mpTbxIndent_IncDec->Hide();
171             mpTbxIndent_IncDecBackground->Hide();
172             mpTbxProDemote->Show();
173             mpTbxProDemoteBackground->Show();
174             break;
175 
176         case CombinedEnumContext(Application_DrawImpress, Context_DrawText):
177             mpTBxVertAlign->Show();
178             mpTBxVertAlignBackground->Show();
179             mpTBxBackColor->Hide();
180             mpTBxBackColorBackground->Hide();
181             mpTBxNumBullet->Show();
182             mpTBxNumBulletBackground->Show();
183             ReSize(true);
184             mpTbxIndent_IncDec->Hide();
185             mpTbxIndent_IncDecBackground->Hide();
186             mpTbxProDemote->Show();
187             mpTbxProDemoteBackground->Show();
188             break;
189 
190         case CombinedEnumContext(Application_DrawImpress, Context_Table):
191             mpTBxVertAlign->Show();
192             mpTBxVertAlignBackground->Show();
193             mpTBxBackColor->Hide();
194             mpTBxBackColorBackground->Hide();
195             mpTBxNumBullet->Show();
196             mpTBxNumBulletBackground->Show();
197             ReSize(true);
198             mpTbxIndent_IncDec->Hide();
199             mpTbxIndent_IncDecBackground->Hide();
200             mpTbxProDemote->Show();
201             mpTbxProDemoteBackground->Show();
202             break;
203 
204         case CombinedEnumContext(Application_WriterVariants, Context_Default):
205         case CombinedEnumContext(Application_WriterVariants, Context_Text):
206             mpTBxVertAlign->Hide();
207             mpTBxVertAlignBackground->Hide();
208             mpTBxBackColor->Show();
209             mpTBxBackColorBackground->Show();
210             mpTBxNumBullet->Show();
211 
212             mpTBxNumBulletBackground->Show();
213             ReSize(true);
214             mpTbxIndent_IncDec->Show();
215             mpTbxIndent_IncDecBackground->Show();
216             mpTbxProDemote->Hide();
217             mpTbxProDemoteBackground->Hide();
218             break;
219 
220         case CombinedEnumContext(Application_WriterVariants, Context_Table):
221             mpTBxVertAlign->Show();
222             mpTBxVertAlignBackground->Show();
223             mpTBxBackColor->Show();
224             mpTBxBackColorBackground->Show();
225             mpTBxNumBullet->Show();
226             mpTBxNumBulletBackground->Show();
227             ReSize(true);
228             mpTbxIndent_IncDec->Show();
229             mpTbxIndent_IncDecBackground->Show();
230             mpTbxProDemote->Hide();
231             mpTbxProDemoteBackground->Hide();
232             break;
233 
234         case CombinedEnumContext(Application_WriterVariants, Context_DrawText):
235             mpTBxVertAlign->Show();
236             mpTBxVertAlignBackground->Show();
237             mpTBxBackColor->Hide();
238             mpTBxBackColorBackground->Hide();
239             mpTBxNumBullet->Hide();
240             mpTBxNumBulletBackground->Hide();
241             ReSize(false);
242             mpTbxIndent_IncDec->Show();
243             mpTbxIndent_IncDecBackground->Show();
244             mpTbxProDemote->Hide();
245             mpTbxProDemoteBackground->Hide();
246             break;
247 
248         case CombinedEnumContext(Application_WriterVariants, Context_Annotation):
249             mpTBxVertAlign->Hide();
250             mpTBxVertAlignBackground->Hide();
251             mpTBxBackColor->Hide();
252             mpTBxBackColorBackground->Hide();
253             mpTBxNumBullet->Hide();
254             mpTBxNumBulletBackground->Hide();
255             ReSize(false);
256             mpTbxIndent_IncDec->Show();
257             mpTbxIndent_IncDecBackground->Show();
258             mpTbxProDemote->Hide();
259             mpTbxProDemoteBackground->Hide();
260             break;
261 
262         case CombinedEnumContext(Application_Calc, Context_EditCell):
263         case CombinedEnumContext(Application_Calc, Context_Cell):
264         case CombinedEnumContext(Application_Calc, Context_Pivot):
265         case CombinedEnumContext(Application_DrawImpress, Context_Text):
266         case CombinedEnumContext(Application_DrawImpress, Context_OutlineText):
267         /*{
268             mpToolBoxScriptSw->Hide();
269             mpToolBoxScript->Show();
270             mpToolBoxSpacing->Show();
271             mpToolBoxHighlight->Hide();
272 
273             Size aSize(PROPERTYPAGE_WIDTH,TEXT_SECTIONPAGE_HEIGHT);
274             aSize = LogicToPixel( aSize,MapMode(MAP_APPFONT) );
275             aSize.setWidth(GetOutputSizePixel().Width());
276             SetSizePixel(aSize);
277         }*/
278             break;
279 
280         default:
281             break;
282     }
283 }
284 
285 SfxBindings* ParaPropertyPanel::GetBindings()
286 {
287     return mpBindings;
288 }
289 
290 
291 
292 
293 void ParaPropertyPanel::DataChanged (const DataChangedEvent& rEvent)
294 {
295     (void)rEvent;
296 }
297 
298 ParaPropertyPanel::~ParaPropertyPanel()
299 {
300     delete mpLnSPItem;
301 }
302 
303 void ParaPropertyPanel::ReSize(bool bSize)
304 {
305     if(bSize)
306     {
307         //Paragraph spacing
308         mpFTUL->SetPosPixel(POS_FT_PARA_SPACE);
309         mpTbxUL_IncDec->SetPosPixel(POS_TBX_PARA_SPACE_INC_DEC);
310         mpTopDist->SetPosPixel(POS_MBX_TOP_DIST);
311         mpBottomDist->SetPosPixel(POS_MBX_BOT_DIST);
312         //Indent
313         mpFTIndent->SetPosPixel(POS_FT_PARA_INDENT);
314         mpTbxIndent_IncDec->SetPosPixel(POS_TBX_PARA_INDENT_INC_DEC);
315         mpTbxProDemote->SetPosPixel(POS_TBX_PARA_INDENT_INC_DEC);
316         mpLeftIndent->SetPosPixel(POS_MBX_LEFT_DIST);
317         mpRightIndent->SetPosPixel(POS_MBX_RIGHT_DIST);
318         mpFLineIndent->SetPosPixel(POS_MBX_FLINE_DIST);
319         //Line spacing
320         mpLineSPTbx->SetPosPixel(TBX_LINE_SPACE);
321         //image
322         maFISpace1.SetPosPixel(POS_IMG_SPACE1);
323         maFISpace2.SetPosPixel(POS_IMG_SPACE2);
324         maFIndent1.SetPosPixel(POS_IMG_INDENT1);
325         maFIndent2.SetPosPixel(POS_IMG_INDENT2);
326         maFIndent3.SetPosPixel(POS_IMG_INDENT3);
327         Size aSize(GetOutputSizePixel().Width(),PARA_SECTIONPAGE_HEIGHT);
328         aSize = LogicToPixel( aSize, MapMode(MAP_APPFONT) );
329         aSize.setWidth(GetOutputSizePixel().Width());
330         SetSizePixel(aSize);
331     }
332     else
333     {
334         //Paragraph spacing
335         mpFTUL->SetPosPixel(POS_FT_PARA_SPACE2);
336         mpTbxUL_IncDec->SetPosPixel(POS_TBX_PARA_SPACE_INC_DEC2);
337         mpTopDist->SetPosPixel(POS_MBX_TOP_DIST2);
338         mpBottomDist->SetPosPixel(POS_MBX_BOT_DIST2);
339         //Indent
340         mpFTIndent->SetPosPixel(POS_FT_PARA_INDENT2);
341         mpTbxIndent_IncDec->SetPosPixel(POS_TBX_PARA_INDENT_INC_DEC2);
342         mpTbxProDemote->SetPosPixel(POS_TBX_PARA_INDENT_INC_DEC2);
343         mpLeftIndent->SetPosPixel(POS_MBX_LEFT_DIST2);
344         mpRightIndent->SetPosPixel(POS_MBX_RIGHT_DIST2);
345         mpFLineIndent->SetPosPixel(POS_MBX_FLINE_DIST2);
346         //Line spacing
347         mpLineSPTbx->SetPosPixel(TBX_LINE_SPACE2);
348         //image
349         maFISpace1.SetPosPixel(POS_IMG_SPACE12);
350         maFISpace2.SetPosPixel(POS_IMG_SPACE22);
351         maFIndent1.SetPosPixel(POS_IMG_INDENT12);
352         maFIndent2.SetPosPixel(POS_IMG_INDENT22);
353         maFIndent3.SetPosPixel(POS_IMG_INDENT32);
354         Size aSize(GetOutputSizePixel().Width(),PARA_SECTIONPAGE_HEIGHT_2);
355         aSize = LogicToPixel( aSize, MapMode(MAP_APPFONT) );
356         aSize.setWidth(GetOutputSizePixel().Width());
357         SetSizePixel(aSize);
358     }
359 
360     if (mxSidebar.is())
361         mxSidebar->requestLayout();
362 }
363 
364 void ParaPropertyPanel::EndSpacingPopupMode (void)
365 {
366     maLineSpacePopup.Hide();
367 }
368 
369 void ParaPropertyPanel::EndBulletsPopupMode (void)
370 {
371     //i122054, Missed following line, for collapse the bullets popup
372     maBulletsPopup.Hide();
373 }
374 
375 void ParaPropertyPanel::EndNumberingPopupMode (void)
376 {
377     //i122054, Missed following line, for collapse the numbering popup
378     maNumberingPopup.Hide();
379 }
380 
381 
382 void ParaPropertyPanel::InitToolBoxAlign()
383 {
384     const bool bIsHighContrastModeActive (Theme::IsHighContrastMode());
385     mpAlignToolBox->SetItemImage(TOOLBOX_ITEM1, maLeftAlignControl.GetIcon(bIsHighContrastModeActive));
386     mpAlignToolBox->SetItemImage(TOOLBOX_ITEM2, maCenterAlignControl.GetIcon(bIsHighContrastModeActive));
387     mpAlignToolBox->SetItemImage(TOOLBOX_ITEM3, maRightAlignControl.GetIcon(bIsHighContrastModeActive));
388     mpAlignToolBox->SetItemImage(TOOLBOX_ITEM4, maJustifyAlignControl.GetIcon(bIsHighContrastModeActive));
389 
390     Link aLink = LINK( this, ParaPropertyPanel, AlignStyleModifyHdl_Impl );
391     mpAlignToolBox->SetSelectHdl( aLink );
392     Size aTbxSize (mpAlignToolBox->CalcWindowSizePixel());
393     mpAlignToolBox->SetOutputSizePixel( aTbxSize );
394 }
395 
396 void ParaPropertyPanel::InitToolBoxVertAlign()
397 {
398     const bool bIsHighContrastModeActive (Theme::IsHighContrastMode());
399     mpTBxVertAlign->SetItemImage(IID_VERT_TOP, maVertTop.GetIcon(bIsHighContrastModeActive));
400     mpTBxVertAlign->SetItemImage(IID_VERT_CENTER, maVertCenter.GetIcon(bIsHighContrastModeActive));
401     mpTBxVertAlign->SetItemImage(IID_VERT_BOTTOM, maVertBottom.GetIcon(bIsHighContrastModeActive));
402     mpTBxVertAlign->SetSelectHdl(LINK(this,ParaPropertyPanel,VertTbxSelectHandler));
403     Size aTbxSize (mpTBxVertAlign->CalcWindowSizePixel());
404     mpTBxVertAlign->SetOutputSizePixel( aTbxSize );
405 }
406 
407 
408 void ParaPropertyPanel::InitToolBoxIndent()
409 {
410     Link aLink = LINK( this, ParaPropertyPanel, ModifyIndentHdl_Impl );
411     mpLeftIndent->SetModifyHdl( aLink );
412     mpRightIndent->SetModifyHdl( aLink );
413     mpFLineIndent->SetModifyHdl( aLink );
414 
415     mpLeftIndent->SetAccessibleName(mpLeftIndent->GetQuickHelpText());
416     mpRightIndent->SetAccessibleName(mpRightIndent->GetQuickHelpText());
417     mpFLineIndent->SetAccessibleName(mpFLineIndent->GetQuickHelpText());
418 
419     const bool bIsHighContrastModeActive (Theme::IsHighContrastMode());
420 
421     if( Application::GetSettings().GetLayoutRTL())
422     {
423         mpTbxIndent_IncDec->SetItemImage(TOOLBOX_ITEM1, maIncIndentControl.GetIcon(bIsHighContrastModeActive));
424         mpTbxIndent_IncDec->SetItemImage(TOOLBOX_ITEM2, maDecIndentControl.GetIcon(bIsHighContrastModeActive));
425     }
426     else
427     {
428         mpTbxIndent_IncDec->SetItemImage(TOOLBOX_ITEM1, maIncIndentControl.GetIcon(bIsHighContrastModeActive));
429         mpTbxIndent_IncDec->SetItemImage(TOOLBOX_ITEM2, maDecIndentControl.GetIcon(bIsHighContrastModeActive));
430     }
431     mpTbxIndent_IncDec->SetItemImage(TOOLBOX_ITEM3,maIndHang);
432     aLink = LINK( this, ParaPropertyPanel, ClickIndent_IncDec_Hdl_Impl );
433     mpTbxIndent_IncDec->SetSelectHdl(aLink);
434     m_eLRSpaceUnit = maLRSpaceControl.GetCoreMetric();
435     Size aTbxSize = mpTbxIndent_IncDec->CalcWindowSizePixel();
436     mpTbxIndent_IncDec->SetOutputSizePixel( aTbxSize );
437 
438     if( Application::GetSettings().GetLayoutRTL())
439     {
440         mpTbxProDemote->SetItemImage(TOOLBOX_ITEM1, maOutLineLeftControl.GetIcon(bIsHighContrastModeActive));
441         mpTbxProDemote->SetItemImage(TOOLBOX_ITEM2, maOutLineRightControl.GetIcon(bIsHighContrastModeActive));
442     }
443     else
444     {
445         mpTbxProDemote->SetItemImage(TOOLBOX_ITEM1, maOutLineLeftControl.GetIcon(bIsHighContrastModeActive));
446         mpTbxProDemote->SetItemImage(TOOLBOX_ITEM2, maOutLineRightControl.GetIcon(bIsHighContrastModeActive));
447     }
448     mpTbxProDemote->SetItemImage(TOOLBOX_ITEM3,maIndHang);
449     aLink = LINK( this, ParaPropertyPanel, ClickProDemote_Hdl_Impl );
450     mpTbxProDemote->SetSelectHdl(aLink);
451     m_eLRSpaceUnit = maLRSpaceControl.GetCoreMetric();
452     aTbxSize = mpTbxProDemote->CalcWindowSizePixel();
453     mpTbxProDemote->SetOutputSizePixel( aTbxSize );
454 }
455 
456 void ParaPropertyPanel::InitToolBoxBGColor()
457 {
458     mpColorUpdater.reset(new ::svx::ToolboxButtonColorUpdater(SID_BACKGROUND_COLOR, TBI_BACK_COLOR, mpTBxBackColor.get(), TBX_UPDATER_MODE_CHAR_COLOR_NEW ));
459 
460     mpTBxBackColor->SetItemImage(TBI_BACK_COLOR, GetDisplayBackground().GetColor().IsDark()? maImgBackColorHigh : maImgBackColor);
461     mpTBxBackColor->SetItemBits( TBI_BACK_COLOR, mpTBxBackColor->GetItemBits( TBI_BACK_COLOR ) | TIB_DROPDOWNONLY );
462 
463     Link aLink = LINK(this, ParaPropertyPanel, ToolBoxBackColorDDHandler);
464     mpTBxBackColor->SetDropdownClickHdl ( aLink );
465     mpTBxBackColor->SetSelectHdl ( aLink );
466     Size aTbxSize (mpTBxBackColor->CalcWindowSizePixel());
467     mpTBxBackColor->SetOutputSizePixel( aTbxSize );
468 }
469 
470 void ParaPropertyPanel::InitToolBoxBulletsNumbering()
471 {
472     const bool bIsHighContrastModeActive (Theme::IsHighContrastMode());
473     mpTBxNumBullet->SetItemImage(IID_BULLET, maBulletOnOff.GetIcon(bIsHighContrastModeActive));
474     mpTBxNumBullet->SetItemImage(IID_NUMBER, maNumberOnOff.GetIcon(bIsHighContrastModeActive));
475 
476     mpTBxNumBullet->SetDropdownClickHdl(LINK(this,ParaPropertyPanel,NumBTbxDDHandler));
477     mpTBxNumBullet->SetSelectHdl(LINK(this,ParaPropertyPanel,NumBTbxSelectHandler));
478     Size aTbxSize (mpTBxNumBullet->CalcWindowSizePixel());
479     mpTBxNumBullet->SetOutputSizePixel( aTbxSize );
480 }
481 void ParaPropertyPanel::InitToolBoxSpacing()
482 {
483     Link aLink = LINK( this, ParaPropertyPanel, ULSpaceHdl_Impl );
484     mpTopDist->SetModifyHdl(aLink);
485     mpBottomDist->SetModifyHdl( aLink );
486 
487     mpTopDist->SetAccessibleName(mpTopDist->GetQuickHelpText());
488     mpBottomDist->SetAccessibleName(mpBottomDist->GetQuickHelpText());
489 
490     // Use a form of image loading that can handle both .uno:<command>
491     // and private:graphirepository... syntax.  This is necessary to
492     // handle the workaround for accessing the images of commands
493     // ParaspaceIncrease and ParaspaceDecrease.
494     // See issue 122446 for more details.
495     mpTbxUL_IncDec->SetItemImage(
496         BT_TBX_UL_INC,
497         sfx2::sidebar::Tools::GetImage(mpTbxUL_IncDec->GetItemCommand(BT_TBX_UL_INC), mxFrame));
498     mpTbxUL_IncDec->SetItemImage(
499         BT_TBX_UL_DEC,
500         sfx2::sidebar::Tools::GetImage(mpTbxUL_IncDec->GetItemCommand(BT_TBX_UL_DEC), mxFrame));
501 
502     aLink = LINK( this, ParaPropertyPanel, ClickUL_IncDec_Hdl_Impl );
503     mpTbxUL_IncDec->SetSelectHdl(aLink);
504     m_eULSpaceUnit = maULSpaceControl.GetCoreMetric();
505     Size aTbxSize = mpTbxUL_IncDec->CalcWindowSizePixel();
506     mpTbxUL_IncDec->SetOutputSizePixel( aTbxSize );
507 }
508 void ParaPropertyPanel::InitToolBoxLineSpacing()
509 {
510     Link aLink = LINK( this, ParaPropertyPanel, ClickLineSPDropDownHdl_Impl );
511     mpLineSPTbx->SetDropdownClickHdl( aLink );
512     mpLineSPTbx->SetSelectHdl( aLink );     //support keyinput "ENTER"
513     mpLineSPTbx->SetItemBits( TOOLBOX_ITEM1, mpLineSPTbx->GetItemBits( TOOLBOX_ITEM1 ) | TIB_DROPDOWNONLY );
514     mpLineSPTbx->SetItemImage(TOOLBOX_ITEM1,maSpace3);
515     Size aTbxSize = mpLineSPTbx->CalcWindowSizePixel();
516     mpLineSPTbx->SetOutputSizePixel( aTbxSize );
517 }
518 
519 void ParaPropertyPanel::initial()
520 {
521     mpFTUL->SetBackground(Wallpaper());
522     mpFTIndent->SetBackground(Wallpaper());
523     maFISpace1.SetBackground(Wallpaper());
524     maFISpace2.SetBackground(Wallpaper());
525     maFIndent1.SetBackground(Wallpaper());
526     maFIndent2.SetBackground(Wallpaper());
527     maFIndent3.SetBackground(Wallpaper());
528 
529     maFISpace1.SetImage(maSpace1);
530     maFISpace2.SetImage(maSpace2);
531     maFIndent1.SetImage(maIndent3);
532     maFIndent2.SetImage(maIndent2);
533     maFIndent3.SetImage(maIndent1);
534 
535     GetBindings()->Invalidate(SID_ATTR_PARA_ADJUST_LEFT,sal_True,sal_False);
536     GetBindings()->Invalidate(SID_ATTR_PARA_ADJUST_CENTER,sal_True,sal_False);
537     GetBindings()->Invalidate(SID_ATTR_PARA_ADJUST_RIGHT,sal_True,sal_False);
538     GetBindings()->Invalidate(SID_ATTR_PARA_ADJUST_BLOCK,sal_True,sal_False);
539 
540     //toolbox
541     InitToolBoxAlign();
542     InitToolBoxVertAlign();
543     InitToolBoxIndent();
544     InitToolBoxBGColor();
545     InitToolBoxBulletsNumbering();
546     InitToolBoxSpacing();
547     InitToolBoxLineSpacing();
548 
549 #ifdef HAS_IA2
550     mpAlignToolBox->SetAccRelationLabeledBy(&mpAlignToolBox);
551     mpTBxVertAlign->SetMpSubEditAccLableBy(&mpTBxVertAlign);
552     mpTBxNumBullet->SetAccRelationLabeledBy(&mpTBxNumBullet);
553     mpTBxBackColor->SetMpSubEditAccLableBy(&mpTBxBackColor);
554     mpFTUL->SetAccRelationLabeledBy(&mpFTUL);
555     mpTbxUL_IncDec->SetAccRelationLabeledBy(&mpTbxUL_IncDec);
556     mpTopDist->SetAccRelationLabeledBy(&mpTopDist);
557     mpBottomDist->SetAccRelationLabeledBy(&mpBottomDist);
558     mpLineSPTbx->SetAccRelationLabeledBy(&mpLineSPTbx);
559     mpFTIndent->SetAccRelationLabeledBy(&mpFTIndent);
560     mpTbxIndent_IncDec->SetAccRelationLabeledBy(&mpTbxIndent_IncDec);
561     mpTbxProDemote->SetAccRelationLabeledBy(&mpTbxProDemote);
562     mpLeftIndent->SetAccRelationLabeledBy(&mpLeftIndent);
563     mpRightIndent->SetAccRelationLabeledBy(&mpRightIndent);
564     mpFLineIndent->SetAccRelationLabeledBy(&mpFLineIndent);
565     mpColorUpdater->SetAccRelationLabeledBy(&mpColorUpdater);
566 #endif
567 }
568 
569 void ParaPropertyPanel::InitImageList(::boost::scoped_ptr<ToolBox>& rTbx, ImageList& rImglst, ImageList& rImgHlst)
570 {
571     sal_Bool bHighContrast = GetDisplayBackground().GetColor().IsDark();
572 
573     ImageList& rImgLst = bHighContrast ? rImgHlst : rImglst;
574 
575     sal_uInt16 nCount = rTbx->GetItemCount();
576     for (sal_uInt16 i = 0; i < nCount; i++)
577     {
578         sal_uInt16 nId = rTbx->GetItemId(i);
579         rTbx->SetItemImage( nId, rImgLst.GetImage( nId ) );
580     }
581 }
582 
583 //===========================for Numbering & Bullet================================================
584 
585 
586 
587 IMPL_LINK(ParaPropertyPanel, NumBTbxDDHandler, ToolBox*, pToolBox)
588 {
589     sal_uInt16 nId = pToolBox->GetCurItemId();
590 
591     EndTracking();
592     pToolBox->SetItemDown( nId, sal_True );
593 
594     if (nId == 1)
595     {
596         maBulletsPopup.UpdateValueSet();
597         maBulletsPopup.Show(*pToolBox);
598     }
599     else if (nId == 2)
600     {
601         maNumberingPopup.UpdateValueSet();
602         maNumberingPopup.Show(*pToolBox);
603     }
604     pToolBox->SetItemDown( nId, sal_False );
605     return 0;
606 }
607 
608 IMPL_LINK(ParaPropertyPanel, NumBTbxSelectHandler, ToolBox*, pToolBox)
609 {
610     sal_uInt16 nId = pToolBox->GetCurItemId();
611     sal_uInt16 nSID = SID_TABLE_VERT_NONE;
612 
613     EndTracking();
614     if (nId == 1)
615     {
616         nSID = FN_NUM_BULLET_ON;
617     }
618     else if ( nId == 2)
619     {
620         nSID = FN_NUM_NUMBERING_ON;
621     }
622     SfxBoolItem aBoolItem(nSID, sal_True);
623     GetBindings()->GetDispatcher()->Execute(nSID, SFX_CALLMODE_RECORD, &aBoolItem, 0L);
624 
625     return 0;
626 }
627 
628 
629 //================================for Vertical Alignment========================================
630 
631 
632 
633 IMPL_LINK(ParaPropertyPanel, VertTbxSelectHandler, ToolBox*, pToolBox)
634 {
635     sal_uInt16 nId = pToolBox->GetCurItemId();
636     sal_uInt16 nSID = SID_TABLE_VERT_NONE;
637     EndTracking();
638     if (nId == 1)
639     {
640         nSID = SID_TABLE_VERT_NONE;
641         mpTBxVertAlign->SetItemState(IID_VERT_TOP, STATE_CHECK);
642         mpTBxVertAlign->SetItemState(IID_VERT_CENTER, STATE_NOCHECK);
643         mpTBxVertAlign->SetItemState(IID_VERT_BOTTOM, STATE_NOCHECK);
644     }
645     else if (nId == 2)
646     {
647         nSID = SID_TABLE_VERT_CENTER;
648         mpTBxVertAlign->SetItemState(IID_VERT_TOP, STATE_NOCHECK);
649         mpTBxVertAlign->SetItemState(IID_VERT_CENTER, STATE_CHECK);
650         mpTBxVertAlign->SetItemState(IID_VERT_BOTTOM, STATE_NOCHECK);
651     }
652     else if (nId == 3)
653     {
654         nSID = SID_TABLE_VERT_BOTTOM;
655         mpTBxVertAlign->SetItemState(IID_VERT_TOP, STATE_NOCHECK);
656         mpTBxVertAlign->SetItemState(IID_VERT_CENTER, STATE_NOCHECK);
657         mpTBxVertAlign->SetItemState(IID_VERT_BOTTOM, STATE_CHECK);
658     }
659     SfxBoolItem aBoolItem(nSID, sal_True);
660     GetBindings()->GetDispatcher()->Execute(nSID, SFX_CALLMODE_RECORD, &aBoolItem, 0L);
661 
662     return 0;
663 }
664 
665 void ParaPropertyPanel::VertStateChanged(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState)
666 {
667     if (eState < SFX_ITEM_DONTCARE)
668     {
669         mpTBxVertAlign->SetItemState(IID_VERT_TOP, STATE_NOCHECK);
670         mpTBxVertAlign->SetItemState(IID_VERT_CENTER, STATE_NOCHECK);
671         mpTBxVertAlign->SetItemState(IID_VERT_BOTTOM, STATE_NOCHECK);
672         mpTBxVertAlign->EnableItem(IID_VERT_TOP, sal_False);
673         mpTBxVertAlign->EnableItem(IID_VERT_CENTER, sal_False);
674         mpTBxVertAlign->EnableItem(IID_VERT_BOTTOM, sal_False);
675     }
676     else
677     {
678         mpTBxVertAlign->EnableItem(IID_VERT_TOP, sal_True);
679         mpTBxVertAlign->EnableItem(IID_VERT_CENTER, sal_True);
680         mpTBxVertAlign->EnableItem(IID_VERT_BOTTOM, sal_True);
681         if ( (eState >= SFX_ITEM_DEFAULT) && (pState->ISA(SfxBoolItem)))
682         {
683             const SfxBoolItem* pItem= (const SfxBoolItem*)pState;
684             sal_Bool aBool = (sal_Bool)pItem->GetValue();
685 
686             if (aBool)
687             {
688                 if (nSID == SID_TABLE_VERT_NONE)
689                 {
690                     mpTBxVertAlign->SetItemState(IID_VERT_TOP, STATE_CHECK);
691                     mpTBxVertAlign->SetItemState(IID_VERT_CENTER, STATE_NOCHECK);
692                     mpTBxVertAlign->SetItemState(IID_VERT_BOTTOM, STATE_NOCHECK);
693                 }
694                 else if (nSID == SID_TABLE_VERT_CENTER)
695                 {
696                     mpTBxVertAlign->SetItemState(IID_VERT_TOP, STATE_NOCHECK);
697                     mpTBxVertAlign->SetItemState(IID_VERT_CENTER, STATE_CHECK);
698                     mpTBxVertAlign->SetItemState(IID_VERT_BOTTOM, STATE_NOCHECK);
699                 }
700                 else if (nSID == SID_TABLE_VERT_BOTTOM)
701                 {
702                     mpTBxVertAlign->SetItemState(IID_VERT_TOP, STATE_NOCHECK);
703                     mpTBxVertAlign->SetItemState(IID_VERT_CENTER, STATE_NOCHECK);
704                     mpTBxVertAlign->SetItemState(IID_VERT_BOTTOM, STATE_CHECK);
705                 }
706             }
707             else
708             {
709                 if (nSID == SID_TABLE_VERT_NONE)
710                 {
711                     mpTBxVertAlign->SetItemState(IID_VERT_TOP, STATE_NOCHECK);
712                 }
713                 else if (nSID == SID_TABLE_VERT_CENTER)
714                 {
715                     mpTBxVertAlign->SetItemState(IID_VERT_CENTER, STATE_NOCHECK);
716                 }
717                 else if (nSID == SID_TABLE_VERT_BOTTOM)
718                 {
719                     mpTBxVertAlign->SetItemState(IID_VERT_BOTTOM, STATE_NOCHECK);
720                 }
721             }
722         }
723         else
724         {
725             mpTBxVertAlign->SetItemState(IID_VERT_TOP, STATE_NOCHECK);
726             mpTBxVertAlign->SetItemState(IID_VERT_CENTER, STATE_NOCHECK);
727             mpTBxVertAlign->SetItemState(IID_VERT_BOTTOM, STATE_NOCHECK);
728         }
729     }
730 }
731 //==================================for Background color=====================
732 
733 IMPL_LINK(ParaPropertyPanel, ToolBoxBackColorDDHandler,ToolBox*, pToolBox)
734 {
735     sal_uInt16 nId = pToolBox->GetCurItemId();
736     OSL_ASSERT(nId == TBI_BACK_COLOR);
737     if(nId == TBI_BACK_COLOR)
738     {
739         pToolBox->SetItemDown( nId, true );
740         maBGColorPopup.Show(*pToolBox);
741         maBGColorPopup.SetCurrentColor(maColor, mbColorAvailable);
742     }
743     return 0;
744 }
745 
746 IMPL_LINK( ParaPropertyPanel, ImplPopupModeEndHdl, FloatingWindow*, EMPTYARG )
747 {
748     return 0;
749 }
750 
751 void ParaPropertyPanel::ShowMenu (void)
752 {
753     if (mpBindings != NULL)
754     {
755         SfxDispatcher* pDispatcher = mpBindings->GetDispatcher();
756         if (pDispatcher != NULL)
757             pDispatcher->Execute(SID_PARA_DLG, SFX_CALLMODE_ASYNCHRON);
758     }
759 }
760 
761 void ParaPropertyPanel::ParaBKGStateChanged(sal_uInt16 /* nSID */, SfxItemState eState, const SfxPoolItem* pState)
762 {
763     if( eState >= SFX_ITEM_DEFAULT && pState->ISA(SvxColorItem))
764     {
765         const SvxColorItem* pItem =  (const SvxColorItem*)pState;
766         maColor = pItem->GetValue();
767         mbColorAvailable = sal_True;
768         mpColorUpdater->Update(maColor);
769     }
770     else
771     {
772         mbColorAvailable = sal_False;
773         maColor.SetColor(COL_AUTO);
774         mpColorUpdater->Update(maColor);
775     }
776 }
777 
778 void ParaPropertyPanel::SetBGColor (
779     const String& /* rsColorName */,
780     const Color aColor)
781 {
782     SvxColorItem aColorItem(aColor, SID_BACKGROUND_COLOR);
783     mpBindings->GetDispatcher()->Execute(SID_BACKGROUND_COLOR, SFX_CALLMODE_RECORD, &aColorItem, 0L);
784     maColor = aColor;
785 }
786 
787 //==================================for Paragraph Alignment=====================
788 IMPL_LINK( ParaPropertyPanel, AlignStyleModifyHdl_Impl, ToolBox*, pBox )
789 {
790     switch (pBox->GetCurItemId())
791     {
792     case BT_SUBSTLEFT:
793         {
794             pBox->SetItemState(BT_SUBSTLEFT,STATE_CHECK);
795             pBox->SetItemState(BT_SUBSTCENTER,STATE_NOCHECK);
796             pBox->SetItemState(BT_SUBSTRIGHT,STATE_NOCHECK);
797             pBox->SetItemState(BT_SUBSTJUSTIFY,STATE_NOCHECK);
798             SfxBoolItem aBoolItem( SID_ATTR_PARA_ADJUST_LEFT,  sal_True );
799             GetBindings()->GetDispatcher()->Execute(SID_ATTR_PARA_ADJUST_LEFT, SFX_CALLMODE_RECORD, &aBoolItem, 0L);
800         }
801         break;
802     case BT_SUBSTCENTER:
803         {
804             pBox->SetItemState(BT_SUBSTCENTER,STATE_CHECK);
805             pBox->SetItemState(BT_SUBSTLEFT,STATE_NOCHECK);
806             pBox->SetItemState(BT_SUBSTRIGHT,STATE_NOCHECK);
807             pBox->SetItemState(BT_SUBSTJUSTIFY,STATE_NOCHECK);
808             SfxBoolItem aBoolItem( SID_ATTR_PARA_ADJUST_CENTER, sal_True );
809             GetBindings()->GetDispatcher()->Execute(SID_ATTR_PARA_ADJUST_CENTER, SFX_CALLMODE_RECORD, &aBoolItem, 0L);
810         }
811         break;
812     case BT_SUBSTRIGHT:
813         {
814             pBox->SetItemState(BT_SUBSTRIGHT,STATE_CHECK);
815             pBox->SetItemState(BT_SUBSTLEFT,STATE_NOCHECK);
816             pBox->SetItemState(BT_SUBSTCENTER,STATE_NOCHECK);
817             pBox->SetItemState(BT_SUBSTJUSTIFY,STATE_NOCHECK);
818             SfxBoolItem aBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, sal_True );
819             GetBindings()->GetDispatcher()->Execute(SID_ATTR_PARA_ADJUST_RIGHT, SFX_CALLMODE_RECORD, &aBoolItem, 0L);
820         }
821         break;
822     case BT_SUBSTJUSTIFY:
823         {
824             pBox->SetItemState(BT_SUBSTJUSTIFY,STATE_CHECK);
825             pBox->SetItemState(BT_SUBSTLEFT,STATE_NOCHECK);
826             pBox->SetItemState(BT_SUBSTRIGHT,STATE_NOCHECK);
827             pBox->SetItemState(BT_SUBSTCENTER,STATE_NOCHECK);
828             SfxBoolItem aBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, sal_True );
829             GetBindings()->GetDispatcher()->Execute(SID_ATTR_PARA_ADJUST_BLOCK, SFX_CALLMODE_RECORD, &aBoolItem, 0L);
830         }
831         break;
832     }
833 
834     return 0;
835 }
836 //==================================for Paragraph Indent=====================
837 IMPL_LINK( ParaPropertyPanel, ModifyIndentHdl_Impl, SvxRelativeField*, /* pBox */ )
838 {
839     SvxLRSpaceItem aMargin( SID_ATTR_PARA_LRSPACE );
840     aMargin.SetTxtLeft( (const long)GetCoreValue( *mpLeftIndent.get(), m_eLRSpaceUnit ) );
841     aMargin.SetRight( (const long)GetCoreValue( *mpRightIndent.get(), m_eLRSpaceUnit ) );
842     aMargin.SetTxtFirstLineOfst( (const short)GetCoreValue( *mpFLineIndent.get(), m_eLRSpaceUnit ) );
843 
844     GetBindings()->GetDispatcher()->Execute(
845         SID_ATTR_PARA_LRSPACE, SFX_CALLMODE_RECORD, &aMargin, 0L);
846     return 0;
847 }
848 
849 IMPL_LINK(ParaPropertyPanel, ClickIndent_IncDec_Hdl_Impl, ToolBox *, pControl)
850 {
851     switch (pControl->GetCurItemId())
852     {
853     case INDENT_INCREMENT:
854         {
855             switch (maContext.GetCombinedContext_DI())
856             {
857             case CombinedEnumContext(Application_WriterVariants, Context_Default):
858             case CombinedEnumContext(Application_WriterVariants, Context_Text):
859             case CombinedEnumContext(Application_WriterVariants, Context_Table):
860                 {
861                     SfxBoolItem aMargin( SID_INC_INDENT, sal_True );
862                     GetBindings()->GetDispatcher()->Execute(
863                         SID_INC_INDENT, SFX_CALLMODE_RECORD, &aMargin, 0L);
864                 }
865                 break;
866             default:
867                 {
868                     SvxLRSpaceItem aMargin( SID_ATTR_PARA_LRSPACE );
869 
870                     maTxtLeft += INDENT_STEP;
871                     sal_Int64 nVal = OutputDevice::LogicToLogic( maTxtLeft, (MapUnit)(SFX_MAPUNIT_TWIP), MAP_100TH_MM );
872                     nVal = OutputDevice::LogicToLogic( (long)nVal, MAP_100TH_MM, (MapUnit)m_eLRSpaceUnit );
873                     aMargin.SetTxtLeft( (const long)nVal );
874                     aMargin.SetRight( (const long)GetCoreValue( *mpRightIndent.get(), m_eLRSpaceUnit ) );
875                     aMargin.SetTxtFirstLineOfst( (const short)GetCoreValue( *mpFLineIndent.get(), m_eLRSpaceUnit ) );
876 
877                     GetBindings()->GetDispatcher()->Execute(
878                         SID_ATTR_PARA_LRSPACE, SFX_CALLMODE_RECORD, &aMargin, 0L);
879                 }
880             }
881         }
882         break;
883     case INDENT_DECREMENT:
884         {
885             switch (maContext.GetCombinedContext_DI())
886             {
887             case CombinedEnumContext(Application_WriterVariants, Context_Default):
888             case CombinedEnumContext(Application_WriterVariants, Context_Text):
889             case CombinedEnumContext(Application_WriterVariants, Context_Table):
890                 {
891                     SfxBoolItem aMargin( SID_DEC_INDENT, sal_True );
892                     GetBindings()->GetDispatcher()->Execute(
893                         SID_DEC_INDENT, SFX_CALLMODE_RECORD, &aMargin, 0L);
894                 }
895                 break;
896             default:
897                 {
898                     if((maTxtLeft - INDENT_STEP) < 0)
899                         maTxtLeft = DEFAULT_VALUE;
900                     else
901                         maTxtLeft -= INDENT_STEP;
902 
903                     SvxLRSpaceItem aMargin( SID_ATTR_PARA_LRSPACE );
904 
905                     sal_Int64 nVal = OutputDevice::LogicToLogic( maTxtLeft, (MapUnit)(SFX_MAPUNIT_TWIP), MAP_100TH_MM );
906                     nVal = OutputDevice::LogicToLogic( (long)nVal, MAP_100TH_MM, (MapUnit)m_eLRSpaceUnit );
907 
908                     aMargin.SetTxtLeft( (const long)nVal );
909                     aMargin.SetRight( (const long)GetCoreValue( *mpRightIndent.get(), m_eLRSpaceUnit ) );
910                     aMargin.SetTxtFirstLineOfst( (const short)GetCoreValue( *mpFLineIndent.get(), m_eLRSpaceUnit ) );
911 
912                     GetBindings()->GetDispatcher()->Execute(
913                         SID_ATTR_PARA_LRSPACE, SFX_CALLMODE_RECORD, &aMargin, 0L);
914                 }
915             }
916         }
917         break;
918     case ID_HANGING_INDENT:
919         {
920             SvxLRSpaceItem aMargin( SID_ATTR_PARA_LRSPACE );
921             aMargin.SetTxtLeft( (const long)GetCoreValue( *mpLeftIndent.get(), m_eLRSpaceUnit ) + (const short)GetCoreValue( *mpFLineIndent.get(), m_eLRSpaceUnit ) );
922             aMargin.SetRight( (const long)GetCoreValue( *mpRightIndent.get(), m_eLRSpaceUnit ) );
923             aMargin.SetTxtFirstLineOfst( ((const short)GetCoreValue( *mpFLineIndent.get(), m_eLRSpaceUnit ))*(-1) );
924 
925             GetBindings()->GetDispatcher()->Execute(
926                 SID_ATTR_PARA_LRSPACE, SFX_CALLMODE_RECORD, &aMargin, 0L);
927         }
928         break;
929     }
930     return( 0L );
931 }
932 
933 IMPL_LINK(ParaPropertyPanel, ClickProDemote_Hdl_Impl, ToolBox *, pControl)
934 {
935     switch (pControl->GetCurItemId())
936     {
937         case BT_TBX_INDENT_PROMOTE:
938         {
939             GetBindings()->GetDispatcher()->Execute( SID_OUTLINE_RIGHT, SFX_CALLMODE_RECORD );
940         }
941         break;
942         case BT_TBX_INDENT_DEMOTE:
943         {
944             GetBindings()->GetDispatcher()->Execute( SID_OUTLINE_LEFT, SFX_CALLMODE_RECORD );
945         }
946         break;
947         case SD_HANGING_INDENT:
948         {
949             SvxLRSpaceItem aMargin( SID_ATTR_PARA_LRSPACE );
950             aMargin.SetTxtLeft( (const long)GetCoreValue( *mpLeftIndent.get(), m_eLRSpaceUnit ) + (const short)GetCoreValue( *mpFLineIndent.get(), m_eLRSpaceUnit ) );
951             aMargin.SetRight( (const long)GetCoreValue( *mpRightIndent.get(), m_eLRSpaceUnit ) );
952             aMargin.SetTxtFirstLineOfst( ((const short)GetCoreValue( *mpFLineIndent.get(), m_eLRSpaceUnit ))*(-1) );
953 
954             GetBindings()->GetDispatcher()->Execute( SID_ATTR_PARA_LRSPACE, SFX_CALLMODE_RECORD, &aMargin, 0L);
955         }
956         break;
957     }
958     return( 0L );
959 }
960 //==================================for Paragraph Line Spacing=====================
961 
962 IMPL_LINK( ParaPropertyPanel, ClickLineSPDropDownHdl_Impl, ToolBox*, pBox )
963 {
964 
965     const sal_uInt16 nId = pBox->GetCurItemId();
966     OSL_ASSERT(nId == TOOLBOX_ITEM1);
967     if(nId == TOOLBOX_ITEM1)
968     {
969         pBox->SetItemDown( nId, true );
970         maLineSpacePopup.Rearrange(meLnSpState,m_eMetricUnit,mpLnSPItem,maContext);
971         maLineSpacePopup.Show(*pBox);
972 
973     }
974     return (0L);
975 }
976 
977 //==================================for Paragraph Spacing=====================
978 IMPL_LINK( ParaPropertyPanel, ULSpaceHdl_Impl, SvxRelativeField*, /* pBox */)
979 {
980     SvxULSpaceItem aMargin( SID_ATTR_PARA_ULSPACE );
981     aMargin.SetUpper( (sal_uInt16)GetCoreValue( *mpTopDist, m_eULSpaceUnit ) );
982     aMargin.SetLower( (sal_uInt16)GetCoreValue( *mpBottomDist, m_eULSpaceUnit ) );
983 
984     GetBindings()->GetDispatcher()->Execute(
985         SID_ATTR_PARA_ULSPACE, SFX_CALLMODE_RECORD, &aMargin, 0L);
986     return 0L;
987 }
988 
989 IMPL_LINK(ParaPropertyPanel, ClickUL_IncDec_Hdl_Impl, ToolBox *, pControl)
990 {
991     switch (pControl->GetCurItemId())
992         {
993             case BT_TBX_UL_INC:
994              {
995                  SvxULSpaceItem aMargin( SID_ATTR_PARA_ULSPACE );
996 
997                  maUpper += UL_STEP;
998                  sal_Int64 nVal = OutputDevice::LogicToLogic( maUpper, (MapUnit)(SFX_MAPUNIT_TWIP), MAP_100TH_MM );
999                  nVal = OutputDevice::LogicToLogic( (long)nVal, MAP_100TH_MM, (MapUnit)m_eLRSpaceUnit );
1000                  aMargin.SetUpper( (const sal_uInt16)nVal );
1001 
1002                  maLower += UL_STEP;
1003                  nVal = OutputDevice::LogicToLogic( maLower, (MapUnit)(SFX_MAPUNIT_TWIP), MAP_100TH_MM );
1004                  nVal = OutputDevice::LogicToLogic( (long)nVal, MAP_100TH_MM, (MapUnit)m_eLRSpaceUnit );
1005                  aMargin.SetLower( (const sal_uInt16)nVal );
1006 
1007                  GetBindings()->GetDispatcher()->Execute(
1008                      SID_ATTR_PARA_ULSPACE, SFX_CALLMODE_RECORD, &aMargin, 0L);
1009              }
1010              break;
1011         case BT_TBX_UL_DEC:
1012             {
1013                  SvxULSpaceItem aMargin( SID_ATTR_PARA_ULSPACE );
1014 
1015                  if( maUpper >= UL_STEP )
1016                  {
1017                     maUpper -= UL_STEP;
1018                     sal_Int64   nVal = OutputDevice::LogicToLogic( maUpper, (MapUnit)(SFX_MAPUNIT_TWIP), MAP_100TH_MM );
1019                     nVal = OutputDevice::LogicToLogic( (long)nVal, MAP_100TH_MM, (MapUnit)m_eLRSpaceUnit );
1020                     aMargin.SetUpper( (const sal_uInt16)nVal );
1021                  }
1022                  else
1023                     aMargin.SetUpper( DEFAULT_VALUE );
1024                  if( maLower >= UL_STEP )
1025                  {
1026                     maLower -= UL_STEP;
1027                     sal_Int64   nVal = OutputDevice::LogicToLogic( maLower, (MapUnit)(SFX_MAPUNIT_TWIP), MAP_100TH_MM );
1028                     nVal = OutputDevice::LogicToLogic( (long)nVal, MAP_100TH_MM, (MapUnit)m_eLRSpaceUnit );
1029                     aMargin.SetLower( (const sal_uInt16)nVal );
1030                  }
1031                  else
1032                     aMargin.SetLower( DEFAULT_VALUE );
1033 
1034                  GetBindings()->GetDispatcher()->Execute(
1035                      SID_ATTR_PARA_ULSPACE, SFX_CALLMODE_RECORD, &aMargin, 0L);
1036             }
1037             break;
1038         }
1039     return( 0L );
1040 }
1041 
1042 //==================================for Paragraph State change=====================
1043 void ParaPropertyPanel::NotifyItemUpdate(
1044     sal_uInt16 nSID,
1045     SfxItemState eState,
1046     const SfxPoolItem* pState,
1047     const bool bIsEnabled)
1048 {
1049     (void)bIsEnabled;
1050 
1051     switch (nSID)
1052     {
1053     case SID_ATTR_METRIC:
1054         {
1055             m_eMetricUnit = GetCurrentUnit(eState,pState);
1056             if( m_eMetricUnit!=m_last_eMetricUnit )
1057             {
1058                 SetFieldUnit( *mpLeftIndent, m_eMetricUnit );
1059                 SetFieldUnit( *mpRightIndent, m_eMetricUnit );
1060                 SetFieldUnit( *mpFLineIndent, m_eMetricUnit );
1061                 SetFieldUnit( *mpTopDist, m_eMetricUnit );
1062                 SetFieldUnit( *mpBottomDist, m_eMetricUnit );
1063             }
1064             m_last_eMetricUnit = m_eMetricUnit;
1065         }
1066         break;
1067 
1068     case SID_ATTR_PARA_LRSPACE:
1069         StateChangedIndentImpl( nSID, eState, pState );
1070         break;
1071 
1072     case SID_ATTR_PARA_LINESPACE:
1073         StateChangedLnSPImpl( nSID, eState, pState );
1074         break;
1075 
1076     case SID_ATTR_PARA_ULSPACE:
1077         StateChangedULImpl( nSID, eState, pState );
1078         break;
1079 
1080     case SID_ATTR_PARA_ADJUST_LEFT:
1081     case SID_ATTR_PARA_ADJUST_CENTER:
1082     case SID_ATTR_PARA_ADJUST_RIGHT:
1083     case SID_ATTR_PARA_ADJUST_BLOCK:
1084         StateChangedAlignmentImpl( nSID, eState, pState );
1085         break;
1086 
1087     case SID_OUTLINE_LEFT:
1088     case SID_OUTLINE_RIGHT:
1089         StateChangeOutLineImpl( nSID, eState, pState );
1090         break;
1091 
1092     case SID_INC_INDENT:
1093     case SID_DEC_INDENT:
1094         StateChangeIncDecImpl( nSID, eState, pState );
1095         break;
1096 
1097     case FN_NUM_NUMBERING_ON:
1098     case FN_NUM_BULLET_ON:
1099         StateChangeBulletNumImpl( nSID, eState, pState );
1100         break;
1101 
1102     case FN_BUL_NUM_RULE_INDEX:
1103     case FN_NUM_NUM_RULE_INDEX:
1104         StateChangeBulletNumRuleImpl( nSID, eState, pState );
1105         break;
1106 
1107     case SID_TABLE_VERT_NONE:
1108     case SID_TABLE_VERT_CENTER:
1109     case SID_TABLE_VERT_BOTTOM:
1110         VertStateChanged( nSID, eState, pState);
1111         break;
1112 
1113     case SID_BACKGROUND_COLOR:
1114         ParaBKGStateChanged(nSID, eState, pState);
1115         break;
1116     }
1117 }
1118 
1119 
1120 
1121 
1122 void ParaPropertyPanel::StateChangedAlignmentImpl( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
1123 {
1124     if( eState >= SFX_ITEM_AVAILABLE )
1125     {
1126         const SfxBoolItem* pItem = (const SfxBoolItem*)pState;
1127         bool IsChecked = (bool)pItem->GetValue();
1128         switch (nSID)
1129         {
1130         case SID_ATTR_PARA_ADJUST_LEFT:
1131             {
1132                 if(IsChecked)
1133                 {
1134                     mpAlignToolBox->SetItemState(BT_SUBSTLEFT,STATE_CHECK);
1135                     mpAlignToolBox->SetItemState(BT_SUBSTCENTER,STATE_NOCHECK);
1136                     mpAlignToolBox->SetItemState(BT_SUBSTRIGHT,STATE_NOCHECK);
1137                     mpAlignToolBox->SetItemState(BT_SUBSTJUSTIFY,STATE_NOCHECK);
1138                 }
1139                 else
1140                     mpAlignToolBox->SetItemState(BT_SUBSTLEFT,STATE_NOCHECK);
1141             }
1142             break;
1143         case SID_ATTR_PARA_ADJUST_CENTER:
1144             {
1145                 if(IsChecked)
1146                 {
1147                     mpAlignToolBox->SetItemState(BT_SUBSTCENTER,STATE_CHECK);
1148                     mpAlignToolBox->SetItemState(BT_SUBSTLEFT,STATE_NOCHECK);
1149                     mpAlignToolBox->SetItemState(BT_SUBSTRIGHT,STATE_NOCHECK);
1150                     mpAlignToolBox->SetItemState(BT_SUBSTJUSTIFY,STATE_NOCHECK);
1151                 }
1152                 else
1153                     mpAlignToolBox->SetItemState(BT_SUBSTCENTER,STATE_NOCHECK);
1154             }
1155             break;
1156         case SID_ATTR_PARA_ADJUST_RIGHT:
1157             {
1158                 if(IsChecked)
1159                 {
1160                     mpAlignToolBox->SetItemState(BT_SUBSTRIGHT,STATE_CHECK);
1161                     mpAlignToolBox->SetItemState(BT_SUBSTLEFT,STATE_NOCHECK);
1162                     mpAlignToolBox->SetItemState(BT_SUBSTCENTER,STATE_NOCHECK);
1163                     mpAlignToolBox->SetItemState(BT_SUBSTJUSTIFY,STATE_NOCHECK);
1164                 }
1165                 else
1166                     mpAlignToolBox->SetItemState(BT_SUBSTRIGHT,STATE_NOCHECK);
1167             }
1168             break;
1169         case SID_ATTR_PARA_ADJUST_BLOCK:
1170             {
1171                 if(IsChecked)
1172                 {
1173                     mpAlignToolBox->SetItemState(BT_SUBSTJUSTIFY,STATE_CHECK);
1174                     mpAlignToolBox->SetItemState(BT_SUBSTLEFT,STATE_NOCHECK);
1175                     mpAlignToolBox->SetItemState(BT_SUBSTCENTER,STATE_NOCHECK);
1176                     mpAlignToolBox->SetItemState(BT_SUBSTRIGHT,STATE_NOCHECK);
1177                 }
1178                 else
1179                     mpAlignToolBox->SetItemState(BT_SUBSTJUSTIFY,STATE_NOCHECK);
1180             }
1181             break;
1182         }
1183     }
1184     else if( eState == SFX_ITEM_DISABLED )
1185     {
1186     }
1187     else if ( eState == SFX_ITEM_DONTCARE )
1188     {
1189         switch (nSID)
1190         {
1191         case SID_ATTR_PARA_ADJUST_LEFT:
1192             mpAlignToolBox->SetItemState(BT_SUBSTLEFT,STATE_NOCHECK);
1193             break;
1194         case SID_ATTR_PARA_ADJUST_CENTER:
1195             mpAlignToolBox->SetItemState(BT_SUBSTCENTER,STATE_NOCHECK);
1196             break;
1197         case SID_ATTR_PARA_ADJUST_RIGHT:
1198             mpAlignToolBox->SetItemState(BT_SUBSTRIGHT,STATE_NOCHECK);
1199             break;
1200         case SID_ATTR_PARA_ADJUST_BLOCK:
1201             mpAlignToolBox->SetItemState(BT_SUBSTJUSTIFY,STATE_NOCHECK);
1202             break;
1203         }
1204     }
1205 }
1206 
1207 void ParaPropertyPanel::StateChangedIndentImpl( sal_uInt16 /* nSID */, SfxItemState eState, const SfxPoolItem* pState )
1208 {
1209     switch (maContext.GetCombinedContext_DI())
1210     {
1211 
1212     case CombinedEnumContext(Application_WriterVariants, Context_DrawText):
1213     case CombinedEnumContext(Application_WriterVariants, Context_Annotation):
1214     case CombinedEnumContext(Application_Calc, Context_DrawText):
1215         {
1216             mpLeftIndent->SetMin( DEFAULT_VALUE );
1217             mpRightIndent->SetMin( DEFAULT_VALUE );
1218             mpFLineIndent->SetMin( DEFAULT_VALUE );
1219             mpTbxIndent_IncDec->Show();
1220             mpTbxProDemote->Hide();
1221         }
1222         break;
1223     case CombinedEnumContext(Application_DrawImpress, Context_DrawText):
1224     case CombinedEnumContext(Application_DrawImpress, Context_Draw):
1225     case CombinedEnumContext(Application_DrawImpress, Context_TextObject):
1226     case CombinedEnumContext(Application_DrawImpress, Context_Graphic):
1227     case CombinedEnumContext(Application_DrawImpress, Context_Table):
1228         {
1229             mpLeftIndent->SetMin( DEFAULT_VALUE );
1230             mpRightIndent->SetMin( DEFAULT_VALUE );
1231             mpFLineIndent->SetMin( DEFAULT_VALUE );
1232             mpTbxIndent_IncDec->Hide();
1233             mpTbxProDemote->Show();
1234         }
1235         break;
1236     case CombinedEnumContext(Application_WriterVariants, Context_Default):
1237     case CombinedEnumContext(Application_WriterVariants, Context_Text):
1238     case CombinedEnumContext(Application_WriterVariants, Context_Table):
1239         {
1240             mpLeftIndent->SetMin( NEGA_MAXVALUE, FUNIT_100TH_MM );
1241             mpRightIndent->SetMin( NEGA_MAXVALUE, FUNIT_100TH_MM );
1242             mpFLineIndent->SetMin( NEGA_MAXVALUE, FUNIT_100TH_MM );
1243             mpTbxIndent_IncDec->Show();
1244             mpTbxProDemote->Hide();
1245         }
1246         break;
1247     }
1248 
1249     if( pState && eState >= SFX_ITEM_AVAILABLE )
1250     {
1251         SvxLRSpaceItem* pSpace = ( SvxLRSpaceItem*)pState;
1252         maTxtLeft = pSpace->GetTxtLeft();
1253         maTxtLeft = OutputDevice::LogicToLogic( maTxtLeft, (MapUnit)m_eLRSpaceUnit, MAP_100TH_MM );
1254         maTxtLeft = OutputDevice::LogicToLogic( maTxtLeft, MAP_100TH_MM, (MapUnit)(SFX_MAPUNIT_TWIP) );
1255 
1256         long aTxtRight = pSpace->GetRight();
1257         aTxtRight = OutputDevice::LogicToLogic( aTxtRight, (MapUnit)m_eLRSpaceUnit, MAP_100TH_MM );
1258         aTxtRight = OutputDevice::LogicToLogic( aTxtRight, MAP_100TH_MM, (MapUnit)(SFX_MAPUNIT_TWIP) );
1259 
1260         long aTxtFirstLineOfst = pSpace->GetTxtFirstLineOfst();
1261         aTxtFirstLineOfst = OutputDevice::LogicToLogic( aTxtFirstLineOfst, (MapUnit)m_eLRSpaceUnit, MAP_100TH_MM );
1262         aTxtFirstLineOfst = OutputDevice::LogicToLogic( aTxtFirstLineOfst, MAP_100TH_MM, (MapUnit)(SFX_MAPUNIT_TWIP) );
1263 
1264         long nVal = OutputDevice::LogicToLogic( maTxtLeft, (MapUnit)(SFX_MAPUNIT_TWIP), MAP_100TH_MM );
1265         nVal = (long)mpLeftIndent->Normalize( (long)nVal );
1266         mpLeftIndent->SetValue( nVal, FUNIT_100TH_MM );
1267 
1268         if ( maContext.GetCombinedContext_DI() != CombinedEnumContext(Application_WriterVariants, Context_Text)
1269              && maContext.GetCombinedContext_DI() != CombinedEnumContext(Application_WriterVariants, Context_Default)
1270              && maContext.GetCombinedContext_DI() != CombinedEnumContext(Application_WriterVariants, Context_Table))
1271         {
1272             mpFLineIndent->SetMin( nVal*(-1), FUNIT_100TH_MM );
1273         }
1274 
1275         long nrVal = OutputDevice::LogicToLogic( aTxtRight, (MapUnit)(SFX_MAPUNIT_TWIP), MAP_100TH_MM );
1276         nrVal = (long)mpRightIndent->Normalize( (long)nrVal );
1277         mpRightIndent->SetValue( nrVal, FUNIT_100TH_MM );
1278 
1279         long nfVal = OutputDevice::LogicToLogic( aTxtFirstLineOfst, (MapUnit)(SFX_MAPUNIT_TWIP), MAP_100TH_MM );
1280         nfVal = (long)mpFLineIndent->Normalize( (long)nfVal );
1281         mpFLineIndent->SetValue( nfVal, FUNIT_100TH_MM );
1282 
1283         switch (maContext.GetCombinedContext_DI())
1284         {
1285         case CombinedEnumContext(Application_WriterVariants, Context_DrawText):
1286         case CombinedEnumContext(Application_WriterVariants, Context_Text):
1287         case CombinedEnumContext(Application_WriterVariants, Context_Default):
1288         case CombinedEnumContext(Application_WriterVariants, Context_Table):
1289         case CombinedEnumContext(Application_WriterVariants, Context_Annotation):
1290             {
1291                 mpLeftIndent->SetMax( MAX_SW - nrVal, FUNIT_100TH_MM );
1292                 mpRightIndent->SetMax( MAX_SW - nVal, FUNIT_100TH_MM );
1293                 mpFLineIndent->SetMax( MAX_SW - nVal - nrVal, FUNIT_100TH_MM );
1294             }
1295             break;
1296         case CombinedEnumContext(Application_DrawImpress, Context_DrawText):
1297         case CombinedEnumContext(Application_DrawImpress, Context_Draw):
1298         case CombinedEnumContext(Application_DrawImpress, Context_Table):
1299         case CombinedEnumContext(Application_DrawImpress, Context_TextObject):
1300         case CombinedEnumContext(Application_DrawImpress, Context_Graphic):
1301             {
1302                 mpLeftIndent->SetMax( MAX_SC_SD - nrVal, FUNIT_100TH_MM );
1303                 mpRightIndent->SetMax( MAX_SC_SD - nVal, FUNIT_100TH_MM );
1304                 mpFLineIndent->SetMax( MAX_SC_SD - nVal - nrVal, FUNIT_100TH_MM );
1305             }
1306         }
1307 
1308         mpTbxIndent_IncDec->Enable();
1309         mpTbxIndent_IncDec->EnableItem(ID_HANGING_INDENT, sal_True);
1310         if ( maContext.GetCombinedContext_DI() != CombinedEnumContext(Application_WriterVariants, Context_Text)
1311              && maContext.GetCombinedContext_DI() != CombinedEnumContext(Application_WriterVariants, Context_Default)
1312              && maContext.GetCombinedContext_DI() != CombinedEnumContext(Application_WriterVariants, Context_Table) )
1313         {
1314             mpTbxIndent_IncDec->EnableItem(BT_TBX_INDENT_INC, sal_True);
1315             mpTbxIndent_IncDec->EnableItem(BT_TBX_INDENT_DEC, sal_True);
1316         }
1317 
1318         mpTbxProDemote->EnableItem(SD_HANGING_INDENT, sal_True);
1319     }
1320     else if( eState == SFX_ITEM_DISABLED )
1321     {
1322         mpLeftIndent-> Disable();
1323         mpRightIndent->Disable();
1324         mpFLineIndent->Disable();
1325         mpTbxIndent_IncDec->Disable();
1326         if( maContext.GetCombinedContext_DI() != CombinedEnumContext(Application_WriterVariants, Context_Text)  &&
1327             maContext.GetCombinedContext_DI() != CombinedEnumContext(Application_WriterVariants, Context_Default) &&
1328             maContext.GetCombinedContext_DI() !=  CombinedEnumContext(Application_WriterVariants, Context_Table) )
1329             mpTbxIndent_IncDec->Disable();
1330         else
1331             mpTbxIndent_IncDec->EnableItem(ID_HANGING_INDENT, sal_False);
1332 
1333         //      maTbxProDemote->Disable();
1334         mpTbxProDemote->EnableItem(SD_HANGING_INDENT, sal_False);
1335     }
1336     else
1337     {
1338         mpLeftIndent->SetEmptyFieldValue();
1339         mpRightIndent->SetEmptyFieldValue();
1340         mpFLineIndent->SetEmptyFieldValue();
1341         if( maContext.GetCombinedContext_DI() != CombinedEnumContext(Application_WriterVariants, Context_Text)  &&
1342             maContext.GetCombinedContext_DI() != CombinedEnumContext(Application_WriterVariants, Context_Default) &&
1343             maContext.GetCombinedContext_DI() !=  CombinedEnumContext(Application_WriterVariants, Context_Table) )
1344             mpTbxIndent_IncDec->Disable();
1345         else
1346             mpTbxIndent_IncDec->EnableItem(ID_HANGING_INDENT, sal_False);
1347         mpTbxProDemote->EnableItem(SD_HANGING_INDENT, sal_False);
1348     }
1349 }
1350 
1351 void ParaPropertyPanel::StateChangedLnSPImpl( sal_uInt16 /* nSID */, SfxItemState eState, const SfxPoolItem* pState )
1352 {
1353     meLnSpState = eState;
1354 
1355     if( pState && eState >= SFX_ITEM_AVAILABLE )
1356     {
1357         if(mpLnSPItem)
1358             delete mpLnSPItem;
1359         mpLnSPItem = ( SvxLineSpacingItem *)pState->Clone();
1360     }
1361 }
1362 
1363 void ParaPropertyPanel::StateChangedULImpl( sal_uInt16 /* nSID */, SfxItemState eState, const SfxPoolItem* pState )
1364 {
1365     mpTopDist->SetMax( mpTopDist->Normalize( MAX_DURCH ), MapToFieldUnit(m_eULSpaceUnit) );
1366     mpBottomDist->SetMax( mpBottomDist->Normalize( MAX_DURCH ), MapToFieldUnit(m_eULSpaceUnit) );
1367 
1368     if( pState && eState >= SFX_ITEM_AVAILABLE )
1369     {
1370         SvxULSpaceItem* pOldItem = (SvxULSpaceItem*)pState;
1371 
1372         maUpper = pOldItem->GetUpper();
1373         maUpper = OutputDevice::LogicToLogic( maUpper, (MapUnit)m_eULSpaceUnit, MAP_100TH_MM );
1374         maUpper = OutputDevice::LogicToLogic( maUpper, MAP_100TH_MM, (MapUnit)(SFX_MAPUNIT_TWIP) );
1375 
1376         maLower = pOldItem->GetLower();
1377         maLower = OutputDevice::LogicToLogic( maLower, (MapUnit)m_eULSpaceUnit, MAP_100TH_MM );
1378         maLower = OutputDevice::LogicToLogic( maLower, MAP_100TH_MM, (MapUnit)(SFX_MAPUNIT_TWIP) );
1379 
1380         sal_Int64 nVal = OutputDevice::LogicToLogic( maUpper, (MapUnit)(SFX_MAPUNIT_TWIP), MAP_100TH_MM );
1381         nVal = mpTopDist->Normalize( nVal );
1382         mpTopDist->SetValue( nVal, FUNIT_100TH_MM );
1383 
1384         nVal = OutputDevice::LogicToLogic( maLower, (MapUnit)(SFX_MAPUNIT_TWIP), MAP_100TH_MM );
1385         nVal = mpBottomDist->Normalize( nVal );
1386         mpBottomDist->SetValue( nVal, FUNIT_100TH_MM );
1387         mpTbxUL_IncDec->Enable();
1388     }
1389     else if(eState == SFX_ITEM_DISABLED )
1390     {
1391         mpTopDist->Disable();
1392         mpBottomDist->Disable();
1393         mpTbxUL_IncDec->Disable();
1394     }
1395     else
1396     {
1397         mpTopDist->SetEmptyFieldValue();
1398         mpBottomDist->SetEmptyFieldValue();
1399         mpTbxUL_IncDec->Disable();
1400     }
1401 }
1402 
1403 void ParaPropertyPanel::StateChangeOutLineImpl( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
1404 {
1405     if (nSID==SID_OUTLINE_LEFT)
1406     {
1407         if( pState && eState == SFX_ITEM_UNKNOWN )
1408             mbOutLineLeft = 1;
1409         else
1410             mbOutLineLeft = 0;
1411     }
1412     if (nSID==SID_OUTLINE_RIGHT)
1413     {
1414         if( pState && eState == SFX_ITEM_UNKNOWN )
1415             mbOutLineRight = 1;
1416         else
1417             mbOutLineRight = 0;
1418     }
1419     if(mbOutLineLeft)
1420         mpTbxProDemote->EnableItem(BT_TBX_INDENT_DEMOTE, sal_True);
1421     else
1422         mpTbxProDemote->EnableItem(BT_TBX_INDENT_DEMOTE, sal_False);
1423 
1424     if(mbOutLineRight)
1425         mpTbxProDemote->EnableItem(BT_TBX_INDENT_PROMOTE, sal_True);
1426     else
1427         mpTbxProDemote->EnableItem(BT_TBX_INDENT_PROMOTE, sal_False);
1428 
1429 }
1430 
1431 void ParaPropertyPanel::StateChangeIncDecImpl( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
1432 {
1433     if ( ( maContext.GetCombinedContext_DI() == CombinedEnumContext(Application_WriterVariants, Context_Text)
1434            || maContext.GetCombinedContext_DI() == CombinedEnumContext(Application_WriterVariants, Context_Default)
1435            || maContext.GetCombinedContext_DI() ==  CombinedEnumContext(Application_WriterVariants, Context_Table) )
1436          && ( nSID == SID_INC_INDENT || nSID == SID_DEC_INDENT ) )
1437     {
1438         // Writer's text shell is the only one which provides reasonable states for Slots SID_INC_INDENT and SID_DEC_INDENT
1439         // - namely SFX_ITEM_UNKNOWN and SFX_ITEM_DISABLED
1440         mpTbxIndent_IncDec->EnableItem(
1441             nSID == SID_INC_INDENT ? BT_TBX_INDENT_INC : BT_TBX_INDENT_DEC,
1442             ( pState && eState == SFX_ITEM_UNKNOWN ) ? sal_True : sal_False );
1443     }
1444 }
1445 
1446 
1447 // Add toggle state for numbering and bullet icons
1448 void ParaPropertyPanel::StateChangeBulletNumImpl( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
1449 {
1450     if ( (eState >= SFX_ITEM_DEFAULT) && (pState->ISA(SfxBoolItem)) )
1451     {
1452         const SfxBoolItem* pItem= (const SfxBoolItem*)pState;
1453         const sal_Bool aBool = (sal_Bool)pItem->GetValue();
1454         if (nSID==FN_NUM_NUMBERING_ON)
1455         {
1456             mpTBxNumBullet->SetItemState(
1457                 IID_NUMBER,
1458                 aBool ? STATE_CHECK : STATE_NOCHECK );
1459         }
1460         else if (nSID==FN_NUM_BULLET_ON)
1461         {
1462             mpTBxNumBullet->SetItemState(
1463                 IID_BULLET,
1464                 aBool ? STATE_CHECK : STATE_NOCHECK );
1465         }
1466     }
1467 }
1468 
1469 
1470 void ParaPropertyPanel::StateChangeBulletNumRuleImpl( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
1471 {
1472     if ( eState >= SFX_ITEM_DEFAULT && pState->ISA(SfxUInt16Item) )
1473     {
1474         sal_uInt16 nValue = (sal_uInt16)0xFFFF;
1475         {
1476             const SfxUInt16Item* pIt = (const SfxUInt16Item*)pState;
1477             if ( pIt )
1478                 nValue = pIt->GetValue();
1479         }
1480 
1481         if ( nSID == FN_BUL_NUM_RULE_INDEX )
1482         {
1483             mnBulletTypeIndex = nValue;
1484         }
1485         else if ( nSID == FN_NUM_NUM_RULE_INDEX )
1486         {
1487             mnNumTypeIndex = nValue;
1488         }
1489     }
1490 }
1491 
1492 
1493 FieldUnit ParaPropertyPanel::GetCurrentUnit( SfxItemState eState, const SfxPoolItem* pState )
1494 {
1495     FieldUnit eUnit = FUNIT_NONE;
1496 
1497     if ( pState && eState >= SFX_ITEM_DEFAULT )
1498         eUnit = (FieldUnit)( (const SfxUInt16Item*)pState )->GetValue();
1499     else
1500     {
1501         SfxViewFrame* pFrame = SfxViewFrame::Current();
1502         SfxObjectShell* pSh = NULL;
1503         if ( pFrame )
1504             pSh = pFrame->GetObjectShell();
1505         if ( pSh )  //the object shell is not always available during reload
1506         {
1507             SfxModule* pModule = pSh->GetModule();
1508             if ( pModule )
1509             {
1510                 const SfxPoolItem* pItem = pModule->GetItem( SID_ATTR_METRIC );
1511                 if ( pItem )
1512                     eUnit = (FieldUnit)( (SfxUInt16Item*)pItem )->GetValue();
1513             }
1514             else
1515             {
1516                 DBG_ERRORFILE( "GetModuleFieldUnit(): no module found" );
1517             }
1518         }
1519     }
1520 
1521     return eUnit;
1522 }
1523 
1524 
1525 PopupControl* ParaPropertyPanel::CreateLineSpacingControl (PopupContainer* pParent)
1526 {
1527     return new ParaLineSpacingControl(pParent, *this);
1528 }
1529 
1530 PopupControl* ParaPropertyPanel::CreateBulletsPopupControl (PopupContainer* pParent)
1531 {
1532     return new ParaBulletsControl(pParent, *this);
1533 }
1534 
1535 PopupControl* ParaPropertyPanel::CreateNumberingPopupControl (PopupContainer* pParent)
1536 {
1537     return new ParaNumberingControl(pParent, *this);
1538 }
1539 
1540 namespace
1541 {
1542     Color GetNoBackgroundColor(void)
1543     {
1544         return COL_TRANSPARENT;
1545     }
1546 } // end of anonymous namespace
1547 
1548 PopupControl* ParaPropertyPanel::CreateBGColorPopupControl (PopupContainer* pParent)
1549 {
1550     const ResId aResId(SVX_RES(STR_NOFILL));
1551 
1552     return new ColorControl(
1553         pParent,
1554         mpBindings,
1555         SVX_RES(RID_POPUPPANEL_PARAPAGE_BACK_COLOR),
1556         SVX_RES(VS_FONT_COLOR),
1557         ::boost::bind(GetNoBackgroundColor),
1558         ::boost::bind(&ParaPropertyPanel::SetBGColor, this, _1,_2),
1559         pParent,
1560         &aResId);
1561 }
1562 
1563 
1564 ParaPropertyPanel::ParaPropertyPanel(Window* pParent,
1565     const cssu::Reference<css::frame::XFrame>& rxFrame,
1566     SfxBindings* pBindings,
1567     const cssu::Reference<css::ui::XSidebar>& rxSidebar)
1568     : Control(pParent, SVX_RES(RID_SIDEBAR_PARA_PANEL)),
1569       mpAlignToolBoxBackground(ControlFactory::CreateToolBoxBackground(this)),
1570       mpAlignToolBox (ControlFactory::CreateToolBox(mpAlignToolBoxBackground.get(),SVX_RES(TBX_HORIZONTALALIGNMENT))),
1571       mpTBxVertAlignBackground(ControlFactory::CreateToolBoxBackground(this)),
1572       mpTBxVertAlign (ControlFactory::CreateToolBox(mpTBxVertAlignBackground.get(),SVX_RES(TBX_VERT_ALIGN))),
1573       mpTBxNumBulletBackground(ControlFactory::CreateToolBoxBackground(this)),
1574       mpTBxNumBullet (ControlFactory::CreateToolBox(mpTBxNumBulletBackground.get(),SVX_RES(TBX_NUM_BULLET))),
1575       mpTBxBackColorBackground(ControlFactory::CreateToolBoxBackground(this)),
1576       mpTBxBackColor (ControlFactory::CreateToolBox(mpTBxBackColorBackground.get(),SVX_RES(TBX_BACK_COLOR))),
1577       mpFTUL (new FixedText(this, SVX_RES(FT_SPACING))),
1578       mpTbxUL_IncDecBackground(ControlFactory::CreateToolBoxBackground(this)),
1579       mpTbxUL_IncDec (ControlFactory::CreateToolBox(mpTbxUL_IncDecBackground.get(),SVX_RES(TBX_UL_INC_DEC))),
1580       mpTopDist (new SvxRelativeField(this, SVX_RES(MF_ABOVE_PARASPACING))),
1581       mpBottomDist (new SvxRelativeField(this, SVX_RES(MF_BELOW_PARASPACING))),
1582       mpLineSPTbxBackground(ControlFactory::CreateToolBoxBackground(this)),
1583       mpLineSPTbx (ControlFactory::CreateToolBox(mpLineSPTbxBackground.get(),SVX_RES(TBX_LINESP))),
1584       mpFTIndent (new FixedText(this, SVX_RES(FT_INDENT))),
1585       mpTbxIndent_IncDecBackground(ControlFactory::CreateToolBoxBackground(this)),
1586       mpTbxIndent_IncDec (ControlFactory::CreateToolBox(mpTbxIndent_IncDecBackground.get(),SVX_RES(TBX_INDENT_INC_DEC))),
1587       mpTbxProDemoteBackground(ControlFactory::CreateToolBoxBackground(this)),
1588       mpTbxProDemote (ControlFactory::CreateToolBox(mpTbxProDemoteBackground.get(),SVX_RES(TBX_INDENT_PRO_DEMOTE))),
1589       mpLeftIndent (new SvxRelativeField(this, SVX_RES(MF_BEFORE_INDENT))),
1590       mpRightIndent (new SvxRelativeField(this, SVX_RES(MF_AFTER_INDENT))),
1591       mpFLineIndent (new SvxRelativeField(this, SVX_RES(MF_FL_INDENT))),
1592 
1593       mpColorUpdater (),
1594       maFISpace1 ( this, SVX_RES( FI_SPACE1)),
1595       maFISpace2 ( this, SVX_RES( FI_SPACE2)),
1596       maFIndent1 ( this, SVX_RES( FI_INDENT1)),
1597       maFIndent2 ( this, SVX_RES( FI_INDENT2)),
1598       maFIndent3 ( this, SVX_RES( FI_INDENT3)),
1599       maSpace1 (SVX_RES(IMG_SPACE1)),
1600       maSpace2 (SVX_RES(IMG_SPACE2)),
1601       maSpace3 (SVX_RES(IMG_SPACE3)),
1602       maIndent1 (SVX_RES(IMG_INDENT1)),
1603       maIndent2 (SVX_RES(IMG_INDENT2)),
1604       maIndent3 (SVX_RES(IMG_INDENT3)),
1605       maIndHang (SVX_RES(IMG_INDENT_HANG)),
1606       maNumBImageList (SVX_RES(IL_NUM_BULLET)),
1607       maNumBImageListH (SVX_RES(ILH_NUM_BULLET)),
1608       maNumBImageListRTL (SVX_RES(IL_NUM_BULLET_RTL)),
1609       maImgBackColorHigh (SVX_RES(IMG_BACK_COLOR_H)),
1610       maImgBackColor (SVX_RES(IMG_BACK_COLOR)),
1611       maTxtLeft (0),
1612       mpLnSPItem (NULL),
1613       meLnSpState (SFX_ITEM_DONTCARE),
1614       mbOutLineLeft (false),
1615       mbOutLineRight (false),
1616       maUpper (0),
1617       maLower (0),
1618       mnBulletTypeIndex ((sal_uInt16)0xFFFF),
1619       mnNumTypeIndex ((sal_uInt16)0xFFFF),
1620       maColor (COL_AUTO),
1621       mbColorAvailable (true),
1622       m_eLRSpaceUnit(),
1623       m_eULSpaceUnit(),
1624       maLeftAlignControl(SID_ATTR_PARA_ADJUST_LEFT, *pBindings, *this, A2S("LeftPara"), rxFrame),
1625       maCenterAlignControl(SID_ATTR_PARA_ADJUST_CENTER, *pBindings, *this, A2S("CenterPara"), rxFrame),
1626       maRightAlignControl(SID_ATTR_PARA_ADJUST_RIGHT, *pBindings, *this, A2S("RightPara"), rxFrame),
1627       maJustifyAlignControl(SID_ATTR_PARA_ADJUST_BLOCK, *pBindings, *this, A2S("JustifyPara"), rxFrame),
1628       maLRSpaceControl (SID_ATTR_PARA_LRSPACE,*pBindings,*this),
1629       maLNSpaceControl (SID_ATTR_PARA_LINESPACE, *pBindings,*this),
1630       maULSpaceControl (SID_ATTR_PARA_ULSPACE, *pBindings,*this),
1631       maOutLineLeftControl(SID_OUTLINE_LEFT, *pBindings, *this, A2S("OutlineRight"), rxFrame),
1632       maOutLineRightControl(SID_OUTLINE_RIGHT, *pBindings, *this, A2S("OutlineLeft"), rxFrame),
1633       maDecIndentControl(SID_DEC_INDENT, *pBindings,*this, A2S("DecrementIndent"), rxFrame),
1634       maIncIndentControl(SID_INC_INDENT, *pBindings,*this, A2S("IncrementIndent"), rxFrame),
1635       maVertTop (SID_TABLE_VERT_NONE, *pBindings, *this, A2S("CellVertTop"), rxFrame),
1636       maVertCenter (SID_TABLE_VERT_CENTER, *pBindings,*this, A2S("CellVertCenter"), rxFrame),
1637       maVertBottom (SID_TABLE_VERT_BOTTOM,*pBindings,*this, A2S("CellVertBottom"), rxFrame),
1638       maBulletOnOff(FN_NUM_BULLET_ON, *pBindings, *this, A2S("DefaultBullet"), rxFrame),
1639       maNumberOnOff(FN_NUM_NUMBERING_ON, *pBindings, *this, A2S("DefaultNumbering"), rxFrame),
1640       maBackColorControl (SID_BACKGROUND_COLOR, *pBindings,*this),
1641       m_aMetricCtl (SID_ATTR_METRIC, *pBindings,*this),
1642       maBulletNumRuleIndex (FN_BUL_NUM_RULE_INDEX, *pBindings,*this),
1643       maNumNumRuleIndex (FN_NUM_NUM_RULE_INDEX, *pBindings,*this),
1644       mxFrame(rxFrame),
1645       maContext(),
1646       mpBindings(pBindings),
1647       maLineSpacePopup(this, ::boost::bind(&ParaPropertyPanel::CreateLineSpacingControl, this, _1)),
1648       maBulletsPopup(this, ::boost::bind(&ParaPropertyPanel::CreateBulletsPopupControl, this, _1)),
1649       maNumberingPopup(this, ::boost::bind(&ParaPropertyPanel::CreateNumberingPopupControl, this, _1)),
1650       maBGColorPopup(this, ::boost::bind(&ParaPropertyPanel::CreateBGColorPopupControl, this, _1)),
1651       mxSidebar(rxSidebar)
1652 {
1653     initial();
1654     FreeResource();
1655 }
1656 
1657 } } // end of namespace svx::sidebar
1658