Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <sfx2/module.hxx>
21 : #include <sfx2/dispatch.hxx>
22 :
23 : #include <svx/svdobj.hxx>
24 : #include <svx/svdopath.hxx>
25 : #include <svx/svdview.hxx>
26 : #include <svx/svdocirc.hxx>
27 : #include <svx/xtextit.hxx>
28 :
29 : #include <svx/dialmgr.hxx>
30 : #include "svx/dlgutil.hxx"
31 :
32 : #include <svx/dialogs.hrc>
33 : #include <svx/fontwork.hxx>
34 : #include <editeng/outlobj.hxx>
35 : #include <basegfx/polygon/b2dpolygon.hxx>
36 : #include <basegfx/point/b2dpoint.hxx>
37 : #include <vcl/settings.hxx>
38 :
39 398 : SFX_IMPL_DOCKINGWINDOW_WITHID( SvxFontWorkChildWindow, SID_FONTWORK );
40 :
41 : // ControllerItem for Fontwork
42 :
43 0 : SvxFontWorkControllerItem::SvxFontWorkControllerItem
44 : (
45 : sal_uInt16 _nId,
46 : SvxFontWorkDialog& rDlg,
47 : SfxBindings& rBindings
48 : ) :
49 :
50 : SfxControllerItem( _nId, rBindings ),
51 :
52 0 : rFontWorkDlg( rDlg )
53 : {
54 0 : }
55 :
56 : // StateChanged method for FontWork items
57 :
58 0 : void SvxFontWorkControllerItem::StateChanged( sal_uInt16 /*nSID*/, SfxItemState /*eState*/,
59 : const SfxPoolItem* pItem )
60 : {
61 0 : switch ( GetId() )
62 : {
63 : case SID_FORMTEXT_STYLE:
64 : {
65 : const XFormTextStyleItem* pStateItem =
66 0 : PTR_CAST(XFormTextStyleItem, pItem);
67 : DBG_ASSERT(pStateItem || pItem == 0, "XFormTextStyleItem expected");
68 0 : rFontWorkDlg.SetStyle_Impl(pStateItem);
69 0 : break;
70 : }
71 : case SID_FORMTEXT_ADJUST:
72 : {
73 : const XFormTextAdjustItem* pStateItem =
74 0 : PTR_CAST(XFormTextAdjustItem, pItem);
75 : DBG_ASSERT(pStateItem || pItem == 0, "XFormTextAdjustItem expected");
76 0 : rFontWorkDlg.SetAdjust_Impl(pStateItem);
77 0 : break;
78 : }
79 : case SID_FORMTEXT_DISTANCE:
80 : {
81 : const XFormTextDistanceItem* pStateItem =
82 0 : PTR_CAST(XFormTextDistanceItem, pItem);
83 : DBG_ASSERT(pStateItem || pItem == 0, "XFormTextDistanceItem erwartet");
84 0 : rFontWorkDlg.SetDistance_Impl(pStateItem);
85 0 : break;
86 : }
87 : case SID_FORMTEXT_START:
88 : {
89 : const XFormTextStartItem* pStateItem =
90 0 : PTR_CAST(XFormTextStartItem, pItem);
91 : DBG_ASSERT(pStateItem || pItem == 0, "XFormTextStartItem expected");
92 0 : rFontWorkDlg.SetStart_Impl(pStateItem);
93 0 : break;
94 : }
95 : case SID_FORMTEXT_MIRROR:
96 : {
97 : const XFormTextMirrorItem* pStateItem =
98 0 : PTR_CAST(XFormTextMirrorItem, pItem);
99 : DBG_ASSERT(pStateItem || pItem == 0, "XFormTextMirrorItem expected");
100 0 : rFontWorkDlg.SetMirror_Impl(pStateItem);
101 0 : break;
102 : }
103 : case SID_FORMTEXT_HIDEFORM:
104 : {
105 : const XFormTextHideFormItem* pStateItem =
106 0 : PTR_CAST(XFormTextHideFormItem, pItem);
107 : DBG_ASSERT(pStateItem || pItem == 0, "XFormTextHideFormItem expected");
108 0 : rFontWorkDlg.SetShowForm_Impl(pStateItem);
109 0 : break;
110 : }
111 : case SID_FORMTEXT_OUTLINE:
112 : {
113 : const XFormTextOutlineItem* pStateItem =
114 0 : PTR_CAST(XFormTextOutlineItem, pItem);
115 : DBG_ASSERT(pStateItem || pItem == 0, "XFormTextOutlineItem expected");
116 0 : rFontWorkDlg.SetOutline_Impl(pStateItem);
117 0 : break;
118 : }
119 : case SID_FORMTEXT_SHADOW:
120 : {
121 : const XFormTextShadowItem* pStateItem =
122 0 : PTR_CAST(XFormTextShadowItem, pItem);
123 : DBG_ASSERT(pStateItem || pItem == 0, "XFormTextShadowItem expected");
124 0 : rFontWorkDlg.SetShadow_Impl(pStateItem);
125 0 : break;
126 : }
127 : case SID_FORMTEXT_SHDWCOLOR:
128 : {
129 : const XFormTextShadowColorItem* pStateItem =
130 0 : PTR_CAST(XFormTextShadowColorItem, pItem);
131 : DBG_ASSERT(pStateItem || pItem == 0, "XFormTextShadowColorItem expected");
132 0 : rFontWorkDlg.SetShadowColor_Impl(pStateItem);
133 0 : break;
134 : }
135 : case SID_FORMTEXT_SHDWXVAL:
136 : {
137 : const XFormTextShadowXValItem* pStateItem =
138 0 : PTR_CAST(XFormTextShadowXValItem, pItem);
139 : DBG_ASSERT(pStateItem || pItem == 0, "XFormTextShadowXValItem expected");
140 0 : rFontWorkDlg.SetShadowXVal_Impl(pStateItem);
141 0 : break;
142 : }
143 : case SID_FORMTEXT_SHDWYVAL:
144 : {
145 : const XFormTextShadowYValItem* pStateItem =
146 0 : PTR_CAST(XFormTextShadowYValItem, pItem);
147 : DBG_ASSERT(pStateItem || pItem == 0, "XFormTextShadowYValItem expected");
148 0 : rFontWorkDlg.SetShadowYVal_Impl(pStateItem);
149 0 : break;
150 : }
151 : }
152 0 : }
153 :
154 : // Derivation from SfxChildWindow as "containers" for Fontwork dialog
155 :
156 0 : SvxFontWorkChildWindow::SvxFontWorkChildWindow
157 : (
158 : vcl::Window* _pParent,
159 : sal_uInt16 nId,
160 : SfxBindings* pBindings,
161 : SfxChildWinInfo* pInfo
162 : ) :
163 :
164 0 : SfxChildWindow( _pParent, nId )
165 : {
166 0 : VclPtrInstance<SvxFontWorkDialog> pDlg(pBindings, this, _pParent);
167 0 : pWindow = pDlg.get();
168 :
169 0 : eChildAlignment = SfxChildAlignment::NOALIGNMENT;
170 :
171 0 : pDlg->Initialize( pInfo );
172 0 : }
173 :
174 : // Floating Window to the attribution of text effects
175 0 : SvxFontWorkDialog::SvxFontWorkDialog(SfxBindings *pBindinx,
176 : SfxChildWindow *pCW,
177 : vcl::Window* _pParent)
178 : : SfxDockingWindow(pBindinx, pCW, _pParent, "DockingFontwork", "svx/ui/dockingfontwork.ui")
179 : , rBindings(*pBindinx)
180 : , nLastStyleTbxId(0)
181 : , nLastAdjustTbxId(0)
182 : , nLastShadowTbxId(0)
183 : , nSaveShadowX(0)
184 : , nSaveShadowY(0)
185 : , nSaveShadowAngle(450)
186 0 : , nSaveShadowSize (100)
187 : {
188 0 : get(m_pMtrFldDistance, "distance");
189 0 : get(m_pMtrFldTextStart, "indent");
190 0 : get(m_pMtrFldShadowX, "distancex");
191 0 : get(m_pMtrFldShadowY, "distancey");
192 0 : get(m_pShadowColorLB, "color");
193 0 : get(m_pFbShadowX, "shadowx");
194 0 : get(m_pFbShadowY, "shadowy");
195 :
196 0 : get(m_pTbxStyle, "style");
197 0 : nStyleOffId = m_pTbxStyle->GetItemId(0);
198 0 : m_pTbxStyle->SetItemBits(nStyleOffId, ToolBoxItemBits::AUTOCHECK);
199 0 : nStyleRotateId = m_pTbxStyle->GetItemId(1);
200 0 : m_pTbxStyle->SetItemBits(nStyleRotateId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::RADIOCHECK);
201 0 : nStyleUprightId = m_pTbxStyle->GetItemId(2);
202 0 : m_pTbxStyle->SetItemBits(nStyleUprightId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::RADIOCHECK);
203 0 : nStyleSlantXId = m_pTbxStyle->GetItemId(3);
204 0 : m_pTbxStyle->SetItemBits(nStyleSlantXId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::RADIOCHECK);
205 0 : nStyleSlantYId = m_pTbxStyle->GetItemId(4);
206 0 : m_pTbxStyle->SetItemBits(nStyleSlantYId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::RADIOCHECK);
207 :
208 0 : get(m_pTbxShadow, "shadow");
209 0 : nShowFormId = m_pTbxShadow->GetItemId(0);
210 0 : m_pTbxShadow->SetItemBits(nShowFormId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::CHECKABLE);
211 0 : nOutlineId = m_pTbxShadow->GetItemId(1);
212 0 : m_pTbxShadow->SetItemBits(nOutlineId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::RADIOCHECK);
213 0 : nShadowOffId = m_pTbxShadow->GetItemId(2);
214 0 : m_pTbxShadow->SetItemBits(nShadowOffId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::RADIOCHECK);
215 0 : nShadowNormalId = m_pTbxShadow->GetItemId(3);
216 0 : m_pTbxShadow->SetItemBits(nShadowNormalId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::RADIOCHECK);
217 0 : nShadowSlantId = m_pTbxShadow->GetItemId(4);
218 0 : m_pTbxShadow->SetItemBits(nShadowSlantId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::RADIOCHECK);
219 :
220 0 : get(m_pTbxAdjust, "adjust");
221 0 : nAdjustMirrorId = m_pTbxAdjust->GetItemId(0);
222 0 : m_pTbxAdjust->SetItemBits(nAdjustMirrorId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::CHECKABLE);
223 0 : nAdjustLeftId = m_pTbxAdjust->GetItemId(1);
224 0 : m_pTbxAdjust->SetItemBits(nAdjustLeftId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::CHECKABLE);
225 0 : nAdjustCenterId = m_pTbxAdjust->GetItemId(2);
226 0 : m_pTbxAdjust->SetItemBits(nAdjustCenterId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::RADIOCHECK);
227 0 : nAdjustRightId = m_pTbxAdjust->GetItemId(3);
228 0 : m_pTbxAdjust->SetItemBits(nAdjustRightId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::RADIOCHECK);
229 0 : nAdjustAutoSizeId = m_pTbxAdjust->GetItemId(4);
230 0 : m_pTbxAdjust->SetItemBits(nAdjustAutoSizeId, ToolBoxItemBits::AUTOCHECK|ToolBoxItemBits::RADIOCHECK);
231 :
232 0 : ApplyImageList();
233 :
234 0 : pCtrlItems[0] = new SvxFontWorkControllerItem(SID_FORMTEXT_STYLE, *this, rBindings);
235 0 : pCtrlItems[1] = new SvxFontWorkControllerItem(SID_FORMTEXT_ADJUST, *this, rBindings);
236 0 : pCtrlItems[2] = new SvxFontWorkControllerItem(SID_FORMTEXT_DISTANCE, *this, rBindings);
237 0 : pCtrlItems[3] = new SvxFontWorkControllerItem(SID_FORMTEXT_START, *this, rBindings);
238 0 : pCtrlItems[4] = new SvxFontWorkControllerItem(SID_FORMTEXT_MIRROR, *this, rBindings);
239 0 : pCtrlItems[5] = new SvxFontWorkControllerItem(SID_FORMTEXT_HIDEFORM, *this, rBindings);
240 0 : pCtrlItems[6] = new SvxFontWorkControllerItem(SID_FORMTEXT_OUTLINE, *this, rBindings);
241 0 : pCtrlItems[7] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHADOW, *this, rBindings);
242 0 : pCtrlItems[8] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWCOLOR, *this, rBindings);
243 0 : pCtrlItems[9] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWXVAL, *this, rBindings);
244 0 : pCtrlItems[10] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWYVAL, *this, rBindings);
245 :
246 0 : Size aSize = m_pTbxStyle->CalcWindowSizePixel();
247 0 : m_pTbxStyle->SetSizePixel(aSize);
248 0 : m_pTbxStyle->SetSelectHdl( LINK(this, SvxFontWorkDialog, SelectStyleHdl_Impl) );
249 :
250 0 : m_pTbxAdjust->SetSizePixel(aSize);
251 0 : m_pTbxAdjust->SetSelectHdl( LINK(this, SvxFontWorkDialog, SelectAdjustHdl_Impl) );
252 :
253 0 : m_pTbxShadow->SetSizePixel(aSize);
254 0 : m_pTbxShadow->SetSelectHdl( LINK(this, SvxFontWorkDialog, SelectShadowHdl_Impl) );
255 :
256 0 : Link<> aLink = LINK(this, SvxFontWorkDialog, ModifyInputHdl_Impl);
257 0 : m_pMtrFldDistance->SetModifyHdl( aLink );
258 0 : m_pMtrFldTextStart->SetModifyHdl( aLink );
259 0 : m_pMtrFldShadowX->SetModifyHdl( aLink );
260 0 : m_pMtrFldShadowY->SetModifyHdl( aLink );
261 :
262 : // Set System metric
263 0 : const FieldUnit eDlgUnit = rBindings.GetDispatcher()->GetModule()->GetFieldUnit();
264 0 : SetFieldUnit(*m_pMtrFldDistance, eDlgUnit, true);
265 0 : SetFieldUnit(*m_pMtrFldTextStart, eDlgUnit, true);
266 0 : SetFieldUnit(*m_pMtrFldShadowX, eDlgUnit, true);
267 0 : SetFieldUnit(*m_pMtrFldShadowY, eDlgUnit, true);
268 0 : if( eDlgUnit == FUNIT_MM )
269 : {
270 0 : m_pMtrFldDistance->SetSpinSize( 50 );
271 0 : m_pMtrFldTextStart->SetSpinSize( 50 );
272 0 : m_pMtrFldShadowX->SetSpinSize( 50 );
273 0 : m_pMtrFldShadowY->SetSpinSize( 50 );
274 : }
275 : else
276 : {
277 0 : m_pMtrFldDistance->SetSpinSize( 10 );
278 0 : m_pMtrFldTextStart->SetSpinSize( 10 );
279 0 : m_pMtrFldShadowX->SetSpinSize( 10 );
280 0 : m_pMtrFldShadowY->SetSpinSize( 10 );
281 : }
282 :
283 0 : m_pShadowColorLB->SetSelectHdl( LINK(this, SvxFontWorkDialog, ColorSelectHdl_Impl) );
284 :
285 0 : aInputIdle.SetPriority(SchedulerPriority::LOWEST);
286 0 : aInputIdle.SetIdleHdl(LINK(this, SvxFontWorkDialog, InputTimoutHdl_Impl));
287 0 : }
288 :
289 0 : SvxFontWorkDialog::~SvxFontWorkDialog()
290 : {
291 0 : disposeOnce();
292 0 : }
293 :
294 0 : void SvxFontWorkDialog::dispose()
295 : {
296 0 : for (sal_uInt16 i = 0; i < CONTROLLER_COUNT; i++)
297 0 : pCtrlItems[i]->dispose();
298 0 : m_pTbxStyle.clear();
299 0 : m_pTbxAdjust.clear();
300 0 : m_pFbDistance.clear();
301 0 : m_pMtrFldDistance.clear();
302 0 : m_pFbTextStart.clear();
303 0 : m_pMtrFldTextStart.clear();
304 0 : m_pTbxShadow.clear();
305 0 : m_pFbShadowX.clear();
306 0 : m_pMtrFldShadowX.clear();
307 0 : m_pFbShadowY.clear();
308 0 : m_pMtrFldShadowY.clear();
309 0 : m_pShadowColorLB.clear();
310 0 : SfxDockingWindow::dispose();
311 0 : }
312 :
313 0 : SfxChildAlignment SvxFontWorkDialog::CheckAlignment( SfxChildAlignment eActAlign,
314 : SfxChildAlignment eAlign )
315 : {
316 : SfxChildAlignment eAlignment;
317 :
318 0 : switch ( eAlign )
319 : {
320 : case SfxChildAlignment::TOP:
321 : case SfxChildAlignment::HIGHESTTOP:
322 : case SfxChildAlignment::LOWESTTOP:
323 : case SfxChildAlignment::BOTTOM:
324 : case SfxChildAlignment::LOWESTBOTTOM:
325 : case SfxChildAlignment::HIGHESTBOTTOM:
326 : {
327 0 : eAlignment = eActAlign;
328 : }
329 0 : break;
330 :
331 : case SfxChildAlignment::LEFT:
332 : case SfxChildAlignment::RIGHT:
333 : case SfxChildAlignment::FIRSTLEFT:
334 : case SfxChildAlignment::LASTLEFT:
335 : case SfxChildAlignment::FIRSTRIGHT:
336 : case SfxChildAlignment::LASTRIGHT:
337 : {
338 0 : eAlignment = eAlign;
339 : }
340 0 : break;
341 :
342 : default:
343 : {
344 0 : eAlignment = eAlign;
345 : }
346 0 : break;
347 : }
348 :
349 0 : return eAlignment;
350 : }
351 :
352 : // Set style buttons
353 :
354 0 : void SvxFontWorkDialog::SetStyle_Impl(const XFormTextStyleItem* pItem)
355 : {
356 0 : if ( pItem )
357 : {
358 0 : sal_uInt16 nId = nStyleOffId;
359 :
360 0 : switch ( pItem->GetValue() )
361 : {
362 0 : case XFT_ROTATE : nId = nStyleRotateId; break;
363 0 : case XFT_UPRIGHT: nId = nStyleUprightId; break;
364 0 : case XFT_SLANTX : nId = nStyleSlantXId; break;
365 0 : case XFT_SLANTY : nId = nStyleSlantYId; break;
366 : default: ;//prevent warning
367 : }
368 0 : m_pTbxStyle->Enable();
369 :
370 : // Make sure that there is always exactly one checked toolbox item.
371 0 : if ( pItem->GetValue() == XFT_NONE )
372 : {
373 0 : m_pTbxStyle->CheckItem(nStyleRotateId, false);
374 0 : m_pTbxStyle->CheckItem(nStyleUprightId, false);
375 0 : m_pTbxStyle->CheckItem(nStyleSlantXId, false);
376 0 : m_pTbxStyle->CheckItem(nStyleSlantYId, false);
377 :
378 0 : m_pTbxStyle->CheckItem(nStyleOffId, true);
379 : }
380 : else
381 : {
382 0 : m_pTbxStyle->CheckItem(nStyleOffId, false);
383 0 : m_pTbxStyle->CheckItem(nId);
384 : }
385 :
386 0 : nLastStyleTbxId = nId;
387 : }
388 : else
389 0 : m_pTbxStyle->Disable();
390 0 : }
391 :
392 : // Set adjust buttons
393 :
394 0 : void SvxFontWorkDialog::SetAdjust_Impl(const XFormTextAdjustItem* pItem)
395 : {
396 0 : if ( pItem )
397 : {
398 : sal_uInt16 nId;
399 :
400 0 : m_pTbxAdjust->Enable();
401 0 : m_pMtrFldDistance->Enable();
402 :
403 0 : if ( pItem->GetValue() == XFT_LEFT || pItem->GetValue() == XFT_RIGHT )
404 : {
405 0 : if ( pItem->GetValue() == XFT_LEFT ) nId = nAdjustLeftId;
406 0 : else nId = nAdjustRightId;
407 0 : m_pMtrFldTextStart->Enable();
408 : }
409 : else
410 : {
411 0 : if ( pItem->GetValue() == XFT_CENTER ) nId = nAdjustCenterId;
412 0 : else nId = nAdjustAutoSizeId;
413 0 : m_pMtrFldTextStart->Disable();
414 : }
415 :
416 0 : if ( !m_pTbxAdjust->IsItemChecked(nId) )
417 : {
418 0 : m_pTbxAdjust->CheckItem(nId);
419 : }
420 0 : nLastAdjustTbxId = nId;
421 : }
422 : else
423 : {
424 0 : m_pTbxAdjust->Disable();
425 0 : m_pMtrFldTextStart->Disable();
426 0 : m_pMtrFldDistance->Disable();
427 : }
428 0 : }
429 :
430 : // Enter Distance value in the edit field
431 :
432 0 : void SvxFontWorkDialog::SetDistance_Impl(const XFormTextDistanceItem* pItem)
433 : {
434 : // Use HasChildPathFocus() instead of HasFocus() at SpinFields
435 0 : if ( pItem && !m_pMtrFldDistance->HasChildPathFocus() )
436 : {
437 0 : SetMetricValue(*m_pMtrFldDistance, pItem->GetValue(), SFX_MAPUNIT_100TH_MM);
438 : }
439 0 : }
440 :
441 : // Enter indent value in the edit field
442 :
443 0 : void SvxFontWorkDialog::SetStart_Impl(const XFormTextStartItem* pItem)
444 : {
445 : // Use HasChildPathFocus() instead of HasFocus() at SpinFields
446 0 : if ( pItem && !m_pMtrFldTextStart->HasChildPathFocus() )
447 : {
448 0 : SetMetricValue(*m_pMtrFldTextStart, pItem->GetValue(), SFX_MAPUNIT_100TH_MM);
449 : }
450 0 : }
451 :
452 : // Set button for reversing the direction of text
453 :
454 0 : void SvxFontWorkDialog::SetMirror_Impl(const XFormTextMirrorItem* pItem)
455 : {
456 0 : if ( pItem )
457 0 : m_pTbxAdjust->CheckItem(nAdjustMirrorId, pItem->GetValue());
458 0 : }
459 :
460 : // Set button for contour display
461 :
462 0 : void SvxFontWorkDialog::SetShowForm_Impl(const XFormTextHideFormItem* pItem)
463 : {
464 0 : if ( pItem )
465 0 : m_pTbxShadow->CheckItem(nShowFormId, !pItem->GetValue());
466 0 : }
467 :
468 : // Set button for text border
469 :
470 0 : void SvxFontWorkDialog::SetOutline_Impl(const XFormTextOutlineItem* pItem)
471 : {
472 0 : if ( pItem )
473 0 : m_pTbxShadow->CheckItem(nOutlineId, pItem->GetValue());
474 0 : }
475 :
476 : // Set shadow buttons
477 :
478 0 : void SvxFontWorkDialog::SetShadow_Impl(const XFormTextShadowItem* pItem,
479 : bool bRestoreValues)
480 : {
481 0 : if ( pItem )
482 : {
483 : sal_uInt16 nId;
484 :
485 0 : m_pTbxShadow->Enable();
486 :
487 0 : if ( pItem->GetValue() == XFTSHADOW_NONE )
488 : {
489 0 : nId = nShadowOffId;
490 0 : m_pFbShadowX->Hide();
491 0 : m_pFbShadowY->Hide();
492 0 : m_pMtrFldShadowX->Disable();
493 0 : m_pMtrFldShadowY->Disable();
494 0 : m_pShadowColorLB->Disable();
495 : }
496 : else
497 : {
498 0 : m_pFbShadowX->Show();
499 0 : m_pFbShadowY->Show();
500 0 : m_pMtrFldShadowX->Enable();
501 0 : m_pMtrFldShadowY->Enable();
502 0 : m_pShadowColorLB->Enable();
503 :
504 0 : if ( pItem->GetValue() == XFTSHADOW_NORMAL )
505 : {
506 0 : nId = nShadowNormalId;
507 0 : const FieldUnit eDlgUnit = rBindings.GetDispatcher()->GetModule()->GetFieldUnit();
508 :
509 0 : m_pMtrFldShadowX->SetUnit( eDlgUnit );
510 0 : m_pMtrFldShadowX->SetDecimalDigits(2);
511 0 : m_pMtrFldShadowX->SetMin(LONG_MIN);
512 0 : m_pMtrFldShadowX->SetMax(LONG_MAX);
513 0 : if( eDlgUnit == FUNIT_MM )
514 0 : m_pMtrFldShadowX->SetSpinSize( 50 );
515 : else
516 0 : m_pMtrFldShadowX->SetSpinSize( 10 );
517 :
518 0 : m_pMtrFldShadowY->SetUnit( eDlgUnit );
519 0 : m_pMtrFldShadowY->SetDecimalDigits(2);
520 0 : m_pMtrFldShadowY->SetMin(LONG_MIN);
521 0 : m_pMtrFldShadowY->SetMax(LONG_MAX);
522 0 : if( eDlgUnit == FUNIT_MM )
523 0 : m_pMtrFldShadowY->SetSpinSize( 50 );
524 : else
525 0 : m_pMtrFldShadowY->SetSpinSize( 10 );
526 :
527 0 : if ( bRestoreValues )
528 : {
529 0 : SetMetricValue(*m_pMtrFldShadowX, nSaveShadowX, SFX_MAPUNIT_100TH_MM);
530 0 : SetMetricValue(*m_pMtrFldShadowY, nSaveShadowY, SFX_MAPUNIT_100TH_MM);
531 :
532 0 : XFormTextShadowXValItem aXItem( nSaveShadowX );
533 0 : XFormTextShadowYValItem aYItem( nSaveShadowY );
534 :
535 0 : GetBindings().GetDispatcher()->Execute(
536 0 : SID_FORMTEXT_SHDWXVAL, SfxCallMode::RECORD, &aXItem, &aYItem, 0L );
537 : }
538 : }
539 : else
540 : {
541 0 : nId = nShadowSlantId;
542 :
543 0 : m_pMtrFldShadowX->SetUnit(FUNIT_DEGREE);
544 0 : m_pMtrFldShadowX->SetDecimalDigits(1);
545 0 : m_pMtrFldShadowX->SetMin(-1800);
546 0 : m_pMtrFldShadowX->SetMax( 1800);
547 0 : m_pMtrFldShadowX->SetSpinSize(10);
548 :
549 0 : m_pMtrFldShadowY->SetUnit(FUNIT_PERCENT);
550 0 : m_pMtrFldShadowY->SetDecimalDigits(0);
551 0 : m_pMtrFldShadowY->SetMin(-999);
552 0 : m_pMtrFldShadowY->SetMax( 999);
553 0 : m_pMtrFldShadowY->SetSpinSize(10);
554 :
555 0 : if ( bRestoreValues )
556 : {
557 0 : m_pMtrFldShadowX->SetValue(nSaveShadowAngle);
558 0 : m_pMtrFldShadowY->SetValue(nSaveShadowSize);
559 0 : XFormTextShadowXValItem aXItem(nSaveShadowAngle);
560 0 : XFormTextShadowYValItem aYItem(nSaveShadowSize);
561 0 : GetBindings().GetDispatcher()->Execute(
562 0 : SID_FORMTEXT_SHDWXVAL, SfxCallMode::RECORD, &aXItem, &aYItem, 0L );
563 : }
564 : }
565 : }
566 :
567 0 : if ( !m_pTbxShadow->IsItemChecked(nId) )
568 : {
569 0 : m_pTbxShadow->CheckItem(nId);
570 : }
571 0 : nLastShadowTbxId = nId;
572 :
573 0 : ApplyImageList();
574 : }
575 : else
576 : {
577 0 : m_pTbxShadow->Disable();
578 0 : m_pMtrFldShadowX->Disable();
579 0 : m_pMtrFldShadowY->Disable();
580 0 : m_pShadowColorLB->Disable();
581 : }
582 0 : }
583 :
584 : // Insert shadow color in listbox
585 :
586 0 : void SvxFontWorkDialog::SetShadowColor_Impl(const XFormTextShadowColorItem* pItem)
587 : {
588 0 : if ( pItem )
589 0 : m_pShadowColorLB->SelectEntry(pItem->GetColorValue());
590 0 : }
591 :
592 : // Enter X-value for shadow in edit field
593 :
594 0 : void SvxFontWorkDialog::SetShadowXVal_Impl(const XFormTextShadowXValItem* pItem)
595 : {
596 : // Use HasChildPathFocus() instead of HasFocus() at SpinFields
597 0 : if ( pItem && !m_pMtrFldShadowX->HasChildPathFocus() )
598 : {
599 : // #i19251#
600 : // sal_Int32 nValue = pItem->GetValue();
601 :
602 : // #i19251#
603 : // The two involved fields/items are used double and contain/give different
604 : // values regarding to the access method. Thus, here we need to separate the access
605 : // methos regarding to the kind of value accessed.
606 0 : if (m_pTbxShadow->IsItemChecked(nShadowSlantId))
607 : {
608 : // #i19251#
609 : // There is no value correction necessary at all, i think this
610 : // was only tried to be done without understanding that the two
611 : // involved fields/items are used double and contain/give different
612 : // values regarding to the access method.
613 : // nValue = nValue - ( int( float( nValue ) / 360.0 ) * 360 );
614 0 : m_pMtrFldShadowX->SetValue(pItem->GetValue());
615 : }
616 : else
617 : {
618 0 : SetMetricValue(*m_pMtrFldShadowX, pItem->GetValue(), SFX_MAPUNIT_100TH_MM);
619 : }
620 : }
621 0 : }
622 :
623 : // Enter Y-value for shadow in edit field
624 :
625 0 : void SvxFontWorkDialog::SetShadowYVal_Impl(const XFormTextShadowYValItem* pItem)
626 : {
627 : // Use HasChildPathFocus() instead of HasFocus() at SpinFields
628 0 : if ( pItem && !m_pMtrFldShadowY->HasChildPathFocus() )
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 : // methos regarding to the kind of value accessed.
634 0 : if (m_pTbxShadow->IsItemChecked(nShadowSlantId))
635 : {
636 0 : m_pMtrFldShadowY->SetValue(pItem->GetValue());
637 : }
638 : else
639 : {
640 0 : SetMetricValue(*m_pMtrFldShadowY, pItem->GetValue(), SFX_MAPUNIT_100TH_MM);
641 : }
642 : }
643 0 : }
644 :
645 0 : IMPL_LINK_NOARG_TYPED(SvxFontWorkDialog, SelectStyleHdl_Impl, ToolBox *, void)
646 : {
647 0 : sal_uInt16 nId = m_pTbxStyle->GetCurItemId();
648 :
649 : // Execute this block when a different toolbox item has been clicked or
650 : // when the off item has been clicked. The later is necessary to
651 : // override the toolbox behaviour of unchecking the item after second
652 : // click on it: One of the items has to be checked at all times (when
653 : // enabled that is.)
654 0 : if (nId == nStyleOffId || nId != nLastStyleTbxId )
655 : {
656 0 : XFormTextStyle eStyle = XFT_NONE;
657 :
658 0 : if (nId == nStyleRotateId)
659 0 : eStyle = XFT_ROTATE;
660 0 : else if (nId == nStyleUprightId)
661 0 : eStyle = XFT_UPRIGHT;
662 0 : else if (nId == nStyleSlantXId)
663 0 : eStyle = XFT_SLANTX;
664 0 : else if (nId == nStyleSlantYId)
665 0 : eStyle = XFT_SLANTY;
666 :
667 0 : XFormTextStyleItem aItem( eStyle );
668 0 : GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_STYLE, SfxCallMode::RECORD, &aItem, 0L );
669 0 : SetStyle_Impl( &aItem );
670 0 : nLastStyleTbxId = nId;
671 : }
672 0 : }
673 :
674 0 : IMPL_LINK_NOARG_TYPED(SvxFontWorkDialog, SelectAdjustHdl_Impl, ToolBox *, void)
675 : {
676 0 : sal_uInt16 nId = m_pTbxAdjust->GetCurItemId();
677 :
678 0 : if (nId == nAdjustMirrorId)
679 : {
680 0 : XFormTextMirrorItem aItem(m_pTbxAdjust->IsItemChecked(nId));
681 0 : GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_MIRROR, SfxCallMode::SLOT, &aItem, 0L );
682 : }
683 0 : else if ( nId != nLastAdjustTbxId )
684 : {
685 0 : XFormTextAdjust eAdjust = XFT_AUTOSIZE;
686 :
687 0 : if (nId == nAdjustLeftId)
688 0 : eAdjust = XFT_LEFT;
689 0 : else if (nId == nAdjustCenterId)
690 0 : eAdjust = XFT_CENTER;
691 0 : else if (nId == nAdjustRightId)
692 0 : eAdjust = XFT_RIGHT;
693 :
694 0 : XFormTextAdjustItem aItem(eAdjust);
695 0 : GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_ADJUST, SfxCallMode::RECORD, &aItem, 0L );
696 0 : SetAdjust_Impl(&aItem);
697 0 : nLastAdjustTbxId = nId;
698 : }
699 0 : }
700 :
701 0 : IMPL_LINK_NOARG_TYPED(SvxFontWorkDialog, SelectShadowHdl_Impl, ToolBox *, void)
702 : {
703 0 : sal_uInt16 nId = m_pTbxShadow->GetCurItemId();
704 :
705 0 : if (nId == nShowFormId)
706 : {
707 0 : XFormTextHideFormItem aItem(!m_pTbxShadow->IsItemChecked(nId));
708 0 : GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_HIDEFORM, SfxCallMode::RECORD, &aItem, 0L );
709 : }
710 0 : else if (nId == nOutlineId)
711 : {
712 0 : XFormTextOutlineItem aItem(m_pTbxShadow->IsItemChecked(nId));
713 0 : GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_OUTLINE, SfxCallMode::RECORD, &aItem, 0L );
714 : }
715 0 : else if (nId != nLastShadowTbxId)
716 : {
717 0 : XFormTextShadow eShadow = XFTSHADOW_NONE;
718 :
719 0 : if (nLastShadowTbxId == nShadowNormalId)
720 : {
721 0 : nSaveShadowX = GetCoreValue(*m_pMtrFldShadowX, SFX_MAPUNIT_100TH_MM);
722 0 : nSaveShadowY = GetCoreValue(*m_pMtrFldShadowY, SFX_MAPUNIT_100TH_MM);
723 : }
724 0 : else if (nLastShadowTbxId == nShadowSlantId)
725 : {
726 0 : nSaveShadowAngle = static_cast<long>(m_pMtrFldShadowX->GetValue());
727 0 : nSaveShadowSize = static_cast<long>(m_pMtrFldShadowY->GetValue());
728 : }
729 0 : nLastShadowTbxId = nId;
730 :
731 0 : if ( nId == nShadowNormalId) eShadow = XFTSHADOW_NORMAL;
732 0 : else if (nId == nShadowSlantId) eShadow = XFTSHADOW_SLANT;
733 :
734 0 : XFormTextShadowItem aItem(eShadow);
735 0 : GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_SHADOW, SfxCallMode::RECORD, &aItem, 0L );
736 0 : SetShadow_Impl(&aItem, true);
737 : }
738 0 : }
739 :
740 0 : IMPL_LINK_NOARG(SvxFontWorkDialog, ModifyInputHdl_Impl)
741 : {
742 0 : aInputIdle.Start();
743 0 : return 0;
744 : }
745 :
746 0 : IMPL_LINK_NOARG_TYPED(SvxFontWorkDialog, InputTimoutHdl_Impl, Idle *, void)
747 : {
748 : // Possibly set the Metric system again. This should be done with a
749 : // listen, this is however not possible at the moment due to compabillity
750 : // issues.
751 0 : const FieldUnit eDlgUnit = rBindings.GetDispatcher()->GetModule()->GetFieldUnit();
752 0 : if( eDlgUnit != m_pMtrFldDistance->GetUnit() )
753 : {
754 0 : SetFieldUnit(*m_pMtrFldDistance, eDlgUnit, true);
755 0 : SetFieldUnit(*m_pMtrFldTextStart, eDlgUnit, true);
756 0 : m_pMtrFldDistance->SetSpinSize( eDlgUnit == FUNIT_MM ? 50 : 10 );
757 0 : m_pMtrFldTextStart->SetSpinSize( eDlgUnit == FUNIT_MM ? 50 : 10 );
758 : }
759 0 : if( eDlgUnit != m_pMtrFldShadowX->GetUnit() &&
760 0 : m_pTbxShadow->IsItemChecked(nShadowNormalId) )
761 : {
762 0 : SetFieldUnit(*m_pMtrFldShadowX, eDlgUnit, true);
763 0 : SetFieldUnit(*m_pMtrFldShadowY, eDlgUnit, true);
764 0 : m_pMtrFldShadowX->SetSpinSize( eDlgUnit == FUNIT_MM ? 50 : 10 );
765 0 : m_pMtrFldShadowY->SetSpinSize( eDlgUnit == FUNIT_MM ? 50 : 10 );
766 : }
767 :
768 0 : long nValue = GetCoreValue(*m_pMtrFldDistance, SFX_MAPUNIT_100TH_MM);
769 0 : XFormTextDistanceItem aDistItem( nValue );
770 0 : nValue = GetCoreValue(*m_pMtrFldTextStart, SFX_MAPUNIT_100TH_MM);
771 0 : XFormTextStartItem aStartItem( nValue );
772 :
773 0 : sal_Int32 nValueX(0L);
774 0 : sal_Int32 nValueY(0L);
775 :
776 : // #i19251#
777 : // The two involved fields/items are used double and contain/give different
778 : // values regarding to the access method. Thus, here we need to separate the access
779 : // methos regarding to the kind of value accessed.
780 0 : if (nLastShadowTbxId == nShadowNormalId)
781 : {
782 0 : nValueX = GetCoreValue(*m_pMtrFldShadowX, SFX_MAPUNIT_100TH_MM);
783 0 : nValueY = GetCoreValue(*m_pMtrFldShadowY, SFX_MAPUNIT_100TH_MM);
784 : }
785 0 : else if (nLastShadowTbxId == nShadowSlantId)
786 : {
787 0 : nValueX = static_cast<long>(m_pMtrFldShadowX->GetValue());
788 0 : nValueY = static_cast<long>(m_pMtrFldShadowY->GetValue());
789 : }
790 :
791 0 : XFormTextShadowXValItem aShadowXItem( nValueX );
792 0 : XFormTextShadowYValItem aShadowYItem( nValueY );
793 :
794 : // Slot-ID does not matter, the Exec method evaluates the entire item set
795 0 : GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_DISTANCE, SfxCallMode::RECORD, &aDistItem,
796 0 : &aStartItem, &aShadowXItem, &aShadowYItem, 0L );
797 0 : }
798 :
799 0 : IMPL_LINK_NOARG(SvxFontWorkDialog, ColorSelectHdl_Impl)
800 : {
801 0 : XFormTextShadowColorItem aItem( "", m_pShadowColorLB->GetSelectEntryColor() );
802 0 : GetBindings().GetDispatcher()->Execute( SID_FORMTEXT_SHDWCOLOR, SfxCallMode::RECORD, &aItem, 0L );
803 0 : return 0;
804 : }
805 :
806 0 : void SvxFontWorkDialog::SetColorList(const XColorListRef &pList)
807 : {
808 0 : if ( pList.is() && pList != pColorList )
809 : {
810 0 : pColorList = pList;
811 0 : m_pShadowColorLB->Clear();
812 0 : m_pShadowColorLB->Fill(pColorList);
813 : }
814 0 : }
815 :
816 0 : void SvxFontWorkDialog::ApplyImageList()
817 : {
818 0 : if (nLastShadowTbxId == nShadowSlantId)
819 : {
820 0 : m_pFbShadowX->SetImage(Image(SVX_RES(RID_SVXIMG_SHADOW_ANGLE)));
821 0 : m_pFbShadowY->SetImage(Image(SVX_RES(RID_SVXIMG_SHADOW_SIZE)));
822 : }
823 : else
824 : {
825 0 : m_pFbShadowX->SetImage(Image(SVX_RES(RID_SVXIMG_SHADOW_XDIST)));
826 0 : m_pFbShadowY->SetImage(Image(SVX_RES(RID_SVXIMG_SHADOW_YDIST)));
827 : }
828 390 : }
829 :
830 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|