xref: /aoo41x/main/svx/source/dialog/fontwork.cxx (revision c7be74b1)
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 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 
27 // include ---------------------------------------------------------------
28 #include <sfx2/module.hxx>
29 #include <sfx2/dispatch.hxx>
30 #include <tools/shl.hxx>
31 
32 #define _SVX_FONTWORK_CXX
33 #include <svx/svdobj.hxx>
34 #include <svx/svdopath.hxx>
35 #include <svx/svdview.hxx>
36 #include <svx/svdocirc.hxx>
37 #include <svx/xtextit.hxx>
38 
39 #include <svx/dialmgr.hxx>
40 #include "svx/dlgutil.hxx"
41 
42 #include <svx/dialogs.hrc>
43 #include "fontwork.hrc"
44 #include <svx/fontwork.hxx>
45 #include <editeng/outlobj.hxx>
46 #include <basegfx/polygon/b2dpolygon.hxx>
47 #include <basegfx/point/b2dpoint.hxx>
48 
49 SFX_IMPL_DOCKINGWINDOW( SvxFontWorkChildWindow, SID_FONTWORK );
50 
51 /*************************************************************************
52 |*
53 |* ControllerItem fuer Fontwork
54 |*
55 \************************************************************************/
56 
57 SvxFontWorkControllerItem::SvxFontWorkControllerItem
58 (
59     sal_uInt16 _nId,
60 	SvxFontWorkDialog& rDlg,
61 	SfxBindings& rBindings
62 ) :
63 
64     SfxControllerItem( _nId, rBindings ),
65 
66 	rFontWorkDlg( rDlg )
67 {
68 }
69 
70 /*************************************************************************
71 |*
72 |* StateChanged-Methode fuer FontWork-Items
73 |*
74 \************************************************************************/
75 
76 void SvxFontWorkControllerItem::StateChanged( sal_uInt16 /*nSID*/, SfxItemState /*eState*/,
77 											  const SfxPoolItem* pItem )
78 {
79 	switch ( GetId() )
80 	{
81 		case SID_FORMTEXT_STYLE:
82 		{
83 			const XFormTextStyleItem* pStateItem =
84 								PTR_CAST(XFormTextStyleItem, pItem);
85 			DBG_ASSERT(pStateItem || pItem == 0, "XFormTextStyleItem erwartet");
86 			rFontWorkDlg.SetStyle_Impl(pStateItem);
87 			break;
88 		}
89 		case SID_FORMTEXT_ADJUST:
90 		{
91 			const XFormTextAdjustItem* pStateItem =
92 								PTR_CAST(XFormTextAdjustItem, pItem);
93 			DBG_ASSERT(pStateItem || pItem == 0, "XFormTextAdjustItem erwartet");
94 			rFontWorkDlg.SetAdjust_Impl(pStateItem);
95 			break;
96 		}
97 		case SID_FORMTEXT_DISTANCE:
98 		{
99 			const XFormTextDistanceItem* pStateItem =
100 								PTR_CAST(XFormTextDistanceItem, pItem);
101 			DBG_ASSERT(pStateItem || pItem == 0, "XFormTextDistanceItem erwartet");
102 			rFontWorkDlg.SetDistance_Impl(pStateItem);
103 			break;
104 		}
105 		case SID_FORMTEXT_START:
106 		{
107 			const XFormTextStartItem* pStateItem =
108 								PTR_CAST(XFormTextStartItem, pItem);
109 			DBG_ASSERT(pStateItem || pItem == 0, "XFormTextStartItem erwartet");
110 			rFontWorkDlg.SetStart_Impl(pStateItem);
111 			break;
112 		}
113 		case SID_FORMTEXT_MIRROR:
114 		{
115 			const XFormTextMirrorItem* pStateItem =
116 								PTR_CAST(XFormTextMirrorItem, pItem);
117 			DBG_ASSERT(pStateItem || pItem == 0, "XFormTextMirrorItem erwartet");
118 			rFontWorkDlg.SetMirror_Impl(pStateItem);
119 			break;
120 		}
121 		case SID_FORMTEXT_HIDEFORM:
122 		{
123 			const XFormTextHideFormItem* pStateItem =
124 								PTR_CAST(XFormTextHideFormItem, pItem);
125 			DBG_ASSERT(pStateItem || pItem == 0, "XFormTextHideFormItem erwartet");
126 			rFontWorkDlg.SetShowForm_Impl(pStateItem);
127 			break;
128 		}
129 		case SID_FORMTEXT_OUTLINE:
130 		{
131 			const XFormTextOutlineItem* pStateItem =
132 								PTR_CAST(XFormTextOutlineItem, pItem);
133 			DBG_ASSERT(pStateItem || pItem == 0, "XFormTextOutlineItem erwartet");
134 			rFontWorkDlg.SetOutline_Impl(pStateItem);
135 			break;
136 		}
137 		case SID_FORMTEXT_SHADOW:
138 		{
139 			const XFormTextShadowItem* pStateItem =
140 								PTR_CAST(XFormTextShadowItem, pItem);
141 			DBG_ASSERT(pStateItem || pItem == 0, "XFormTextShadowItem erwartet");
142 			rFontWorkDlg.SetShadow_Impl(pStateItem);
143 			break;
144 		}
145 		case SID_FORMTEXT_SHDWCOLOR:
146 		{
147 			const XFormTextShadowColorItem* pStateItem =
148 								PTR_CAST(XFormTextShadowColorItem, pItem);
149 			DBG_ASSERT(pStateItem || pItem == 0, "XFormTextShadowColorItem erwartet");
150 			rFontWorkDlg.SetShadowColor_Impl(pStateItem);
151 			break;
152 		}
153 		case SID_FORMTEXT_SHDWXVAL:
154 		{
155 			const XFormTextShadowXValItem* pStateItem =
156 								PTR_CAST(XFormTextShadowXValItem, pItem);
157 			DBG_ASSERT(pStateItem || pItem == 0, "XFormTextShadowXValItem erwartet");
158 			rFontWorkDlg.SetShadowXVal_Impl(pStateItem);
159 			break;
160 		}
161 		case SID_FORMTEXT_SHDWYVAL:
162 		{
163 			const XFormTextShadowYValItem* pStateItem =
164 								PTR_CAST(XFormTextShadowYValItem, pItem);
165 			DBG_ASSERT(pStateItem || pItem == 0, "XFormTextShadowYValItem erwartet");
166 			rFontWorkDlg.SetShadowYVal_Impl(pStateItem);
167 			break;
168 		}
169 	}
170 }
171 
172 /*************************************************************************
173 |*
174 |* Ableitung vom SfxChildWindow als "Behaelter" fuer Fontwork-Dialog
175 |*
176 \************************************************************************/
177 
178 SvxFontWorkChildWindow::SvxFontWorkChildWindow
179 (
180     Window* _pParent,
181 	sal_uInt16 nId,
182 	SfxBindings* pBindings,
183 	SfxChildWinInfo* pInfo
184 ) :
185 
186     SfxChildWindow( _pParent, nId )
187 
188 {
189     pWindow = new SvxFontWorkDialog( pBindings, this, _pParent,
190 									 SVX_RES( RID_SVXDLG_FONTWORK ) );
191 	SvxFontWorkDialog* pDlg = (SvxFontWorkDialog*) pWindow;
192 
193 	eChildAlignment = SFX_ALIGN_NOALIGNMENT;
194 
195 	pDlg->Initialize( pInfo );
196 }
197 
198 /*************************************************************************
199 |*
200 |* Floating Window zur Attributierung von Texteffekten
201 |*
202 \************************************************************************/
203 
204 SvxFontWorkDialog::SvxFontWorkDialog( SfxBindings *pBindinx,
205 									  SfxChildWindow *pCW,
206                                       Window* _pParent,
207 									  const ResId& rResId ) :
208     SfxDockingWindow( pBindinx, pCW, _pParent, rResId ),
209 
210 	aTbxStyle		(this, ResId(TBX_STYLE,*rResId.GetResMgr())),
211 	aTbxAdjust		(this, ResId(TBX_ADJUST,*rResId.GetResMgr())),
212 
213 	aFbDistance 	(this, ResId(FB_DISTANCE,*rResId.GetResMgr())),
214 	aMtrFldDistance (this, ResId(MTR_FLD_DISTANCE,*rResId.GetResMgr())),
215 	aFbTextStart	(this, ResId(FB_TEXTSTART,*rResId.GetResMgr())),
216 	aMtrFldTextStart(this, ResId(MTR_FLD_TEXTSTART,*rResId.GetResMgr())),
217 
218 	aTbxShadow		(this, ResId(TBX_SHADOW,*rResId.GetResMgr())),
219 
220 	aFbShadowX		(this, ResId(FB_SHADOW_X,*rResId.GetResMgr())),
221 	aMtrFldShadowX	(this, ResId(MTR_FLD_SHADOW_X,*rResId.GetResMgr())),
222 	aFbShadowY		(this, ResId(FB_SHADOW_Y,*rResId.GetResMgr())),
223 	aMtrFldShadowY	(this, ResId(MTR_FLD_SHADOW_Y,*rResId.GetResMgr())),
224 
225 	aShadowColorLB	(this, ResId(CLB_SHADOW_COLOR,*rResId.GetResMgr())),
226     rBindings       (*pBindinx),
227 
228 	nLastStyleTbxId(0),
229 	nLastAdjustTbxId(0),
230 	nLastShadowTbxId(0),
231 	nSaveShadowX	(0),
232 	nSaveShadowY	(0),
233 	nSaveShadowAngle(450),
234 	nSaveShadowSize (100),
235 
236     maImageList     (ResId(IL_FONTWORK,*rResId.GetResMgr())),
237     maImageListH    (ResId(ILH_FONTWORK,*rResId.GetResMgr())),
238 
239     maColorTable()
240 {
241 	FreeResource();
242 
243 	ApplyImageList();
244 
245 	pCtrlItems[0] = new SvxFontWorkControllerItem(SID_FORMTEXT_STYLE, *this, rBindings);
246 	pCtrlItems[1] = new SvxFontWorkControllerItem(SID_FORMTEXT_ADJUST, *this, rBindings);
247 	pCtrlItems[2] = new SvxFontWorkControllerItem(SID_FORMTEXT_DISTANCE, *this, rBindings);
248 	pCtrlItems[3] = new SvxFontWorkControllerItem(SID_FORMTEXT_START, *this, rBindings);
249 	pCtrlItems[4] = new SvxFontWorkControllerItem(SID_FORMTEXT_MIRROR, *this, rBindings);
250 	pCtrlItems[5] = new SvxFontWorkControllerItem(SID_FORMTEXT_HIDEFORM, *this, rBindings);
251 	pCtrlItems[6] = new SvxFontWorkControllerItem(SID_FORMTEXT_OUTLINE, *this, rBindings);
252 	pCtrlItems[7] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHADOW, *this, rBindings);
253 	pCtrlItems[8] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWCOLOR, *this, rBindings);
254 	pCtrlItems[9] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWXVAL, *this, rBindings);
255 	pCtrlItems[10] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWYVAL, *this, rBindings);
256 
257 	Size aSize = aTbxStyle.CalcWindowSizePixel();
258 	aTbxStyle.SetSizePixel(aSize);
259 	aTbxStyle.SetSelectHdl( LINK(this, SvxFontWorkDialog, SelectStyleHdl_Impl) );
260 
261 	aTbxAdjust.SetSizePixel(aSize);
262 	aTbxAdjust.SetSelectHdl( LINK(this, SvxFontWorkDialog, SelectAdjustHdl_Impl) );
263 
264 	aTbxShadow.SetSizePixel(aSize);
265 	aTbxShadow.SetSelectHdl( LINK(this, SvxFontWorkDialog, SelectShadowHdl_Impl) );
266 
267 	Link aLink = LINK(this, SvxFontWorkDialog, ModifyInputHdl_Impl);
268 	aMtrFldDistance.SetModifyHdl( aLink );
269 	aMtrFldTextStart.SetModifyHdl( aLink );
270 	aMtrFldShadowX.SetModifyHdl( aLink );
271 	aMtrFldShadowY.SetModifyHdl( aLink );
272 
273 	// System-Metrik setzen
274 	const FieldUnit eDlgUnit = rBindings.GetDispatcher()->GetModule()->GetFieldUnit();
275 	SetFieldUnit( aMtrFldDistance, eDlgUnit, sal_True );
276 	SetFieldUnit( aMtrFldTextStart, eDlgUnit, sal_True );
277 	SetFieldUnit( aMtrFldShadowX, eDlgUnit, sal_True );
278 	SetFieldUnit( aMtrFldShadowY, eDlgUnit, sal_True );
279 	if( eDlgUnit == FUNIT_MM )
280 	{
281 		aMtrFldDistance.SetSpinSize( 50 );
282 		aMtrFldTextStart.SetSpinSize( 50 );
283 		aMtrFldShadowX.SetSpinSize( 50 );
284 		aMtrFldShadowY.SetSpinSize( 50 );
285 	}
286 	else
287 	{
288 		aMtrFldDistance.SetSpinSize( 10 );
289 		aMtrFldTextStart.SetSpinSize( 10 );
290 		aMtrFldShadowX.SetSpinSize( 10 );
291 		aMtrFldShadowY.SetSpinSize( 10 );
292 	}
293 
294 	aShadowColorLB.SetSelectHdl( LINK(this, SvxFontWorkDialog, ColorSelectHdl_Impl) );
295 
296 	aInputTimer.SetTimeout(500);
297 	aInputTimer.SetTimeoutHdl(LINK(this, SvxFontWorkDialog, InputTimoutHdl_Impl));
298 }
299 
300 /*************************************************************************
301 |*
302 |* Destruktor
303 |*
304 \************************************************************************/
305 
306 SvxFontWorkDialog::~SvxFontWorkDialog()
307 {
308 	for (sal_uInt16 i = 0; i < CONTROLLER_COUNT; i++)
309 		DELETEZ(pCtrlItems[i]);
310 }
311 
312 /*************************************************************************
313 |*
314 \************************************************************************/
315 
316 void SvxFontWorkDialog::Zoom()
317 {
318 	SfxDockingWindow::Roll();
319 }
320 
321 
322 /*************************************************************************
323 |*
324 |*
325 |*
326 \************************************************************************/
327 
328 SfxChildAlignment SvxFontWorkDialog::CheckAlignment( SfxChildAlignment eActAlign,
329 													 SfxChildAlignment eAlign )
330 {
331 	SfxChildAlignment eAlignment;
332 
333 	switch ( eAlign )
334 	{
335 		case SFX_ALIGN_TOP:
336 		case SFX_ALIGN_HIGHESTTOP:
337 		case SFX_ALIGN_LOWESTTOP:
338 		case SFX_ALIGN_BOTTOM:
339 		case SFX_ALIGN_LOWESTBOTTOM:
340 		case SFX_ALIGN_HIGHESTBOTTOM:
341 		{
342 			eAlignment = eActAlign;
343 		}
344 		break;
345 
346 		case SFX_ALIGN_LEFT:
347 		case SFX_ALIGN_RIGHT:
348 		case SFX_ALIGN_FIRSTLEFT:
349 		case SFX_ALIGN_LASTLEFT:
350 		case SFX_ALIGN_FIRSTRIGHT:
351 		case SFX_ALIGN_LASTRIGHT:
352 		{
353 			eAlignment = eAlign;
354 		}
355 		break;
356 
357 		default:
358 		{
359 			eAlignment = eAlign;
360 		}
361 		break;
362 	}
363 
364 	return eAlignment;
365 }
366 
367 
368 /*************************************************************************
369 |*
370 |* Style-Buttons setzen
371 |*
372 \************************************************************************/
373 
374 void SvxFontWorkDialog::SetStyle_Impl(const XFormTextStyleItem* pItem)
375 {
376     if ( pItem )
377 	{
378 		sal_uInt16 nId = TBI_STYLE_OFF;
379 
380 		switch ( pItem->GetValue() )
381 		{
382 			case XFT_ROTATE : nId = TBI_STYLE_ROTATE;	break;
383 			case XFT_UPRIGHT: nId = TBI_STYLE_UPRIGHT;	break;
384 			case XFT_SLANTX : nId = TBI_STYLE_SLANTX;	break;
385 			case XFT_SLANTY : nId = TBI_STYLE_SLANTY;	break;
386             default: ;//prevent warning
387 		}
388 		aTbxStyle.Enable();
389 
390         // Make sure that there is allways exactly one checked toolbox item.
391 		if ( pItem->GetValue() == XFT_NONE )
392 		{
393 			aTbxStyle.CheckItem(TBI_STYLE_ROTATE, sal_False);
394 			aTbxStyle.CheckItem(TBI_STYLE_UPRIGHT, sal_False);
395 			aTbxStyle.CheckItem(TBI_STYLE_SLANTX, sal_False);
396 			aTbxStyle.CheckItem(TBI_STYLE_SLANTY, sal_False);
397 
398 			aTbxStyle.CheckItem(TBI_STYLE_OFF, sal_True);
399 		}
400 		else
401         {
402 			aTbxStyle.CheckItem(TBI_STYLE_OFF, sal_False);
403             aTbxStyle.CheckItem(nId);
404         }
405 
406 		nLastStyleTbxId = nId;
407 	}
408 	else
409 		aTbxStyle.Disable();
410 }
411 
412 /*************************************************************************
413 |*
414 |* Adjust-Buttons setzen
415 |*
416 \************************************************************************/
417 
418 void SvxFontWorkDialog::SetAdjust_Impl(const XFormTextAdjustItem* pItem)
419 {
420 	if ( pItem )
421 	{
422 		sal_uInt16 nId;
423 
424 		aTbxAdjust.Enable();
425 		aMtrFldDistance.Enable();
426 
427 		if ( pItem->GetValue() == XFT_LEFT || pItem->GetValue() == XFT_RIGHT )
428 		{
429 			if ( pItem->GetValue() == XFT_LEFT )	nId = TBI_ADJUST_LEFT;
430 			else									nId = TBI_ADJUST_RIGHT;
431 			aMtrFldTextStart.Enable();
432 		}
433 		else
434 		{
435 			if ( pItem->GetValue() == XFT_CENTER )	nId = TBI_ADJUST_CENTER;
436 			else									nId = TBI_ADJUST_AUTOSIZE;
437 			aMtrFldTextStart.Disable();
438 		}
439 
440 		if ( !aTbxAdjust.IsItemChecked(nId) )
441 		{
442 			aTbxAdjust.CheckItem(nId);
443 		}
444 		nLastAdjustTbxId = nId;
445 	}
446 	else
447 	{
448 		aTbxAdjust.Disable();
449 		aMtrFldTextStart.Disable();
450 		aMtrFldDistance.Disable();
451 	}
452 }
453 
454 /*************************************************************************
455 |*
456 |* Abstand-Wert in Editfeld eintragen
457 |*
458 \************************************************************************/
459 
460 void SvxFontWorkDialog::SetDistance_Impl(const XFormTextDistanceItem* pItem)
461 {
462 	// #104596# Use HasChildPathFocus() instead of HasFocus() at SpinFields
463 	if ( pItem && !aMtrFldDistance.HasChildPathFocus() )
464 	{
465 		SetMetricValue( aMtrFldDistance, pItem->GetValue(), SFX_MAPUNIT_100TH_MM );
466 	}
467 }
468 
469 /*************************************************************************
470 |*
471 |* Einzug-Wert in Editfeld eintragen
472 |*
473 \************************************************************************/
474 
475 void SvxFontWorkDialog::SetStart_Impl(const XFormTextStartItem* pItem)
476 {
477 	// #104596# Use HasChildPathFocus() instead of HasFocus() at SpinFields
478 	if ( pItem && !aMtrFldTextStart.HasChildPathFocus() )
479 	{
480 		SetMetricValue( aMtrFldTextStart, pItem->GetValue(), SFX_MAPUNIT_100TH_MM );
481 	}
482 }
483 
484 /*************************************************************************
485 |*
486 |* Button fuer Umkehrung der Textrichtung setzen
487 |*
488 \************************************************************************/
489 
490 void SvxFontWorkDialog::SetMirror_Impl(const XFormTextMirrorItem* pItem)
491 {
492 	if ( pItem )
493 		aTbxAdjust.CheckItem(TBI_ADJUST_MIRROR, pItem->GetValue());
494 }
495 
496 /*************************************************************************
497 |*
498 |* Button fuer Konturanzeige setzen
499 |*
500 \************************************************************************/
501 
502 void SvxFontWorkDialog::SetShowForm_Impl(const XFormTextHideFormItem* pItem)
503 {
504 	if ( pItem )
505 		aTbxShadow.CheckItem(TBI_SHOWFORM, !pItem->GetValue());
506 }
507 
508 /*************************************************************************
509 |*
510 |* Button fuer Zeichenumrandung setzen
511 |*
512 \************************************************************************/
513 
514 void SvxFontWorkDialog::SetOutline_Impl(const XFormTextOutlineItem* pItem)
515 {
516 	if ( pItem )
517 		aTbxShadow.CheckItem(TBI_OUTLINE, pItem->GetValue());
518 }
519 
520 /*************************************************************************
521 |*
522 |* Shadow-Buttons setzen
523 |*
524 \************************************************************************/
525 
526 void SvxFontWorkDialog::SetShadow_Impl(const XFormTextShadowItem* pItem,
527 										sal_Bool bRestoreValues)
528 {
529 	if ( pItem )
530 	{
531 		sal_uInt16 nId;
532 
533 		aTbxShadow.Enable();
534 
535 		if ( pItem->GetValue() == XFTSHADOW_NONE )
536 		{
537 			nId = TBI_SHADOW_OFF;
538 			aFbShadowX.Hide();
539 			aFbShadowY.Hide();
540 			aMtrFldShadowX.Disable();
541 			aMtrFldShadowY.Disable();
542 			aShadowColorLB.Disable();
543 		}
544 		else
545 		{
546 			aFbShadowX.Show();
547 			aFbShadowY.Show();
548 			aMtrFldShadowX.Enable();
549 			aMtrFldShadowY.Enable();
550 			aShadowColorLB.Enable();
551 
552 			if ( pItem->GetValue() == XFTSHADOW_NORMAL )
553 			{
554 				nId = TBI_SHADOW_NORMAL;
555 				const FieldUnit eDlgUnit = rBindings.GetDispatcher()->GetModule()->GetFieldUnit();
556 
557 //              aFbShadowX.SetBitmap( Bitmap( ResId(RID_SVXBMP_SHADOW_XDIST, _pMgr ) ) );
558 				//aMtrFldShadowX.SetUnit(FUNIT_MM);
559 				aMtrFldShadowX.SetUnit( eDlgUnit );
560 				aMtrFldShadowX.SetDecimalDigits(2);
561                 aMtrFldShadowX.SetMin(LONG_MIN);
562                 aMtrFldShadowX.SetMax(LONG_MAX);
563 				if( eDlgUnit == FUNIT_MM )
564 					aMtrFldShadowX.SetSpinSize( 50 );
565 				else
566 					aMtrFldShadowX.SetSpinSize( 10 );
567 
568 //              aFbShadowY.SetBitmap( Bitmap( ResId( RID_SVXBMP_SHADOW_YDIST, _pMgr ) ) );
569 				//aMtrFldShadowY.SetUnit(FUNIT_MM);
570 				aMtrFldShadowY.SetUnit( eDlgUnit );
571 				aMtrFldShadowY.SetDecimalDigits(2);
572                 aMtrFldShadowY.SetMin(LONG_MIN);
573                 aMtrFldShadowY.SetMax(LONG_MAX);
574 				if( eDlgUnit == FUNIT_MM )
575 					aMtrFldShadowY.SetSpinSize( 50 );
576 				else
577 					aMtrFldShadowY.SetSpinSize( 10 );
578 
579 				if ( bRestoreValues )
580 				{
581 					SetMetricValue( aMtrFldShadowX, nSaveShadowX, SFX_MAPUNIT_100TH_MM );
582 					SetMetricValue( aMtrFldShadowY, nSaveShadowY, SFX_MAPUNIT_100TH_MM );
583 
584 					XFormTextShadowXValItem aXItem( nSaveShadowX );
585 					XFormTextShadowYValItem aYItem( nSaveShadowY );
586 
587 					GetBindings().GetDispatcher()->Execute(
588 						SID_FORMTEXT_SHDWXVAL, SFX_CALLMODE_RECORD, &aXItem, &aYItem, 0L );
589 				}
590 			}
591 			else
592 			{
593 				nId = TBI_SHADOW_SLANT;
594 
595 //              aFbShadowX.SetBitmap( Bitmap( ResId( RID_SVXBMP_SHADOW_ANGLE, _pMgr ) ) );
596 				aMtrFldShadowX.SetUnit(FUNIT_CUSTOM);
597 				aMtrFldShadowX.SetDecimalDigits(1);
598                 aMtrFldShadowX.SetMin(-1800);
599                 aMtrFldShadowX.SetMax( 1800);
600 				aMtrFldShadowX.SetSpinSize(10);
601 
602 //              aFbShadowY.SetBitmap( Bitmap( ResId( RID_SVXBMP_SHADOW_SIZE, _pMgr ) ) );
603 				aMtrFldShadowY.SetUnit(FUNIT_CUSTOM);
604 				aMtrFldShadowY.SetDecimalDigits(0);
605                 aMtrFldShadowY.SetMin(-999);
606                 aMtrFldShadowY.SetMax( 999);
607 				aMtrFldShadowY.SetSpinSize(10);
608 
609 				if ( bRestoreValues )
610 				{
611 					aMtrFldShadowX.SetValue(nSaveShadowAngle);
612 					aMtrFldShadowY.SetValue(nSaveShadowSize);
613 					XFormTextShadowXValItem aXItem(nSaveShadowAngle);
614 					XFormTextShadowYValItem aYItem(nSaveShadowSize);
615 					GetBindings().GetDispatcher()->Execute(
616 						SID_FORMTEXT_SHDWXVAL, SFX_CALLMODE_RECORD, &aXItem, &aYItem, 0L );
617 				}
618 			}
619 		}
620 
621 		if ( !aTbxShadow.IsItemChecked(nId) )
622 		{
623 			aTbxShadow.CheckItem(nId);
624 		}
625 		nLastShadowTbxId = nId;
626 
627 		ApplyImageList();
628 	}
629 	else
630 	{
631 		aTbxShadow.Disable();
632 		aMtrFldShadowX.Disable();
633 		aMtrFldShadowY.Disable();
634 		aShadowColorLB.Disable();
635 	}
636 }
637 
638 /*************************************************************************
639 |*
640 |* Schattenfarbe in Listbox eintragen
641 |*
642 \************************************************************************/
643 
644 void SvxFontWorkDialog::SetShadowColor_Impl(const XFormTextShadowColorItem* pItem)
645 {
646 	if ( pItem )
647         aShadowColorLB.SelectEntry(pItem->GetColorValue());
648 }
649 
650 /*************************************************************************
651 |*
652 |* X-Wert fuer Schatten in Editfeld eintragen
653 |*
654 \************************************************************************/
655 
656 void SvxFontWorkDialog::SetShadowXVal_Impl(const XFormTextShadowXValItem* pItem)
657 {
658 	// #104596# Use HasChildPathFocus() instead of HasFocus() at SpinFields
659 	if ( pItem && !aMtrFldShadowX.HasChildPathFocus() )
660 	{
661 		// #i19251#
662 		// sal_Int32 nValue = pItem->GetValue();
663 
664 		// #i19251#
665 		// The two involved fields/items are used double and contain/give different
666 		// values regarding to the access method. Thus, here we need to separate the access
667 		// methos regarding to the kind of value accessed.
668 		if(aTbxShadow.IsItemChecked(TBI_SHADOW_SLANT))
669 		{
670 			// #i19251#
671 			// There is no value correction necessary at all, i think this
672 			// was only tried to be done without understanding that the two
673 			// involved fields/items are used double and contain/give different
674 			// values regarding to the access method.
675 			// nValue = nValue - ( int( float( nValue ) / 360.0 ) * 360 );
676 			aMtrFldShadowX.SetValue(pItem->GetValue());
677 		}
678 		else
679 		{
680 			SetMetricValue( aMtrFldShadowX, pItem->GetValue(), SFX_MAPUNIT_100TH_MM );
681 		}
682 	}
683 }
684 
685 /*************************************************************************
686 |*
687 |* Y-Wert fuer Schatten in Editfeld eintragen
688 |*
689 \************************************************************************/
690 
691 void SvxFontWorkDialog::SetShadowYVal_Impl(const XFormTextShadowYValItem* pItem)
692 {
693 	// #104596# Use HasChildPathFocus() instead of HasFocus() at SpinFields
694 	if ( pItem && !aMtrFldShadowY.HasChildPathFocus() )
695 	{
696 		// #i19251#
697 		// The two involved fields/items are used double and contain/give different
698 		// values regarding to the access method. Thus, here we need to separate the access
699 		// methos regarding to the kind of value accessed.
700 		if(aTbxShadow.IsItemChecked(TBI_SHADOW_SLANT))
701 		{
702 			aMtrFldShadowY.SetValue(pItem->GetValue());
703 		}
704 		else
705 		{
706 			SetMetricValue( aMtrFldShadowY, pItem->GetValue(), SFX_MAPUNIT_100TH_MM );
707 		}
708 	}
709 }
710 
711 /*************************************************************************
712 |*
713 \************************************************************************/
714 
715 IMPL_LINK( SvxFontWorkDialog, SelectStyleHdl_Impl, void *, EMPTYARG )
716 {
717 	sal_uInt16 nId = aTbxStyle.GetCurItemId();
718 
719     // Execute this block when a different toolbox item has been clicked or
720     // when the off item has been clicked.  The later is necessary to
721     // override the toolbox behaviour of unchecking the item after second
722     // click on it: One of the items has to be checked at all times (when
723     // enabled that is.)
724 	if (nId == TBI_STYLE_OFF || nId != nLastStyleTbxId )
725 	{
726 		XFormTextStyle eStyle = XFT_NONE;
727 
728 		switch ( nId )
729 		{
730 			case TBI_STYLE_ROTATE	: eStyle = XFT_ROTATE;	break;
731 			case TBI_STYLE_UPRIGHT	: eStyle = XFT_UPRIGHT; break;
732 			case TBI_STYLE_SLANTX	: eStyle = XFT_SLANTX;	break;
733 			case TBI_STYLE_SLANTY	: eStyle = XFT_SLANTY;	break;
734 		}
735 		XFormTextStyleItem aItem( eStyle );
736 		GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_STYLE, SFX_CALLMODE_RECORD, &aItem, 0L );
737 		SetStyle_Impl( &aItem );
738 		nLastStyleTbxId = nId;
739 	}
740 	return 0;
741 }
742 
743 /*************************************************************************
744 |*
745 \************************************************************************/
746 
747 IMPL_LINK( SvxFontWorkDialog, SelectAdjustHdl_Impl, void *, EMPTYARG )
748 {
749 	sal_uInt16 nId = aTbxAdjust.GetCurItemId();
750 
751 	if ( nId == TBI_ADJUST_MIRROR )
752 	{
753 		XFormTextMirrorItem aItem(aTbxAdjust.IsItemChecked(nId));
754 		GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_MIRROR, SFX_CALLMODE_SLOT, &aItem, 0L );
755 	}
756 	else if ( nId != nLastAdjustTbxId )
757 	{
758 		XFormTextAdjust eAdjust = XFT_AUTOSIZE;
759 
760 		switch ( nId )
761 		{
762 			case TBI_ADJUST_LEFT	: eAdjust = XFT_LEFT;	break;
763 			case TBI_ADJUST_CENTER	: eAdjust = XFT_CENTER; break;
764 			case TBI_ADJUST_RIGHT	: eAdjust = XFT_RIGHT;	break;
765 		}
766 		XFormTextAdjustItem aItem(eAdjust);
767 		GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_ADJUST, SFX_CALLMODE_RECORD, &aItem, 0L );
768 		SetAdjust_Impl(&aItem);
769 		nLastAdjustTbxId = nId;
770 	}
771 	return 0;
772 }
773 
774 /*************************************************************************
775 |*
776 \************************************************************************/
777 
778 IMPL_LINK( SvxFontWorkDialog, SelectShadowHdl_Impl, void *, EMPTYARG )
779 {
780 	sal_uInt16 nId = aTbxShadow.GetCurItemId();
781 
782 	if ( nId == TBI_SHOWFORM )
783 	{
784 		XFormTextHideFormItem aItem(!aTbxShadow.IsItemChecked(nId));
785 		GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_HIDEFORM, SFX_CALLMODE_RECORD, &aItem, 0L );
786 	}
787 	else if ( nId == TBI_OUTLINE )
788 	{
789 		XFormTextOutlineItem aItem(aTbxShadow.IsItemChecked(nId));
790 		GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_OUTLINE, SFX_CALLMODE_RECORD, &aItem, 0L );
791 	}
792 	else if ( nId != nLastShadowTbxId )
793 	{
794 		XFormTextShadow eShadow = XFTSHADOW_NONE;
795 
796 		if ( nLastShadowTbxId == TBI_SHADOW_NORMAL )
797 		{
798 			nSaveShadowX = GetCoreValue( aMtrFldShadowX, SFX_MAPUNIT_100TH_MM );
799 			nSaveShadowY = GetCoreValue( aMtrFldShadowY, SFX_MAPUNIT_100TH_MM );
800 		}
801 		else if ( nLastShadowTbxId == TBI_SHADOW_SLANT )
802 		{
803 			nSaveShadowAngle = static_cast<long>(aMtrFldShadowX.GetValue());
804 			nSaveShadowSize  = static_cast<long>(aMtrFldShadowY.GetValue());
805 		}
806 		nLastShadowTbxId = nId;
807 
808 		if ( nId == TBI_SHADOW_NORMAL ) 	eShadow = XFTSHADOW_NORMAL;
809 		else if ( nId == TBI_SHADOW_SLANT ) eShadow = XFTSHADOW_SLANT;
810 
811 		XFormTextShadowItem aItem(eShadow);
812 		GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_SHADOW, SFX_CALLMODE_RECORD, &aItem, 0L );
813 		SetShadow_Impl(&aItem, sal_True);
814 	}
815 	return 0;
816 }
817 
818 /*************************************************************************
819 |*
820 \************************************************************************/
821 
822 IMPL_LINK_INLINE_START( SvxFontWorkDialog, ModifyInputHdl_Impl, void *, EMPTYARG )
823 {
824 	aInputTimer.Start();
825 	return 0;
826 }
827 IMPL_LINK_INLINE_END( SvxFontWorkDialog, ModifyInputHdl_Impl, void *, EMPTYARG )
828 
829 /*************************************************************************
830 |*
831 \************************************************************************/
832 
833 IMPL_LINK( SvxFontWorkDialog, InputTimoutHdl_Impl, void *, EMPTYARG )
834 {
835 	// System-Metrik evtl. neu setzen
836 	// Dieses sollte mal als Listener passieren, ist aber aus
837 	// inkompatibilitaetsgruenden z.Z. nicht moeglich
838 	const FieldUnit eDlgUnit = rBindings.GetDispatcher()->GetModule()->GetFieldUnit();
839 	if( eDlgUnit != aMtrFldDistance.GetUnit() )
840 	{
841 		SetFieldUnit( aMtrFldDistance, eDlgUnit, sal_True );
842 		SetFieldUnit( aMtrFldTextStart, eDlgUnit, sal_True );
843 		aMtrFldDistance.SetSpinSize( eDlgUnit == FUNIT_MM ? 50 : 10 );
844 		aMtrFldTextStart.SetSpinSize( eDlgUnit == FUNIT_MM ? 50 : 10 );
845 	}
846 	if( eDlgUnit != aMtrFldShadowX.GetUnit() &&
847 		aTbxShadow.IsItemChecked( TBI_SHADOW_NORMAL ) )
848 	{
849 		SetFieldUnit( aMtrFldShadowX, eDlgUnit, sal_True );
850 		SetFieldUnit( aMtrFldShadowY, eDlgUnit, sal_True );
851 		aMtrFldShadowX.SetSpinSize( eDlgUnit == FUNIT_MM ? 50 : 10 );
852 		aMtrFldShadowY.SetSpinSize( eDlgUnit == FUNIT_MM ? 50 : 10 );
853 	}
854 
855 	long nValue = GetCoreValue( aMtrFldDistance, SFX_MAPUNIT_100TH_MM );
856 	XFormTextDistanceItem aDistItem( nValue );
857 	nValue = GetCoreValue( aMtrFldTextStart, SFX_MAPUNIT_100TH_MM );
858 	XFormTextStartItem aStartItem( nValue );
859 
860 	sal_Int32 nValueX(0L);
861 	sal_Int32 nValueY(0L);
862 
863 	// #i19251#
864 	// The two involved fields/items are used double and contain/give different
865 	// values regarding to the access method. Thus, here we need to separate the access
866 	// methos regarding to the kind of value accessed.
867 	if(nLastShadowTbxId == TBI_SHADOW_NORMAL)
868 	{
869 		nValueX = GetCoreValue( aMtrFldShadowX, SFX_MAPUNIT_100TH_MM );
870 		nValueY = GetCoreValue( aMtrFldShadowY, SFX_MAPUNIT_100TH_MM );
871 	}
872 	else if(nLastShadowTbxId == TBI_SHADOW_SLANT)
873 	{
874 		nValueX = static_cast<long>(aMtrFldShadowX.GetValue());
875 		nValueY = static_cast<long>(aMtrFldShadowY.GetValue());
876 	}
877 
878 	XFormTextShadowXValItem aShadowXItem( nValueX );
879 	XFormTextShadowYValItem aShadowYItem( nValueY );
880 
881 	// Slot-ID ist egal, die Exec-Methode wertet das gesamte ItemSet aus
882 	GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_DISTANCE, SFX_CALLMODE_RECORD, &aDistItem,
883 											&aStartItem, &aShadowXItem, &aShadowYItem, 0L );
884 	return 0;
885 }
886 
887 /*************************************************************************
888 |*
889 \************************************************************************/
890 
891 IMPL_LINK( SvxFontWorkDialog, ColorSelectHdl_Impl, void *, EMPTYARG )
892 {
893 // Changed by obo. Linux-Compiler can't parse commented lines
894 	XFormTextShadowColorItem aItem( (const String &) String(),
895 								    (const Color &) aShadowColorLB.GetSelectEntryColor() );
896 //	XFormTextShadowColorItem aItem( String(),
897 //								    aShadowColorLB.GetSelectEntryColor() );
898 	GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_SHDWCOLOR, SFX_CALLMODE_RECORD, &aItem, 0L );
899 	return 0;
900 }
901 
902 /*************************************************************************
903 |*
904 \************************************************************************/
905 
906 void SvxFontWorkDialog::SetColorTable(XColorListSharedPtr aTable)
907 {
908 	if ( aTable != maColorTable )
909 	{
910 		maColorTable = aTable;
911 		aShadowColorLB.Clear();
912 		aShadowColorLB.Fill(maColorTable);
913 	}
914 }
915 
916 /*************************************************************************
917 |*
918 \************************************************************************/
919 
920 void SvxFontWorkDialog::SetActive(sal_Bool /*bActivate*/)
921 {
922 }
923 
924 void SvxFontWorkDialog::DataChanged( const DataChangedEvent& rDCEvt )
925 {
926 	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
927             ApplyImageList();
928 
929     SfxDockingWindow::DataChanged( rDCEvt );
930 }
931 /* -----------------------------08.05.2002 14:28------------------------------
932 
933  ---------------------------------------------------------------------------*/
934 void SvxFontWorkDialog::ApplyImageList()
935 {
936 	bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
937 
938     ImageList& rImgLst = bHighContrast ? maImageListH : maImageList;
939 
940 	aTbxStyle.SetImageList( rImgLst );
941 	aTbxAdjust.SetImageList( rImgLst );
942 	aTbxShadow.SetImageList( rImgLst );
943 
944 	switch( nLastShadowTbxId )
945 	{
946 	case TBI_SHADOW_SLANT:
947 		aFbShadowX.SetImage( rImgLst.GetImage( TBI_SHADOW_ANGLE ) );
948 		aFbShadowY.SetImage( rImgLst.GetImage( TBI_SHADOW_SIZE ) );
949 		break;
950 //	case TBI_SHADOW_NORMAL:
951 	default:
952 		aFbShadowX.SetImage( rImgLst.GetImage( TBI_SHADOW_XDIST ) );
953 		aFbShadowY.SetImage( rImgLst.GetImage( TBI_SHADOW_YDIST ) );
954 		break;
955 	}
956 
957 	aFbDistance.SetImage( rImgLst.GetImage( TBI_DISTANCE ) );
958 	aFbTextStart.SetImage( rImgLst.GetImage( TBI_TEXTSTART ) );
959 
960 }
961