Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/LibreOffice/svx/source/dialog/   (Office von Apache Version 25.8.3.2©)  Datei vom 5.10.2025 mit Größe 28 kB image not shown  

Quelle  fontwork.cxx   Sprache: C

 
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */


#include <sfx2/module.hxx>
#include <sfx2/dispatch.hxx>

#include <svx/colorbox.hxx>
#include <svx/dialmgr.hxx>
#include <svx/strings.hrc>
#include <svx/xftadit.hxx>
#include <svx/xftdiit.hxx>
#include <svx/xftstit.hxx>
#include <svx/xftmrit.hxx>
#include <svx/xftouit.hxx>
#include <svx/xftshit.hxx>
#include <svx/xftshcit.hxx>
#include <svx/xftshxy.hxx>
#include <svx/xtextit0.hxx>

#include <svtools/unitconv.hxx>
#include <svx/svxids.hrc>
#include <bitmaps.hlst>
#include <svx/fontwork.hxx>
#include <svl/itemset.hxx>

constexpr int WIDTH_CHARS = 10;

SFX_IMPL_DOCKINGWINDOW_WITHID( SvxFontWorkChildWindow, SID_FONTWORK );

// ControllerItem for Fontwork

SvxFontWorkControllerItem::SvxFontWorkControllerItem
(
    sal_uInt16 _nId,
    SvxFontWorkDialog& rDlg,
    SfxBindings& rBindings
) :

    SfxControllerItem( _nId, rBindings ),

    rFontWorkDlg( rDlg )
{
}

// StateChanged method for FontWork items

void SvxFontWorkControllerItem::StateChangedAtToolBoxControl( sal_uInt16 /*nSID*/, SfxItemState /*eState*/,
                                              const SfxPoolItem* pItem )
{
    switch ( GetId() )
    {
        case SID_FORMTEXT_STYLE:
        {
            const XFormTextStyleItem* pStateItem =
                                dynamic_cast<const XFormTextStyleItem*>( pItem );
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextStyleItem expected");
            rFontWorkDlg.SetStyle_Impl(pStateItem);
            break;
        }
        case SID_FORMTEXT_ADJUST:
        {
            const XFormTextAdjustItem* pStateItem =
                                dynamic_cast<const XFormTextAdjustItem*>( pItem );
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextAdjustItem expected");
            rFontWorkDlg.SetAdjust_Impl(pStateItem);
            break;
        }
        case SID_FORMTEXT_DISTANCE:
        {
            const XFormTextDistanceItem* pStateItem =
                                dynamic_cast<const XFormTextDistanceItem*>( pItem );
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextDistanceItem expected");
            rFontWorkDlg.SetDistance_Impl(pStateItem);
            break;
        }
        case SID_FORMTEXT_START:
        {
            const XFormTextStartItem* pStateItem =
                                dynamic_cast<const XFormTextStartItem*>( pItem );
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextStartItem expected");
            rFontWorkDlg.SetStart_Impl(pStateItem);
            break;
        }
        case SID_FORMTEXT_MIRROR:
        {
            const XFormTextMirrorItem* pStateItem =
                                dynamic_cast<const XFormTextMirrorItem*>( pItem );
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextMirrorItem expected");
            rFontWorkDlg.SetMirror_Impl(pStateItem);
            break;
        }
        case SID_FORMTEXT_HIDEFORM:
        {
            const XFormTextHideFormItem* pStateItem =
                                dynamic_cast<const XFormTextHideFormItem*>( pItem );
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextHideFormItem expected");
            rFontWorkDlg.SetShowForm_Impl(pStateItem);
            break;
        }
        case SID_FORMTEXT_OUTLINE:
        {
            const XFormTextOutlineItem* pStateItem =
                                dynamic_cast<const XFormTextOutlineItem*>( pItem );
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextOutlineItem expected");
            rFontWorkDlg.SetOutline_Impl(pStateItem);
            break;
        }
        case SID_FORMTEXT_SHADOW:
        {
            const XFormTextShadowItem* pStateItem =
                                dynamic_cast<const XFormTextShadowItem*>( pItem );
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextShadowItem expected");
            rFontWorkDlg.SetShadow_Impl(pStateItem);
            break;
        }
        case SID_FORMTEXT_SHDWCOLOR:
        {
            const XFormTextShadowColorItem* pStateItem =
                                dynamic_cast<const XFormTextShadowColorItem*>( pItem );
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextShadowColorItem expected");
            rFontWorkDlg.SetShadowColor_Impl(pStateItem);
            break;
        }
        case SID_FORMTEXT_SHDWXVAL:
        {
            const XFormTextShadowXValItem* pStateItem =
                                dynamic_cast<const XFormTextShadowXValItem*>( pItem );
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextShadowXValItem expected");
            rFontWorkDlg.SetShadowXVal_Impl(pStateItem);
            break;
        }
        case SID_FORMTEXT_SHDWYVAL:
        {
            const XFormTextShadowYValItem* pStateItem =
                                dynamic_cast<const XFormTextShadowYValItem*>( pItem );
            DBG_ASSERT(pStateItem || pItem == nullptr, "XFormTextShadowYValItem expected");
            rFontWorkDlg.SetShadowYVal_Impl(pStateItem);
            break;
        }
    }
}

// Derivation from SfxChildWindow as "containers" for Fontwork dialog

SvxFontWorkChildWindow::SvxFontWorkChildWindow
(
    vcl::Window* _pParent,
    sal_uInt16 nId,
    SfxBindings* pBindings,
    SfxChildWinInfo* pInfo
) :
    SfxChildWindow( _pParent, nId )
{
    VclPtrInstance<SvxFontWorkDialog> pDlg(pBindings, this, _pParent);
    SetWindow(pDlg);

    pDlg->Initialize( pInfo );
}

// Floating Window to the attribution of text effects
SvxFontWorkDialog::SvxFontWorkDialog(SfxBindings *pBindinx,
                                     SfxChildWindow *pCW,
                                     vcl::Window* _pParent)
    : SfxDockingWindow(pBindinx, pCW, _pParent, u"DockingFontwork"_ustr, u"svx/ui/dockingfontwork.ui"_ustr)
    , rBindings(*pBindinx)
    , aInputIdle("SvxFontWorkDialog Input")
    , nSaveShadowX(0)
    , nSaveShadowY(0)
    , nSaveShadowAngle(450)
    , nSaveShadowSize (100)
    , m_xTbxStyle(m_xBuilder->weld_toolbar(u"style"_ustr))
    , m_xTbxAdjust(m_xBuilder->weld_toolbar(u"adjust"_ustr))
    , m_xMtrFldDistance(m_xBuilder->weld_metric_spin_button(u"distance"_ustr, FieldUnit::CM))
    , m_xMtrFldTextStart(m_xBuilder->weld_metric_spin_button(u"indent"_ustr, FieldUnit::CM))
    , m_xTbxShadow(m_xBuilder->weld_toolbar(u"shadow"_ustr))
    , m_xFbShadowX(m_xBuilder->weld_image(u"shadowx"_ustr))
    , m_xMtrFldShadowX(m_xBuilder->weld_metric_spin_button(u"distancex"_ustr, FieldUnit::CM))
    , m_xFbShadowY(m_xBuilder->weld_image(u"shadowy"_ustr))
    , m_xMtrFldShadowY(m_xBuilder->weld_metric_spin_button(u"distancey"_ustr, FieldUnit::CM))
    , m_xShadowColorLB(new ColorListBox(m_xBuilder->weld_menu_button(u"color"_ustr), [this]{ return GetFrameWeld(); } ))
{
    SetText(SvxResId(RID_SVXSTR_FONTWORK));

    ApplyImageList();

    pCtrlItems[0] = new SvxFontWorkControllerItem(SID_FORMTEXT_STYLE, *this, rBindings);
    pCtrlItems[1] = new SvxFontWorkControllerItem(SID_FORMTEXT_ADJUST, *this, rBindings);
    pCtrlItems[2] = new SvxFontWorkControllerItem(SID_FORMTEXT_DISTANCE, *this, rBindings);
    pCtrlItems[3] = new SvxFontWorkControllerItem(SID_FORMTEXT_START, *this, rBindings);
    pCtrlItems[4] = new SvxFontWorkControllerItem(SID_FORMTEXT_MIRROR, *this, rBindings);
    pCtrlItems[5] = new SvxFontWorkControllerItem(SID_FORMTEXT_HIDEFORM, *this, rBindings);
    pCtrlItems[6] = new SvxFontWorkControllerItem(SID_FORMTEXT_OUTLINE, *this, rBindings);
    pCtrlItems[7] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHADOW, *this, rBindings);
    pCtrlItems[8] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWCOLOR, *this, rBindings);
    pCtrlItems[9] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWXVAL, *this, rBindings);
    pCtrlItems[10] = new SvxFontWorkControllerItem(SID_FORMTEXT_SHDWYVAL, *this, rBindings);

    m_xTbxStyle->connect_clicked(LINK(this, SvxFontWorkDialog, SelectStyleHdl_Impl));
    m_xTbxAdjust->connect_clicked(LINK(this, SvxFontWorkDialog, SelectAdjustHdl_Impl));
    m_xTbxShadow->connect_clicked(LINK(this, SvxFontWorkDialog, SelectShadowHdl_Impl));

    Link<weld::MetricSpinButton&,void> aLink = LINK(this, SvxFontWorkDialog, ModifyInputHdl_Impl);
    m_xMtrFldDistance->connect_value_changed( aLink );
    m_xMtrFldTextStart->connect_value_changed( aLink );
    m_xMtrFldShadowX->connect_value_changed( aLink );
    m_xMtrFldShadowY->connect_value_changed( aLink );

    // Set System metric
    const FieldUnit eDlgUnit = rBindings.GetDispatcher()->GetModule()->GetFieldUnit();
    SetFieldUnit(*m_xMtrFldDistance, eDlgUnit, true);
    SetFieldUnit(*m_xMtrFldTextStart, eDlgUnit, true);
    SetFieldUnit(*m_xMtrFldShadowX, eDlgUnit, true);
    SetFieldUnit(*m_xMtrFldShadowY, eDlgUnit, true);
    if( eDlgUnit == FieldUnit::MM )
    {
        m_xMtrFldDistance->set_increments(50, 500, FieldUnit::NONE);
        m_xMtrFldTextStart->set_increments(50, 500, FieldUnit::NONE);
        m_xMtrFldShadowX->set_increments(50, 500, FieldUnit::NONE);
        m_xMtrFldShadowY->set_increments(50, 500, FieldUnit::NONE);
    }
    else
    {
        m_xMtrFldDistance->set_increments(10, 100, FieldUnit::NONE);
        m_xMtrFldTextStart->set_increments(10, 100, FieldUnit::NONE);
        m_xMtrFldShadowX->set_increments(10, 100, FieldUnit::NONE);
        m_xMtrFldShadowY->set_increments(10, 100, FieldUnit::NONE);
    }
    m_xMtrFldShadowX->set_width_chars(WIDTH_CHARS);
    m_xMtrFldShadowY->set_width_chars(WIDTH_CHARS);

    m_xShadowColorLB->SetSelectHdl( LINK(this, SvxFontWorkDialog, ColorSelectHdl_Impl) );

    aInputIdle.SetPriority(TaskPriority::LOWEST);
    aInputIdle.SetInvokeHandler(LINK(this, SvxFontWorkDialog, InputTimeoutHdl_Impl));
}

SvxFontWorkDialog::~SvxFontWorkDialog()
{
    disposeOnce();
}

void SvxFontWorkDialog::dispose()
{
    for (SvxFontWorkControllerItem* pCtrlItem : pCtrlItems)
        pCtrlItem->dispose();
    m_xTbxStyle.reset();
    m_xTbxAdjust.reset();
    m_xMtrFldDistance.reset();
    m_xMtrFldTextStart.reset();
    m_xTbxShadow.reset();
    m_xFbShadowX.reset();
    m_xMtrFldShadowX.reset();
    m_xFbShadowY.reset();
    m_xMtrFldShadowY.reset();
    m_xShadowColorLB.reset();
    SfxDockingWindow::dispose();
}

SfxChildAlignment SvxFontWorkDialog::CheckAlignment( SfxChildAlignment eActAlign,
                                                     SfxChildAlignment eAlign )
{
    SfxChildAlignment eAlignment;

    switch ( eAlign )
    {
        case SfxChildAlignment::TOP:
        case SfxChildAlignment::HIGHESTTOP:
        case SfxChildAlignment::LOWESTTOP:
        case SfxChildAlignment::BOTTOM:
        case SfxChildAlignment::LOWESTBOTTOM:
        case SfxChildAlignment::HIGHESTBOTTOM:
        {
            eAlignment = eActAlign;
        }
        break;

        case SfxChildAlignment::LEFT:
        case SfxChildAlignment::RIGHT:
        case SfxChildAlignment::FIRSTLEFT:
        case SfxChildAlignment::LASTLEFT:
        case SfxChildAlignment::FIRSTRIGHT:
        case SfxChildAlignment::LASTRIGHT:
        {
            eAlignment = eAlign;
        }
        break;

        default:
        {
            eAlignment = eAlign;
        }
        break;
    }

    return eAlignment;
}

// Set style buttons
void SvxFontWorkDialog::SetStyle_Impl(const XFormTextStyleItem* pItem)
{
    if ( pItem )
    {
        OUString sId = u"off"_ustr;

        switch ( pItem->GetValue() )
        {
            case XFormTextStyle::Rotate : sId = "rotate";   break;
            case XFormTextStyle::Upright: sId = "upright";  break;
            case XFormTextStyle::SlantX : sId = "hori";   break;
            case XFormTextStyle::SlantY : sId = "vert";   break;
            default: ;//prevent warning
        }
        m_xTbxStyle->set_sensitive(true);

        // Make sure that there is always exactly one checked toolbox item.
        if ( pItem->GetValue() == XFormTextStyle::NONE )
        {
            m_xTbxStyle->set_item_active(u"rotate"_ustr, false);
            m_xTbxStyle->set_item_active(u"upright"_ustr, false);
            m_xTbxStyle->set_item_active(u"hori"_ustr, false);
            m_xTbxStyle->set_item_active(u"vert"_ustr, false);

            m_xTbxStyle->set_item_active(u"off"_ustr, true);
        }
        else
        {
            m_xTbxStyle->set_item_active(u"off"_ustr, false);
            m_xTbxStyle->set_item_active(sId, true);
        }

        m_sLastStyleTbxId = sId;
    }
    else
        m_xTbxStyle->set_sensitive(false);
}

// Set adjust buttons

void SvxFontWorkDialog::SetAdjust_Impl(const XFormTextAdjustItem* pItem)
{
    if ( pItem )
    {
        OUString sId;

        m_xTbxAdjust->set_sensitive(true);
        m_xMtrFldDistance->set_sensitive(true);

        if ( pItem->GetValue() == XFormTextAdjust::Left || pItem->GetValue() == XFormTextAdjust::Right )
        {
            if (pItem->GetValue() == XFormTextAdjust::Left)
                sId = "left";
            else
                sId = "right";
            m_xMtrFldTextStart->set_sensitive(true);
        }
        else
        {
            if (pItem->GetValue() == XFormTextAdjust::Center)
                sId = "center";
            else
                sId = "autosize";
            m_xMtrFldTextStart->set_sensitive(false);
        }

        if (!m_xTbxAdjust->get_item_active(sId))
            m_xTbxAdjust->set_item_active(sId, true);

        m_sLastAdjustTbxId = sId;
    }
    else
    {
        m_xTbxAdjust->set_sensitive(false);
        m_xMtrFldTextStart->set_sensitive(false);
        m_xMtrFldDistance->set_sensitive(false);
    }
}

// Enter Distance value in the edit field

void SvxFontWorkDialog::SetDistance_Impl(const XFormTextDistanceItem* pItem)
{
    if (pItem && !m_xMtrFldDistance->has_focus())
    {
        SetMetricValue(*m_xMtrFldDistance, pItem->GetValue(), MapUnit::Map100thMM);
    }
}

// Enter indent value in the edit field

void SvxFontWorkDialog::SetStart_Impl(const XFormTextStartItem* pItem)
{
    if (pItem && !m_xMtrFldTextStart->has_focus())
    {
        SetMetricValue(*m_xMtrFldTextStart, pItem->GetValue(), MapUnit::Map100thMM);
    }
}

// Set button for reversing the direction of text

void SvxFontWorkDialog::SetMirror_Impl(const XFormTextMirrorItem* pItem)
{
    if ( pItem )
        m_xTbxAdjust->set_item_active(u"orientation"_ustr, pItem->GetValue());
}

// Set button for contour display

void SvxFontWorkDialog::SetShowForm_Impl(const XFormTextHideFormItem* pItem)
{
    if ( pItem )
        m_xTbxShadow->set_item_active(u"contour"_ustr, !pItem->GetValue());
}

// Set button for text border

void SvxFontWorkDialog::SetOutline_Impl(const XFormTextOutlineItem* pItem)
{
    if ( pItem )
        m_xTbxShadow->set_item_active(u"textcontour"_ustr, pItem->GetValue());
}

// Set shadow buttons

void SvxFontWorkDialog::SetShadow_Impl(const XFormTextShadowItem* pItem,
                                        bool bRestoreValues)
{
    if ( pItem )
    {
        OUString sId;

        m_xTbxShadow->set_sensitive(true);

        if ( pItem->GetValue() == XFormTextShadow::NONE )
        {
            sId = "noshadow";
            m_xFbShadowX->hide();
            m_xFbShadowY->hide();
            m_xMtrFldShadowX->set_sensitive(false);
            m_xMtrFldShadowY->set_sensitive(false);
            m_xShadowColorLB->set_sensitive(false);
        }
        else
        {
            m_xFbShadowX->show();
            m_xFbShadowY->show();
            m_xMtrFldShadowX->set_sensitive(true);
            m_xMtrFldShadowY->set_sensitive(true);
            m_xShadowColorLB->set_sensitive(true);

            if ( pItem->GetValue() == XFormTextShadow::Normal )
            {
                sId = "vertical";
                const FieldUnit eDlgUnit = rBindings.GetDispatcher()->GetModule()->GetFieldUnit();

                m_xMtrFldShadowX->set_unit( eDlgUnit );
                m_xMtrFldShadowX->set_digits(2);
                m_xMtrFldShadowX->set_range(INT_MIN, INT_MAX, FieldUnit::NONE);
                if( eDlgUnit == FieldUnit::MM )
                    m_xMtrFldShadowX->set_increments(50, 500, FieldUnit::NONE);
                else
                    m_xMtrFldShadowX->set_increments(10, 100, FieldUnit::NONE);
                m_xMtrFldShadowX->set_width_chars(WIDTH_CHARS);

                m_xMtrFldShadowY->set_unit( eDlgUnit );
                m_xMtrFldShadowY->set_digits(2);
                m_xMtrFldShadowY->set_range(INT_MIN, INT_MAX, FieldUnit::NONE);
                if( eDlgUnit == FieldUnit::MM )
                    m_xMtrFldShadowY->set_increments(50, 500, FieldUnit::NONE);
                else
                    m_xMtrFldShadowY->set_increments(10, 100, FieldUnit::NONE);
                m_xMtrFldShadowY->set_width_chars(WIDTH_CHARS);

                if ( bRestoreValues )
                {
                    SetMetricValue(*m_xMtrFldShadowX, nSaveShadowX, MapUnit::Map100thMM);
                    SetMetricValue(*m_xMtrFldShadowY, nSaveShadowY, MapUnit::Map100thMM);

                    XFormTextShadowXValItem aXItem( nSaveShadowX );
                    XFormTextShadowYValItem aYItem( nSaveShadowY );

                    GetBindings().GetDispatcher()->ExecuteList(
                        SID_FORMTEXT_SHDWXVAL, SfxCallMode::RECORD,
                        { &aXItem, &aYItem });
                }
            }
            else
            {
                sId = "slant";

                m_xMtrFldShadowX->set_unit(FieldUnit::DEGREE);
                m_xMtrFldShadowX->set_digits(1);
                m_xMtrFldShadowX->set_range(-1800, 1800, FieldUnit::NONE);
                m_xMtrFldShadowX->set_increments(10, 100, FieldUnit::NONE);
                m_xMtrFldShadowX->set_width_chars(WIDTH_CHARS);

                m_xMtrFldShadowY->set_unit(FieldUnit::PERCENT);
                m_xMtrFldShadowY->set_digits(0);
                m_xMtrFldShadowY->set_range(-999, 999, FieldUnit::NONE);
                m_xMtrFldShadowY->set_increments(10, 100, FieldUnit::NONE);
                m_xMtrFldShadowY->set_width_chars(WIDTH_CHARS);

                if ( bRestoreValues )
                {
                    m_xMtrFldShadowX->set_value(nSaveShadowAngle, FieldUnit::NONE);
                    m_xMtrFldShadowY->set_value(nSaveShadowSize, FieldUnit::NONE);
                    XFormTextShadowXValItem aXItem(nSaveShadowAngle);
                    XFormTextShadowYValItem aYItem(nSaveShadowSize);
                    GetBindings().GetDispatcher()->ExecuteList(
                        SID_FORMTEXT_SHDWXVAL, SfxCallMode::RECORD,
                        { &aXItem, &aYItem });
                }
            }
        }

        if (!m_xTbxShadow->get_item_active(sId))
            m_xTbxShadow->set_item_active(sId, true);
        m_sLastShadowTbxId = sId;

        ApplyImageList();
    }
    else
    {
        m_xTbxShadow->set_sensitive(false);
        m_xMtrFldShadowX->set_sensitive(false);
        m_xMtrFldShadowY->set_sensitive(false);
        m_xShadowColorLB->set_sensitive(false);
    }
}

// Insert shadow color in listbox

void SvxFontWorkDialog::SetShadowColor_Impl(const XFormTextShadowColorItem* pItem)
{
    if ( pItem )
        m_xShadowColorLB->SelectEntry(pItem->GetColorValue());
}

// Enter X-value for shadow in edit field
void SvxFontWorkDialog::SetShadowXVal_Impl(const XFormTextShadowXValItem* pItem)
{
    if (!pItem || m_xMtrFldShadowX->has_focus())
        return;

    // #i19251#
    // sal_Int32 nValue = pItem->GetValue();

    // #i19251#
    // The two involved fields/items are used double and contain/give different
    // values regarding to the access method. Thus, here we need to separate the access
    // methods regarding to the kind of value accessed.
    if (m_xTbxShadow->get_item_active(u"slant"_ustr))
    {
        // #i19251#
        // There is no value correction necessary at all, i think this
        // was only tried to be done without understanding that the two
        // involved fields/items are used double and contain/give different
        // values regarding to the access method.
        // nValue = nValue - ( int( float( nValue ) / 360.0 ) * 360 );
        m_xMtrFldShadowX->set_value(pItem->GetValue(), FieldUnit::NONE);
    }
    else
    {
        SetMetricValue(*m_xMtrFldShadowX, pItem->GetValue(), MapUnit::Map100thMM);
    }
}

// Enter Y-value for shadow in edit field
void SvxFontWorkDialog::SetShadowYVal_Impl(const XFormTextShadowYValItem* pItem)
{
    if (!pItem || m_xMtrFldShadowY->has_focus())
        return;

    // #i19251#
    // The two involved fields/items are used double and contain/give different
    // values regarding to the access method. Thus, here we need to separate the access
    // methods regarding to the kind of value accessed.
    if (m_xTbxShadow->get_item_active(u"slant"_ustr))
    {
        m_xMtrFldShadowY->set_value(pItem->GetValue(), FieldUnit::NONE);
    }
    else
    {
        SetMetricValue(*m_xMtrFldShadowY, pItem->GetValue(), MapUnit::Map100thMM);
    }
}

IMPL_LINK(SvxFontWorkDialog, SelectStyleHdl_Impl, const OUString&, rId, void)
{
    // Execute this block when a different toolbox item has been clicked or
    // when the off item has been clicked.  The later is necessary to
    // override the toolbox behaviour of unchecking the item after second
    // click on it: One of the items has to be checked at all times (when
    // enabled that is.)
    if (rId != "off" && rId == m_sLastStyleTbxId)
        return;

    XFormTextStyle eStyle = XFormTextStyle::NONE;

    if (rId == "rotate")
        eStyle = XFormTextStyle::Rotate;
    else if (rId == "upright")
        eStyle = XFormTextStyle::Upright;
    else if (rId == "hori")
        eStyle = XFormTextStyle::SlantX;
    else if (rId == "vert")
        eStyle = XFormTextStyle::SlantY;

    XFormTextStyleItem aItem( eStyle );
    GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_STYLE,
            SfxCallMode::RECORD, { &aItem });
    SetStyle_Impl( &aItem );
    m_sLastStyleTbxId = rId;
}

IMPL_LINK(SvxFontWorkDialog, SelectAdjustHdl_Impl, const OUString&, rId, void)
{
    if (rId == "orientation")
    {
        XFormTextMirrorItem aItem(m_xTbxAdjust->get_item_active(rId));
        GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_MIRROR,
                SfxCallMode::SLOT, { &aItem });
    }
    else if (rId != m_sLastAdjustTbxId)
    {
        XFormTextAdjust eAdjust = XFormTextAdjust::AutoSize;

        if (rId == "left")
            eAdjust = XFormTextAdjust::Left;
        else if (rId == "center")
            eAdjust = XFormTextAdjust::Center;
        else if (rId == "right")
            eAdjust = XFormTextAdjust::Right;

        XFormTextAdjustItem aItem(eAdjust);
        GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_ADJUST,
                SfxCallMode::RECORD, { &aItem });
        SetAdjust_Impl(&aItem);
        m_sLastAdjustTbxId = rId;
    }
}

IMPL_LINK(SvxFontWorkDialog, SelectShadowHdl_Impl, const OUString&, rId, void)
{
    if (rId == "contour")
    {
        XFormTextHideFormItem aItem(!m_xTbxShadow->get_item_active(rId));
        GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_HIDEFORM,
                SfxCallMode::RECORD, { &aItem });
    }
    else if (rId == "textcontour")
    {
        XFormTextOutlineItem aItem(m_xTbxShadow->get_item_active(rId));
        GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_OUTLINE,
                SfxCallMode::RECORD, { &aItem });
    }
    else if (rId != m_sLastShadowTbxId)
    {
        XFormTextShadow eShadow = XFormTextShadow::NONE;

        if (m_sLastShadowTbxId == "vertical")
        {
            nSaveShadowX = GetCoreValue(*m_xMtrFldShadowX, MapUnit::Map100thMM);
            nSaveShadowY = GetCoreValue(*m_xMtrFldShadowY, MapUnit::Map100thMM);
        }
        else if (m_sLastShadowTbxId == "slant")
        {
            nSaveShadowAngle = m_xMtrFldShadowX->get_value(FieldUnit::NONE);
            nSaveShadowSize  = m_xMtrFldShadowY->get_value(FieldUnit::NONE);
        }
        m_sLastShadowTbxId = rId;

        if ( rId == "vertical")  eShadow = XFormTextShadow::Normal;
        else if (rId == "slant") eShadow = XFormTextShadow::Slant;

        XFormTextShadowItem aItem(eShadow);
        GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_SHADOW,
                SfxCallMode::RECORD, { &aItem });
        SetShadow_Impl(&aItem, true);
    }
}

IMPL_LINK_NOARG(SvxFontWorkDialog, ModifyInputHdl_Impl, weld::MetricSpinButton&, ;void)
{
    aInputIdle.Start();
}

IMPL_LINK_NOARG(SvxFontWorkDialog, InputTimeoutHdl_Impl, Timer*, void)
{
    // Possibly set the Metric system again. This should be done with a
    // listen, this is however not possible at the moment due to compatibility
    // issues.
    const FieldUnit eDlgUnit = rBindings.GetDispatcher()->GetModule()->GetFieldUnit();
    if( eDlgUnit != m_xMtrFldDistance->get_unit() )
    {
        SetFieldUnit(*m_xMtrFldDistance, eDlgUnit, true);
        SetFieldUnit(*m_xMtrFldTextStart, eDlgUnit, true);
        if (eDlgUnit == FieldUnit::MM)
        {
            m_xMtrFldDistance->set_increments(50, 500, FieldUnit::NONE);
            m_xMtrFldTextStart->set_increments(50, 500, FieldUnit::NONE);
        }
        else
        {
            m_xMtrFldDistance->set_increments(10, 100, FieldUnit::NONE);
            m_xMtrFldTextStart->set_increments(10, 100, FieldUnit::NONE);
        }
    }
    if( eDlgUnit != m_xMtrFldShadowX->get_unit() &&
        m_xTbxShadow->get_item_active(u"vertical"_ustr) )
    {
        SetFieldUnit(*m_xMtrFldShadowX, eDlgUnit, true);
        SetFieldUnit(*m_xMtrFldShadowY, eDlgUnit, true);

        if (eDlgUnit == FieldUnit::MM)
        {
            m_xMtrFldShadowX->set_increments(50, 500, FieldUnit::NONE);
            m_xMtrFldShadowY->set_increments(50, 500, FieldUnit::NONE);
        }
        else
        {
            m_xMtrFldShadowX->set_increments(10, 100, FieldUnit::NONE);
            m_xMtrFldShadowY->set_increments(10, 100, FieldUnit::NONE);
        }
    }

    tools::Long nValue = GetCoreValue(*m_xMtrFldDistance, MapUnit::Map100thMM);
    XFormTextDistanceItem aDistItem( nValue );
    nValue = GetCoreValue(*m_xMtrFldTextStart, MapUnit::Map100thMM);
    XFormTextStartItem aStartItem( nValue );

    sal_Int32 nValueX(0);
    sal_Int32 nValueY(0);

    // #i19251#
    // The two involved fields/items are used double and contain/give different
    // values regarding to the access method. Thus, here we need to separate the access
    // method regarding to the kind of value accessed.
    if (m_sLastShadowTbxId == "vertical")
    {
        nValueX = GetCoreValue(*m_xMtrFldShadowX, MapUnit::Map100thMM);
        nValueY = GetCoreValue(*m_xMtrFldShadowY, MapUnit::Map100thMM);
    }
    else if (m_sLastShadowTbxId == "slant")
    {
        nValueX = m_xMtrFldShadowX->get_value(FieldUnit::NONE);
        nValueY = m_xMtrFldShadowY->get_value(FieldUnit::NONE);
    }

    XFormTextShadowXValItem aShadowXItem( nValueX );
    XFormTextShadowYValItem aShadowYItem( nValueY );

    // Slot-ID does not matter, the Exec method evaluates the entire item set
    GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_DISTANCE,
            SfxCallMode::RECORD,
            { &aDistItem, &aStartItem, &aShadowXItem, &aShadowYItem });
}

IMPL_LINK_NOARG(SvxFontWorkDialog, ColorSelectHdl_Impl, ColorListBox&, void)
{
    XFormTextShadowColorItem aItem( u""_ustr, m_xShadowColorLB->GetSelectEntryColor() );
    GetBindings().GetDispatcher()->ExecuteList(SID_FORMTEXT_SHDWCOLOR,
            SfxCallMode::RECORD, { &aItem });
}

void SvxFontWorkDialog::ApplyImageList()
{
    if (m_sLastShadowTbxId == "slant")
    {
        m_xFbShadowX->set_from_icon_name(RID_SVXBMP_SHADOW_ANGLE);
        m_xFbShadowY->set_from_icon_name(RID_SVXBMP_SHADOW_SIZE);
    }
    else
    {
        m_xFbShadowX->set_from_icon_name(RID_SVXBMP_SHADOW_XDIST);
        m_xFbShadowY->set_from_icon_name(RID_SVXBMP_SHADOW_YDIST);
    }
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Messung V0.5
C=96 H=95 G=95

¤ Dauer der Verarbeitung: 0.6 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.