1
0
Fork 0
libreoffice/svx/source/dialog/fontwork.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

795 lines
28 KiB
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>
#define 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: */