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
SvxFontWorkControllerItem(sal_uInt16 _nId,SvxFontWorkDialog & rDlg,SfxBindings & rBindings)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
StateChanged(sal_uInt16,SfxItemState,const SfxPoolItem * pItem)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
SvxFontWorkChildWindow(Window * _pParent,sal_uInt16 nId,SfxBindings * pBindings,SfxChildWinInfo * pInfo)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
SvxFontWorkDialog(SfxBindings * pBindinx,SfxChildWindow * pCW,Window * _pParent,const ResId & rResId)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
~SvxFontWorkDialog()294 SvxFontWorkDialog::~SvxFontWorkDialog()
295 {
296 for (sal_uInt16 i = 0; i < CONTROLLER_COUNT; i++)
297 DELETEZ(pCtrlItems[i]);
298 }
299
300 /*************************************************************************
301 |*
302 \************************************************************************/
303
Zoom()304 void SvxFontWorkDialog::Zoom()
305 {
306 SfxDockingWindow::Roll();
307 }
308
309
310 /*************************************************************************
311 |*
312 \************************************************************************/
313
CheckAlignment(SfxChildAlignment eActAlign,SfxChildAlignment eAlign)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
SetStyle_Impl(const XFormTextStyleItem * pItem)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
SetAdjust_Impl(const XFormTextAdjustItem * pItem)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
SetDistance_Impl(const XFormTextDistanceItem * pItem)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
SetStart_Impl(const XFormTextStartItem * pItem)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
SetMirror_Impl(const XFormTextMirrorItem * pItem)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
SetShowForm_Impl(const XFormTextHideFormItem * pItem)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
SetOutline_Impl(const XFormTextOutlineItem * pItem)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
SetShadow_Impl(const XFormTextShadowItem * pItem,sal_Bool bRestoreValues)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
SetShadowColor_Impl(const XFormTextShadowColorItem * pItem)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
SetShadowXVal_Impl(const XFormTextShadowXValItem * pItem)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
SetShadowYVal_Impl(const XFormTextShadowYValItem * pItem)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
IMPL_LINK(SvxFontWorkDialog,SelectStyleHdl_Impl,void *,EMPTYARG)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
IMPL_LINK(SvxFontWorkDialog,SelectAdjustHdl_Impl,void *,EMPTYARG)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
IMPL_LINK(SvxFontWorkDialog,SelectShadowHdl_Impl,void *,EMPTYARG)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
IMPL_LINK_INLINE_START(SvxFontWorkDialog,ModifyInputHdl_Impl,void *,EMPTYARG)786 IMPL_LINK_INLINE_START( SvxFontWorkDialog, ModifyInputHdl_Impl, void *, EMPTYARG )
787 {
788 aInputTimer.Start();
789 return 0;
790 }
IMPL_LINK_INLINE_END(SvxFontWorkDialog,ModifyInputHdl_Impl,void *,EMPTYARG)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
IMPL_LINK(SvxFontWorkDialog,ColorSelectHdl_Impl,void *,EMPTYARG)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
SetColorTable(XColorListSharedPtr aTable)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
SetActive(sal_Bool)884 void SvxFontWorkDialog::SetActive(sal_Bool /*bActivate*/)
885 {
886 }
887
DataChanged(const DataChangedEvent & rDCEvt)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 ---------------------------------------------------------------------------*/
ApplyImageList()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