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