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 	mbUseLineSPCustom	(0),
59 	mbLineSPDisable		(0),
60 	mrParaPropertyPanel	(rPanel),
61 	mpBindings		(NULL),
62 	nMinFixDist		(BEGIN_VALUE),
63 	pActLineDistFld 	(&aLineDistAtPercentBox),
64 	maLineSpacing		(ValueSetWithTextControl::IMAGE_TEXT,this, SVX_RES(LINE_SPACING)),
65 	maCustomFT		(this, SVX_RES(FT_CUSTOM)),
66 	maLSpacingFT		(this, SVX_RES(FT_LINE_SPACING)),
67 	aLineDist		(this, SVX_RES(LB_LINE_SPACING)),
68 	maOfFT			(this, SVX_RES(FT_OF)),
69 	aLineDistAtPercentBox	(this, SVX_RES(ED_SBINDE_LINEDISTPERCENT)),
70 	aLineDistAtMetricBox	(this, SVX_RES(ED_SBINDE_LINEDISTPOINT)),
71 	maSpacing1		(SVX_RES(IMG_SPACING1)),
72 	maSpacing115		(SVX_RES(IMG_SPACING115)),
73 	maSpacing15		(SVX_RES(IMG_SPACING15)),
74 	maSpacing2		(SVX_RES(IMG_SPACING2)),
75 	maSelSpacing1		(SVX_RES(IMG_SEL_SPACING1)),
76 	maSelSpacing115		(SVX_RES(IMG_SEL_SPACING115)),
77 	maSelSpacing15		(SVX_RES(IMG_SEL_SPACING15)),
78 	maSelSpacing2		(SVX_RES(IMG_SEL_SPACING2)),
79 	maImgCus		(SVX_RES(IMG_CUSTOM)),
80 	maImgCusGrey		(SVX_RES(IMG_CUSTOM_GRAY)),
81 	maStrCus		(SVX_RES(STR_LCVALUE)),
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 	maValue                 (0),
89 	maPos                   (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 				default:
396 					break;
397 				}
398 			}
399 			break;
400 		case SVX_LINE_SPACE_FIX:
401 			{
402 				if(pActLineDistFld != &(aLineDistAtMetricBox))
403 				{
404 					pActLineDistFld->Disable();
405 					pActLineDistFld->Hide();
406 					pActLineDistFld = &(aLineDistAtMetricBox);
407 				}
408 				else
409 				{
410 					pActLineDistFld = &(aLineDistAtPercentBox);
411 					pActLineDistFld->Disable();
412 					pActLineDistFld->Hide();
413 					pActLineDistFld = &(aLineDistAtMetricBox);
414 				}
415 				pActLineDistFld->Enable();
416 				pActLineDistFld->Show();
417 				maLineSpacing.SetNoSelection();
418                             maLineSpacing.SelectItem(0);
419 
420 				SetMetricValue(aLineDistAtMetricBox, currSPItem->GetLineHeight(), eUnit);
421 				aLineDist.SelectEntryPos( LLINESPACE_FIX );
422 
423 				mbUseLineSPCustom = USE_CUSTOM;
424 			}
425 			break;
426 
427 		case SVX_LINE_SPACE_MIN:
428 			{
429 				if(pActLineDistFld != &(aLineDistAtMetricBox))
430 				{
431 					pActLineDistFld->Disable();
432 					pActLineDistFld->Hide();
433 					pActLineDistFld = &(aLineDistAtMetricBox);
434 				}
435 				else
436 				{
437 					pActLineDistFld = &(aLineDistAtPercentBox);
438 					pActLineDistFld->Disable();
439 					pActLineDistFld->Hide();
440 					pActLineDistFld = &(aLineDistAtMetricBox);
441 				}
442 				pActLineDistFld->Enable();
443 				pActLineDistFld->Show();
444 				maLineSpacing.SetNoSelection();
445                             maLineSpacing.SelectItem(0);
446 
447 				SetMetricValue(aLineDistAtMetricBox, currSPItem->GetLineHeight(), eUnit);
448 				aLineDist.SelectEntryPos( LLINESPACE_MIN );
449 				mbUseLineSPCustom = USE_CUSTOM;
450 			}
451 			break;
452 		default:
453 			break;
454 		}
455 	}
456 	else if( eState == SFX_ITEM_DISABLED )
457 	{
458 		aLineDist.Disable();
459 		pActLineDistFld->Enable(sal_False);
460 		pActLineDistFld->SetText( String() );
461 		maLineSpacing.SetNoSelection();
462               maLineSpacing.SelectItem(0);
463 
464 	    mbUseLineSPCustom = DO_NOT_CUSTOM;
465 	}
466 	else
467 	{
468 		pActLineDistFld->Enable(sal_False);
469 		pActLineDistFld->SetText( String() );
470 		aLineDist.SetNoSelection();
471 		maLineSpacing.SetNoSelection();
472               maLineSpacing.SelectItem(0);
473 		mbUseLineSPCustom = DO_NOT_CUSTOM;
474 	}
475 
476 	aLineDist.SaveValue();
477 
478     const sal_uInt16 uCount = aLineDist.GetEntryCount();
479     if( uCount == LLINESPACE_FIX + 1 )
480     {
481         switch (currentContext.GetCombinedContext_DI())
482         {
483         case CombinedEnumContext(Application_DrawImpress, Context_Table):
484         case CombinedEnumContext(Application_DrawImpress, Context_DrawText):
485         case CombinedEnumContext(Application_DrawImpress, Context_Draw):
486         case CombinedEnumContext(Application_DrawImpress, Context_TextObject):
487         case CombinedEnumContext(Application_DrawImpress, Context_Graphic):
488         case CombinedEnumContext(Application_Calc, Context_DrawText):
489         case CombinedEnumContext(Application_WriterVariants, Context_DrawText):
490         case CombinedEnumContext(Application_WriterVariants, Context_Annotation):
491             {
492                 aLineDist.RemoveEntry(LLINESPACE_FIX);
493             }
494         }
495     }
496     else if( uCount == LLINESPACE_FIX)
497     {
498         switch (currentContext.GetCombinedContext_DI())
499         {
500             case CombinedEnumContext(Application_WriterVariants, Context_Default):
501             case CombinedEnumContext(Application_WriterVariants, Context_Text):
502             case CombinedEnumContext(Application_WriterVariants, Context_Table):
503             {
504                 aLineDist.InsertEntry(String::CreateFromAscii("Fixed"), LLINESPACE_FIX);
505             }
506         }
507     }
508     maLineSpacing.Format();
509     maLineSpacing.StartSelection();
510 }
511 
512 void ParaLineSpacingControl::SetAllNoSel()
513 {
514 	maLineSpacing.SelectItem(1);
515 	maLineSpacing.SetNoSelection();
516 }
517 
518 IMPL_LINK( ParaLineSpacingControl, LineSPDistHdl_Impl, ListBox*, pBox )
519 {
520 	maLineSpacing.SetNoSelection();
521        maLineSpacing.SelectItem(0);
522 	maLineSpacing.Format();
523 	maLineSpacing.StartSelection();
524 
525 	switch( pBox->GetSelectEntryPos() )
526 	{
527 		case LLINESPACE_1:
528 		case LLINESPACE_15:
529 		case LLINESPACE_2:
530 			pActLineDistFld->Enable(sal_False);
531 			pActLineDistFld->SetText( String() );
532 			break;
533 
534 		case LLINESPACE_DURCH:
535 			aLineDistAtPercentBox.Hide();
536 			pActLineDistFld = &aLineDistAtMetricBox;
537 			aLineDistAtMetricBox.SetMin(0);
538 
539 
540 			if ( !aLineDistAtMetricBox.GetText().Len() )
541 				aLineDistAtMetricBox.SetValue(
542 					aLineDistAtMetricBox.Normalize( 0 ) );
543 			aLineDistAtPercentBox.Hide();
544 			pActLineDistFld->Show();
545 			pActLineDistFld->Enable();
546 			break;
547 
548 		case LLINESPACE_MIN:
549 			aLineDistAtPercentBox.Hide();
550 			pActLineDistFld = &aLineDistAtMetricBox;
551 			aLineDistAtMetricBox.SetMin(0);
552 
553 			if ( !aLineDistAtMetricBox.GetText().Len() )
554 				aLineDistAtMetricBox.SetValue(
555 					aLineDistAtMetricBox.Normalize( 0 ), FUNIT_TWIP );
556 			aLineDistAtPercentBox.Hide();
557 			pActLineDistFld->Show();
558 			pActLineDistFld->Enable();
559 			break;
560 
561 		case LLINESPACE_PROP:
562 			aLineDistAtMetricBox.Hide();
563 			pActLineDistFld = &aLineDistAtPercentBox;
564 
565 			if ( !aLineDistAtPercentBox.GetText().Len() )
566 				aLineDistAtPercentBox.SetValue(
567 					aLineDistAtPercentBox.Normalize( 100 ), FUNIT_TWIP );
568 			aLineDistAtMetricBox.Hide();
569 			pActLineDistFld->Show();
570 			pActLineDistFld->Enable();
571 			break;
572 		case LLINESPACE_FIX:
573 		{
574 			aLineDistAtPercentBox.Hide();
575 			pActLineDistFld = &aLineDistAtMetricBox;
576 			sal_Int64 nTemp = aLineDistAtMetricBox.GetValue();
577 			aLineDistAtMetricBox.SetMin(aLineDistAtMetricBox.Normalize(nMinFixDist), FUNIT_TWIP);
578 
579 			if ( aLineDistAtMetricBox.GetValue() != nTemp )
580 				SetMetricValue( aLineDistAtMetricBox,
581 									FIX_DIST_DEF, SFX_MAPUNIT_TWIP );
582 			aLineDistAtPercentBox.Hide();
583 			pActLineDistFld->Show();
584 			pActLineDistFld->Enable();
585 		}
586 		break;
587 	}
588 	ExecuteLineSpace();
589 	return 0;
590 }
591 
592 IMPL_LINK( ParaLineSpacingControl, LineSPDistAtHdl_Impl, MetricField*, /* pBox */ )
593 {
594 	ExecuteLineSpace();
595 	return (0L);
596 }
597 
598 void ParaLineSpacingControl::ExecuteLineSpace()
599 {
600 	aLineDist.SaveValue();
601 	maLineSpacing.SetNoSelection();
602 
603 	SvxLineSpacingItem aSpacing(_DEFAULT_LINE_SPACING, SID_ATTR_PARA_LINESPACE);
604 	sal_uInt16 nPos = aLineDist.GetSelectEntryPos();
605 
606 	switch ( nPos )
607 	{
608 		case LLINESPACE_1:
609 		case LLINESPACE_15:
610 		case LLINESPACE_2:
611 			{
612 				SetLineSpace( aSpacing, nPos );
613 				maPos = nPos;
614 			}
615 			break;
616 
617 		case LLINESPACE_PROP:
618 			{
619 				SetLineSpace( aSpacing, nPos,
620 					aLineDistAtPercentBox.Denormalize(
621 					(long)aLineDistAtPercentBox.GetValue() ) );
622 				maPos = nPos;
623 				maValue =aLineDistAtPercentBox.GetValue();
624 			}
625 			break;
626 
627 		case LLINESPACE_MIN:
628 		case LLINESPACE_DURCH:
629 		case LLINESPACE_FIX:
630 			{
631 				SetLineSpace( aSpacing, nPos,
632 					GetCoreValue( aLineDistAtMetricBox, m_eLNSpaceUnit ) );
633 				maPos = nPos;
634 				maValue = GetCoreValue( aLineDistAtMetricBox, m_eLNSpaceUnit );
635 			}
636 		break;
637 
638 		default:
639 			DBG_ERROR( "error!!" );
640 			break;
641 	}
642 
643 	mpBindings->GetDispatcher()->Execute(
644 			SID_ATTR_PARA_LINESPACE, SFX_CALLMODE_RECORD, &aSpacing, 0L);
645 
646 	mbUseLineSPCustom = USE_CUSTOM;
647 }
648 
649 void ParaLineSpacingControl::SetLineSpace( SvxLineSpacingItem& rLineSpace,
650 						int eSpace, long lValue )
651 {
652 	switch ( eSpace )
653 	{
654 		case LLINESPACE_1:
655 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
656 			rLineSpace.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
657 			break;
658 
659 		case LLINESPACE_15:
660 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
661 			rLineSpace.SetPropLineSpace( LINESPACE_15 );
662 			break;
663 
664 		case LLINESPACE_2:
665 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
666 			rLineSpace.SetPropLineSpace( LINESPACE_2 );
667 			break;
668 
669 		case LLINESPACE_PROP:
670 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
671 			rLineSpace.SetPropLineSpace( (sal_uInt8)lValue );
672 			break;
673 
674 		case LLINESPACE_MIN:
675 			rLineSpace.SetLineHeight( (sal_uInt16)lValue );
676 			rLineSpace.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
677 			break;
678 
679 		case LLINESPACE_DURCH:
680 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
681 			rLineSpace.SetInterLineSpace( (sal_uInt16)lValue );
682 			break;
683 
684 		case LLINESPACE_FIX:
685 			rLineSpace.SetLineHeight((sal_uInt16)lValue);
686 			rLineSpace.GetLineSpaceRule() = SVX_LINE_SPACE_FIX;
687 			rLineSpace.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
688 		break;
689 	}
690 }
691 
692 IMPL_LINK(ParaLineSpacingControl, VSSelHdl, void *, pControl)
693 {
694 	maLineSpacing.SetNoSelection();
695 	bool bClosePop = true;
696 	if(pControl == &maLineSpacing)
697 	{
698 		sal_uInt16 iPos = maLineSpacing.GetSelectItemId();
699 		switch ( iPos )
700 		{
701 			case 1:
702 				ExecuteLineSpacing( 0, 0 );
703 				break;
704 			case 2:
705 				ExecuteLineSpacing( 0, 3 );
706 				break;
707 			case 3:
708 				ExecuteLineSpacing( 0, 1 );
709 				break;
710 			case 4:
711 				ExecuteLineSpacing( 0, 2 );
712 				break;
713 			case 5:
714 				{
715 					if(!(mbLineSPDisable))
716 					{
717 						//maPos = mrParaPropertyPanel.maLinePos;
718 						aLineDist.SelectEntryPos( maPos ) ;
719 						aLineDist.SaveValue();
720 						//maValue = mrParaPropertyPanel.maLineValue;
721 
722 						SvxLineSpacingItem aSpacing(_DEFAULT_LINE_SPACING, SID_ATTR_PARA_LINESPACE);
723 						switch(maPos)
724 						{
725 						case LLINESPACE_1:
726 						case LLINESPACE_15:
727 						case LLINESPACE_2:
728 							SetLineSpace( aSpacing, maPos );
729 							break;
730 
731 						case LLINESPACE_PROP:
732 							SetLineSpace( aSpacing, maPos,
733 								aLineDistAtPercentBox.Denormalize( (long)maValue ) );
734 							break;
735 
736 						case LLINESPACE_MIN:
737 						case LLINESPACE_DURCH:
738 						case LLINESPACE_FIX:
739 							SetLineSpace( aSpacing, maPos, (long)maValue );
740 							break;
741 						}
742 
743 						mpBindings->GetDispatcher()->Execute(
744 							SID_ATTR_PARA_LINESPACE, SFX_CALLMODE_RECORD, &aSpacing, 0L);
745 
746 						ExecuteLineSpacing( USE_CUSTOM, 0 );
747 					}
748 					else
749 						bClosePop = sal_False;
750 				}
751 				break;
752 		}
753 	}
754 	if(bClosePop)
755 		mrParaPropertyPanel.EndSpacingPopupMode();
756 	return 0;
757 }
758 
759 void ParaLineSpacingControl::ExecuteLineSpacing( sal_uInt16 aIsCustom, sal_uInt16 aEntry )
760 {
761 	if( !aIsCustom )
762 	{
763 		aLineDist.SelectEntryPos( aEntry ) ;
764 		aLineDist.SaveValue();
765 		SvxLineSpacingItem aSpacing(_DEFAULT_LINE_SPACING, SID_ATTR_PARA_LINESPACE);
766 		sal_uInt16 nPos = aEntry;
767 		if( aEntry == LLINESPACE_PROP )
768 			SetLineSpace( aSpacing, nPos, aLineDistAtPercentBox.Denormalize( (long)115 ) );
769 		else
770 			SetLineSpace( aSpacing, nPos );
771 
772 		mpBindings->GetDispatcher()->Execute(
773 			SID_ATTR_PARA_LINESPACE, SFX_CALLMODE_RECORD, &aSpacing, 0L);
774 	}
775 
776 	if( !aIsCustom )
777 	{
778 		mbUseLineSPCustom = DO_NOT_CUSTOM;
779 		mrParaPropertyPanel.EndSpacingPopupMode();
780 	}
781 	maLineSpacing.SetNoSelection();
782 }
783 
784 }} // end of namespace sidebar
785 
786