Coverage Report

Created: 2026-03-31 11:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/svx/source/dialog/fontwork.cxx
Line
Count
Source
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/chalign.hxx>
22
#include <sfx2/dispatch.hxx>
23
24
#include <svx/colorbox.hxx>
25
#include <svx/dialmgr.hxx>
26
#include <svx/strings.hrc>
27
#include <svx/xftadit.hxx>
28
#include <svx/xftdiit.hxx>
29
#include <svx/xftstit.hxx>
30
#include <svx/xftmrit.hxx>
31
#include <svx/xftouit.hxx>
32
#include <svx/xftshit.hxx>
33
#include <svx/xftshcit.hxx>
34
#include <svx/xftshxy.hxx>
35
#include <svx/xtextit0.hxx>
36
37
#include <svtools/unitconv.hxx>
38
#include <svx/svxids.hrc>
39
#include <tools/fldunit.hxx>
40
#include <tools/mapunit.hxx>
41
#include <bitmaps.hlst>
42
#include <svx/fontwork.hxx>
43
#include <svl/itemset.hxx>
44
#include <vcl/weld/Builder.hxx>
45
46
constexpr int WIDTH_CHARS = 10;
47
48
SFX_IMPL_DOCKINGWINDOW_WITHID( SvxFontWorkChildWindow, SID_FONTWORK );
49
50
// ControllerItem for Fontwork
51
52
SvxFontWorkControllerItem::SvxFontWorkControllerItem
53
(
54
    sal_uInt16 _nId,
55
    SvxFontWorkDialog& rDlg,
56
    SfxBindings& rBindings
57
) :
58
59
0
    SfxControllerItem( _nId, rBindings ),
60
61
0
    m_rFontWorkDlg( rDlg )
62
0
{
63
0
}
64
65
// StateChanged method for FontWork items
66
67
void SvxFontWorkControllerItem::StateChangedAtToolBoxControl( sal_uInt16 /*nSID*/, SfxItemState /*eState*/,
68
                                              const SfxPoolItem* pItem )
69
0
{
70
0
    switch ( GetId() )
71
0
    {
72
0
        case SID_FORMTEXT_STYLE:
73
0
        {
74
0
            const XFormTextStyleItem* pStateItem =
75
0
                                dynamic_cast<const XFormTextStyleItem*>( pItem );
76
0
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextStyleItem expected");
77
0
            m_rFontWorkDlg.SetStyle_Impl(pStateItem);
78
0
            break;
79
0
        }
80
0
        case SID_FORMTEXT_ADJUST:
81
0
        {
82
0
            const XFormTextAdjustItem* pStateItem =
83
0
                                dynamic_cast<const XFormTextAdjustItem*>( pItem );
84
0
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextAdjustItem expected");
85
0
            m_rFontWorkDlg.SetAdjust_Impl(pStateItem);
86
0
            break;
87
0
        }
88
0
        case SID_FORMTEXT_DISTANCE:
89
0
        {
90
0
            const XFormTextDistanceItem* pStateItem =
91
0
                                dynamic_cast<const XFormTextDistanceItem*>( pItem );
92
0
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextDistanceItem expected");
93
0
            m_rFontWorkDlg.SetDistance_Impl(pStateItem);
94
0
            break;
95
0
        }
96
0
        case SID_FORMTEXT_START:
97
0
        {
98
0
            const XFormTextStartItem* pStateItem =
99
0
                                dynamic_cast<const XFormTextStartItem*>( pItem );
100
0
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextStartItem expected");
101
0
            m_rFontWorkDlg.SetStart_Impl(pStateItem);
102
0
            break;
103
0
        }
104
0
        case SID_FORMTEXT_MIRROR:
105
0
        {
106
0
            const XFormTextMirrorItem* pStateItem =
107
0
                                dynamic_cast<const XFormTextMirrorItem*>( pItem );
108
0
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextMirrorItem expected");
109
0
            m_rFontWorkDlg.SetMirror_Impl(pStateItem);
110
0
            break;
111
0
        }
112
0
        case SID_FORMTEXT_HIDEFORM:
113
0
        {
114
0
            const XFormTextHideFormItem* pStateItem =
115
0
                                dynamic_cast<const XFormTextHideFormItem*>( pItem );
116
0
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextHideFormItem expected");
117
0
            m_rFontWorkDlg.SetShowForm_Impl(pStateItem);
118
0
            break;
119
0
        }
120
0
        case SID_FORMTEXT_OUTLINE:
121
0
        {
122
0
            const XFormTextOutlineItem* pStateItem =
123
0
                                dynamic_cast<const XFormTextOutlineItem*>( pItem );
124
0
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextOutlineItem expected");
125
0
            m_rFontWorkDlg.SetOutline_Impl(pStateItem);
126
0
            break;
127
0
        }
128
0
        case SID_FORMTEXT_SHADOW:
129
0
        {
130
0
            const XFormTextShadowItem* pStateItem =
131
0
                                dynamic_cast<const XFormTextShadowItem*>( pItem );
132
0
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextShadowItem expected");
133
0
            m_rFontWorkDlg.SetShadow_Impl(pStateItem);
134
0
            break;
135
0
        }
136
0
        case SID_FORMTEXT_SHDWCOLOR:
137
0
        {
138
0
            const XFormTextShadowColorItem* pStateItem =
139
0
                                dynamic_cast<const XFormTextShadowColorItem*>( pItem );
140
0
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextShadowColorItem expected");
141
0
            m_rFontWorkDlg.SetShadowColor_Impl(pStateItem);
142
0
            break;
143
0
        }
144
0
        case SID_FORMTEXT_SHDWXVAL:
145
0
        {
146
0
            const XFormTextShadowXValItem* pStateItem =
147
0
                                dynamic_cast<const XFormTextShadowXValItem*>( pItem );
148
0
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextShadowXValItem expected");
149
0
            m_rFontWorkDlg.SetShadowXVal_Impl(pStateItem);
150
0
            break;
151
0
        }
152
0
        case SID_FORMTEXT_SHDWYVAL:
153
0
        {
154
0
            const XFormTextShadowYValItem* pStateItem =
155
0
                                dynamic_cast<const XFormTextShadowYValItem*>( pItem );
156
0
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextShadowYValItem expected");
157
0
            m_rFontWorkDlg.SetShadowYVal_Impl(pStateItem);
158
0
            break;
159
0
        }
160
0
    }
161
0
}
162
163
// Derivation from SfxChildWindow as "containers" for Fontwork dialog
164
165
SvxFontWorkChildWindow::SvxFontWorkChildWindow
166
(
167
    vcl::Window* _pParent,
168
    sal_uInt16 nId,
169
    SfxBindings* pBindings,
170
    SfxChildWinInfo* pInfo
171
) :
172
0
    SfxChildWindow( _pParent, nId )
173
0
{
174
0
    VclPtrInstance<SvxFontWorkDialog> pDlg(pBindings, this, _pParent);
175
0
    SetWindow(pDlg);
176
177
0
    pDlg->Initialize( pInfo );
178
0
}
179
180
// Floating Window to the attribution of text effects
181
SvxFontWorkDialog::SvxFontWorkDialog(SfxBindings *pBindinx,
182
                                     SfxChildWindow *pCW,
183
                                     vcl::Window* _pParent)
184
0
    : SfxDockingWindow(pBindinx, pCW, _pParent, u"DockingFontwork"_ustr, u"svx/ui/dockingfontwork.ui"_ustr)
185
0
    , m_rBindings(*pBindinx)
186
0
    , m_aInputIdle("SvxFontWorkDialog Input")
187
0
    , m_nSaveShadowX(0)
188
0
    , m_nSaveShadowY(0)
189
0
    , m_nSaveShadowAngle(450)
190
0
    , m_nSaveShadowSize (100)
191
0
    , m_xTbxStyle(m_xBuilder->weld_toolbar(u"style"_ustr))
192
0
    , m_xTbxAdjust(m_xBuilder->weld_toolbar(u"adjust"_ustr))
193
0
    , m_xMtrFldDistance(m_xBuilder->weld_metric_spin_button(u"distance"_ustr, FieldUnit::CM))
194
0
    , m_xMtrFldTextStart(m_xBuilder->weld_metric_spin_button(u"indent"_ustr, FieldUnit::CM))
195
0
    , m_xTbxShadow(m_xBuilder->weld_toolbar(u"shadow"_ustr))
196
0
    , m_xFbShadowX(m_xBuilder->weld_image(u"shadowx"_ustr))
197
0
    , m_xMtrFldShadowX(m_xBuilder->weld_metric_spin_button(u"distancex"_ustr, FieldUnit::CM))
198
0
    , m_xFbShadowY(m_xBuilder->weld_image(u"shadowy"_ustr))
199
0
    , m_xMtrFldShadowY(m_xBuilder->weld_metric_spin_button(u"distancey"_ustr, FieldUnit::CM))
200
0
    , m_xShadowColorLB(new ColorListBox(m_xBuilder->weld_menu_button(u"color"_ustr), [this]{ return GetFrameWeld(); } ))
201
0
{
202
0
    SetText(SvxResId(RID_SVXSTR_FONTWORK));
203
204
0
    ApplyImageList();
205
206
0
    m_pCtrlItems[0] = new SvxFontWorkControllerItem(SID_FORMTEXT_STYLE, *this, m_rBindings);
207
0
    m_pCtrlItems[1] = new SvxFontWorkControllerItem(SID_FORMTEXT_ADJUST, *this, m_rBindings);
208
0
    m_pCtrlItems[2] = new SvxFontWorkControllerItem(SID_FORMTEXT_DISTANCE, *this, m_rBindings);
209
0
    m_pCtrlItems[3] = new SvxFontWorkControllerItem(SID_FORMTEXT_START, *this, m_rBindings);
210
0
    m_pCtrlItems[4] = new SvxFontWorkControllerItem(SID_FORMTEXT_MIRROR, *this, m_rBindings);
211
0
    m_pCtrlItems[5] = new SvxFontWorkControllerItem(SID_FORMTEXT_HIDEFORM, *this, m_rBindings);
212
0
    m_pCtrlItems[6] = new SvxFontWorkControllerItem(SID_FORMTEXT_OUTLINE, *this, m_rBindings);
213
0
    m_pCtrlItems[7] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHADOW, *this, m_rBindings);
214
0
    m_pCtrlItems[8] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWCOLOR, *this, m_rBindings);
215
0
    m_pCtrlItems[9] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWXVAL, *this, m_rBindings);
216
0
    m_pCtrlItems[10] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWYVAL, *this, m_rBindings);
217
218
0
    m_xTbxStyle->connect_clicked(LINK(this, SvxFontWorkDialog, SelectStyleHdl_Impl));
219
0
    m_xTbxAdjust->connect_clicked(LINK(this, SvxFontWorkDialog, SelectAdjustHdl_Impl));
220
0
    m_xTbxShadow->connect_clicked(LINK(this, SvxFontWorkDialog, SelectShadowHdl_Impl));
221
222
0
    Link<weld::MetricSpinButton&,void> aLink = LINK(this, SvxFontWorkDialog, ModifyInputHdl_Impl);
223
0
    m_xMtrFldDistance->connect_value_changed( aLink );
224
0
    m_xMtrFldTextStart->connect_value_changed( aLink );
225
0
    m_xMtrFldShadowX->connect_value_changed( aLink );
226
0
    m_xMtrFldShadowY->connect_value_changed( aLink );
227
228
    // Set System metric
229
0
    const FieldUnit eDlgUnit = m_rBindings.GetDispatcher()->GetModule()->GetFieldUnit();
230
0
    SetFieldUnit(*m_xMtrFldDistance, eDlgUnit, true);
231
0
    SetFieldUnit(*m_xMtrFldTextStart, eDlgUnit, true);
232
0
    SetFieldUnit(*m_xMtrFldShadowX, eDlgUnit, true);
233
0
    SetFieldUnit(*m_xMtrFldShadowY, eDlgUnit, true);
234
0
    if( eDlgUnit == FieldUnit::MM )
235
0
    {
236
0
        m_xMtrFldDistance->set_increments(50, 500, FieldUnit::NONE);
237
0
        m_xMtrFldTextStart->set_increments(50, 500, FieldUnit::NONE);
238
0
        m_xMtrFldShadowX->set_increments(50, 500, FieldUnit::NONE);
239
0
        m_xMtrFldShadowY->set_increments(50, 500, FieldUnit::NONE);
240
0
    }
241
0
    else
242
0
    {
243
0
        m_xMtrFldDistance->set_increments(10, 100, FieldUnit::NONE);
244
0
        m_xMtrFldTextStart->set_increments(10, 100, FieldUnit::NONE);
245
0
        m_xMtrFldShadowX->set_increments(10, 100, FieldUnit::NONE);
246
0
        m_xMtrFldShadowY->set_increments(10, 100, FieldUnit::NONE);
247
0
    }
248
0
    m_xMtrFldShadowX->set_width_chars(WIDTH_CHARS);
249
0
    m_xMtrFldShadowY->set_width_chars(WIDTH_CHARS);
250
251
0
    m_xShadowColorLB->SetSelectHdl( LINK(this, SvxFontWorkDialog, ColorSelectHdl_Impl) );
252
253
0
    m_aInputIdle.SetPriority(TaskPriority::LOWEST);
254
0
    m_aInputIdle.SetInvokeHandler(LINK(this, SvxFontWorkDialog, InputTimeoutHdl_Impl));
255
0
}
Unexecuted instantiation: SvxFontWorkDialog::SvxFontWorkDialog(SfxBindings*, SfxChildWindow*, vcl::Window*)
Unexecuted instantiation: SvxFontWorkDialog::SvxFontWorkDialog(SfxBindings*, SfxChildWindow*, vcl::Window*)
256
257
SvxFontWorkDialog::~SvxFontWorkDialog()
258
0
{
259
0
    disposeOnce();
260
0
}
261
262
void SvxFontWorkDialog::dispose()
263
0
{
264
0
    for (SvxFontWorkControllerItem* pCtrlItem : m_pCtrlItems)
265
0
        pCtrlItem->dispose();
266
0
    m_xTbxStyle.reset();
267
0
    m_xTbxAdjust.reset();
268
0
    m_xMtrFldDistance.reset();
269
0
    m_xMtrFldTextStart.reset();
270
0
    m_xTbxShadow.reset();
271
0
    m_xFbShadowX.reset();
272
0
    m_xMtrFldShadowX.reset();
273
0
    m_xFbShadowY.reset();
274
0
    m_xMtrFldShadowY.reset();
275
0
    m_xShadowColorLB.reset();
276
0
    SfxDockingWindow::dispose();
277
0
}
278
279
SfxChildAlignment SvxFontWorkDialog::CheckAlignment( SfxChildAlignment eActAlign,
280
                                                     SfxChildAlignment eAlign )
281
0
{
282
0
    SfxChildAlignment eAlignment;
283
284
0
    switch ( eAlign )
285
0
    {
286
0
        case SfxChildAlignment::TOP:
287
0
        case SfxChildAlignment::HIGHESTTOP:
288
0
        case SfxChildAlignment::LOWESTTOP:
289
0
        case SfxChildAlignment::BOTTOM:
290
0
        case SfxChildAlignment::LOWESTBOTTOM:
291
0
        case SfxChildAlignment::HIGHESTBOTTOM:
292
0
        {
293
0
            eAlignment = eActAlign;
294
0
        }
295
0
        break;
296
297
0
        case SfxChildAlignment::LEFT:
298
0
        case SfxChildAlignment::RIGHT:
299
0
        case SfxChildAlignment::FIRSTLEFT:
300
0
        case SfxChildAlignment::LASTLEFT:
301
0
        case SfxChildAlignment::FIRSTRIGHT:
302
0
        case SfxChildAlignment::LASTRIGHT:
303
0
        {
304
0
            eAlignment = eAlign;
305
0
        }
306
0
        break;
307
308
0
        default:
309
0
        {
310
0
            eAlignment = eAlign;
311
0
        }
312
0
        break;
313
0
    }
314
315
0
    return eAlignment;
316
0
}
317
318
// Set style buttons
319
void SvxFontWorkDialog::SetStyle_Impl(const XFormTextStyleItem* pItem)
320
0
{
321
0
    if ( pItem )
322
0
    {
323
0
        OUString sId = u"off"_ustr;
324
325
0
        switch ( pItem->GetValue() )
326
0
        {
327
0
            case XFormTextStyle::Rotate : sId = "rotate";   break;
328
0
            case XFormTextStyle::Upright: sId = "upright";  break;
329
0
            case XFormTextStyle::SlantX : sId = "hori";   break;
330
0
            case XFormTextStyle::SlantY : sId = "vert";   break;
331
0
            default: ;//prevent warning
332
0
        }
333
0
        m_xTbxStyle->set_sensitive(true);
334
335
        // Make sure that there is always exactly one checked toolbox item.
336
0
        if ( pItem->GetValue() == XFormTextStyle::NONE )
337
0
        {
338
0
            m_xTbxStyle->set_item_active(u"rotate"_ustr, false);
339
0
            m_xTbxStyle->set_item_active(u"upright"_ustr, false);
340
0
            m_xTbxStyle->set_item_active(u"hori"_ustr, false);
341
0
            m_xTbxStyle->set_item_active(u"vert"_ustr, false);
342
343
0
            m_xTbxStyle->set_item_active(u"off"_ustr, true);
344
0
        }
345
0
        else
346
0
        {
347
0
            m_xTbxStyle->set_item_active(u"off"_ustr, false);
348
0
            m_xTbxStyle->set_item_active(sId, true);
349
0
        }
350
351
0
        m_sLastStyleTbxId = sId;
352
0
    }
353
0
    else
354
0
        m_xTbxStyle->set_sensitive(false);
355
0
}
356
357
// Set adjust buttons
358
359
void SvxFontWorkDialog::SetAdjust_Impl(const XFormTextAdjustItem* pItem)
360
0
{
361
0
    if ( pItem )
362
0
    {
363
0
        OUString sId;
364
365
0
        m_xTbxAdjust->set_sensitive(true);
366
0
        m_xMtrFldDistance->set_sensitive(true);
367
368
0
        if ( pItem->GetValue() == XFormTextAdjust::Left || pItem->GetValue() == XFormTextAdjust::Right )
369
0
        {
370
0
            if (pItem->GetValue() == XFormTextAdjust::Left)
371
0
                sId = "left";
372
0
            else
373
0
                sId = "right";
374
0
            m_xMtrFldTextStart->set_sensitive(true);
375
0
        }
376
0
        else
377
0
        {
378
0
            if (pItem->GetValue() == XFormTextAdjust::Center)
379
0
                sId = "center";
380
0
            else
381
0
                sId = "autosize";
382
0
            m_xMtrFldTextStart->set_sensitive(false);
383
0
        }
384
385
0
        if (!m_xTbxAdjust->get_item_active(sId))
386
0
            m_xTbxAdjust->set_item_active(sId, true);
387
388
0
        m_sLastAdjustTbxId = sId;
389
0
    }
390
0
    else
391
0
    {
392
0
        m_xTbxAdjust->set_sensitive(false);
393
0
        m_xMtrFldTextStart->set_sensitive(false);
394
0
        m_xMtrFldDistance->set_sensitive(false);
395
0
    }
396
0
}
397
398
// Enter Distance value in the edit field
399
400
void SvxFontWorkDialog::SetDistance_Impl(const XFormTextDistanceItem* pItem)
401
0
{
402
0
    if (pItem && !m_xMtrFldDistance->has_focus())
403
0
    {
404
0
        SetMetricValue(*m_xMtrFldDistance, pItem->GetValue(), MapUnit::Map100thMM);
405
0
    }
406
0
}
407
408
// Enter indent value in the edit field
409
410
void SvxFontWorkDialog::SetStart_Impl(const XFormTextStartItem* pItem)
411
0
{
412
0
    if (pItem && !m_xMtrFldTextStart->has_focus())
413
0
    {
414
0
        SetMetricValue(*m_xMtrFldTextStart, pItem->GetValue(), MapUnit::Map100thMM);
415
0
    }
416
0
}
417
418
// Set button for reversing the direction of text
419
420
void SvxFontWorkDialog::SetMirror_Impl(const XFormTextMirrorItem* pItem)
421
0
{
422
0
    if ( pItem )
423
0
        m_xTbxAdjust->set_item_active(u"orientation"_ustr, pItem->GetValue());
424
0
}
425
426
// Set button for contour display
427
428
void SvxFontWorkDialog::SetShowForm_Impl(const XFormTextHideFormItem* pItem)
429
0
{
430
0
    if ( pItem )
431
0
        m_xTbxShadow->set_item_active(u"contour"_ustr, !pItem->GetValue());
432
0
}
433
434
// Set button for text border
435
436
void SvxFontWorkDialog::SetOutline_Impl(const XFormTextOutlineItem* pItem)
437
0
{
438
0
    if ( pItem )
439
0
        m_xTbxShadow->set_item_active(u"textcontour"_ustr, pItem->GetValue());
440
0
}
441
442
// Set shadow buttons
443
444
void SvxFontWorkDialog::SetShadow_Impl(const XFormTextShadowItem* pItem,
445
                                        bool bRestoreValues)
446
0
{
447
0
    if ( pItem )
448
0
    {
449
0
        OUString sId;
450
451
0
        m_xTbxShadow->set_sensitive(true);
452
453
0
        if ( pItem->GetValue() == XFormTextShadow::NONE )
454
0
        {
455
0
            sId = "noshadow";
456
0
            m_xFbShadowX->hide();
457
0
            m_xFbShadowY->hide();
458
0
            m_xMtrFldShadowX->set_sensitive(false);
459
0
            m_xMtrFldShadowY->set_sensitive(false);
460
0
            m_xShadowColorLB->set_sensitive(false);
461
0
        }
462
0
        else
463
0
        {
464
0
            m_xFbShadowX->show();
465
0
            m_xFbShadowY->show();
466
0
            m_xMtrFldShadowX->set_sensitive(true);
467
0
            m_xMtrFldShadowY->set_sensitive(true);
468
0
            m_xShadowColorLB->set_sensitive(true);
469
470
0
            if ( pItem->GetValue() == XFormTextShadow::Normal )
471
0
            {
472
0
                sId = "vertical";
473
0
                const FieldUnit eDlgUnit = m_rBindings.GetDispatcher()->GetModule()->GetFieldUnit();
474
475
0
                m_xMtrFldShadowX->set_unit( eDlgUnit );
476
0
                m_xMtrFldShadowX->set_digits(2);
477
0
                m_xMtrFldShadowX->set_range(INT_MIN, INT_MAX, FieldUnit::NONE);
478
0
                if( eDlgUnit == FieldUnit::MM )
479
0
                    m_xMtrFldShadowX->set_increments(50, 500, FieldUnit::NONE);
480
0
                else
481
0
                    m_xMtrFldShadowX->set_increments(10, 100, FieldUnit::NONE);
482
0
                m_xMtrFldShadowX->set_width_chars(WIDTH_CHARS);
483
484
0
                m_xMtrFldShadowY->set_unit( eDlgUnit );
485
0
                m_xMtrFldShadowY->set_digits(2);
486
0
                m_xMtrFldShadowY->set_range(INT_MIN, INT_MAX, FieldUnit::NONE);
487
0
                if( eDlgUnit == FieldUnit::MM )
488
0
                    m_xMtrFldShadowY->set_increments(50, 500, FieldUnit::NONE);
489
0
                else
490
0
                    m_xMtrFldShadowY->set_increments(10, 100, FieldUnit::NONE);
491
0
                m_xMtrFldShadowY->set_width_chars(WIDTH_CHARS);
492
493
0
                if ( bRestoreValues )
494
0
                {
495
0
                    SetMetricValue(*m_xMtrFldShadowX, m_nSaveShadowX, MapUnit::Map100thMM);
496
0
                    SetMetricValue(*m_xMtrFldShadowY, m_nSaveShadowY, MapUnit::Map100thMM);
497
498
0
                    XFormTextShadowXValItem aXItem( m_nSaveShadowX );
499
0
                    XFormTextShadowYValItem aYItem( m_nSaveShadowY );
500
501
0
                    GetBindings().GetDispatcher()->ExecuteList(
502
0
                        SID_FORMTEXT_SHDWXVAL, SfxCallMode::RECORD,
503
0
                        { &aXItem, &aYItem });
504
0
                }
505
0
            }
506
0
            else
507
0
            {
508
0
                sId = "slant";
509
510
0
                m_xMtrFldShadowX->set_unit(FieldUnit::DEGREE);
511
0
                m_xMtrFldShadowX->set_digits(1);
512
0
                m_xMtrFldShadowX->set_range(-1800, 1800, FieldUnit::NONE);
513
0
                m_xMtrFldShadowX->set_increments(10, 100, FieldUnit::NONE);
514
0
                m_xMtrFldShadowX->set_width_chars(WIDTH_CHARS);
515
516
0
                m_xMtrFldShadowY->set_unit(FieldUnit::PERCENT);
517
0
                m_xMtrFldShadowY->set_digits(0);
518
0
                m_xMtrFldShadowY->set_range(-999, 999, FieldUnit::NONE);
519
0
                m_xMtrFldShadowY->set_increments(10, 100, FieldUnit::NONE);
520
0
                m_xMtrFldShadowY->set_width_chars(WIDTH_CHARS);
521
522
0
                if ( bRestoreValues )
523
0
                {
524
0
                    m_xMtrFldShadowX->set_value(m_nSaveShadowAngle, FieldUnit::NONE);
525
0
                    m_xMtrFldShadowY->set_value(m_nSaveShadowSize, FieldUnit::NONE);
526
0
                    XFormTextShadowXValItem aXItem(m_nSaveShadowAngle);
527
0
                    XFormTextShadowYValItem aYItem(m_nSaveShadowSize);
528
0
                    GetBindings().GetDispatcher()->ExecuteList(
529
0
                        SID_FORMTEXT_SHDWXVAL, SfxCallMode::RECORD,
530
0
                        { &aXItem, &aYItem });
531
0
                }
532
0
            }
533
0
        }
534
535
0
        if (!m_xTbxShadow->get_item_active(sId))
536
0
            m_xTbxShadow->set_item_active(sId, true);
537
0
        m_sLastShadowTbxId = sId;
538
539
0
        ApplyImageList();
540
0
    }
541
0
    else
542
0
    {
543
0
        m_xTbxShadow->set_sensitive(false);
544
0
        m_xMtrFldShadowX->set_sensitive(false);
545
0
        m_xMtrFldShadowY->set_sensitive(false);
546
0
        m_xShadowColorLB->set_sensitive(false);
547
0
    }
548
0
}
549
550
// Insert shadow color in listbox
551
552
void SvxFontWorkDialog::SetShadowColor_Impl(const XFormTextShadowColorItem* pItem)
553
0
{
554
0
    if ( pItem )
555
0
        m_xShadowColorLB->SelectEntry(pItem->GetColorValue());
556
0
}
557
558
// Enter X-value for shadow in edit field
559
void SvxFontWorkDialog::SetShadowXVal_Impl(const XFormTextShadowXValItem* pItem)
560
0
{
561
0
    if (!pItem || m_xMtrFldShadowX->has_focus())
562
0
        return;
563
564
    // #i19251#
565
    // sal_Int32 nValue = pItem->GetValue();
566
567
    // #i19251#
568
    // The two involved fields/items are used double and contain/give different
569
    // values regarding to the access method. Thus, here we need to separate the access
570
    // methods regarding to the kind of value accessed.
571
0
    if (m_xTbxShadow->get_item_active(u"slant"_ustr))
572
0
    {
573
        // #i19251#
574
        // There is no value correction necessary at all, i think this
575
        // was only tried to be done without understanding that the two
576
        // involved fields/items are used double and contain/give different
577
        // values regarding to the access method.
578
        // nValue = nValue - ( int( float( nValue ) / 360.0 ) * 360 );
579
0
        m_xMtrFldShadowX->set_value(pItem->GetValue(), FieldUnit::NONE);
580
0
    }
581
0
    else
582
0
    {
583
0
        SetMetricValue(*m_xMtrFldShadowX, pItem->GetValue(), MapUnit::Map100thMM);
584
0
    }
585
0
}
586
587
// Enter Y-value for shadow in edit field
588
void SvxFontWorkDialog::SetShadowYVal_Impl(const XFormTextShadowYValItem* pItem)
589
0
{
590
0
    if (!pItem || m_xMtrFldShadowY->has_focus())
591
0
        return;
592
593
    // #i19251#
594
    // The two involved fields/items are used double and contain/give different
595
    // values regarding to the access method. Thus, here we need to separate the access
596
    // methods regarding to the kind of value accessed.
597
0
    if (m_xTbxShadow->get_item_active(u"slant"_ustr))
598
0
    {
599
0
        m_xMtrFldShadowY->set_value(pItem->GetValue(), FieldUnit::NONE);
600
0
    }
601
0
    else
602
0
    {
603
0
        SetMetricValue(*m_xMtrFldShadowY, pItem->GetValue(), MapUnit::Map100thMM);
604
0
    }
605
0
}
606
607
IMPL_LINK(SvxFontWorkDialog, SelectStyleHdl_Impl, const OUString&, rId, void)
608
0
{
609
    // Execute this block when a different toolbox item has been clicked or
610
    // when the off item has been clicked.  The later is necessary to
611
    // override the toolbox behaviour of unchecking the item after second
612
    // click on it: One of the items has to be checked at all times (when
613
    // enabled that is.)
614
0
    if (rId != "off" && rId == m_sLastStyleTbxId)
615
0
        return;
616
617
0
    XFormTextStyle eStyle = XFormTextStyle::NONE;
618
619
0
    if (rId == "rotate")
620
0
        eStyle = XFormTextStyle::Rotate;
621
0
    else if (rId == "upright")
622
0
        eStyle = XFormTextStyle::Upright;
623
0
    else if (rId == "hori")
624
0
        eStyle = XFormTextStyle::SlantX;
625
0
    else if (rId == "vert")
626
0
        eStyle = XFormTextStyle::SlantY;
627
628
0
    XFormTextStyleItem aItem( eStyle );
629
0
    GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_STYLE,
630
0
            SfxCallMode::RECORD, { &aItem });
631
0
    SetStyle_Impl( &aItem );
632
0
    m_sLastStyleTbxId = rId;
633
0
}
634
635
IMPL_LINK(SvxFontWorkDialog, SelectAdjustHdl_Impl, const OUString&, rId, void)
636
0
{
637
0
    if (rId == "orientation")
638
0
    {
639
0
        XFormTextMirrorItem aItem(m_xTbxAdjust->get_item_active(rId));
640
0
        GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_MIRROR,
641
0
                SfxCallMode::SLOT, { &aItem });
642
0
    }
643
0
    else if (rId != m_sLastAdjustTbxId)
644
0
    {
645
0
        XFormTextAdjust eAdjust = XFormTextAdjust::AutoSize;
646
647
0
        if (rId == "left")
648
0
            eAdjust = XFormTextAdjust::Left;
649
0
        else if (rId == "center")
650
0
            eAdjust = XFormTextAdjust::Center;
651
0
        else if (rId == "right")
652
0
            eAdjust = XFormTextAdjust::Right;
653
654
0
        XFormTextAdjustItem aItem(eAdjust);
655
0
        GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_ADJUST,
656
0
                SfxCallMode::RECORD, { &aItem });
657
0
        SetAdjust_Impl(&aItem);
658
0
        m_sLastAdjustTbxId = rId;
659
0
    }
660
0
}
661
662
IMPL_LINK(SvxFontWorkDialog, SelectShadowHdl_Impl, const OUString&, rId, void)
663
0
{
664
0
    if (rId == "contour")
665
0
    {
666
0
        XFormTextHideFormItem aItem(!m_xTbxShadow->get_item_active(rId));
667
0
        GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_HIDEFORM,
668
0
                SfxCallMode::RECORD, { &aItem });
669
0
    }
670
0
    else if (rId == "textcontour")
671
0
    {
672
0
        XFormTextOutlineItem aItem(m_xTbxShadow->get_item_active(rId));
673
0
        GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_OUTLINE,
674
0
                SfxCallMode::RECORD, { &aItem });
675
0
    }
676
0
    else if (rId != m_sLastShadowTbxId)
677
0
    {
678
0
        XFormTextShadow eShadow = XFormTextShadow::NONE;
679
680
0
        if (m_sLastShadowTbxId == "vertical")
681
0
        {
682
0
            m_nSaveShadowX = GetCoreValue(*m_xMtrFldShadowX, MapUnit::Map100thMM);
683
0
            m_nSaveShadowY = GetCoreValue(*m_xMtrFldShadowY, MapUnit::Map100thMM);
684
0
        }
685
0
        else if (m_sLastShadowTbxId == "slant")
686
0
        {
687
0
            m_nSaveShadowAngle = m_xMtrFldShadowX->get_value(FieldUnit::NONE);
688
0
            m_nSaveShadowSize  = m_xMtrFldShadowY->get_value(FieldUnit::NONE);
689
0
        }
690
0
        m_sLastShadowTbxId = rId;
691
692
0
        if ( rId == "vertical")  eShadow = XFormTextShadow::Normal;
693
0
        else if (rId == "slant") eShadow = XFormTextShadow::Slant;
694
695
0
        XFormTextShadowItem aItem(eShadow);
696
0
        GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_SHADOW,
697
0
                SfxCallMode::RECORD, { &aItem });
698
0
        SetShadow_Impl(&aItem, true);
699
0
    }
700
0
}
701
702
IMPL_LINK_NOARG(SvxFontWorkDialog, ModifyInputHdl_Impl, weld::MetricSpinButton&, void)
703
0
{
704
0
    m_aInputIdle.Start();
705
0
}
706
707
IMPL_LINK_NOARG(SvxFontWorkDialog, InputTimeoutHdl_Impl, Timer*, void)
708
0
{
709
    // Possibly set the Metric system again. This should be done with a
710
    // listen, this is however not possible at the moment due to compatibility
711
    // issues.
712
0
    const FieldUnit eDlgUnit = m_rBindings.GetDispatcher()->GetModule()->GetFieldUnit();
713
0
    if( eDlgUnit != m_xMtrFldDistance->get_unit() )
714
0
    {
715
0
        SetFieldUnit(*m_xMtrFldDistance, eDlgUnit, true);
716
0
        SetFieldUnit(*m_xMtrFldTextStart, eDlgUnit, true);
717
0
        if (eDlgUnit == FieldUnit::MM)
718
0
        {
719
0
            m_xMtrFldDistance->set_increments(50, 500, FieldUnit::NONE);
720
0
            m_xMtrFldTextStart->set_increments(50, 500, FieldUnit::NONE);
721
0
        }
722
0
        else
723
0
        {
724
0
            m_xMtrFldDistance->set_increments(10, 100, FieldUnit::NONE);
725
0
            m_xMtrFldTextStart->set_increments(10, 100, FieldUnit::NONE);
726
0
        }
727
0
    }
728
0
    if( eDlgUnit != m_xMtrFldShadowX->get_unit() &&
729
0
        m_xTbxShadow->get_item_active(u"vertical"_ustr) )
730
0
    {
731
0
        SetFieldUnit(*m_xMtrFldShadowX, eDlgUnit, true);
732
0
        SetFieldUnit(*m_xMtrFldShadowY, eDlgUnit, true);
733
734
0
        if (eDlgUnit == FieldUnit::MM)
735
0
        {
736
0
            m_xMtrFldShadowX->set_increments(50, 500, FieldUnit::NONE);
737
0
            m_xMtrFldShadowY->set_increments(50, 500, FieldUnit::NONE);
738
0
        }
739
0
        else
740
0
        {
741
0
            m_xMtrFldShadowX->set_increments(10, 100, FieldUnit::NONE);
742
0
            m_xMtrFldShadowY->set_increments(10, 100, FieldUnit::NONE);
743
0
        }
744
0
    }
745
746
0
    tools::Long nValue = GetCoreValue(*m_xMtrFldDistance, MapUnit::Map100thMM);
747
0
    XFormTextDistanceItem aDistItem( nValue );
748
0
    nValue = GetCoreValue(*m_xMtrFldTextStart, MapUnit::Map100thMM);
749
0
    XFormTextStartItem aStartItem( nValue );
750
751
0
    sal_Int32 nValueX(0);
752
0
    sal_Int32 nValueY(0);
753
754
    // #i19251#
755
    // The two involved fields/items are used double and contain/give different
756
    // values regarding to the access method. Thus, here we need to separate the access
757
    // method regarding to the kind of value accessed.
758
0
    if (m_sLastShadowTbxId == "vertical")
759
0
    {
760
0
        nValueX = GetCoreValue(*m_xMtrFldShadowX, MapUnit::Map100thMM);
761
0
        nValueY = GetCoreValue(*m_xMtrFldShadowY, MapUnit::Map100thMM);
762
0
    }
763
0
    else if (m_sLastShadowTbxId == "slant")
764
0
    {
765
0
        nValueX = m_xMtrFldShadowX->get_value(FieldUnit::NONE);
766
0
        nValueY = m_xMtrFldShadowY->get_value(FieldUnit::NONE);
767
0
    }
768
769
0
    XFormTextShadowXValItem aShadowXItem( nValueX );
770
0
    XFormTextShadowYValItem aShadowYItem( nValueY );
771
772
    // Slot-ID does not matter, the Exec method evaluates the entire item set
773
0
    GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_DISTANCE,
774
0
            SfxCallMode::RECORD,
775
0
            { &aDistItem, &aStartItem, &aShadowXItem, &aShadowYItem });
776
0
}
777
778
IMPL_LINK_NOARG(SvxFontWorkDialog, ColorSelectHdl_Impl, ColorListBox&, void)
779
0
{
780
0
    XFormTextShadowColorItem aItem( u""_ustr, m_xShadowColorLB->GetSelectEntryColor() );
781
0
    GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_SHDWCOLOR,
782
0
            SfxCallMode::RECORD, { &aItem });
783
0
}
784
785
void SvxFontWorkDialog::ApplyImageList()
786
0
{
787
0
    if (m_sLastShadowTbxId == "slant")
788
0
    {
789
0
        m_xFbShadowX->set_from_icon_name(RID_SVXBMP_SHADOW_ANGLE);
790
0
        m_xFbShadowY->set_from_icon_name(RID_SVXBMP_SHADOW_SIZE);
791
0
    }
792
0
    else
793
0
    {
794
0
        m_xFbShadowX->set_from_icon_name(RID_SVXBMP_SHADOW_XDIST);
795
0
        m_xFbShadowY->set_from_icon_name(RID_SVXBMP_SHADOW_YDIST);
796
0
    }
797
0
}
798
799
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */