1
0
Fork 0
libreoffice/svx/source/sidebar/paragraph/ParaPropertyPanel.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

695 lines
29 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 "ParaPropertyPanel.hxx"
#include <sfx2/dispatch.hxx>
#include <sfx2/module.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/weldutils.hxx>
#include <editeng/lrspitem.hxx>
#include <editeng/ulspitem.hxx>
#include <svx/dlgctrl.hxx>
#include <svx/svxids.hrc>
#include <svl/intitem.hxx>
#include <sfx2/objsh.hxx>
#include <svtools/unitconv.hxx>
#include <sal/log.hxx>
#include <com/sun/star/lang/IllegalArgumentException.hpp>
#include <utility>
using namespace css;
using namespace css::uno;
namespace svx::sidebar {
#define DEFAULT_VALUE 0
#define MAX_DURCH 31680 // tdf#68335: 1584 pt for UX interoperability with Word
#define MAX_SW 1709400
#define MAX_SC_SD 116220200
#define NEGA_MAXVALUE -10000000
std::unique_ptr<PanelLayout> ParaPropertyPanel::Create (
weld::Widget* pParent,
const css::uno::Reference<css::frame::XFrame>& rxFrame,
SfxBindings* pBindings,
const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
{
if (pParent == nullptr)
throw lang::IllegalArgumentException(u"no parent Window given to ParaPropertyPanel::Create"_ustr, nullptr, 0);
if ( ! rxFrame.is())
throw lang::IllegalArgumentException(u"no XFrame given to ParaPropertyPanel::Create"_ustr, nullptr, 1);
if (pBindings == nullptr)
throw lang::IllegalArgumentException(u"no SfxBindings given to ParaPropertyPanel::Create"_ustr, nullptr, 2);
return std::make_unique<ParaPropertyPanel>(pParent, rxFrame, pBindings, rxSidebar);
}
void ParaPropertyPanel::HandleContextChange (
const vcl::EnumContext& rContext)
{
if (maContext == rContext)
{
// Nothing to do.
return;
}
maContext = rContext;
switch (maContext.GetCombinedContext_DI())
{
case CombinedEnumContext(Application::Calc, Context::DrawText):
case CombinedEnumContext(Application::WriterVariants, Context::DrawText):
case CombinedEnumContext(Application::DrawImpress, Context::Draw):
case CombinedEnumContext(Application::DrawImpress, Context::TextObject):
case CombinedEnumContext(Application::DrawImpress, Context::Graphic):
case CombinedEnumContext(Application::DrawImpress, Context::DrawText):
case CombinedEnumContext(Application::DrawImpress, Context::Table):
mxTBxVertAlign->show();
mxTBxBackColor->hide();
mxTBxNumBullet->hide();
set_hyphenation_base_visible(false);
set_hyphenation_other_visible(false);
ReSize();
break;
case CombinedEnumContext(Application::WriterVariants, Context::Default):
case CombinedEnumContext(Application::WriterVariants, Context::Text):
mxTBxVertAlign->hide();
mxTBxBackColor->show();
mxTBxNumBullet->show();
set_hyphenation_base_visible(true);
set_hyphenation_other_visible(mxTBxHyphenation->get_item_active("Hyphenate"));
ReSize();
break;
case CombinedEnumContext(Application::WriterVariants, Context::Table):
mxTBxVertAlign->show();
mxTBxBackColor->show();
mxTBxNumBullet->show();
set_hyphenation_base_visible(true);
// close the optional controls (when the controls were hidden later,
// remained a big empty space before the Table panel)
// TODO: if the hyphenation is enabled in the table, and the hyphenation
// has exactly the same settings, as outside of the table, the controls
// remain hidden. Workaround: disable and enable hyphenation again.
// Enable it automatically by mouse hovering hyphenation sidebar toolbar?
set_hyphenation_other_visible(false);
ReSize();
break;
case CombinedEnumContext(Application::WriterVariants, Context::Annotation):
mxTBxVertAlign->hide();
mxTBxBackColor->hide();
mxTBxNumBullet->hide();
set_hyphenation_base_visible(true);
ReSize();
break;
case CombinedEnumContext(Application::Calc, Context::EditCell):
case CombinedEnumContext(Application::Calc, Context::Cell):
case CombinedEnumContext(Application::Calc, Context::Pivot):
case CombinedEnumContext(Application::Calc, Context::Sparkline):
case CombinedEnumContext(Application::DrawImpress, Context::Text):
case CombinedEnumContext(Application::DrawImpress, Context::OutlineText):
set_hyphenation_base_visible(false);
set_hyphenation_other_visible(false);
break;
default:
break;
}
}
void ParaPropertyPanel::ReSize()
{
if (mxSidebar.is())
mxSidebar->requestLayout();
}
void ParaPropertyPanel::InitToolBoxIndent()
{
Link<weld::MetricSpinButton&,void> aLink = LINK( this, ParaPropertyPanel, ModifyIndentHdl_Impl );
mxLeftIndent->connect_value_changed( aLink );
mxRightIndent->connect_value_changed( aLink );
mxFLineIndent->connect_value_changed( aLink );
m_eLRSpaceUnit = maLRSpaceControl.GetCoreMetric();
}
void ParaPropertyPanel::InitToolBoxSpacing()
{
Link<weld::MetricSpinButton&,void> aLink = LINK( this, ParaPropertyPanel, ULSpaceHdl_Impl );
mxTopDist->connect_value_changed(aLink);
mxBottomDist->connect_value_changed( aLink );
m_eULSpaceUnit = maULSpaceControl.GetCoreMetric();
}
void ParaPropertyPanel::set_hyphenation_base_visible( bool bVisible )
{
// hide all hyphenation control for non-Writer applications
// TODO: add automatic hyphenation for these, too
mxHyphenationLabel->set_visible(bVisible);
mxTBxHyphenation->set_item_visible("Hyphenate", bVisible);
ReSize();
}
void ParaPropertyPanel::set_hyphenation_other_visible( bool bVisible )
{
mxTBxHyphenation->set_item_visible("HyphenateCaps", bVisible);
mxTBxHyphenation->set_item_visible("HyphenateLastWord", bVisible);
mxTBxHyphenation->set_item_visible("HyphenateLastFullLine", bVisible);
mxTBxHyphenation->set_item_visible("HyphenateColumn", bVisible);
mxTBxHyphenation->set_item_visible("HyphenatePage", bVisible);
mxTBxHyphenation->set_item_visible("HyphenateSpread", bVisible);
mxAtLineEndLabel->set_visible(bVisible);
mxAtLineBeginLabel->set_visible(bVisible);
mxConsecutiveLabel->set_visible(bVisible);
mxCompoundLabel->set_visible(bVisible);
mxWordLengthLabel->set_visible(bVisible);
mxZoneLabel->set_visible(bVisible);
mxAtLineEnd->get_widget().set_visible(bVisible);
mxAtLineBegin->get_widget().set_visible(bVisible);
mxConsecutive->get_widget().set_visible(bVisible);
mxCompound->get_widget().set_visible(bVisible);
mxWordLength->get_widget().set_visible(bVisible);
mxZone->get_widget().set_visible(bVisible);
ReSize();
}
void ParaPropertyPanel::InitToolBoxHyphenation()
{
// hide most of the controls of hyphenation
set_hyphenation_other_visible(false);
Link<weld::MetricSpinButton&,void> aLink = LINK( this, ParaPropertyPanel, HyphenationHdl_Impl );
mxAtLineEnd->connect_value_changed(aLink);
mxAtLineBegin->connect_value_changed(aLink);
mxConsecutive->connect_value_changed(aLink);
mxCompound->connect_value_changed(aLink);
mxWordLength->connect_value_changed(aLink);
mxZone->connect_value_changed(aLink);
m_eHyphenZoneUnit = m_aZoneControl.GetCoreMetric();
}
void ParaPropertyPanel::initial()
{
limitMetricWidths();
//toolbox
InitToolBoxIndent();
InitToolBoxSpacing();
InitToolBoxHyphenation();
}
// for Paragraph Indent
IMPL_LINK_NOARG( ParaPropertyPanel, ModifyIndentHdl_Impl, weld::MetricSpinButton&, void)
{
SvxLRSpaceItem aMargin( SID_ATTR_PARA_LRSPACE );
// tdf#36709: TODO: Handle font-relative units from GUI
aMargin.SetTextLeft(SvxIndentValue::twips(mxLeftIndent->GetCoreValue(m_eLRSpaceUnit)));
aMargin.SetRight(SvxIndentValue::twips(mxRightIndent->GetCoreValue(m_eLRSpaceUnit)));
aMargin.SetTextFirstLineOffset(
SvxIndentValue::twips(mxFLineIndent->GetCoreValue(m_eLRSpaceUnit)));
GetBindings()->GetDispatcher()->ExecuteList(
SID_ATTR_PARA_LRSPACE, SfxCallMode::RECORD, { &aMargin });
}
// for Paragraph Spacing
IMPL_LINK_NOARG( ParaPropertyPanel, ULSpaceHdl_Impl, weld::MetricSpinButton&, void)
{
SvxULSpaceItem aMargin( SID_ATTR_PARA_ULSPACE );
aMargin.SetUpper( static_cast<sal_uInt16>(mxTopDist->GetCoreValue(m_eULSpaceUnit)));
aMargin.SetLower( static_cast<sal_uInt16>(mxBottomDist->GetCoreValue(m_eULSpaceUnit)));
GetBindings()->GetDispatcher()->ExecuteList(
SID_ATTR_PARA_ULSPACE, SfxCallMode::RECORD, { &aMargin });
}
void ParaPropertyPanel::fill_hyphenzone(SvxHyphenZoneItem & rHyphen)
{
rHyphen.SetHyphen(mxTBxHyphenation->get_item_active("Hyphenate"));
rHyphen.GetMinLead() = static_cast<sal_uInt8>(mxAtLineEnd->get_value(FieldUnit::NONE));
rHyphen.GetMinTrail() = static_cast<sal_uInt8>(mxAtLineBegin->get_value(FieldUnit::NONE));
rHyphen.GetMinWordLength() = static_cast<sal_uInt8>(mxWordLength->get_value(FieldUnit::NONE));
rHyphen.GetMaxHyphens() = static_cast<sal_uInt8>(mxConsecutive->get_value(FieldUnit::NONE));
rHyphen.GetCompoundMinLead() = static_cast<sal_uInt8>(mxCompound->get_value(FieldUnit::NONE));
rHyphen.GetTextHyphenZone() = static_cast<sal_uInt16>(mxZone->GetCoreValue(m_eHyphenZoneUnit));
rHyphen.SetNoCapsHyphenation(!mxTBxHyphenation->get_item_active("HyphenateCaps"));
rHyphen.SetNoLastWordHyphenation(!mxTBxHyphenation->get_item_active("HyphenateLastWord"));
rHyphen.SetKeep(!mxTBxHyphenation->get_item_active("HyphenateSpread"));
rHyphen.GetKeepType() = !rHyphen.IsKeep()
? 3
: mxTBxHyphenation->get_item_active("HyphenatePage")
? 1
: mxTBxHyphenation->get_item_active("HyphenateColumn")
? 2
: mxTBxHyphenation->get_item_active("HyphenateLastFullLine")
? 3
: 4;
}
// for hyphenation
IMPL_LINK_NOARG( ParaPropertyPanel, HyphenationHdl_Impl, weld::MetricSpinButton&, void)
{
SvxHyphenZoneItem aHyphen( false, 69 /*RES_PARATR_HYPHENZONE*/);
fill_hyphenzone(aHyphen);
GetBindings()->GetDispatcher()->ExecuteList(
SID_ATTR_PARA_HYPHENZONE, SfxCallMode::RECORD, { &aHyphen });
}
// for hyphenation toggle buttons
IMPL_LINK( ParaPropertyPanel, HyphenationToggleButtonHdl_Impl, const OUString&, rBtn, void)
{
if ( mbUpdatingHyphenateButtons )
return;
// skip connect_toggled() events triggered by set_item_active(), which resulted stuck buttons
mbUpdatingHyphenateButtons = true;
SvxHyphenZoneItem aHyphen( false, 69 /*RES_PARATR_HYPHENZONE*/);
sal_Int16 nButton = 0;
bool bEnabled = false;
// get the correct getKeepType(), if clicked on one of the Hyphenate Across icons
if( rBtn == "HyphenateSpread" )
{
nButton = 4;
bEnabled = mxTBxHyphenation->get_item_active("HyphenateSpread");
}
else if( rBtn == "HyphenatePage" )
{
nButton = 3;
bEnabled = mxTBxHyphenation->get_item_active("HyphenatePage");
}
else if( rBtn == "HyphenateColumn" )
{
nButton = 2;
bEnabled = mxTBxHyphenation->get_item_active("HyphenateColumn");
}
else if( rBtn == "HyphenateLastFullLine" )
{
nButton = 1;
bEnabled = mxTBxHyphenation->get_item_active("HyphenateLastFullLine");
}
if (nButton > 0)
{
mxTBxHyphenation->set_item_active("HyphenateSpread", nButton == 4 && bEnabled);
mxTBxHyphenation->set_item_active("HyphenatePage", nButton > 3 || (nButton == 3 && bEnabled));
mxTBxHyphenation->set_item_active("HyphenateColumn", nButton > 2 || (nButton == 2 && bEnabled));
mxTBxHyphenation->set_item_active("HyphenateLastFullLine", nButton > 1 || bEnabled);
}
fill_hyphenzone(aHyphen);
GetBindings()->GetDispatcher()->ExecuteList(
SID_ATTR_PARA_HYPHENZONE, SfxCallMode::RECORD, { &aHyphen });
mbUpdatingHyphenateButtons = false;
}
// for Paragraph State change
void ParaPropertyPanel::NotifyItemUpdate(
sal_uInt16 nSID,
SfxItemState eState,
const SfxPoolItem* pState)
{
switch (nSID)
{
case SID_ATTR_METRIC:
{
m_eMetricUnit = GetCurrentUnit(eState,pState);
if( m_eMetricUnit!=m_last_eMetricUnit )
{
mxLeftIndent->SetFieldUnit(m_eMetricUnit);
mxRightIndent->SetFieldUnit(m_eMetricUnit);
mxFLineIndent->SetFieldUnit(m_eMetricUnit);
mxTopDist->SetFieldUnit(m_eMetricUnit);
mxBottomDist->SetFieldUnit(m_eMetricUnit);
limitMetricWidths();
}
m_last_eMetricUnit = m_eMetricUnit;
}
break;
case SID_ATTR_PARA_LRSPACE:
StateChangedIndentImpl( eState, pState );
break;
case SID_ATTR_PARA_ULSPACE:
StateChangedULImpl( eState, pState );
break;
case SID_ATTR_PARA_HYPHENZONE:
StateChangedHyphenationImpl( eState, pState );
break;
}
}
void ParaPropertyPanel::StateChangedIndentImpl( SfxItemState eState, const SfxPoolItem* pState )
{
switch (maContext.GetCombinedContext_DI())
{
case CombinedEnumContext(Application::WriterVariants, Context::DrawText):
case CombinedEnumContext(Application::WriterVariants, Context::Annotation):
case CombinedEnumContext(Application::Calc, Context::DrawText):
case CombinedEnumContext(Application::DrawImpress, Context::DrawText):
case CombinedEnumContext(Application::DrawImpress, Context::Draw):
case CombinedEnumContext(Application::DrawImpress, Context::TextObject):
case CombinedEnumContext(Application::DrawImpress, Context::Graphic):
case CombinedEnumContext(Application::DrawImpress, Context::Table):
{
mxLeftIndent->set_min( DEFAULT_VALUE, FieldUnit::NONE );
mxRightIndent->set_min( DEFAULT_VALUE, FieldUnit::NONE );
mxFLineIndent->set_min( DEFAULT_VALUE, FieldUnit::NONE );
}
break;
case CombinedEnumContext(Application::WriterVariants, Context::Default):
case CombinedEnumContext(Application::WriterVariants, Context::Text):
case CombinedEnumContext(Application::WriterVariants, Context::Table):
{
mxLeftIndent->set_min( NEGA_MAXVALUE, FieldUnit::MM_100TH );
mxRightIndent->set_min( NEGA_MAXVALUE, FieldUnit::MM_100TH );
mxFLineIndent->set_min( NEGA_MAXVALUE, FieldUnit::MM_100TH );
}
break;
}
bool bDisabled = eState == SfxItemState::DISABLED;
mxLeftIndent->set_sensitive(!bDisabled);
mxRightIndent->set_sensitive(!bDisabled);
mxFLineIndent->set_sensitive(!bDisabled);
if (pState && eState >= SfxItemState::DEFAULT)
{
// tdf#36709: TODO: Handle font-relative units
const SvxLRSpaceItem* pSpace = static_cast<const SvxLRSpaceItem*>(pState);
maTxtLeft = pSpace->ResolveTextLeft({});
maTxtLeft = OutputDevice::LogicToLogic(maTxtLeft, m_eLRSpaceUnit, MapUnit::MapTwip);
tools::Long aTxtRight = pSpace->ResolveRight({});
aTxtRight = OutputDevice::LogicToLogic(aTxtRight, m_eLRSpaceUnit, MapUnit::MapTwip);
tools::Long aTxtFirstLineOfst = pSpace->ResolveTextFirstLineOffset({});
aTxtFirstLineOfst = OutputDevice::LogicToLogic( aTxtFirstLineOfst, m_eLRSpaceUnit, MapUnit::MapTwip );
tools::Long nVal = o3tl::convert(maTxtLeft, o3tl::Length::twip, o3tl::Length::mm100);
nVal = static_cast<tools::Long>(mxLeftIndent->normalize( nVal ));
if ( maContext.GetCombinedContext_DI() != CombinedEnumContext(Application::WriterVariants, Context::Text)
&& maContext.GetCombinedContext_DI() != CombinedEnumContext(Application::WriterVariants, Context::Default)
&& maContext.GetCombinedContext_DI() != CombinedEnumContext(Application::WriterVariants, Context::Table))
{
mxFLineIndent->set_min( nVal*-1, FieldUnit::MM_100TH );
}
tools::Long nrVal = o3tl::convert(aTxtRight, o3tl::Length::twip, o3tl::Length::mm100);
nrVal = static_cast<tools::Long>(mxRightIndent->normalize( nrVal ));
switch (maContext.GetCombinedContext_DI())
{
case CombinedEnumContext(Application::WriterVariants, Context::DrawText):
case CombinedEnumContext(Application::WriterVariants, Context::Text):
case CombinedEnumContext(Application::WriterVariants, Context::Default):
case CombinedEnumContext(Application::WriterVariants, Context::Table):
case CombinedEnumContext(Application::WriterVariants, Context::Annotation):
{
mxLeftIndent->set_max( MAX_SW - nrVal, FieldUnit::MM_100TH );
mxRightIndent->set_max( MAX_SW - nVal, FieldUnit::MM_100TH );
mxFLineIndent->set_max( MAX_SW - nVal - nrVal, FieldUnit::MM_100TH );
}
break;
case CombinedEnumContext(Application::DrawImpress, Context::DrawText):
case CombinedEnumContext(Application::DrawImpress, Context::Draw):
case CombinedEnumContext(Application::DrawImpress, Context::Table):
case CombinedEnumContext(Application::DrawImpress, Context::TextObject):
case CombinedEnumContext(Application::DrawImpress, Context::Graphic):
{
mxLeftIndent->set_max( MAX_SC_SD - nrVal, FieldUnit::MM_100TH );
mxRightIndent->set_max( MAX_SC_SD - nVal, FieldUnit::MM_100TH );
mxFLineIndent->set_max( MAX_SC_SD - nVal - nrVal, FieldUnit::MM_100TH );
}
}
mxLeftIndent->set_value( nVal, FieldUnit::MM_100TH );
mxRightIndent->set_value( nrVal, FieldUnit::MM_100TH );
tools::Long nfVal = o3tl::convert(aTxtFirstLineOfst, o3tl::Length::twip, o3tl::Length::mm100);
nfVal = static_cast<tools::Long>(mxFLineIndent->normalize( nfVal ));
mxFLineIndent->set_value( nfVal, FieldUnit::MM_100TH );
}
else if (eState != SfxItemState::DISABLED )
{
mxLeftIndent->set_text(u""_ustr);
mxRightIndent->set_text(u""_ustr);
mxFLineIndent->set_text(u""_ustr);
}
limitMetricWidths();
}
void ParaPropertyPanel::StateChangedULImpl( SfxItemState eState, const SfxPoolItem* pState )
{
mxTopDist->set_max( mxTopDist->normalize( MAX_DURCH ), MapToFieldUnit(m_eULSpaceUnit) );
mxBottomDist->set_max( mxBottomDist->normalize( MAX_DURCH ), MapToFieldUnit(m_eULSpaceUnit) );
bool bDisabled = eState == SfxItemState::DISABLED;
mxTopDist->set_sensitive(!bDisabled);
mxBottomDist->set_sensitive(!bDisabled);
if( pState && eState >= SfxItemState::DEFAULT )
{
const SvxULSpaceItem* pOldItem = static_cast<const SvxULSpaceItem*>(pState);
maUpper = pOldItem->GetUpper();
maUpper = OutputDevice::LogicToLogic(maUpper, m_eULSpaceUnit, MapUnit::MapTwip);
maLower = pOldItem->GetLower();
maLower = OutputDevice::LogicToLogic(maLower, m_eULSpaceUnit, MapUnit::MapTwip);
sal_Int64 nVal = o3tl::convert(maUpper, o3tl::Length::twip, o3tl::Length::mm100);
nVal = mxTopDist->normalize( nVal );
mxTopDist->set_value( nVal, FieldUnit::MM_100TH );
nVal = o3tl::convert(maLower, o3tl::Length::twip, o3tl::Length::mm100);
nVal = mxBottomDist->normalize( nVal );
mxBottomDist->set_value( nVal, FieldUnit::MM_100TH );
}
else if (eState != SfxItemState::DISABLED )
{
mxTopDist->set_text(u""_ustr);
mxBottomDist->set_text(u""_ustr);
}
limitMetricWidths();
}
void ParaPropertyPanel::StateChangedHyphenationImpl( SfxItemState eState, const SfxPoolItem* pState )
{
mxZone->set_max( mxZone->normalize( MAX_DURCH ), MapToFieldUnit(m_eHyphenZoneUnit) );
if( pState && eState >= SfxItemState::DEFAULT )
{
const SvxHyphenZoneItem* pOldItem = static_cast<const SvxHyphenZoneItem*>(pState);
maZone = pOldItem->GetTextHyphenZone();
maZone = OutputDevice::LogicToLogic(maZone, m_eHyphenZoneUnit, MapUnit::MapTwip);
sal_Int64 nVal = o3tl::convert(maZone, o3tl::Length::twip, o3tl::Length::cm);
nVal = mxZone->normalize( nVal );
mxZone->set_value( nVal, FieldUnit::CM );
mxAtLineEnd->set_value(pOldItem->GetMinLead(), FieldUnit::CHAR);
mxAtLineBegin->set_value(pOldItem->GetMinTrail(), FieldUnit::CHAR);
auto nMaxHyphens = pOldItem->GetMaxHyphens();
mxConsecutive->set_value(nMaxHyphens, FieldUnit::NONE);
mxCompound->set_value(pOldItem->GetCompoundMinLead(), FieldUnit::CHAR);
mxWordLength->set_value(pOldItem->GetMinWordLength(), FieldUnit::CHAR);
bool bHyph = pOldItem->IsHyphen();
mxTBxHyphenation->set_item_active("Hyphenate", bHyph);
mxTBxHyphenation->set_item_active("HyphenateCaps", !pOldItem->IsNoCapsHyphenation());
mxTBxHyphenation->set_item_active("HyphenateLastWord", !pOldItem->IsNoLastWordHyphenation());
mxTBxHyphenation->set_item_active("HyphenateLastFullLine", !pOldItem->IsKeep() || pOldItem->GetKeepType() < 4);
mxTBxHyphenation->set_item_active("HyphenateColumn", !pOldItem->IsKeep() || pOldItem->GetKeepType() < 3);
mxTBxHyphenation->set_item_active("HyphenatePage", !pOldItem->IsKeep() || pOldItem->GetKeepType() < 2);
mxTBxHyphenation->set_item_active("HyphenateSpread", !pOldItem->IsKeep() || pOldItem->GetKeepType() < 1);
set_hyphenation_other_visible( bHyph );
}
}
FieldUnit ParaPropertyPanel::GetCurrentUnit( SfxItemState eState, const SfxPoolItem* pState )
{
FieldUnit eUnit = FieldUnit::NONE;
if ( pState && eState >= SfxItemState::DEFAULT )
eUnit = static_cast<FieldUnit>(static_cast<const SfxUInt16Item*>(pState)->GetValue());
else
{
SfxViewFrame* pFrame = SfxViewFrame::Current();
SfxObjectShell* pSh = nullptr;
if ( pFrame )
pSh = pFrame->GetObjectShell();
if ( pSh ) //the object shell is not always available during reload
{
SfxModule* pModule = pSh->GetModule();
if ( pModule )
{
eUnit = pModule->GetFieldUnit();
}
else
{
SAL_WARN("svx.sidebar", "GetModuleFieldUnit(): no module found");
}
}
}
return eUnit;
}
ParaPropertyPanel::ParaPropertyPanel(weld::Widget* pParent,
const css::uno::Reference<css::frame::XFrame>& rxFrame,
SfxBindings* pBindings,
css::uno::Reference<css::ui::XSidebar> xSidebar)
: PanelLayout(pParent, u"ParaPropertyPanel"_ustr, u"svx/ui/sidebarparagraph.ui"_ustr),
//Alignment
mxTBxHorzAlign(m_xBuilder->weld_toolbar(u"horizontalalignment"_ustr)),
mxHorzAlignDispatch(new ToolbarUnoDispatcher(*mxTBxHorzAlign, *m_xBuilder, rxFrame)),
mxTBxVertAlign(m_xBuilder->weld_toolbar(u"verticalalignment"_ustr)),
mxVertAlignDispatch(new ToolbarUnoDispatcher(*mxTBxVertAlign, *m_xBuilder, rxFrame)),
//NumBullet&Backcolor
mxTBxNumBullet(m_xBuilder->weld_toolbar(u"numberbullet"_ustr)),
mxNumBulletDispatch(new ToolbarUnoDispatcher(*mxTBxNumBullet, *m_xBuilder, rxFrame)),
mxTBxBackColor(m_xBuilder->weld_toolbar(u"backgroundcolor"_ustr)),
mxBackColorDispatch(new ToolbarUnoDispatcher(*mxTBxBackColor, *m_xBuilder, rxFrame)),
mxTBxWriteDirection(m_xBuilder->weld_toolbar(u"writedirection"_ustr)),
mxWriteDirectionDispatch(new ToolbarUnoDispatcher(*mxTBxWriteDirection, *m_xBuilder, rxFrame)),
mxTBxParaSpacing(m_xBuilder->weld_toolbar(u"paraspacing"_ustr)),
mxParaSpacingDispatch(new ToolbarUnoDispatcher(*mxTBxParaSpacing, *m_xBuilder, rxFrame)),
mxTBxLineSpacing(m_xBuilder->weld_toolbar(u"linespacing"_ustr)),
mxLineSpacingDispatch(new ToolbarUnoDispatcher(*mxTBxLineSpacing, *m_xBuilder, rxFrame)),
mxTBxIndent(m_xBuilder->weld_toolbar(u"indent"_ustr)),
mxIndentDispatch(new ToolbarUnoDispatcher(*mxTBxIndent, *m_xBuilder, rxFrame)),
//Hyphenation
mxTBxHyphenation(m_xBuilder->weld_toolbar(u"hyphenation"_ustr)),
//Paragraph spacing
mxTopDist(m_xBuilder->weld_metric_spin_button(u"aboveparaspacing"_ustr, FieldUnit::CM)),
mxBottomDist(m_xBuilder->weld_metric_spin_button(u"belowparaspacing"_ustr, FieldUnit::CM)),
mxLeftIndent(m_xBuilder->weld_metric_spin_button(u"beforetextindent"_ustr, FieldUnit::CM)),
mxRightIndent(m_xBuilder->weld_metric_spin_button(u"aftertextindent"_ustr, FieldUnit::CM)),
mxFLineIndent(m_xBuilder->weld_metric_spin_button(u"firstlineindent"_ustr, FieldUnit::CM)),
mxHyphenationLabel(m_xBuilder->weld_label(u"hyphenationlabel"_ustr)),
mxAtLineEndLabel(m_xBuilder->weld_label(u"lineend_label"_ustr)),
mxAtLineBeginLabel(m_xBuilder->weld_label(u"linebegin_label"_ustr)),
mxConsecutiveLabel(m_xBuilder->weld_label(u"consecutive_label"_ustr)),
mxCompoundLabel(m_xBuilder->weld_label(u"compound_label"_ustr)),
mxWordLengthLabel(m_xBuilder->weld_label(u"wordlength_label"_ustr)),
mxZoneLabel(m_xBuilder->weld_label(u"zone_label"_ustr)),
mxAtLineEnd(m_xBuilder->weld_metric_spin_button(u"lineend"_ustr, FieldUnit::CHAR)),
mxAtLineBegin(m_xBuilder->weld_metric_spin_button(u"linebegin"_ustr, FieldUnit::CHAR)),
mxConsecutive(m_xBuilder->weld_metric_spin_button(u"consecutive"_ustr, FieldUnit::NONE)),
mxCompound(m_xBuilder->weld_metric_spin_button(u"compound"_ustr, FieldUnit::CHAR)),
mxWordLength(m_xBuilder->weld_metric_spin_button(u"wordlength"_ustr, FieldUnit::CHAR)),
mxZone(m_xBuilder->weld_metric_spin_button(u"zone"_ustr, FieldUnit::CM)),
mbUpdatingHyphenateButtons(false),
maTxtLeft (0),
maUpper (0),
maLower (0),
maZone (0),
m_eMetricUnit(FieldUnit::NONE),
m_last_eMetricUnit(FieldUnit::NONE),
m_eLRSpaceUnit(),
m_eULSpaceUnit(),
m_eHyphenZoneUnit(),
maLRSpaceControl (SID_ATTR_PARA_LRSPACE,*pBindings,*this),
maULSpaceControl (SID_ATTR_PARA_ULSPACE, *pBindings,*this),
m_aMetricCtl (SID_ATTR_METRIC, *pBindings,*this),
m_aAtLineEndControl (SID_ATTR_PARA_HYPHENZONE, *pBindings,*this),
m_aAtLineBeginControl (SID_ATTR_PARA_HYPHENZONE, *pBindings,*this),
m_aConsecutiveControl (SID_ATTR_PARA_HYPHENZONE, *pBindings,*this),
m_aCompoundControl (SID_ATTR_PARA_HYPHENZONE, *pBindings,*this),
m_aWordLengthControl (SID_ATTR_PARA_HYPHENZONE, *pBindings,*this),
m_aZoneControl (SID_ATTR_PARA_HYPHENZONE, *pBindings,*this),
mpBindings(pBindings),
mxSidebar(std::move(xSidebar))
{
mxTBxHyphenation->connect_clicked(LINK( this, ParaPropertyPanel, HyphenationToggleButtonHdl_Impl));
// tdf#130197 We want to give this toolbar a width as if it had 5 entries
// (the parent grid has homogeneous width set so both columns will have the
// same width). This ParaPropertyPanel is a default panel in writer, so
// subsequent panels, e.g. the TableEditPanel panel can have up to 5
// entries in each of its column and remain in alignment with this panel
padWidthForSidebar(*mxTBxIndent, rxFrame);
initial();
m_aMetricCtl.RequestUpdate();
}
void ParaPropertyPanel::limitMetricWidths()
{
limitWidthForSidebar(*mxTopDist);
limitWidthForSidebar(*mxBottomDist);
limitWidthForSidebar(*mxLeftIndent);
limitWidthForSidebar(*mxRightIndent);
limitWidthForSidebar(*mxFLineIndent);
}
ParaPropertyPanel::~ParaPropertyPanel()
{
mxHorzAlignDispatch.reset();
mxTBxHorzAlign.reset();
mxVertAlignDispatch.reset();
mxTBxVertAlign.reset();
mxNumBulletDispatch.reset();
mxTBxNumBullet.reset();
mxBackColorDispatch.reset();
mxTBxBackColor.reset();
mxWriteDirectionDispatch.reset();
mxTBxWriteDirection.reset();
mxParaSpacingDispatch.reset();
mxTBxParaSpacing.reset();
mxLineSpacingDispatch.reset();
mxTBxLineSpacing.reset();
mxIndentDispatch.reset();
mxTBxIndent.reset();
mxTBxHyphenation.reset();
mxTopDist.reset();
mxBottomDist.reset();
mxLeftIndent.reset();
mxRightIndent.reset();
mxFLineIndent.reset();
maLRSpaceControl.dispose();
maULSpaceControl.dispose();
m_aMetricCtl.dispose();
m_aAtLineEndControl.dispose();
m_aAtLineBeginControl.dispose();
m_aConsecutiveControl.dispose();
m_aCompoundControl.dispose();
m_aWordLengthControl.dispose();
m_aZoneControl.dispose();
}
} // end of namespace svx::sidebar
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */