xref: /AOO41X/main/svx/source/dialog/fontwork.cxx (revision 7ea7a1cc0485d11251efeb72154f72ac1c990b6e)
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 
SvxFontWorkControllerItem(sal_uInt16 _nId,SvxFontWorkDialog & rDlg,SfxBindings & rBindings)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 
StateChanged(sal_uInt16,SfxItemState,const SfxPoolItem * pItem)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 
SvxFontWorkChildWindow(Window * _pParent,sal_uInt16 nId,SfxBindings * pBindings,SfxChildWinInfo * pInfo)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 
SvxFontWorkDialog(SfxBindings * pBindinx,SfxChildWindow * pCW,Window * _pParent,const ResId & rResId)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 
~SvxFontWorkDialog()306 SvxFontWorkDialog::~SvxFontWorkDialog()
307 {
308     for (sal_uInt16 i = 0; i < CONTROLLER_COUNT; i++)
309         DELETEZ(pCtrlItems[i]);
310 }
311 
312 /*************************************************************************
313 |*
314 \************************************************************************/
315 
Zoom()316 void SvxFontWorkDialog::Zoom()
317 {
318     SfxDockingWindow::Roll();
319 }
320 
321 
322 /*************************************************************************
323 |*
324 |*
325 |*
326 \************************************************************************/
327 
CheckAlignment(SfxChildAlignment eActAlign,SfxChildAlignment eAlign)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 
SetStyle_Impl(const XFormTextStyleItem * pItem)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 
SetAdjust_Impl(const XFormTextAdjustItem * pItem)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 
SetDistance_Impl(const XFormTextDistanceItem * pItem)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 
SetStart_Impl(const XFormTextStartItem * pItem)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 
SetMirror_Impl(const XFormTextMirrorItem * pItem)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 
SetShowForm_Impl(const XFormTextHideFormItem * pItem)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 
SetOutline_Impl(const XFormTextOutlineItem * pItem)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 
SetShadow_Impl(const XFormTextShadowItem * pItem,sal_Bool bRestoreValues)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_PERCENT);
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 
SetShadowColor_Impl(const XFormTextShadowColorItem * pItem)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 
SetShadowXVal_Impl(const XFormTextShadowXValItem * pItem)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 
SetShadowYVal_Impl(const XFormTextShadowYValItem * pItem)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 
IMPL_LINK(SvxFontWorkDialog,SelectStyleHdl_Impl,void *,EMPTYARG)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 
IMPL_LINK(SvxFontWorkDialog,SelectAdjustHdl_Impl,void *,EMPTYARG)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 
IMPL_LINK(SvxFontWorkDialog,SelectShadowHdl_Impl,void *,EMPTYARG)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 
IMPL_LINK_INLINE_START(SvxFontWorkDialog,ModifyInputHdl_Impl,void *,EMPTYARG)822 IMPL_LINK_INLINE_START( SvxFontWorkDialog, ModifyInputHdl_Impl, void *, EMPTYARG )
823 {
824     aInputTimer.Start();
825     return 0;
826 }
IMPL_LINK_INLINE_END(SvxFontWorkDialog,ModifyInputHdl_Impl,void *,EMPTYARG)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 
IMPL_LINK(SvxFontWorkDialog,ColorSelectHdl_Impl,void *,EMPTYARG)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 
SetColorTable(XColorListSharedPtr aTable)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 
SetActive(sal_Bool)920 void SvxFontWorkDialog::SetActive(sal_Bool /*bActivate*/)
921 {
922 }
923 
DataChanged(const DataChangedEvent & rDCEvt)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  ---------------------------------------------------------------------------*/
ApplyImageList()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