/* -*- 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 #include #include #include #include #include #include #include #include #include #include #include #include #include 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 ParaPropertyPanel::Create ( weld::Widget* pParent, const css::uno::Reference& rxFrame, SfxBindings* pBindings, const css::uno::Reference& 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(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 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 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 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(mxTopDist->GetCoreValue(m_eULSpaceUnit))); aMargin.SetLower( static_cast(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(mxAtLineEnd->get_value(FieldUnit::NONE)); rHyphen.GetMinTrail() = static_cast(mxAtLineBegin->get_value(FieldUnit::NONE)); rHyphen.GetMinWordLength() = static_cast(mxWordLength->get_value(FieldUnit::NONE)); rHyphen.GetMaxHyphens() = static_cast(mxConsecutive->get_value(FieldUnit::NONE)); rHyphen.GetCompoundMinLead() = static_cast(mxCompound->get_value(FieldUnit::NONE)); rHyphen.GetTextHyphenZone() = static_cast(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(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(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(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(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(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(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(static_cast(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& rxFrame, SfxBindings* pBindings, css::uno::Reference 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: */