/* -*- 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 in Prozent C=93 H=100 G=96
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland