xref: /trunk/main/svx/source/sidebar/paragraph/ParaLineSpacingControl.cxx (revision b72581ebb13ed43e856c6be7241afc7224d899dc)
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 "ParaLineSpacingControl.hxx"
24 #include "ParaPropertyPanel.hrc"
25 #include <sfx2/sidebar/ResourceDefinitions.hrc>
26 #include <svx/dialogs.hrc>
27 #include <svx/dialmgr.hxx>
28 #include <unotools/viewoptions.hxx>
29 #include <editeng/kernitem.hxx>
30 #include <sfx2/bindings.hxx>
31 #include <sfx2/dispatch.hxx>
32 #include <sfx2/sidebar/Theme.hxx>
33 #include <svtools/unitconv.hxx>
34 
35 #define _DEFAULT_LINE_SPACING  200
36 #define FIX_DIST_DEF           283
37 #define LINESPACE_1            100
38 #define LINESPACE_15           150
39 #define LINESPACE_2            200
40 #define LINESPACE_115          115
41 
42 #define LLINESPACE_1          0
43 #define LLINESPACE_15         1
44 #define LLINESPACE_2          2
45 #define LLINESPACE_PROP       3
46 #define LLINESPACE_MIN        4
47 #define LLINESPACE_DURCH      5
48 #define LLINESPACE_FIX        6
49 
50 #define DO_NOT_CUSTOM          0
51 #define USE_CUSTOM             1
52 
53 namespace svx { namespace sidebar {
54 
55 
56 ParaLineSpacingControl::ParaLineSpacingControl(Window* pParent, svx::sidebar::ParaPropertyPanel& rPanel)
57 :   PopupControl( pParent,SVX_RES(RID_POPUPPANEL_PARAPAGE_LINESPACING))
58 ,   mrParaPropertyPanel(rPanel)
59 ,   mpBindings(NULL)
60 ,aLineDist              ( this, SVX_RES( LB_LINE_SPACING )),
61 aLineDistAtPercentBox   ( this, SVX_RES( ED_SBINDE_LINEDISTPERCENT ) ),
62 aLineDistAtMetricBox    ( this, SVX_RES( ED_SBINDE_LINEDISTPOINT ) ),
63 maCustomFT        ( this, SVX_RES( FT_CUSTOM ) ),
64 maLSpacingFT      ( this, SVX_RES( FT_LINE_SPACING ) ),
65 maOfFT            ( this, SVX_RES( FT_OF ) ),
66 maSpacing1       (SVX_RES(IMG_SPACING1)),
67 maSpacing115     (SVX_RES(IMG_SPACING115)),
68 maSpacing15      (SVX_RES(IMG_SPACING15)),
69 maSpacing2       (SVX_RES(IMG_SPACING2)),
70 maSelSpacing1    (SVX_RES(IMG_SEL_SPACING1)),
71 maSelSpacing115  (SVX_RES(IMG_SEL_SPACING115)),
72 maSelSpacing15   (SVX_RES(IMG_SEL_SPACING15)),
73 maSelSpacing2    (SVX_RES(IMG_SEL_SPACING2)),
74 maImgCusGrey     (SVX_RES(IMG_CUSTOM_GRAY)),
75 maImgCus         (SVX_RES(IMG_CUSTOM)),
76 maStrCus         (SVX_RES(STR_LCVALUE)),
77 pActLineDistFld         ( &aLineDistAtPercentBox ),
78 nMinFixDist             ( BEGIN_VALUE ),
79 maValue                 ( 0 ),
80 maPos                   ( 0 ),
81 maLineSpacing       (ValueSetWithTextControl::IMAGE_TEXT,this, SVX_RES( LINE_SPACING ) ),
82 mpImg           (NULL),
83 mpImgSel        (NULL),
84 mpStr           (NULL),
85 mpStrTip        (NULL),
86 maLine          (SVX_RES(STR_LSPACING)),
87 maOf            (SVX_RES(STR_LS_OF))
88 , mbUseLineSPCustom             (0)
89 , mbLineSPDisable               (0)
90 {
91     initial();
92     FreeResource();
93     mpBindings = mrParaPropertyPanel.GetBindings();
94 //  m_eLNSpaceUnit = mrParaPropertyPanel.maLNSpaceControl.GetCoreMetric();
95     m_eLNSpaceUnit = SFX_MAPUNIT_100TH_MM;
96 }
97 ParaLineSpacingControl::~ParaLineSpacingControl()
98 {
99     delete[] mpImg;
100     delete[] mpImgSel;
101     delete[] mpStr;
102     delete[] mpStrTip;
103 }
104 
105 void ParaLineSpacingControl::initial()
106 {
107     maLineSpacing.SetStyle( maLineSpacing.GetStyle()| WB_3DLOOK |  WB_NO_DIRECTSELECT  );
108 
109     maLineSpacing.SetControlBackground(
110         GetSettings().GetStyleSettings().GetHighContrastMode()
111         ? GetSettings().GetStyleSettings().GetMenuColor()
112         : sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground ));
113     maLineSpacing.SetColor(
114         GetSettings().GetStyleSettings().GetHighContrastMode()
115         ? GetSettings().GetStyleSettings().GetMenuColor()
116         : sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground ));
117     maLineSpacing.SetBackground(
118         GetSettings().GetStyleSettings().GetHighContrastMode()
119         ? GetSettings().GetStyleSettings().GetMenuColor()
120         : sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground ));
121 
122     mpImg = new Image[4];
123     mpImg[0] = maSpacing1;
124     mpImg[1] = maSpacing115;
125     mpImg[2] = maSpacing15;
126     mpImg[3] = maSpacing2;
127 
128     mpImgSel = new Image[4];
129     mpImgSel[0] = maSelSpacing1;
130     mpImgSel[1] = maSelSpacing115;
131     mpImgSel[2] = maSelSpacing15;
132     mpImgSel[3] = maSelSpacing2;
133 
134     mpStr = new XubString[4];
135     mpStr[0] = XubString(SVX_RES(STR_SPACING1));
136     mpStr[1] = XubString(SVX_RES(STR_SPACING115));
137     mpStr[2] = XubString(SVX_RES(STR_SPACING15));
138     mpStr[3] = XubString(SVX_RES(STR_SPACING2));
139 
140     mpStrTip = new XubString[4];
141     mpStrTip[0] = XubString(SVX_RES(STR_LS_SINGLE));
142     mpStrTip[1] = XubString(SVX_RES(STR_LS_115));
143     mpStrTip[2] = XubString(SVX_RES(STR_LS_15));
144     mpStrTip[3] = XubString(SVX_RES(STR_LS_DOUBLE));
145     for (int i=0;i<4;i++)
146         maLineSpacing.AddItem(mpImg[i], &mpImgSel[i],mpStr[i],&mpStrTip[i]);
147 
148     maLineSpacing.AddItem( maImgCus, 0, maStrCus, 0 );
149 
150     SetAllNoSel();
151     Link aLink = LINK(this, ParaLineSpacingControl,VSSelHdl );
152     maLineSpacing.SetSelectHdl(aLink);
153     maLineSpacing.StartSelection();
154     maLineSpacing.Show();
155 
156     aLink = LINK( this, ParaLineSpacingControl, LineSPDistHdl_Impl );
157     aLineDist.SetSelectHdl(aLink);
158     aLineDist.SelectEntryPos( LLINESPACE_1 ) ;
159     aLink = LINK( this, ParaLineSpacingControl, LineSPDistAtHdl_Impl );
160     aLineDistAtPercentBox.SetModifyHdl( aLink );
161     aLineDistAtMetricBox.SetModifyHdl( aLink );
162 }
163 
164 
165 void ParaLineSpacingControl::PopupModeEndCallback()
166 {
167     if( mbUseLineSPCustom )
168     {
169         //maLinePos = mpLineSPPage->maPos;
170         //maLineValue = mpLineSPPage->maValue;
171 
172         SvtViewOptions aWinOpt( E_WINDOW, LSP_POS_GLOBAL_VALUE );
173         ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq(1);
174         aSeq[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("maLinePos") );
175         aSeq[0].Value <<= ::rtl::OUString( String::CreateFromInt64( maPos ));
176         aWinOpt.SetUserData( aSeq );
177 
178         SvtViewOptions aWinOpt2( E_WINDOW, LSP_LV_GLOBAL_VALUE );
179         aSeq[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("maLineValue") );
180         aSeq[0].Value <<= ::rtl::OUString( String::CreateFromInt64( maValue ));
181         aWinOpt2.SetUserData( aSeq );
182     }
183 }
184 
185 void ParaLineSpacingControl::Rearrange(SfxItemState currSPState,FieldUnit currMetricUnit,SvxLineSpacingItem* currSPItem,const ::sfx2::sidebar::EnumContext currentContext)
186 {
187     SvtViewOptions aWinOpt( E_WINDOW, LSP_POS_GLOBAL_VALUE );
188     if ( aWinOpt.Exists() )
189     {
190         ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq = aWinOpt.GetUserData();
191         ::rtl::OUString aTmp;
192         if ( aSeq.getLength())
193             aSeq[0].Value >>= aTmp;
194 
195         String aWinData( aTmp );
196         maPos = (sal_uInt16)aWinData.ToInt32();
197     }
198 
199     SvtViewOptions aWinOpt2( E_WINDOW, LSP_LV_GLOBAL_VALUE );
200     if ( aWinOpt2.Exists() )
201     {
202         ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq = aWinOpt2.GetUserData();
203         ::rtl::OUString aTmp;
204         if ( aSeq.getLength())
205             aSeq[0].Value >>= aTmp;
206 
207         String aWinData( aTmp );
208         maValue = (sal_uInt16)aWinData.ToInt32();
209     }
210     String sHelpText;
211     switch(maPos)
212     {
213         case LLINESPACE_1:
214             sHelpText += mpStrTip[0];
215             break;
216         case LLINESPACE_15:
217             sHelpText += mpStrTip[2];
218             break;
219         case LLINESPACE_2:
220             sHelpText += mpStrTip[3];
221             break;
222         case LLINESPACE_PROP:
223             sHelpText +=maLine;
224             sHelpText.Append(String("Proportion: ", 12, RTL_TEXTENCODING_ASCII_US));
225             sHelpText += maOf;
226             sHelpText.Append( String::CreateFromInt64( maValue ));
227             break;
228         case LLINESPACE_MIN:
229             sHelpText += maLine;
230             sHelpText.Append(String("At Least: ", 10, RTL_TEXTENCODING_ASCII_US));
231             sHelpText += maOf;
232             sHelpText.Append( String::CreateFromInt64( maValue ));
233             break;
234         case LLINESPACE_DURCH:
235             sHelpText += maLine;
236             sHelpText.Append(String("Leading: ", 9, RTL_TEXTENCODING_ASCII_US));
237             sHelpText += maOf;
238             sHelpText.Append( String::CreateFromInt64( maValue ));
239             break;
240         case LLINESPACE_FIX:
241             sHelpText += maLine;
242             sHelpText.Append(String("Fixed: ", 7, RTL_TEXTENCODING_ASCII_US));
243             sHelpText += maOf;
244             sHelpText.Append( String::CreateFromInt64( maValue ));
245             break;
246     }
247     if( !aWinOpt.Exists() && !aWinOpt2.Exists() )
248         mbLineSPDisable = sal_True;
249     else
250         mbLineSPDisable = sal_False;
251 
252     if( mbLineSPDisable )
253         maLineSpacing.ReplaceItemImages(5, maImgCusGrey,0);
254     else
255     {
256         maLineSpacing.ReplaceItemImages(5, maImgCus,0);
257         maLineSpacing.SetItemText(5,sHelpText);
258     }
259 
260     SfxItemState eState = currSPState;
261 
262     SetFieldUnit( aLineDistAtMetricBox, currMetricUnit );
263 
264 //  mpLineSPPage->SetAllNoSel();
265     aLineDist.Enable();
266     pActLineDistFld->Enable();
267     pActLineDistFld->SetText( String() );
268     bool bValueSetFocus = sal_False;        //wj
269 
270     if( eState >= SFX_ITEM_AVAILABLE )
271     {
272     //  SfxMapUnit eUnit = maLNSpaceControl.GetCoreMetric();
273         SfxMapUnit eUnit = SFX_MAPUNIT_100TH_MM;
274         m_eLNSpaceUnit = eUnit;
275 
276         switch( currSPItem->GetLineSpaceRule() )
277         {
278         case SVX_LINE_SPACE_AUTO:
279             {
280                 SvxInterLineSpace eInter = currSPItem->GetInterLineSpaceRule();
281 
282                 switch( eInter )
283                 {
284                 case SVX_INTER_LINE_SPACE_OFF:
285                     {
286                         aLineDist.SelectEntryPos( LLINESPACE_1 );
287                         pActLineDistFld->Disable();
288                         pActLineDistFld->SetText( String() );
289                         mbUseLineSPCustom = DO_NOT_CUSTOM;
290                         if ( LINESPACE_1 == currSPItem->GetPropLineSpace() )
291                         {
292                             maLineSpacing.SelectItem(1);
293                             bValueSetFocus = sal_True;  //wj
294                         }
295                     }
296                     break;
297 
298                 case SVX_INTER_LINE_SPACE_PROP:
299                     {
300                         if ( LINESPACE_1 == currSPItem->GetPropLineSpace() )
301                         {
302                             aLineDist.SelectEntryPos( LLINESPACE_1 );
303                             pActLineDistFld->Disable();
304                             pActLineDistFld->SetText( String() );
305                             mbUseLineSPCustom = DO_NOT_CUSTOM;
306                             maLineSpacing.SelectItem(1);
307                             bValueSetFocus = sal_True;  //wj
308                             break;
309                         }
310                         if ( LINESPACE_15 == currSPItem->GetPropLineSpace() )
311                         {
312                             aLineDist.SelectEntryPos( LLINESPACE_15 );
313                             pActLineDistFld->Disable();
314                             pActLineDistFld->SetText( String() );
315 
316                             mbUseLineSPCustom = DO_NOT_CUSTOM;
317                             maLineSpacing.SelectItem(3);
318                             bValueSetFocus = sal_True;  //wj
319                             break;
320                         }
321                         if ( LINESPACE_2 == currSPItem->GetPropLineSpace() )
322                         {
323                             aLineDist.SelectEntryPos( LLINESPACE_2 );
324                             pActLineDistFld->Disable();
325                             pActLineDistFld->SetText( String() );
326 
327                             mbUseLineSPCustom = DO_NOT_CUSTOM;
328                             maLineSpacing.SelectItem(4);
329                             bValueSetFocus = sal_True;  //wj
330                             break;
331                         }
332 
333                         aLineDist.SelectEntryPos( LLINESPACE_PROP );
334                         if(pActLineDistFld != &(aLineDistAtPercentBox))
335                         {
336                             pActLineDistFld->Disable();
337                             pActLineDistFld->Hide();
338                             pActLineDistFld = &(aLineDistAtPercentBox);
339                         }
340                         else
341                         {
342                             pActLineDistFld = &(aLineDistAtMetricBox);
343                             pActLineDistFld->Disable();
344                             pActLineDistFld->Hide();
345                             pActLineDistFld = &(aLineDistAtPercentBox);
346                         }
347                         pActLineDistFld->Enable();
348                         pActLineDistFld->Show();
349                         aLineDistAtPercentBox.
350                             SetValue( aLineDistAtPercentBox.Normalize(
351                             currSPItem->GetPropLineSpace() ) );
352 
353                         if( currSPItem->GetPropLineSpace() == LINESPACE_115 )
354                         {
355                             mbUseLineSPCustom = DO_NOT_CUSTOM;
356                             maLineSpacing.SelectItem(2);
357                             bValueSetFocus = sal_True;  //wj
358                         }
359                         else
360                         {
361                             mbUseLineSPCustom = USE_CUSTOM;
362                             maLineSpacing.SetNoSelection();
363                                                  maLineSpacing.SelectItem(0);
364                         }
365                     }
366                     break;
367 
368                 case SVX_INTER_LINE_SPACE_FIX:
369                     {
370                         if(pActLineDistFld != &(aLineDistAtMetricBox))
371                         {
372                             pActLineDistFld->Disable();
373                             pActLineDistFld->Hide();
374                             pActLineDistFld = &(aLineDistAtMetricBox);
375                         }
376                         else
377                         {
378                             pActLineDistFld = &(aLineDistAtPercentBox);
379                             pActLineDistFld->Disable();
380                             pActLineDistFld->Hide();
381                             pActLineDistFld = &(aLineDistAtMetricBox);
382                         }
383                         pActLineDistFld->Enable();
384                         pActLineDistFld->Show();
385                         maLineSpacing.SetNoSelection();
386                                           maLineSpacing.SelectItem(0);
387 
388                         SetMetricValue( aLineDistAtMetricBox,
389                             currSPItem->GetInterLineSpace(), eUnit );
390                         aLineDist.SelectEntryPos( LLINESPACE_DURCH );
391 
392                         mbUseLineSPCustom = USE_CUSTOM;
393                     }
394                     break;
395                 }
396             }
397             break;
398         case SVX_LINE_SPACE_FIX:
399             {
400                 if(pActLineDistFld != &(aLineDistAtMetricBox))
401                 {
402                     pActLineDistFld->Disable();
403                     pActLineDistFld->Hide();
404                     pActLineDistFld = &(aLineDistAtMetricBox);
405                 }
406                 else
407                 {
408                     pActLineDistFld = &(aLineDistAtPercentBox);
409                     pActLineDistFld->Disable();
410                     pActLineDistFld->Hide();
411                     pActLineDistFld = &(aLineDistAtMetricBox);
412                 }
413                 pActLineDistFld->Enable();
414                 pActLineDistFld->Show();
415                 maLineSpacing.SetNoSelection();
416                             maLineSpacing.SelectItem(0);
417 
418                 SetMetricValue(aLineDistAtMetricBox, currSPItem->GetLineHeight(), eUnit);
419                 aLineDist.SelectEntryPos( LLINESPACE_FIX );
420 
421                 mbUseLineSPCustom = USE_CUSTOM;
422             }
423             break;
424 
425         case SVX_LINE_SPACE_MIN:
426             {
427                 if(pActLineDistFld != &(aLineDistAtMetricBox))
428                 {
429                     pActLineDistFld->Disable();
430                     pActLineDistFld->Hide();
431                     pActLineDistFld = &(aLineDistAtMetricBox);
432                 }
433                 else
434                 {
435                     pActLineDistFld = &(aLineDistAtPercentBox);
436                     pActLineDistFld->Disable();
437                     pActLineDistFld->Hide();
438                     pActLineDistFld = &(aLineDistAtMetricBox);
439                 }
440                 pActLineDistFld->Enable();
441                 pActLineDistFld->Show();
442                 maLineSpacing.SetNoSelection();
443                             maLineSpacing.SelectItem(0);
444 
445                 SetMetricValue(aLineDistAtMetricBox, currSPItem->GetLineHeight(), eUnit);
446                 aLineDist.SelectEntryPos( LLINESPACE_MIN );
447                 mbUseLineSPCustom = USE_CUSTOM;
448             }
449             break;
450         }
451     }
452     else if( eState == SFX_ITEM_DISABLED )
453     {
454         aLineDist.Disable();
455         pActLineDistFld->Enable(sal_False);
456         pActLineDistFld->SetText( String() );
457         maLineSpacing.SetNoSelection();
458               maLineSpacing.SelectItem(0);
459 
460         mbUseLineSPCustom = DO_NOT_CUSTOM;
461     }
462     else
463     {
464         pActLineDistFld->Enable(sal_False);
465         pActLineDistFld->SetText( String() );
466         aLineDist.SetNoSelection();
467         maLineSpacing.SetNoSelection();
468               maLineSpacing.SelectItem(0);
469         mbUseLineSPCustom = DO_NOT_CUSTOM;
470     }
471 
472     aLineDist.SaveValue();
473 
474     const sal_uInt16 uCount = aLineDist.GetEntryCount();
475     if( uCount == LLINESPACE_FIX + 1 )
476     {
477         switch (currentContext.GetCombinedContext_DI())
478         {
479         case CombinedEnumContext(Application_DrawImpress, Context_Table):
480         case CombinedEnumContext(Application_DrawImpress, Context_DrawText):
481         case CombinedEnumContext(Application_DrawImpress, Context_Draw):
482         case CombinedEnumContext(Application_DrawImpress, Context_TextObject):
483         case CombinedEnumContext(Application_DrawImpress, Context_Graphic):
484         case CombinedEnumContext(Application_Calc, Context_DrawText):
485         case CombinedEnumContext(Application_WriterVariants, Context_DrawText):
486         case CombinedEnumContext(Application_WriterVariants, Context_Annotation):
487             {
488                 aLineDist.RemoveEntry(LLINESPACE_FIX);
489             }
490         }
491     }
492     else if( uCount == LLINESPACE_FIX)
493     {
494         switch (currentContext.GetCombinedContext_DI())
495         {
496             case CombinedEnumContext(Application_WriterVariants, Context_Default):
497             case CombinedEnumContext(Application_WriterVariants, Context_Text):
498             case CombinedEnumContext(Application_WriterVariants, Context_Table):
499             {
500                 aLineDist.InsertEntry(String::CreateFromAscii("Fixed"), LLINESPACE_FIX);
501             }
502         }
503     }
504     maLineSpacing.Format();
505     maLineSpacing.StartSelection();
506 }
507 
508 void ParaLineSpacingControl::SetAllNoSel()
509 {
510     maLineSpacing.SelectItem(1);
511     maLineSpacing.SetNoSelection();
512 }
513 
514 IMPL_LINK( ParaLineSpacingControl, LineSPDistHdl_Impl, ListBox*, pBox )
515 {
516     maLineSpacing.SetNoSelection();
517        maLineSpacing.SelectItem(0);
518     maLineSpacing.Format();
519     maLineSpacing.StartSelection();
520 
521     switch( pBox->GetSelectEntryPos() )
522     {
523         case LLINESPACE_1:
524         case LLINESPACE_15:
525         case LLINESPACE_2:
526             pActLineDistFld->Enable(sal_False);
527             pActLineDistFld->SetText( String() );
528             break;
529 
530         case LLINESPACE_DURCH:
531             aLineDistAtPercentBox.Hide();
532             pActLineDistFld = &aLineDistAtMetricBox;
533             aLineDistAtMetricBox.SetMin(0);
534 
535 
536             if ( !aLineDistAtMetricBox.GetText().Len() )
537                 aLineDistAtMetricBox.SetValue(
538                     aLineDistAtMetricBox.Normalize( 0 ) );
539             aLineDistAtPercentBox.Hide();
540             pActLineDistFld->Show();
541             pActLineDistFld->Enable();
542             break;
543 
544         case LLINESPACE_MIN:
545             aLineDistAtPercentBox.Hide();
546             pActLineDistFld = &aLineDistAtMetricBox;
547             aLineDistAtMetricBox.SetMin(0);
548 
549             if ( !aLineDistAtMetricBox.GetText().Len() )
550                 aLineDistAtMetricBox.SetValue(
551                     aLineDistAtMetricBox.Normalize( 0 ), FUNIT_TWIP );
552             aLineDistAtPercentBox.Hide();
553             pActLineDistFld->Show();
554             pActLineDistFld->Enable();
555             break;
556 
557         case LLINESPACE_PROP:
558             aLineDistAtMetricBox.Hide();
559             pActLineDistFld = &aLineDistAtPercentBox;
560 
561             if ( !aLineDistAtPercentBox.GetText().Len() )
562                 aLineDistAtPercentBox.SetValue(
563                     aLineDistAtPercentBox.Normalize( 100 ), FUNIT_TWIP );
564             aLineDistAtMetricBox.Hide();
565             pActLineDistFld->Show();
566             pActLineDistFld->Enable();
567             break;
568         case LLINESPACE_FIX:
569         {
570             aLineDistAtPercentBox.Hide();
571             pActLineDistFld = &aLineDistAtMetricBox;
572             sal_Int64 nTemp = aLineDistAtMetricBox.GetValue();
573             aLineDistAtMetricBox.SetMin(aLineDistAtMetricBox.Normalize(nMinFixDist), FUNIT_TWIP);
574 
575             if ( aLineDistAtMetricBox.GetValue() != nTemp )
576                 SetMetricValue( aLineDistAtMetricBox,
577                                     FIX_DIST_DEF, SFX_MAPUNIT_TWIP );
578             aLineDistAtPercentBox.Hide();
579             pActLineDistFld->Show();
580             pActLineDistFld->Enable();
581         }
582         break;
583     }
584     ExecuteLineSpace();
585     return 0;
586 }
587 
588 IMPL_LINK( ParaLineSpacingControl, LineSPDistAtHdl_Impl, MetricField*, /* pBox */ )
589 {
590     ExecuteLineSpace();
591     return (0L);
592 }
593 
594 void ParaLineSpacingControl::ExecuteLineSpace()
595 {
596     aLineDist.SaveValue();
597     maLineSpacing.SetNoSelection();
598 
599     SvxLineSpacingItem aSpacing(_DEFAULT_LINE_SPACING, SID_ATTR_PARA_LINESPACE);
600     sal_uInt16 nPos = aLineDist.GetSelectEntryPos();
601 
602     switch ( nPos )
603     {
604         case LLINESPACE_1:
605         case LLINESPACE_15:
606         case LLINESPACE_2:
607             {
608                 SetLineSpace( aSpacing, nPos );
609                 maPos = nPos;
610             }
611             break;
612 
613         case LLINESPACE_PROP:
614             {
615                 SetLineSpace( aSpacing, nPos,
616                     aLineDistAtPercentBox.Denormalize(
617                     (long)aLineDistAtPercentBox.GetValue() ) );
618                 maPos = nPos;
619                 maValue =aLineDistAtPercentBox.GetValue();
620             }
621             break;
622 
623         case LLINESPACE_MIN:
624         case LLINESPACE_DURCH:
625         case LLINESPACE_FIX:
626             {
627                 SetLineSpace( aSpacing, nPos,
628                     GetCoreValue( aLineDistAtMetricBox, m_eLNSpaceUnit ) );
629                 maPos = nPos;
630                 maValue = GetCoreValue( aLineDistAtMetricBox, m_eLNSpaceUnit );
631             }
632         break;
633 
634         default:
635             DBG_ERROR( "error!!" );
636             break;
637     }
638 
639     mpBindings->GetDispatcher()->Execute(
640             SID_ATTR_PARA_LINESPACE, SFX_CALLMODE_RECORD, &aSpacing, 0L);
641 
642     mbUseLineSPCustom = USE_CUSTOM;
643 }
644 
645 void ParaLineSpacingControl::SetLineSpace( SvxLineSpacingItem& rLineSpace,
646                         int eSpace, long lValue )
647 {
648     switch ( eSpace )
649     {
650         case LLINESPACE_1:
651             rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
652             rLineSpace.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
653             break;
654 
655         case LLINESPACE_15:
656             rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
657             rLineSpace.SetPropLineSpace( LINESPACE_15 );
658             break;
659 
660         case LLINESPACE_2:
661             rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
662             rLineSpace.SetPropLineSpace( LINESPACE_2 );
663             break;
664 
665         case LLINESPACE_PROP:
666             rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
667             rLineSpace.SetPropLineSpace( (sal_uInt8)lValue );
668             break;
669 
670         case LLINESPACE_MIN:
671             rLineSpace.SetLineHeight( (sal_uInt16)lValue );
672             rLineSpace.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
673             break;
674 
675         case LLINESPACE_DURCH:
676             rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
677             rLineSpace.SetInterLineSpace( (sal_uInt16)lValue );
678             break;
679 
680         case LLINESPACE_FIX:
681             rLineSpace.SetLineHeight((sal_uInt16)lValue);
682             rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_FIX;
683             rLineSpace.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
684         break;
685     }
686 }
687 
688 IMPL_LINK(ParaLineSpacingControl, VSSelHdl, void *, pControl)
689 {
690     maLineSpacing.SetNoSelection();
691     bool bClosePop = true;
692     if(pControl == &maLineSpacing)
693     {
694         sal_uInt16 iPos = maLineSpacing.GetSelectItemId();
695         switch ( iPos )
696         {
697             case 1:
698                 ExecuteLineSpacing( 0, 0 );
699                 break;
700             case 2:
701                 ExecuteLineSpacing( 0, 3 );
702                 break;
703             case 3:
704                 ExecuteLineSpacing( 0, 1 );
705                 break;
706             case 4:
707                 ExecuteLineSpacing( 0, 2 );
708                 break;
709             case 5:
710                 {
711                     if(!(mbLineSPDisable))
712                     {
713                         //maPos = mrParaPropertyPanel.maLinePos;
714                         aLineDist.SelectEntryPos( maPos ) ;
715                         aLineDist.SaveValue();
716                         //maValue = mrParaPropertyPanel.maLineValue;
717 
718                         SvxLineSpacingItem aSpacing(_DEFAULT_LINE_SPACING, SID_ATTR_PARA_LINESPACE);
719                         switch(maPos)
720                         {
721                         case LLINESPACE_1:
722                         case LLINESPACE_15:
723                         case LLINESPACE_2:
724                             SetLineSpace( aSpacing, maPos );
725                             break;
726 
727                         case LLINESPACE_PROP:
728                             SetLineSpace( aSpacing, maPos,
729                                 aLineDistAtPercentBox.Denormalize( (long)maValue ) );
730                             break;
731 
732                         case LLINESPACE_MIN:
733                         case LLINESPACE_DURCH:
734                         case LLINESPACE_FIX:
735                             SetLineSpace( aSpacing, maPos, (long)maValue );
736                             break;
737                         }
738 
739                         mpBindings->GetDispatcher()->Execute(
740                             SID_ATTR_PARA_LINESPACE, SFX_CALLMODE_RECORD, &aSpacing, 0L);
741 
742                         ExecuteLineSpacing( USE_CUSTOM, 0 );
743                     }
744                     else
745                         bClosePop = sal_False;
746                 }
747                 break;
748         }
749     }
750     if(bClosePop)
751         mrParaPropertyPanel.EndSpacingPopupMode();
752     return 0;
753 }
754 
755 void ParaLineSpacingControl::ExecuteLineSpacing( sal_uInt16 aIsCustom, sal_uInt16 aEntry )
756 {
757     if( !aIsCustom )
758     {
759         aLineDist.SelectEntryPos( aEntry ) ;
760         aLineDist.SaveValue();
761         SvxLineSpacingItem aSpacing(_DEFAULT_LINE_SPACING, SID_ATTR_PARA_LINESPACE);
762         sal_uInt16 nPos = aEntry;
763         if( aEntry == LLINESPACE_PROP )
764             SetLineSpace( aSpacing, nPos, aLineDistAtPercentBox.Denormalize( (long)115 ) );
765         else
766             SetLineSpace( aSpacing, nPos );
767 
768         mpBindings->GetDispatcher()->Execute(
769             SID_ATTR_PARA_LINESPACE, SFX_CALLMODE_RECORD, &aSpacing, 0L);
770     }
771 
772     if( !aIsCustom )
773     {
774         mbUseLineSPCustom = DO_NOT_CUSTOM;
775         mrParaPropertyPanel.EndSpacingPopupMode();
776     }
777     maLineSpacing.SetNoSelection();
778 }
779 
780 }} // end of namespace sidebar
781 
782