Add new paragraph justification option "Split compound words" for
custom compound-based "smart" hyphenation. Add compound-based "smart"
hyphenation support for Danish, Dutch, Esperanto, Estonian, German,
Norwegian, Swedish (and potentially, Icelandic, Finnish and
Latvian) languages by fixing Hunspell morphological analysis and the
associated lingucomponent code. (Previously compound-based "smart"
hyphenation was enabled only for Hungarian.)
With the new option it's possible to keep MSO/MS-DOCX interoperability,
also introducing a better hyphenation algorithm for several languages.
Details:
* Add check box to Alignment in paragraph formatting dialog window;
* Store properties in paragraph model:
css::style::ParagraphProperties::ParaIsCompoundBased
* Implement it by checking the new option in the previously
added commit f9f694f5d9f39c5801bc5fec45867252c293bbcb;
* Add ODF import/export (loext:compound-based);
* Add ODF unit tests by the new tdf173389_smart_hyphenation_nl.odt
and tdf173389_smart_hyphenation_hu.odt. Now use the previous
tdf119908_smart_hyphenation_hu for disabled compound-based "smart"
hyphenation, also the new tdf119908_smart_hyphenation_nl.odt.
Note: the Dutch test document results better compound-based
hyphenation in two positions.
* Add Hunspell patch to fix Danish, Dutch, Esperanto, Estonian,
German, Norwegian, Swedish (and future Icelandic, Latvian,
Finnish) morphological analysis for compound word constituents;
* hyphenimp.cxx hyphenate(): fix tokenization for consecutive
pa: elements, like resulted in the fixed Hunspell dictionaries.
Follow-up to commit f9f694f5d9
"tdf#173389 sw: add compound-based “smart” hyphenation for readability".
Change-Id: I4414bd588646ecf6dc86b77642833ac9c7820a98
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211341
Tested-by: Jenkins
Reviewed-by: László Németh <nemeth@numbertext.org>
3180 lines
123 KiB
C++
3180 lines
123 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 <memory>
|
|
#include <osl/diagnose.h>
|
|
#include <svl/style.hxx>
|
|
#include <sfx2/objsh.hxx>
|
|
#include <vcl/mnemonic.hxx>
|
|
#include <vcl/settings.hxx>
|
|
#include <vcl/weld/Builder.hxx>
|
|
#include <svx/flagsdef.hxx>
|
|
#include <svx/svxids.hrc>
|
|
#include <svx/sdtaitm.hxx>
|
|
#include <tools/debug.hxx>
|
|
#include <tools/mapunit.hxx>
|
|
|
|
#include <svl/cjkoptions.hxx>
|
|
#include <editeng/pgrditem.hxx>
|
|
#include <svx/strings.hrc>
|
|
#include <svx/dialmgr.hxx>
|
|
#include <paragrph.hxx>
|
|
#include <editeng/autodiritem.hxx>
|
|
#include <editeng/frmdiritem.hxx>
|
|
#include <editeng/lspcitem.hxx>
|
|
#include <editeng/adjustitem.hxx>
|
|
#include <editeng/orphitem.hxx>
|
|
#include <editeng/widwitem.hxx>
|
|
#include <editeng/tstpitem.hxx>
|
|
#include <editeng/pmdlitem.hxx>
|
|
#include <editeng/spltitem.hxx>
|
|
#include <editeng/hyphenzoneitem.hxx>
|
|
#include <editeng/ulspitem.hxx>
|
|
#include <editeng/lrspitem.hxx>
|
|
#include <editeng/formatbreakitem.hxx>
|
|
#include <editeng/keepitem.hxx>
|
|
#include <editeng/scriptspaceitem.hxx>
|
|
#include <editeng/hngpnctitem.hxx>
|
|
#include <editeng/forbiddenruleitem.hxx>
|
|
#include <i18nlangtag/languagetag.hxx>
|
|
#include <i18nlangtag/mslangid.hxx>
|
|
#include <svx/dlgutil.hxx>
|
|
#include <sfx2/htmlmode.hxx>
|
|
#include <editeng/paravertalignitem.hxx>
|
|
#include <svl/eitem.hxx>
|
|
#include <svl/intitem.hxx>
|
|
#include <unotools/syslocaleoptions.hxx>
|
|
#include <com/sun/star/text/ParagraphHyphenationKeepType.hpp>
|
|
|
|
const WhichRangesContainer SvxStdParagraphTabPage::pStdRanges(
|
|
svl::Items<
|
|
SID_ATTR_PARA_LINESPACE, SID_ATTR_PARA_LINESPACE, // 10033
|
|
SID_ATTR_PARA_LEFTSPACE, SID_ATTR_PARA_FIRSTLINESPACE,
|
|
SID_ATTR_LRSPACE, SID_ATTR_ULSPACE, // 10048 - 10049
|
|
SID_ATTR_PARA_REGISTER, SID_ATTR_PARA_REGISTER // 10413
|
|
>);
|
|
|
|
const WhichRangesContainer SvxParaAlignTabPage::pAlignRanges(
|
|
svl::Items<
|
|
SID_ATTR_PARA_ADJUST, SID_ATTR_PARA_ADJUST, // 10027
|
|
// tdf#154543 - reset snap to grid to parent
|
|
SID_ATTR_PARA_SNAPTOGRID, SID_ATTR_PARA_SNAPTOGRID // 10945
|
|
>);
|
|
|
|
const WhichRangesContainer SvxParaAlignTabPage::pSdrAlignRanges(
|
|
svl::Items<
|
|
SDRATTR_TEXT_VERTADJUST, SDRATTR_TEXT_VERTADJUST, // 1076
|
|
SID_ATTR_PARA_ADJUST, SID_ATTR_PARA_ADJUST , // 10027
|
|
SID_ATTR_FRAMEDIRECTION, SID_ATTR_FRAMEDIRECTION, // 10944
|
|
SID_ATTR_PARA_AUTOFRAMEDIRECTION, SID_ATTR_PARA_AUTOFRAMEDIRECTION
|
|
>);
|
|
|
|
const WhichRangesContainer SvxExtParagraphTabPage::pExtRanges(svl::Items<
|
|
SID_ATTR_PARA_PAGEBREAK, SID_ATTR_PARA_WIDOWS, // 10037 - 10041
|
|
SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP // 10065 - 10066
|
|
>);
|
|
|
|
#define MAX_DURCH 31680 // tdf#68335: 1584 pt for UX interoperability with Word
|
|
#define FIX_DIST_DEF 283 // standard fix distance 0,5 cm
|
|
|
|
namespace {
|
|
|
|
enum LineSpaceList
|
|
{
|
|
LLINESPACE_1 = 0,
|
|
LLINESPACE_115 = 1,
|
|
LLINESPACE_15 = 2,
|
|
LLINESPACE_2 = 3,
|
|
LLINESPACE_PROP = 4,
|
|
LLINESPACE_MIN = 5,
|
|
LLINESPACE_DURCH= 6,
|
|
LLINESPACE_FIX = 7
|
|
};
|
|
|
|
SvxIndentValue lcl_GetFontRelativeValue(const SvxRelativeField& rField, MapUnit eUnit)
|
|
{
|
|
switch (rField.GetCurrentUnit())
|
|
{
|
|
case FieldUnit::FONT_EM:
|
|
return SvxIndentValue{ static_cast<double>(rField.get_value(FieldUnit::NONE)) / 100.0,
|
|
css::util::MeasureUnit::FONT_EM };
|
|
|
|
case FieldUnit::FONT_CJK_ADVANCE:
|
|
return SvxIndentValue{ static_cast<double>(rField.get_value(FieldUnit::NONE)) / 100.0,
|
|
css::util::MeasureUnit::FONT_CJK_ADVANCE };
|
|
|
|
default:
|
|
return SvxIndentValue::twips(static_cast<double>(rField.GetCoreValue(eUnit)));
|
|
}
|
|
}
|
|
|
|
void lcl_SetFontRelativeValue(SvxRelativeField& rField, const SvxIndentValue& rValue, MapUnit eUnit)
|
|
{
|
|
switch (rValue.m_nUnit)
|
|
{
|
|
case css::util::MeasureUnit::FONT_EM:
|
|
rField.SetFontRelative(FieldUnit::FONT_EM);
|
|
rField.set_value(static_cast<sal_Int64>(std::llround(rValue.m_dValue * 100.0)),
|
|
FieldUnit::FONT_EM);
|
|
break;
|
|
|
|
case css::util::MeasureUnit::FONT_CJK_ADVANCE:
|
|
rField.SetFontRelative(FieldUnit::FONT_CJK_ADVANCE);
|
|
rField.set_value(static_cast<sal_Int64>(std::llround(rValue.m_dValue * 100.0)),
|
|
FieldUnit::FONT_CJK_ADVANCE);
|
|
break;
|
|
|
|
default:
|
|
rField.SetMetricValue(static_cast<sal_Int64>(std::llround(rValue.m_dValue)), eUnit);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void SetLineSpace_Impl( SvxLineSpacingItem&, int, tools::Long lValue = 0 );
|
|
|
|
void SetLineSpace_Impl( SvxLineSpacingItem& rLineSpace,
|
|
int eSpace, tools::Long lValue )
|
|
{
|
|
switch ( eSpace )
|
|
{
|
|
case LLINESPACE_1:
|
|
rLineSpace.SetLineSpaceRule( SvxLineSpaceRule::Auto );
|
|
rLineSpace.SetInterLineSpaceRule( SvxInterLineSpaceRule::Off );
|
|
break;
|
|
|
|
case LLINESPACE_115:
|
|
rLineSpace.SetLineSpaceRule( SvxLineSpaceRule::Auto );
|
|
rLineSpace.SetPropLineSpace( 115 );
|
|
break;
|
|
|
|
case LLINESPACE_15:
|
|
rLineSpace.SetLineSpaceRule( SvxLineSpaceRule::Auto );
|
|
rLineSpace.SetPropLineSpace( 150 );
|
|
break;
|
|
|
|
case LLINESPACE_2:
|
|
rLineSpace.SetLineSpaceRule( SvxLineSpaceRule::Auto );
|
|
rLineSpace.SetPropLineSpace( 200 );
|
|
break;
|
|
|
|
case LLINESPACE_PROP:
|
|
rLineSpace.SetLineSpaceRule( SvxLineSpaceRule::Auto );
|
|
rLineSpace.SetPropLineSpace( static_cast<sal_uInt16>(lValue) );
|
|
break;
|
|
|
|
case LLINESPACE_MIN:
|
|
rLineSpace.SetLineHeight( static_cast<sal_uInt16>(lValue) );
|
|
rLineSpace.SetInterLineSpaceRule( SvxInterLineSpaceRule::Off );
|
|
break;
|
|
|
|
case LLINESPACE_DURCH:
|
|
rLineSpace.SetLineSpaceRule( SvxLineSpaceRule::Auto );
|
|
rLineSpace.SetInterLineSpace( static_cast<sal_uInt16>(lValue) );
|
|
break;
|
|
|
|
case LLINESPACE_FIX:
|
|
rLineSpace.SetLineHeight(static_cast<sal_uInt16>(lValue));
|
|
rLineSpace.SetLineSpaceRule( SvxLineSpaceRule::Fix );
|
|
rLineSpace.SetInterLineSpaceRule( SvxInterLineSpaceRule::Off );
|
|
break;
|
|
}
|
|
}
|
|
|
|
static sal_uInt16 GetHtmlMode_Impl(const SfxItemSet& rSet)
|
|
{
|
|
sal_uInt16 nHtmlMode = 0;
|
|
const SfxUInt16Item* pItem = rSet.GetItemIfSet(SID_HTML_MODE, false);
|
|
if (!pItem)
|
|
{
|
|
if (SfxObjectShell* pShell = SfxObjectShell::Current())
|
|
pItem = pShell->GetItem(SID_HTML_MODE);
|
|
}
|
|
if(pItem)
|
|
{
|
|
nHtmlMode = pItem->GetValue();
|
|
}
|
|
return nHtmlMode;
|
|
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::ELRLoseFocus()
|
|
{
|
|
SfxItemPool* pPool = GetItemSet().GetPool();
|
|
assert(pPool && "Where is the pool?");
|
|
FieldUnit eUnit =
|
|
MapToFieldUnit( pPool->GetMetric( GetWhich( SID_ATTR_LRSPACE ) ) );
|
|
|
|
sal_Int64 nL = m_aLeftIndent.denormalize(m_aLeftIndent.get_value(eUnit));
|
|
sal_Int64 nR = m_aRightIndent.denormalize(m_aRightIndent.get_value(eUnit));
|
|
OUString aTmp = m_aFLineIndent.get_text();
|
|
|
|
if (m_aLeftIndent.get_min(FieldUnit::NONE) < 0)
|
|
m_aFLineIndent.set_min(-99999, FieldUnit::MM);
|
|
else
|
|
m_aFLineIndent.set_min(m_aFLineIndent.normalize(-nL), eUnit);
|
|
|
|
// Check only for concrete width (Shell)
|
|
sal_Int64 nTmp = nWidth - nL - nR - MM50;
|
|
m_aFLineIndent.set_max(m_aFLineIndent.normalize(nTmp), eUnit);
|
|
|
|
if (aTmp.isEmpty())
|
|
m_aFLineIndent.set_text(OUString());
|
|
// maximum left right
|
|
aTmp = m_aLeftIndent.get_text();
|
|
nTmp = nWidth - nR - MM50;
|
|
m_aLeftIndent.set_max(m_aLeftIndent.normalize(nTmp), eUnit);
|
|
|
|
if ( aTmp.isEmpty() )
|
|
m_aLeftIndent.set_text(OUString());
|
|
aTmp = m_aRightIndent.get_text();
|
|
nTmp = nWidth - nL - MM50;
|
|
m_aRightIndent.set_max(m_aRightIndent.normalize(nTmp), eUnit);
|
|
|
|
if ( aTmp.isEmpty() )
|
|
m_aRightIndent.set_text(OUString());
|
|
|
|
UpdateExample_Impl();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxStdParagraphTabPage, ELRLoseFocusHdl, weld::MetricSpinButton&, void)
|
|
{
|
|
ELRLoseFocus();
|
|
}
|
|
|
|
std::unique_ptr<SfxTabPage> SvxStdParagraphTabPage::Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rSet)
|
|
{
|
|
return std::make_unique<SvxStdParagraphTabPage>(pPage, pController, *rSet);
|
|
}
|
|
|
|
bool SvxStdParagraphTabPage::FillItemSet( SfxItemSet* rOutSet )
|
|
{
|
|
const SfxPoolItem* pOld = nullptr;
|
|
SfxItemPool* pPool = rOutSet->GetPool();
|
|
DBG_ASSERT( pPool, "Where is the pool?" );
|
|
|
|
bool bModified = false;
|
|
sal_uInt16 nWhich;
|
|
int nPos = m_xLineDist->get_active();
|
|
|
|
if ( nPos != -1 &&
|
|
( m_bLineDistToggled ||
|
|
m_xLineDist->get_value_changed_from_saved() ||
|
|
m_xLineDistAtPercentBox->get_value_changed_from_saved() ||
|
|
m_xLineDistAtMetricBox->get_value_changed_from_saved() ) )
|
|
{
|
|
nWhich = GetWhich( SID_ATTR_PARA_LINESPACE );
|
|
MapUnit eUnit = pPool->GetMetric( nWhich );
|
|
SvxLineSpacingItem aSpacing(
|
|
static_cast<const SvxLineSpacingItem&>(GetItemSet().Get( nWhich )) );
|
|
|
|
switch ( nPos )
|
|
{
|
|
case LLINESPACE_1:
|
|
case LLINESPACE_115:
|
|
case LLINESPACE_15:
|
|
case LLINESPACE_2:
|
|
SetLineSpace_Impl( aSpacing, nPos );
|
|
break;
|
|
|
|
case LLINESPACE_PROP:
|
|
SetLineSpace_Impl( aSpacing, nPos,
|
|
static_cast<tools::Long>(m_xLineDistAtPercentBox->denormalize(
|
|
m_xLineDistAtPercentBox->get_value(FieldUnit::NONE) )) );
|
|
break;
|
|
|
|
case LLINESPACE_MIN:
|
|
case LLINESPACE_DURCH:
|
|
case LLINESPACE_FIX:
|
|
SetLineSpace_Impl( aSpacing, nPos,
|
|
GetCoreValue( *m_xLineDistAtMetricBox, eUnit ) );
|
|
break;
|
|
|
|
default:
|
|
OSL_FAIL( "unknown LineDist entry" );
|
|
break;
|
|
}
|
|
pOld = GetOldItem( *rOutSet, SID_ATTR_PARA_LINESPACE );
|
|
|
|
if ( m_bLineDistToggled ||
|
|
!pOld || !( *static_cast<const SvxLineSpacingItem*>(pOld) == aSpacing ) ||
|
|
SfxItemState::INVALID == GetItemSet().GetItemState( nWhich ) )
|
|
{
|
|
rOutSet->Put( aSpacing );
|
|
bModified = true;
|
|
}
|
|
}
|
|
|
|
if ( m_aTopDist.get_value_changed_from_saved() || m_aBottomDist.get_value_changed_from_saved()
|
|
|| m_xContextualCB->get_state_changed_from_saved())
|
|
{
|
|
nWhich = GetWhich( SID_ATTR_ULSPACE );
|
|
MapUnit eUnit = pPool->GetMetric( nWhich );
|
|
pOld = GetOldItem( *rOutSet, SID_ATTR_ULSPACE );
|
|
SvxULSpaceItem aMargin( nWhich );
|
|
|
|
if ( bRelativeMode )
|
|
{
|
|
DBG_ASSERT( GetItemSet().GetParent(), "No ParentSet" );
|
|
|
|
const SvxULSpaceItem& rOldItem =
|
|
static_cast<const SvxULSpaceItem&>(GetItemSet().GetParent()->Get( nWhich ));
|
|
|
|
if ( m_aTopDist.IsRelative() )
|
|
aMargin.SetUpper( rOldItem.GetUpper(),
|
|
static_cast<sal_uInt16>(m_aTopDist.get_value(FieldUnit::NONE)) );
|
|
else
|
|
aMargin.SetUpper( static_cast<sal_uInt16>(m_aTopDist.GetCoreValue(eUnit)) );
|
|
|
|
if ( m_aBottomDist.IsRelative() )
|
|
aMargin.SetLower( rOldItem.GetLower(),
|
|
static_cast<sal_uInt16>(m_aBottomDist.get_value(FieldUnit::NONE)) );
|
|
else
|
|
aMargin.SetLower( static_cast<sal_uInt16>(m_aBottomDist.GetCoreValue(eUnit)) );
|
|
|
|
}
|
|
else
|
|
{
|
|
aMargin.SetUpper(static_cast<sal_uInt16>(m_aTopDist.GetCoreValue(eUnit)));
|
|
aMargin.SetLower(static_cast<sal_uInt16>(m_aBottomDist.GetCoreValue(eUnit)));
|
|
}
|
|
aMargin.SetContextValue(m_xContextualCB->get_active());
|
|
|
|
if ( !pOld || *static_cast<const SvxULSpaceItem*>(pOld) != aMargin ||
|
|
SfxItemState::INVALID == GetItemSet().GetItemState( nWhich ) )
|
|
{
|
|
rOutSet->Put( aMargin );
|
|
bModified = true;
|
|
}
|
|
}
|
|
bool bNullTab = false;
|
|
|
|
if (m_bSplitLRSpace && m_aLeftIndent.get_value_changed_from_saved())
|
|
{
|
|
nWhich = GetWhich(SID_ATTR_PARA_LEFTSPACE);
|
|
MapUnit const eUnit = pPool->GetMetric(nWhich);
|
|
SvxTextLeftMarginItem item(nWhich);
|
|
pOld = GetOldItem(*rOutSet, SID_ATTR_PARA_LEFTSPACE);
|
|
|
|
if (bRelativeMode)
|
|
{
|
|
assert(GetItemSet().GetParent());
|
|
|
|
const SvxTextLeftMarginItem & rOldItem(
|
|
static_cast<const SvxTextLeftMarginItem&>(GetItemSet().GetParent()->Get(nWhich)));
|
|
|
|
if (m_aLeftIndent.IsRelative())
|
|
{
|
|
item.SetTextLeft(rOldItem.GetTextLeft(),
|
|
static_cast<sal_uInt16>(m_aLeftIndent.get_value(FieldUnit::NONE)));
|
|
}
|
|
else
|
|
{
|
|
item.SetTextLeft(lcl_GetFontRelativeValue(m_aLeftIndent, eUnit));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
item.SetTextLeft(lcl_GetFontRelativeValue(m_aLeftIndent, eUnit));
|
|
}
|
|
if (!pOld || *static_cast<const SvxTextLeftMarginItem*>(pOld) != item
|
|
|| SfxItemState::INVALID == GetItemSet().GetItemState(nWhich))
|
|
{
|
|
rOutSet->Put(item);
|
|
bModified = true;
|
|
}
|
|
}
|
|
|
|
if (m_bSplitLRSpace && m_aRightIndent.get_value_changed_from_saved())
|
|
{
|
|
nWhich = GetWhich(SID_ATTR_PARA_RIGHTSPACE);
|
|
MapUnit const eUnit = pPool->GetMetric(nWhich);
|
|
SvxRightMarginItem item(nWhich);
|
|
pOld = GetOldItem(*rOutSet, SID_ATTR_PARA_RIGHTSPACE);
|
|
|
|
if (bRelativeMode)
|
|
{
|
|
assert(GetItemSet().GetParent());
|
|
|
|
const SvxRightMarginItem & rOldItem(
|
|
static_cast<const SvxRightMarginItem&>(GetItemSet().GetParent()->Get(nWhich)));
|
|
|
|
if (m_aRightIndent.IsRelative())
|
|
{
|
|
item.SetRight(rOldItem.GetRight(),
|
|
static_cast<sal_uInt16>(m_aRightIndent.get_value(FieldUnit::NONE)));
|
|
}
|
|
else
|
|
{
|
|
item.SetRight(lcl_GetFontRelativeValue(m_aRightIndent, eUnit));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
item.SetRight(lcl_GetFontRelativeValue(m_aRightIndent, eUnit));
|
|
}
|
|
if (!pOld || *static_cast<const SvxRightMarginItem*>(pOld) != item
|
|
|| SfxItemState::INVALID == GetItemSet().GetItemState(nWhich))
|
|
{
|
|
rOutSet->Put(item);
|
|
bModified = true;
|
|
}
|
|
}
|
|
|
|
if (m_bSplitLRSpace && (m_aFLineIndent.get_value_changed_from_saved()
|
|
|| m_xAutoCB->get_state_changed_from_saved()))
|
|
{
|
|
nWhich = GetWhich(SID_ATTR_PARA_FIRSTLINESPACE);
|
|
MapUnit const eUnit = pPool->GetMetric(nWhich);
|
|
SvxFirstLineIndentItem item(nWhich);
|
|
pOld = GetOldItem(*rOutSet, SID_ATTR_PARA_FIRSTLINESPACE);
|
|
|
|
if (bRelativeMode)
|
|
{
|
|
assert(GetItemSet().GetParent());
|
|
|
|
const SvxFirstLineIndentItem & rOldItem(
|
|
static_cast<const SvxFirstLineIndentItem&>(GetItemSet().GetParent()->Get(nWhich)));
|
|
|
|
if (m_aFLineIndent.IsRelative())
|
|
{
|
|
item.SetTextFirstLineOffset(
|
|
rOldItem.GetTextFirstLineOffset(),
|
|
static_cast<sal_uInt16>(m_aFLineIndent.get_value(FieldUnit::NONE)));
|
|
}
|
|
else
|
|
{
|
|
item.SetTextFirstLineOffset(lcl_GetFontRelativeValue(m_aFLineIndent, eUnit));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
item.SetTextFirstLineOffset(lcl_GetFontRelativeValue(m_aFLineIndent, eUnit));
|
|
}
|
|
item.SetAutoFirst(m_xAutoCB->get_active());
|
|
if (item.GetTextFirstLineOffset().m_dValue < 0.0)
|
|
{
|
|
bNullTab = true;
|
|
}
|
|
|
|
if (!pOld || *static_cast<const SvxFirstLineIndentItem*>(pOld) != item
|
|
|| SfxItemState::INVALID == GetItemSet().GetItemState(nWhich))
|
|
{
|
|
rOutSet->Put(item);
|
|
bModified = true;
|
|
}
|
|
}
|
|
|
|
if (!m_bSplitLRSpace &&
|
|
(m_aLeftIndent.get_value_changed_from_saved() ||
|
|
m_aFLineIndent.get_value_changed_from_saved() ||
|
|
m_aRightIndent.get_value_changed_from_saved() ||
|
|
m_xAutoCB->get_state_changed_from_saved()))
|
|
{
|
|
nWhich = GetWhich( SID_ATTR_LRSPACE );
|
|
MapUnit eUnit = pPool->GetMetric( nWhich );
|
|
SvxLRSpaceItem aMargin( nWhich );
|
|
pOld = GetOldItem( *rOutSet, SID_ATTR_LRSPACE );
|
|
|
|
if ( bRelativeMode )
|
|
{
|
|
DBG_ASSERT( GetItemSet().GetParent(), "No ParentSet" );
|
|
|
|
const SvxLRSpaceItem& rOldItem =
|
|
static_cast<const SvxLRSpaceItem&>(GetItemSet().GetParent()->Get( nWhich ));
|
|
|
|
if (m_aLeftIndent.IsRelative())
|
|
aMargin.SetTextLeft( rOldItem.GetTextLeft(),
|
|
static_cast<sal_uInt16>(m_aLeftIndent.get_value(FieldUnit::NONE)) );
|
|
else
|
|
aMargin.SetTextLeft(lcl_GetFontRelativeValue(m_aLeftIndent, eUnit));
|
|
|
|
if ( m_aRightIndent.IsRelative() )
|
|
aMargin.SetRight( rOldItem.GetRight(),
|
|
static_cast<sal_uInt16>(m_aRightIndent.get_value(FieldUnit::NONE)) );
|
|
else
|
|
aMargin.SetRight(lcl_GetFontRelativeValue(m_aRightIndent, eUnit));
|
|
|
|
if ( m_aFLineIndent.IsRelative() )
|
|
aMargin.SetTextFirstLineOffset(
|
|
rOldItem.GetTextFirstLineOffset(),
|
|
static_cast<sal_uInt16>(m_aFLineIndent.get_value(FieldUnit::NONE)));
|
|
else
|
|
{
|
|
aMargin.SetTextFirstLineOffset(lcl_GetFontRelativeValue(m_aFLineIndent, eUnit));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
aMargin.SetTextLeft(lcl_GetFontRelativeValue(m_aLeftIndent, eUnit));
|
|
aMargin.SetRight(lcl_GetFontRelativeValue(m_aRightIndent, eUnit));
|
|
aMargin.SetTextFirstLineOffset(lcl_GetFontRelativeValue(m_aFLineIndent, eUnit));
|
|
}
|
|
aMargin.SetAutoFirst(m_xAutoCB->get_active());
|
|
if (aMargin.GetTextFirstLineOffset().m_dValue < 0.0)
|
|
bNullTab = true;
|
|
|
|
if ( !pOld || *static_cast<const SvxLRSpaceItem*>(pOld) != aMargin ||
|
|
SfxItemState::INVALID == GetItemSet().GetItemState( nWhich ) )
|
|
{
|
|
rOutSet->Put( aMargin );
|
|
bModified = true;
|
|
}
|
|
}
|
|
|
|
if ( bNullTab )
|
|
{
|
|
MapUnit eUnit = pPool->GetMetric( GetWhich( SID_ATTR_TABSTOP ) );
|
|
if ( MapUnit::Map100thMM != eUnit )
|
|
{
|
|
|
|
// negative first line indent -> set null default tabstob if applicable
|
|
sal_uInt16 _nWhich = GetWhich( SID_ATTR_TABSTOP );
|
|
const SfxItemSet& rInSet = GetItemSet();
|
|
|
|
if ( rInSet.GetItemState( _nWhich ) >= SfxItemState::DEFAULT )
|
|
{
|
|
const SvxTabStopItem& rTabItem =
|
|
static_cast<const SvxTabStopItem&>(rInSet.Get( _nWhich ));
|
|
SvxTabStopItem aNullTab( rTabItem );
|
|
SvxTabStop aNull( 0, SvxTabAdjust::Default );
|
|
aNullTab.Insert( aNull );
|
|
rOutSet->Put( aNullTab );
|
|
}
|
|
}
|
|
}
|
|
if (m_xRegisterCB->get_visible())
|
|
{
|
|
const SfxBoolItem* pBoolItem = static_cast<const SfxBoolItem*>(GetOldItem(
|
|
*rOutSet, SID_ATTR_PARA_REGISTER));
|
|
if (!pBoolItem)
|
|
return bModified;
|
|
sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_REGISTER );
|
|
bool bSet = pBoolItem->GetValue();
|
|
|
|
if (m_xRegisterCB->get_active() != bSet)
|
|
{
|
|
std::unique_ptr<SfxBoolItem> pRegItem(pBoolItem->Clone());
|
|
pRegItem->SetValue(!bSet);
|
|
rOutSet->Put(std::move(pRegItem));
|
|
bModified = true;
|
|
}
|
|
else if ( SfxItemState::DEFAULT == GetItemSet().GetItemState( _nWhich, false ) )
|
|
rOutSet->ClearItem(_nWhich);
|
|
}
|
|
|
|
return bModified;
|
|
}
|
|
|
|
static bool UseCharUnitInUI(const SfxItemSet& rSet)
|
|
{
|
|
const bool bApplyCharUnit = GetApplyCharUnit(rSet);
|
|
if (!bApplyCharUnit)
|
|
return false;
|
|
if (!SvtCJKOptions::IsAsianTypographyEnabled())
|
|
return false;
|
|
// tdf#101895 Given that we choose to show cm vs inch based on this Locale
|
|
// setting, also choose to use ch[ar] and line based on that locale when
|
|
// bApplyCharUnit is enabled.
|
|
return MsLangId::isCJK(SvtSysLocaleOptions().GetRealLanguageTag().getLanguageType());
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::Reset( const SfxItemSet* rSet )
|
|
{
|
|
SfxItemPool* pPool = rSet->GetPool();
|
|
DBG_ASSERT( pPool, "Where is the pool?" );
|
|
|
|
// adjust metric
|
|
FieldUnit eFUnit = GetModuleFieldUnit( *rSet );
|
|
if (UseCharUnitInUI(*rSet))
|
|
eFUnit = FieldUnit::CHAR;
|
|
|
|
m_aLeftIndent.SetFieldUnit(eFUnit);
|
|
m_aRightIndent.SetFieldUnit(eFUnit);
|
|
m_aFLineIndent.SetFieldUnit(eFUnit);
|
|
if ( eFUnit == FieldUnit::CHAR )
|
|
{
|
|
m_aTopDist.SetFieldUnit(FieldUnit::LINE);
|
|
m_aBottomDist.SetFieldUnit(FieldUnit::LINE);
|
|
SetFieldUnit(*m_xLineDistAtMetricBox, FieldUnit::POINT);
|
|
}
|
|
else
|
|
{
|
|
m_aTopDist.SetFieldUnit(eFUnit);
|
|
m_aBottomDist.SetFieldUnit(eFUnit);
|
|
SetFieldUnit(*m_xLineDistAtMetricBox, eFUnit);
|
|
}
|
|
|
|
sal_uInt16 const nWhichFL(GetWhich(SID_ATTR_PARA_FIRSTLINESPACE));
|
|
m_bSplitLRSpace = (nWhichFL != SID_ATTR_PARA_FIRSTLINESPACE);
|
|
SfxItemState const eItemStateFL(rSet->GetItemState(nWhichFL));
|
|
sal_uInt16 const nWhichLM(GetWhich(SID_ATTR_PARA_LEFTSPACE));
|
|
SfxItemState const eItemStateLM(rSet->GetItemState(nWhichLM));
|
|
sal_uInt16 const nWhichRM(GetWhich(SID_ATTR_PARA_RIGHTSPACE));
|
|
SfxItemState const eItemStateRM(rSet->GetItemState(nWhichRM));
|
|
|
|
if (m_bSplitLRSpace && SfxItemState::DEFAULT <= eItemStateLM)
|
|
{
|
|
const SvxTextLeftMarginItem & rOldLeftMargin(
|
|
static_cast<const SvxTextLeftMarginItem &>(rSet->Get(nWhichLM)));
|
|
|
|
MapUnit const eUnit = pPool->GetMetric(nWhichLM);
|
|
|
|
if (bRelativeMode)
|
|
{
|
|
if (rOldLeftMargin.GetPropLeft() != 100)
|
|
{
|
|
m_aLeftIndent.SetRelative( true );
|
|
m_aLeftIndent.set_value(rOldLeftMargin.GetPropLeft(), FieldUnit::NONE);
|
|
}
|
|
else
|
|
{
|
|
m_aLeftIndent.SetRelative(false);
|
|
m_aLeftIndent.SetFieldUnit(eFUnit);
|
|
lcl_SetFontRelativeValue(m_aLeftIndent, rOldLeftMargin.GetTextLeft(), eUnit);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lcl_SetFontRelativeValue(m_aLeftIndent, rOldLeftMargin.GetTextLeft(), eUnit);
|
|
}
|
|
}
|
|
else if (m_bSplitLRSpace)
|
|
{
|
|
m_aLeftIndent.set_text(OUString());
|
|
}
|
|
|
|
if (m_bSplitLRSpace && SfxItemState::DEFAULT <= eItemStateRM)
|
|
{
|
|
const SvxRightMarginItem & rOldRightMargin(
|
|
static_cast<const SvxRightMarginItem &>(rSet->Get(nWhichRM)));
|
|
|
|
MapUnit const eUnit = pPool->GetMetric(nWhichRM);
|
|
|
|
if (bRelativeMode)
|
|
{
|
|
if (rOldRightMargin.GetPropRight() != 100)
|
|
{
|
|
m_aRightIndent.SetRelative( true );
|
|
m_aRightIndent.set_value(rOldRightMargin.GetPropRight(), FieldUnit::NONE);
|
|
}
|
|
else
|
|
{
|
|
m_aRightIndent.SetRelative(false);
|
|
m_aRightIndent.SetFieldUnit(eFUnit);
|
|
lcl_SetFontRelativeValue(m_aRightIndent, rOldRightMargin.GetRight(), eUnit);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lcl_SetFontRelativeValue(m_aRightIndent, rOldRightMargin.GetRight(), eUnit);
|
|
}
|
|
}
|
|
else if (m_bSplitLRSpace)
|
|
{
|
|
m_aRightIndent.set_text(OUString());
|
|
}
|
|
|
|
if (m_bSplitLRSpace && SfxItemState::DEFAULT <= eItemStateFL)
|
|
{
|
|
const SvxFirstLineIndentItem & rOldFirstLine(
|
|
static_cast<const SvxFirstLineIndentItem &>(rSet->Get(nWhichFL)));
|
|
|
|
MapUnit const eUnit = pPool->GetMetric(nWhichFL);
|
|
|
|
if (bRelativeMode)
|
|
{
|
|
if (rOldFirstLine.GetPropTextFirstLineOffset() != 100)
|
|
{
|
|
m_aFLineIndent.SetRelative(true);
|
|
m_aFLineIndent.set_value(rOldFirstLine.GetPropTextFirstLineOffset(), FieldUnit::NONE);
|
|
}
|
|
else
|
|
{
|
|
m_aFLineIndent.SetRelative(false);
|
|
m_aFLineIndent.set_min(-9999, FieldUnit::NONE);
|
|
m_aFLineIndent.SetFieldUnit(eFUnit);
|
|
lcl_SetFontRelativeValue(m_aFLineIndent, rOldFirstLine.GetTextFirstLineOffset(),
|
|
eUnit);
|
|
}
|
|
m_xAutoCB->set_active(rOldFirstLine.IsAutoFirst());
|
|
}
|
|
else
|
|
{
|
|
lcl_SetFontRelativeValue(m_aFLineIndent, rOldFirstLine.GetTextFirstLineOffset(), eUnit);
|
|
m_xAutoCB->set_active(rOldFirstLine.IsAutoFirst());
|
|
}
|
|
AutoHdl_Impl(*m_xAutoCB);
|
|
}
|
|
else if (m_bSplitLRSpace)
|
|
{
|
|
m_aFLineIndent.set_text(OUString());
|
|
}
|
|
|
|
sal_uInt16 _nWhich = GetWhich( SID_ATTR_LRSPACE );
|
|
SfxItemState eItemState = rSet->GetItemState( _nWhich );
|
|
|
|
if (!m_bSplitLRSpace && SfxItemState::DEFAULT <= eItemState)
|
|
{
|
|
MapUnit eUnit = pPool->GetMetric( _nWhich );
|
|
|
|
if ( bRelativeMode )
|
|
{
|
|
const SvxLRSpaceItem& rOldItem =
|
|
static_cast<const SvxLRSpaceItem&>(rSet->Get( _nWhich ));
|
|
|
|
if ( rOldItem.GetPropLeft() != 100 )
|
|
{
|
|
m_aLeftIndent.SetRelative( true );
|
|
m_aLeftIndent.set_value(rOldItem.GetPropLeft(), FieldUnit::NONE);
|
|
}
|
|
else
|
|
{
|
|
m_aLeftIndent.SetRelative(false);
|
|
m_aLeftIndent.SetFieldUnit(eFUnit);
|
|
lcl_SetFontRelativeValue(m_aLeftIndent, rOldItem.GetTextLeft(), eUnit);
|
|
}
|
|
|
|
if ( rOldItem.GetPropRight() != 100 )
|
|
{
|
|
m_aRightIndent.SetRelative( true );
|
|
m_aRightIndent.set_value(rOldItem.GetPropRight(), FieldUnit::NONE);
|
|
}
|
|
else
|
|
{
|
|
m_aRightIndent.SetRelative(false);
|
|
m_aRightIndent.SetFieldUnit(eFUnit);
|
|
lcl_SetFontRelativeValue(m_aRightIndent, rOldItem.GetRight(), eUnit);
|
|
}
|
|
|
|
if ( rOldItem.GetPropTextFirstLineOffset() != 100 )
|
|
{
|
|
m_aFLineIndent.SetRelative(true);
|
|
m_aFLineIndent.set_value(rOldItem.GetPropTextFirstLineOffset(), FieldUnit::NONE);
|
|
}
|
|
else
|
|
{
|
|
m_aFLineIndent.SetRelative(false);
|
|
m_aFLineIndent.set_min(-9999, FieldUnit::NONE);
|
|
m_aFLineIndent.SetFieldUnit(eFUnit);
|
|
lcl_SetFontRelativeValue(m_aFLineIndent, rOldItem.GetTextFirstLineOffset(), eUnit);
|
|
}
|
|
m_xAutoCB->set_active(rOldItem.IsAutoFirst());
|
|
}
|
|
else
|
|
{
|
|
const SvxLRSpaceItem& rSpace =
|
|
static_cast<const SvxLRSpaceItem&>(rSet->Get( _nWhich ));
|
|
|
|
lcl_SetFontRelativeValue(m_aLeftIndent, rSpace.GetTextLeft(), eUnit);
|
|
lcl_SetFontRelativeValue(m_aRightIndent, rSpace.GetRight(), eUnit);
|
|
lcl_SetFontRelativeValue(m_aFLineIndent, rSpace.GetTextFirstLineOffset(), eUnit);
|
|
m_xAutoCB->set_active(rSpace.IsAutoFirst());
|
|
}
|
|
AutoHdl_Impl(*m_xAutoCB);
|
|
}
|
|
else if (!m_bSplitLRSpace)
|
|
{
|
|
m_aLeftIndent.set_text(OUString());
|
|
m_aRightIndent.set_text(OUString());
|
|
m_aFLineIndent.set_text(OUString());
|
|
}
|
|
|
|
_nWhich = GetWhich( SID_ATTR_ULSPACE );
|
|
eItemState = rSet->GetItemState( _nWhich );
|
|
|
|
if ( eItemState >= SfxItemState::DEFAULT )
|
|
{
|
|
MapUnit eUnit = pPool->GetMetric( _nWhich );
|
|
|
|
const SvxULSpaceItem& rOldItem =
|
|
static_cast<const SvxULSpaceItem&>(rSet->Get( _nWhich ));
|
|
if ( bRelativeMode )
|
|
{
|
|
|
|
if ( rOldItem.GetPropUpper() != 100 )
|
|
{
|
|
m_aTopDist.SetRelative( true );
|
|
m_aTopDist.set_value(rOldItem.GetPropUpper(), FieldUnit::NONE);
|
|
}
|
|
else
|
|
{
|
|
m_aTopDist.SetRelative(false);
|
|
if (eFUnit == FieldUnit::CHAR)
|
|
m_aTopDist.SetFieldUnit(FieldUnit::LINE);
|
|
else
|
|
m_aTopDist.SetFieldUnit(eFUnit);
|
|
m_aTopDist.SetMetricValue(rOldItem.GetUpper(), eUnit);
|
|
}
|
|
|
|
if ( rOldItem.GetPropLower() != 100 )
|
|
{
|
|
m_aBottomDist.SetRelative( true );
|
|
m_aBottomDist.set_value(rOldItem.GetPropLower(), FieldUnit::NONE);
|
|
}
|
|
else
|
|
{
|
|
m_aBottomDist.SetRelative(false);
|
|
if (eFUnit == FieldUnit::CHAR)
|
|
m_aBottomDist.SetFieldUnit(FieldUnit::LINE);
|
|
else
|
|
m_aBottomDist.SetFieldUnit(eFUnit);
|
|
m_aBottomDist.SetMetricValue(rOldItem.GetLower(), eUnit);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_aTopDist.SetMetricValue(rOldItem.GetUpper(), eUnit);
|
|
m_aBottomDist.SetMetricValue(rOldItem.GetLower(), eUnit);
|
|
}
|
|
m_xContextualCB->set_active(rOldItem.GetContext());
|
|
}
|
|
else
|
|
{
|
|
m_aTopDist.set_text(OUString());
|
|
m_aBottomDist.set_text(OUString());
|
|
}
|
|
|
|
_nWhich = GetWhich( SID_ATTR_PARA_LINESPACE );
|
|
eItemState = rSet->GetItemState( _nWhich );
|
|
|
|
if ( eItemState >= SfxItemState::DEFAULT )
|
|
SetLineSpacing_Impl( static_cast<const SvxLineSpacingItem &>(rSet->Get( _nWhich )) );
|
|
else
|
|
m_xLineDist->set_active(-1);
|
|
|
|
_nWhich = GetWhich( SID_ATTR_PARA_REGISTER );
|
|
eItemState = rSet->GetItemState( _nWhich );
|
|
|
|
if ( eItemState >= SfxItemState::DEFAULT )
|
|
m_xRegisterCB->set_active( static_cast<const SfxBoolItem &>(rSet->Get( _nWhich )).GetValue());
|
|
m_xRegisterCB->save_state();
|
|
sal_uInt16 nHtmlMode = GetHtmlMode_Impl(*rSet);
|
|
if(nHtmlMode & HTMLMODE_ON)
|
|
{
|
|
m_xRegisterCB->hide();
|
|
m_xAutoCB->hide();
|
|
}
|
|
|
|
// this sets the min/max limits; do this _after_ setting the values,
|
|
// because for Impress the min of first-line indent depends on value of
|
|
// left-indent!
|
|
ELRLoseFocus();
|
|
ChangesApplied();
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::ChangesApplied()
|
|
{
|
|
m_aLeftIndent.save_value();
|
|
m_aRightIndent.save_value();
|
|
m_aFLineIndent.save_value();
|
|
m_xLineDist->save_value();
|
|
m_xLineDistAtPercentBox->save_value();
|
|
m_xLineDistAtMetricBox->save_value();
|
|
m_xRegisterCB->save_state();
|
|
m_aTopDist.save_value();
|
|
m_aBottomDist.save_value();
|
|
m_xContextualCB->save_state();
|
|
m_xAutoCB->save_state();
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::EnableRelativeMode()
|
|
{
|
|
DBG_ASSERT( GetItemSet().GetParent(), "RelativeMode, but no parent-set!" );
|
|
|
|
m_aLeftIndent.EnableRelativeMode( 0, 999 );
|
|
m_aFLineIndent.EnableRelativeMode( 0, 999 );
|
|
m_aRightIndent.EnableRelativeMode( 0, 999 );
|
|
m_aTopDist.EnableRelativeMode( 0, 999 );
|
|
m_aBottomDist.EnableRelativeMode( 0, 999 );
|
|
bRelativeMode = true;
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::ActivatePage( const SfxItemSet& rSet )
|
|
{
|
|
sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_ADJUST );
|
|
SfxItemState eItemState = rSet.GetItemState( _nWhich );
|
|
|
|
if ( eItemState < SfxItemState::DEFAULT )
|
|
return;
|
|
|
|
const SvxAdjustItem& rAdj = static_cast<const SvxAdjustItem&>( rSet.Get( _nWhich ) );
|
|
SvxAdjust eAdjust = rAdj.GetAdjust();
|
|
if ( eAdjust == SvxAdjust::Center || eAdjust == SvxAdjust::Block )
|
|
{
|
|
_nWhich = GetWhich( SID_ATTR_FRAMEDIRECTION );
|
|
eItemState = rSet.GetItemState( _nWhich );
|
|
|
|
if ( eItemState >= SfxItemState::DEFAULT )
|
|
{
|
|
const SvxFrameDirectionItem& rFrameDirItem = static_cast<const SvxFrameDirectionItem&>( rSet.Get( _nWhich ) );
|
|
SvxFrameDirection eFrameDirection = rFrameDirItem.GetValue();
|
|
|
|
m_aExampleWin.EnableRTL( SvxFrameDirection::Horizontal_RL_TB == eFrameDirection );
|
|
|
|
if ( eAdjust == SvxAdjust::Block )
|
|
m_aExampleWin.SetLastLine( rAdj.GetLastBlock() );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_aExampleWin.EnableRTL( eAdjust == SvxAdjust::Right );
|
|
eAdjust = SvxAdjust::Left; //required for correct preview display
|
|
m_aExampleWin.SetLastLine( eAdjust );
|
|
}
|
|
m_aExampleWin.SetAdjust( eAdjust );
|
|
|
|
UpdateExample_Impl();
|
|
}
|
|
|
|
DeactivateRC SvxStdParagraphTabPage::DeactivatePage( SfxItemSet* _pSet )
|
|
{
|
|
ELRLoseFocus();
|
|
|
|
if ( _pSet )
|
|
FillItemSet( _pSet );
|
|
return DeactivateRC::LeavePage;
|
|
}
|
|
|
|
SvxStdParagraphTabPage::SvxStdParagraphTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rAttr)
|
|
: SfxTabPage(pPage, pController, u"cui/ui/paraindentspacing.ui"_ustr, u"ParaIndentSpacing"_ustr, &rAttr)
|
|
, nWidth(11905 /*567 * 50*/)
|
|
, nMinFixDist(0)
|
|
, bRelativeMode(false)
|
|
, m_aLeftIndent(m_xBuilder->weld_metric_spin_button(u"spinED_LEFTINDENT"_ustr, FieldUnit::CM))
|
|
, m_aRightIndent(m_xBuilder->weld_metric_spin_button(u"spinED_RIGHTINDENT"_ustr, FieldUnit::CM))
|
|
, m_xFLineLabel(m_xBuilder->weld_label(u"labelFT_FLINEINDENT"_ustr))
|
|
, m_aFLineIndent(m_xBuilder->weld_metric_spin_button(u"spinED_FLINEINDENT"_ustr, FieldUnit::CM))
|
|
, m_xAutoCB(m_xBuilder->weld_check_button(u"checkCB_AUTO"_ustr))
|
|
, m_aTopDist(m_xBuilder->weld_metric_spin_button(u"spinED_TOPDIST"_ustr, FieldUnit::CM))
|
|
, m_aBottomDist(m_xBuilder->weld_metric_spin_button(u"spinED_BOTTOMDIST"_ustr, FieldUnit::CM))
|
|
, m_xContextualCB(m_xBuilder->weld_check_button(u"checkCB_CONTEXTUALSPACING"_ustr))
|
|
, m_xLineDist(m_xBuilder->weld_combo_box(u"comboLB_LINEDIST"_ustr))
|
|
, m_xLineDistAtPercentBox(m_xBuilder->weld_metric_spin_button(u"spinED_LINEDISTPERCENT"_ustr, FieldUnit::PERCENT))
|
|
, m_xLineDistAtMetricBox(m_xBuilder->weld_metric_spin_button(u"spinED_LINEDISTMETRIC"_ustr, FieldUnit::CM))
|
|
, m_xLineDistAtPlaceHolderBox(m_xBuilder->weld_metric_spin_button(u"spinED_BLANK"_ustr, FieldUnit::CM))
|
|
, m_xLineDistAtLabel(m_xBuilder->weld_label(u"labelFT_LINEDIST"_ustr))
|
|
, m_xAbsDist(m_xBuilder->weld_label(u"labelST_LINEDIST_ABS"_ustr))
|
|
, m_xRegisterCB(m_xBuilder->weld_check_button(u"checkCB_REGISTER"_ustr))
|
|
, m_xExampleWin(new weld::CustomWeld(*m_xBuilder, u"drawingareaWN_EXAMPLE"_ustr, m_aExampleWin))
|
|
{
|
|
// this page needs ExchangeSupport
|
|
SetExchangeSupport();
|
|
|
|
m_xLineDistAtMetricBox->hide();
|
|
m_xLineDistAtPlaceHolderBox->hide();
|
|
m_xLineDistAtPlaceHolderBox->set_text(OUString());
|
|
|
|
Init_Impl();
|
|
m_aFLineIndent.set_min(-9999, FieldUnit::NONE); // is set to 0 on default
|
|
m_aFLineIndent.EnableNegativeMode();
|
|
m_aFLineIndent.EnableFontRelativeMode();
|
|
|
|
m_aLeftIndent.EnableFontRelativeMode();
|
|
m_aRightIndent.EnableFontRelativeMode();
|
|
}
|
|
|
|
SvxStdParagraphTabPage::~SvxStdParagraphTabPage()
|
|
{
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::EnableNegativeMode()
|
|
{
|
|
m_aLeftIndent.set_min(-9999, FieldUnit::NONE);
|
|
m_aRightIndent.set_min(-9999, FieldUnit::NONE);
|
|
m_aRightIndent.EnableNegativeMode();
|
|
m_aLeftIndent.EnableNegativeMode();
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::SetLineSpacing_Impl
|
|
(
|
|
const SvxLineSpacingItem &rAttr
|
|
)
|
|
{
|
|
MapUnit eUnit = GetItemSet().GetPool()->GetMetric( rAttr.Which() );
|
|
|
|
switch( rAttr.GetLineSpaceRule() )
|
|
{
|
|
case SvxLineSpaceRule::Auto:
|
|
{
|
|
SvxInterLineSpaceRule eInter = rAttr.GetInterLineSpaceRule();
|
|
|
|
switch( eInter )
|
|
{
|
|
// Default single line spacing
|
|
case SvxInterLineSpaceRule::Off:
|
|
m_xLineDist->set_active( LLINESPACE_1 );
|
|
break;
|
|
|
|
// Default single line spacing
|
|
case SvxInterLineSpaceRule::Prop:
|
|
if ( 100 == rAttr.GetPropLineSpace() )
|
|
{
|
|
m_xLineDist->set_active( LLINESPACE_1 );
|
|
break;
|
|
}
|
|
// 1.15 line spacing
|
|
if ( 115 == rAttr.GetPropLineSpace() )
|
|
{
|
|
m_xLineDist->set_active( LLINESPACE_115 );
|
|
break;
|
|
}
|
|
// 1.5 line spacing
|
|
if ( 150 == rAttr.GetPropLineSpace() )
|
|
{
|
|
m_xLineDist->set_active( LLINESPACE_15 );
|
|
break;
|
|
}
|
|
// double line spacing
|
|
if ( 200 == rAttr.GetPropLineSpace() )
|
|
{
|
|
m_xLineDist->set_active( LLINESPACE_2 );
|
|
break;
|
|
}
|
|
// the set per cent value
|
|
m_xLineDistAtPercentBox->set_value(m_xLineDistAtPercentBox->normalize(rAttr.GetPropLineSpace()), FieldUnit::NONE);
|
|
m_xLineDist->set_active( LLINESPACE_PROP );
|
|
break;
|
|
|
|
case SvxInterLineSpaceRule::Fix:
|
|
SetMetricValue( *m_xLineDistAtMetricBox, rAttr.GetInterLineSpace(), eUnit );
|
|
m_xLineDist->set_active( LLINESPACE_DURCH );
|
|
break;
|
|
default: ;//prevent warning
|
|
}
|
|
}
|
|
break;
|
|
case SvxLineSpaceRule::Fix:
|
|
SetMetricValue(*m_xLineDistAtMetricBox, rAttr.GetLineHeight(), eUnit);
|
|
m_xLineDist->set_active( LLINESPACE_FIX );
|
|
break;
|
|
|
|
case SvxLineSpaceRule::Min:
|
|
SetMetricValue(*m_xLineDistAtMetricBox, rAttr.GetLineHeight(), eUnit);
|
|
m_xLineDist->set_active( LLINESPACE_MIN );
|
|
break;
|
|
default: ;//prevent warning
|
|
}
|
|
LineDistHdl_Impl( *m_xLineDist );
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxStdParagraphTabPage, LineDistPopupHdl_Impl, weld::ComboBox&, void)
|
|
{
|
|
m_bLineDistToggled = true;
|
|
}
|
|
|
|
IMPL_LINK(SvxStdParagraphTabPage, LineDistHdl_Impl, weld::ComboBox&, rBox, void)
|
|
{
|
|
switch (rBox.get_active())
|
|
{
|
|
case LLINESPACE_1:
|
|
case LLINESPACE_115:
|
|
case LLINESPACE_15:
|
|
case LLINESPACE_2:
|
|
m_xLineDistAtLabel->set_sensitive(false);
|
|
m_xLineDistAtPercentBox->hide();
|
|
m_xLineDistAtMetricBox->hide();
|
|
m_xLineDistAtPlaceHolderBox->show();
|
|
break;
|
|
|
|
case LLINESPACE_DURCH:
|
|
// setting a sensible default?
|
|
// limit MS min(10, aPageSize)
|
|
m_xLineDistAtMetricBox->set_min(0, FieldUnit::NONE);
|
|
|
|
if (m_xLineDistAtPlaceHolderBox->get_visible())
|
|
m_xLineDistAtMetricBox->set_value(m_xLineDistAtMetricBox->normalize(1), FieldUnit::NONE);
|
|
m_xLineDistAtPlaceHolderBox->hide();
|
|
m_xLineDistAtPercentBox->hide();
|
|
m_xLineDistAtMetricBox->show();
|
|
m_xLineDistAtLabel->set_sensitive(true);
|
|
break;
|
|
|
|
case LLINESPACE_MIN:
|
|
m_xLineDistAtMetricBox->set_min(0, FieldUnit::NONE);
|
|
|
|
if (m_xLineDistAtPlaceHolderBox->get_visible())
|
|
m_xLineDistAtMetricBox->set_value(m_xLineDistAtMetricBox->normalize(10), FieldUnit::TWIP);
|
|
m_xLineDistAtPlaceHolderBox->hide();
|
|
m_xLineDistAtPercentBox->hide();
|
|
m_xLineDistAtMetricBox->show();
|
|
m_xLineDistAtLabel->set_sensitive(true);
|
|
break;
|
|
|
|
case LLINESPACE_PROP:
|
|
|
|
if (m_xLineDistAtPlaceHolderBox->get_visible())
|
|
m_xLineDistAtPercentBox->set_value(m_xLineDistAtPercentBox->normalize(100), FieldUnit::TWIP);
|
|
m_xLineDistAtPlaceHolderBox->hide();
|
|
m_xLineDistAtMetricBox->hide();
|
|
m_xLineDistAtPercentBox->show();
|
|
m_xLineDistAtLabel->set_sensitive(true);
|
|
break;
|
|
case LLINESPACE_FIX:
|
|
{
|
|
auto nTemp = m_xLineDistAtMetricBox->get_value(FieldUnit::NONE);
|
|
m_xLineDistAtMetricBox->set_min(m_xLineDistAtMetricBox->normalize(nMinFixDist), FieldUnit::TWIP);
|
|
|
|
// if the value has been changed at SetMin,
|
|
// it is time for the default
|
|
if (m_xLineDistAtMetricBox->get_value(FieldUnit::NONE) != nTemp)
|
|
SetMetricValue( *m_xLineDistAtMetricBox, FIX_DIST_DEF, MapUnit::MapTwip ); // fix is only in Writer
|
|
m_xLineDistAtPlaceHolderBox->hide();
|
|
m_xLineDistAtPercentBox->hide();
|
|
m_xLineDistAtMetricBox->show();
|
|
m_xLineDistAtLabel->set_sensitive(true);
|
|
}
|
|
break;
|
|
}
|
|
UpdateExample_Impl();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxStdParagraphTabPage, ModifyHdl_Impl, weld::MetricSpinButton&, void)
|
|
{
|
|
UpdateExample_Impl();
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::Init_Impl()
|
|
{
|
|
m_xLineDist->connect_popup_toggled(LINK(this, SvxStdParagraphTabPage, LineDistPopupHdl_Impl));
|
|
m_xLineDist->connect_changed(LINK(this, SvxStdParagraphTabPage, LineDistHdl_Impl));
|
|
|
|
Link<weld::MetricSpinButton&,void> aLink2 = LINK(this, SvxStdParagraphTabPage, ELRLoseFocusHdl);
|
|
m_aFLineIndent.connect_value_changed(aLink2);
|
|
m_aLeftIndent.connect_value_changed(aLink2);
|
|
m_aRightIndent.connect_value_changed(aLink2);
|
|
|
|
Link<weld::MetricSpinButton&,void> aLink = LINK(this, SvxStdParagraphTabPage, ModifyHdl_Impl);
|
|
m_aTopDist.connect_value_changed(aLink);
|
|
m_aBottomDist.connect_value_changed(aLink);
|
|
|
|
m_xAutoCB->connect_toggled(LINK(this, SvxStdParagraphTabPage, AutoHdl_Impl));
|
|
SfxItemPool* pPool = GetItemSet().GetPool();
|
|
assert(pPool && "Where is the pool?");
|
|
FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( GetWhich( SID_ATTR_LRSPACE ) ) );
|
|
|
|
m_aTopDist.set_max( m_aTopDist.normalize( MAX_DURCH ), eUnit );
|
|
m_aBottomDist.set_max( m_aBottomDist.normalize( MAX_DURCH ), eUnit );
|
|
m_xLineDistAtMetricBox->set_max( m_xLineDistAtMetricBox->normalize( MAX_DURCH ), eUnit );
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::UpdateExample_Impl()
|
|
{
|
|
m_aExampleWin.SetFirstLineOffset( static_cast<short>(m_aFLineIndent.denormalize( m_aFLineIndent.get_value( FieldUnit::TWIP ) )) );
|
|
m_aExampleWin.SetLeftMargin( static_cast<tools::Long>(m_aLeftIndent.denormalize( m_aLeftIndent.get_value( FieldUnit::TWIP ) ) ) );
|
|
m_aExampleWin.SetRightMargin( static_cast<tools::Long>(m_aRightIndent.denormalize( m_aRightIndent.get_value( FieldUnit::TWIP ) ) ) );
|
|
m_aExampleWin.SetUpper( static_cast<sal_uInt16>(m_aTopDist.denormalize( m_aTopDist.get_value( FieldUnit::TWIP ) )) );
|
|
m_aExampleWin.SetLower( static_cast<sal_uInt16>(m_aBottomDist.denormalize( m_aBottomDist.get_value( FieldUnit::TWIP ) )) );
|
|
|
|
int nPos = m_xLineDist->get_active();
|
|
|
|
switch ( nPos )
|
|
{
|
|
case LLINESPACE_1:
|
|
case LLINESPACE_115:
|
|
case LLINESPACE_15:
|
|
case LLINESPACE_2:
|
|
case LLINESPACE_PROP:
|
|
case LLINESPACE_MIN:
|
|
case LLINESPACE_DURCH:
|
|
case LLINESPACE_FIX:
|
|
m_aExampleWin.SetLineSpace( static_cast<SvxPrevLineSpace>(nPos) );
|
|
break;
|
|
}
|
|
m_aExampleWin.Invalidate();
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::EnableRegisterMode()
|
|
{
|
|
m_xRegisterCB->show();
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::EnableContextualMode()
|
|
{
|
|
m_xContextualCB->show();
|
|
}
|
|
|
|
IMPL_LINK(SvxStdParagraphTabPage, AutoHdl_Impl, weld::Toggleable&, rBox, void)
|
|
{
|
|
bool bEnable = !rBox.get_active();
|
|
m_xFLineLabel->set_sensitive(bEnable);
|
|
m_aFLineIndent.set_sensitive(bEnable);
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::EnableAutoFirstLine()
|
|
{
|
|
m_xAutoCB->show();
|
|
}
|
|
|
|
void SvxStdParagraphTabPage::PageCreated(const SfxAllItemSet& aSet)
|
|
{
|
|
|
|
/* different bit represent call to different method of SvxStdParagraphTabPage
|
|
0x0001 --->EnableRelativeMode()
|
|
0x0002 --->EnableRegisterMode()
|
|
0x0004 --->EnableAutoFirstLine()
|
|
0x0008 --->EnableNegativeMode()
|
|
0x0010 --->EnableContextualMode()
|
|
*/
|
|
const SfxUInt16Item* pPageWidthItem = aSet.GetItem<SfxUInt16Item>(SID_SVXSTDPARAGRAPHTABPAGE_PAGEWIDTH, false);
|
|
const SfxUInt32Item* pFlagSetItem = aSet.GetItem<SfxUInt32Item>(SID_SVXSTDPARAGRAPHTABPAGE_FLAGSET, false);
|
|
|
|
if (pPageWidthItem)
|
|
nWidth = pPageWidthItem->GetValue();
|
|
|
|
if (pFlagSetItem )
|
|
{
|
|
if (( 0x0001 & pFlagSetItem->GetValue())== 0x0001 )
|
|
EnableRelativeMode();
|
|
|
|
if (( 0x0002 & pFlagSetItem->GetValue())== 0x0002 )
|
|
EnableRegisterMode();
|
|
|
|
if ( ( 0x0004 & pFlagSetItem->GetValue())== 0x0004 )
|
|
EnableAutoFirstLine();
|
|
}
|
|
|
|
if (pFlagSetItem)
|
|
{
|
|
if (( 0x0008 & pFlagSetItem->GetValue()) == 0x0008 )
|
|
EnableNegativeMode();
|
|
|
|
if (( 0x0010 & pFlagSetItem->GetValue()) == 0x0010 )
|
|
EnableContextualMode();
|
|
}
|
|
}
|
|
|
|
#define LASTLINEPOS_DEFAULT 0
|
|
#define LASTLINEPOS_LEFT 1
|
|
|
|
#define LASTLINECOUNT_OLD 3
|
|
#define LASTLINECOUNT_NEW 4
|
|
|
|
SvxParaAlignTabPage::SvxParaAlignTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rSet)
|
|
: SfxTabPage(pPage, pController, u"cui/ui/paragalignpage.ui"_ustr, u"ParaAlignPage"_ustr, &rSet)
|
|
, m_bSdrVertAlign(false)
|
|
, m_xLeft(m_xBuilder->weld_radio_button(u"radioBTN_LEFTALIGN"_ustr))
|
|
, m_xStart(m_xBuilder->weld_radio_button(u"radioBTN_STARTALIGN"_ustr))
|
|
, m_xRight(m_xBuilder->weld_radio_button(u"radioBTN_RIGHTALIGN"_ustr))
|
|
, m_xEnd(m_xBuilder->weld_radio_button(u"radioBTN_ENDALIGN"_ustr))
|
|
, m_xCenter(m_xBuilder->weld_radio_button(u"radioBTN_CENTERALIGN"_ustr))
|
|
, m_xJustify(m_xBuilder->weld_radio_button(u"radioBTN_JUSTIFYALIGN"_ustr))
|
|
, m_xLeftBottom(m_xBuilder->weld_label(u"labelST_LEFTALIGN_ASIAN"_ustr))
|
|
, m_xRightTop(m_xBuilder->weld_label(u"labelST_RIGHTALIGN_ASIAN"_ustr))
|
|
, m_xLastLineFT(m_xBuilder->weld_label(u"labelLB_LASTLINE"_ustr))
|
|
, m_xLastLineLB(m_xBuilder->weld_combo_box(u"comboLB_LASTLINE"_ustr))
|
|
, m_xExpandCB(m_xBuilder->weld_check_button(u"checkCB_EXPAND"_ustr))
|
|
, m_xSnapToGridCB(m_xBuilder->weld_check_button(u"checkCB_SNAP"_ustr))
|
|
, m_xExampleWin(new weld::CustomWeld(*m_xBuilder, u"drawingareaWN_EXAMPLE"_ustr, m_aExampleWin))
|
|
, m_xVertAlignFL(m_xBuilder->weld_widget(u"frameFL_VERTALIGN"_ustr))
|
|
, m_xVertAlignLB(m_xBuilder->weld_combo_box(u"comboLB_VERTALIGN"_ustr))
|
|
, m_xVertAlign(m_xBuilder->weld_label(u"labelFL_VERTALIGN"_ustr))
|
|
, m_xVertAlignSdr(m_xBuilder->weld_label(u"labelST_VERTALIGN_SDR"_ustr))
|
|
, m_xTextDirectionLB(new svx::FrameDirectionListBox(m_xBuilder->weld_combo_box(u"comboLB_TEXTDIRECTION"_ustr)))
|
|
, m_xAutoTextDirectionCB(m_xBuilder->weld_check_button(u"checkCB_AUTOTEXTDIRECTION"_ustr))
|
|
, m_xLabelWordSpacing(m_xBuilder->weld_label(u"labelWordSpacing"_ustr))
|
|
, m_xLabelMinimum(m_xBuilder->weld_label(u"labelMinimum"_ustr))
|
|
, m_xLabelDesired(m_xBuilder->weld_label(u"labelDesired"_ustr))
|
|
, m_xLabelMaximum(m_xBuilder->weld_label(u"labelMaximum"_ustr))
|
|
, m_xWordSpacing(m_xBuilder->weld_metric_spin_button(u"spin_WORD_SPACING"_ustr, FieldUnit::PERCENT))
|
|
, m_xWordSpacingMinimum(m_xBuilder->weld_metric_spin_button(u"spin_WORD_SPACING_MIN"_ustr, FieldUnit::PERCENT))
|
|
, m_xWordSpacingMaximum(m_xBuilder->weld_metric_spin_button(u"spin_WORD_SPACING_MAX"_ustr, FieldUnit::PERCENT))
|
|
, m_xParagraphComposer(m_xBuilder->weld_check_button(u"checkParaComposer"_ustr))
|
|
, m_xLabelLetterSpacing(m_xBuilder->weld_label(u"labelLetterSpacing"_ustr))
|
|
, m_xLetterSpacingMinimum(m_xBuilder->weld_metric_spin_button(u"spin_LETTER_SPACING_MIN"_ustr, FieldUnit::PERCENT))
|
|
, m_xLetterSpacingMaximum(m_xBuilder->weld_metric_spin_button(u"spin_LETTER_SPACING_MAX"_ustr, FieldUnit::PERCENT))
|
|
, m_xCompoundBased(m_xBuilder->weld_check_button(u"checkCompoundBased"_ustr))
|
|
, m_xLabelGlyphScaling(m_xBuilder->weld_label(u"labelGlyphScaling"_ustr))
|
|
, m_xGlyphScalingMinimum(m_xBuilder->weld_metric_spin_button(u"spin_GLYPH_SCALING_MIN"_ustr, FieldUnit::PERCENT))
|
|
, m_xGlyphScalingMaximum(m_xBuilder->weld_metric_spin_button(u"spin_GLYPH_SCALING_MAX"_ustr, FieldUnit::PERCENT))
|
|
{
|
|
SetExchangeSupport();
|
|
|
|
sal_uInt16 nLastLinePos = LASTLINEPOS_DEFAULT;
|
|
|
|
if ( SvtCJKOptions::IsAsianTypographyEnabled() )
|
|
{
|
|
m_xLeft->set_label(m_xLeftBottom->get_label());
|
|
m_xRight->set_label(m_xRightTop->get_label());
|
|
|
|
OUString sLeft(m_xLeft->get_label());
|
|
sLeft = MnemonicGenerator::EraseAllMnemonicChars( sLeft );
|
|
|
|
if (m_xLastLineLB->get_count() == LASTLINECOUNT_OLD)
|
|
{
|
|
m_xLastLineLB->remove(0);
|
|
m_xLastLineLB->insert_text(0, sLeft);
|
|
}
|
|
else
|
|
nLastLinePos = LASTLINEPOS_LEFT;
|
|
}
|
|
|
|
// remove "Default" or "Left" entry, depends on CJKOptions
|
|
if (m_xLastLineLB->get_count() == LASTLINECOUNT_NEW)
|
|
m_xLastLineLB->remove(nLastLinePos);
|
|
|
|
Link<weld::Toggleable&, void> aLink = LINK( this, SvxParaAlignTabPage, AlignHdl_Impl );
|
|
m_xLeft->connect_toggled(aLink);
|
|
m_xStart->connect_toggled(aLink);
|
|
m_xRight->connect_toggled(aLink);
|
|
m_xEnd->connect_toggled(aLink);
|
|
m_xCenter->connect_toggled(aLink);
|
|
m_xJustify->connect_toggled(aLink);
|
|
m_xLastLineLB->connect_changed(LINK(this, SvxParaAlignTabPage, LastLineHdl_Impl));
|
|
m_xTextDirectionLB->connect_changed(LINK(this, SvxParaAlignTabPage, TextDirectionHdl_Impl));
|
|
|
|
m_xTextDirectionLB->append(SvxFrameDirection::Environment, SvxResId(RID_SVXSTR_FRAMEDIR_SUPER));
|
|
m_xTextDirectionLB->append(SvxFrameDirection::Horizontal_LR_TB, SvxResId(RID_SVXSTR_FRAMEDIR_LTR));
|
|
m_xTextDirectionLB->append(SvxFrameDirection::Horizontal_RL_TB, SvxResId(RID_SVXSTR_FRAMEDIR_RTL));
|
|
|
|
// Minimum <= Desired <= Maximum word spacing
|
|
// apply these modifying the other values, if needed
|
|
m_xWordSpacing->connect_value_changed(LINK(this, SvxParaAlignTabPage, WordSpacingHdl_Impl));
|
|
m_xWordSpacingMinimum->connect_value_changed(LINK(this, SvxParaAlignTabPage, WordSpacingMinimumHdl_Impl));
|
|
m_xWordSpacingMaximum->connect_value_changed(LINK(this, SvxParaAlignTabPage, WordSpacingMaximumHdl_Impl));
|
|
}
|
|
|
|
SvxParaAlignTabPage::~SvxParaAlignTabPage()
|
|
{
|
|
}
|
|
|
|
DeactivateRC SvxParaAlignTabPage::DeactivatePage( SfxItemSet* _pSet )
|
|
{
|
|
if ( _pSet )
|
|
FillItemSet( _pSet );
|
|
return DeactivateRC::LeavePage;
|
|
}
|
|
|
|
std::unique_ptr<SfxTabPage> SvxParaAlignTabPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rSet)
|
|
{
|
|
return std::make_unique<SvxParaAlignTabPage>(pPage, pController, *rSet);
|
|
}
|
|
|
|
bool SvxParaAlignTabPage::FillItemSet( SfxItemSet* rOutSet )
|
|
{
|
|
bool bModified = false;
|
|
|
|
bool bAdj = false;
|
|
SvxAdjust eAdjust = SvxAdjust::Left;
|
|
|
|
if (m_xLeft->get_active())
|
|
{
|
|
eAdjust = SvxAdjust::Left;
|
|
bAdj = m_xLeft->get_saved_state() == TRISTATE_FALSE;
|
|
}
|
|
else if (m_xStart->get_active())
|
|
{
|
|
eAdjust = SvxAdjust::ParaStart;
|
|
bAdj = m_xStart->get_saved_state() == TRISTATE_FALSE;
|
|
}
|
|
else if (m_xRight->get_active())
|
|
{
|
|
eAdjust = SvxAdjust::Right;
|
|
bAdj = m_xRight->get_saved_state() == TRISTATE_FALSE;
|
|
}
|
|
else if (m_xEnd->get_active())
|
|
{
|
|
eAdjust = SvxAdjust::ParaEnd;
|
|
bAdj = m_xEnd->get_saved_state() == TRISTATE_FALSE;
|
|
}
|
|
else if (m_xCenter->get_active())
|
|
{
|
|
eAdjust = SvxAdjust::Center;
|
|
bAdj = m_xCenter->get_saved_state() == TRISTATE_FALSE;
|
|
}
|
|
else if (m_xJustify->get_active())
|
|
{
|
|
eAdjust = SvxAdjust::Block;
|
|
bAdj = m_xJustify->get_saved_state() == TRISTATE_FALSE ||
|
|
m_xExpandCB->get_state_changed_from_saved() ||
|
|
m_xLastLineLB->get_value_changed_from_saved() ||
|
|
m_xWordSpacing->get_value_changed_from_saved() ||
|
|
m_xWordSpacingMinimum->get_value_changed_from_saved() ||
|
|
m_xWordSpacingMaximum->get_value_changed_from_saved() ||
|
|
m_xParagraphComposer->get_state_changed_from_saved() ||
|
|
m_xLetterSpacingMinimum->get_value_changed_from_saved() ||
|
|
m_xLetterSpacingMaximum->get_value_changed_from_saved() ||
|
|
m_xCompoundBased->get_state_changed_from_saved() ||
|
|
m_xGlyphScalingMinimum->get_value_changed_from_saved() ||
|
|
m_xGlyphScalingMaximum->get_value_changed_from_saved();
|
|
}
|
|
|
|
sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_ADJUST );
|
|
|
|
if (bAdj)
|
|
{
|
|
SvxAdjust eOneWord = m_xExpandCB->get_active() ? SvxAdjust::Block : SvxAdjust::Left;
|
|
|
|
int nLBPos = m_xLastLineLB->get_active();
|
|
SvxAdjust eLastBlock = SvxAdjust::Left;
|
|
if ( 1 == nLBPos )
|
|
eLastBlock = SvxAdjust::Center;
|
|
else if ( 2 == nLBPos )
|
|
eLastBlock = SvxAdjust::Block;
|
|
|
|
SvxAdjustItem aAdj( static_cast<const SvxAdjustItem&>(GetItemSet().Get( _nWhich )) );
|
|
aAdj.SetAdjust( eAdjust );
|
|
aAdj.SetOneWord( eOneWord );
|
|
aAdj.SetLastBlock( eLastBlock );
|
|
aAdj.SetPropWordSpacing( m_xWordSpacing->get_value(FieldUnit::PERCENT) );
|
|
aAdj.SetPropWordSpacingMinimum( m_xWordSpacingMinimum->get_value(FieldUnit::PERCENT) );
|
|
aAdj.SetPropWordSpacingMaximum( m_xWordSpacingMaximum->get_value(FieldUnit::PERCENT) );
|
|
aAdj.SetParagraphComposer( m_xParagraphComposer->get_active() );
|
|
aAdj.SetPropLetterSpacingMinimum( m_xLetterSpacingMinimum->get_value(FieldUnit::PERCENT) );
|
|
aAdj.SetPropLetterSpacingMaximum( m_xLetterSpacingMaximum->get_value(FieldUnit::PERCENT) );
|
|
aAdj.SetCompoundBased( m_xCompoundBased->get_active() );
|
|
aAdj.SetPropScaleWidthMinimum( m_xGlyphScalingMinimum->get_value(FieldUnit::PERCENT) );
|
|
aAdj.SetPropScaleWidthMaximum( m_xGlyphScalingMaximum->get_value(FieldUnit::PERCENT) );
|
|
rOutSet->Put( aAdj );
|
|
bModified = true;
|
|
}
|
|
|
|
if (m_xSnapToGridCB->get_state_changed_from_saved())
|
|
{
|
|
rOutSet->Put(SvxParaGridItem(m_xSnapToGridCB->get_active(), GetWhich( SID_ATTR_PARA_SNAPTOGRID )));
|
|
bModified = true;
|
|
}
|
|
|
|
if (m_xVertAlignLB->get_value_changed_from_saved())
|
|
{
|
|
if (m_bSdrVertAlign)
|
|
rOutSet->Put(SdrTextVertAdjustItem(static_cast<SdrTextVertAdjust>(m_xVertAlignLB->get_active())));
|
|
else
|
|
rOutSet->Put(SvxParaVertAlignItem(static_cast<SvxParaVertAlignItem::Align>(m_xVertAlignLB->get_active()), GetWhich( SID_PARA_VERTALIGN )));
|
|
bModified = true;
|
|
}
|
|
|
|
if (m_xTextDirectionLB->get_visible())
|
|
{
|
|
if (m_xTextDirectionLB->get_value_changed_from_saved())
|
|
{
|
|
SvxFrameDirection eDir = m_xTextDirectionLB->get_active_id();
|
|
rOutSet->Put( SvxFrameDirectionItem( eDir, GetWhich( SID_ATTR_FRAMEDIRECTION ) ) );
|
|
bModified = true;
|
|
}
|
|
}
|
|
|
|
if (m_xAutoTextDirectionCB->get_state_changed_from_saved())
|
|
{
|
|
rOutSet->Put(SvxAutoFrameDirectionItem(m_xAutoTextDirectionCB->get_active(),
|
|
GetWhich(SID_ATTR_PARA_AUTOFRAMEDIRECTION)));
|
|
bModified = true;
|
|
}
|
|
|
|
return bModified;
|
|
}
|
|
|
|
void SvxParaAlignTabPage::ActivatePage( const SfxItemSet& rSet )
|
|
{
|
|
Reset( &rSet );
|
|
}
|
|
|
|
void SvxParaAlignTabPage::Reset( const SfxItemSet* rSet )
|
|
{
|
|
sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_ADJUST );
|
|
SfxItemState eItemState = rSet->GetItemState( _nWhich );
|
|
|
|
sal_Int32 nLBSelect = 0;
|
|
if ( eItemState >= SfxItemState::DEFAULT )
|
|
{
|
|
const SvxAdjustItem& rAdj = static_cast<const SvxAdjustItem&>(rSet->Get( _nWhich ));
|
|
|
|
switch ( rAdj.GetAdjust() /*!!! ask VB rAdj.GetLastBlock()*/ )
|
|
{
|
|
case SvxAdjust::Left: m_xLeft->set_active(true); break;
|
|
|
|
case SvxAdjust::ParaStart: m_xStart->set_active(true); break;
|
|
|
|
case SvxAdjust::Right: m_xRight->set_active(true); break;
|
|
|
|
case SvxAdjust::ParaEnd: m_xEnd->set_active(true); break;
|
|
|
|
case SvxAdjust::Center: m_xCenter->set_active(true); break;
|
|
|
|
case SvxAdjust::Block: m_xJustify->set_active(true); break;
|
|
default: ; //prevent warning
|
|
}
|
|
bool bEnable = m_xJustify->get_active();
|
|
m_xLastLineFT->set_sensitive(bEnable);
|
|
m_xLastLineLB->set_sensitive(bEnable);
|
|
|
|
switch(rAdj.GetLastBlock())
|
|
{
|
|
case SvxAdjust::Left: nLBSelect = 0; break;
|
|
|
|
case SvxAdjust::Center: nLBSelect = 1; break;
|
|
|
|
case SvxAdjust::Block: nLBSelect = 2; break;
|
|
default: ; //prevent warning
|
|
}
|
|
m_xExpandCB->set_sensitive(bEnable && nLBSelect == 2);
|
|
m_xExpandCB->set_active(SvxAdjust::Block == rAdj.GetOneWord());
|
|
|
|
if (m_xJustify->get_active())
|
|
{
|
|
m_xLabelWordSpacing->set_sensitive(true);
|
|
m_xLabelMinimum->set_sensitive(true);
|
|
m_xLabelDesired->set_sensitive(true);
|
|
m_xLabelMaximum->set_sensitive(true);
|
|
m_xWordSpacing->set_sensitive(true);
|
|
m_xWordSpacingMinimum->set_sensitive(true);
|
|
m_xWordSpacingMaximum->set_sensitive(true);
|
|
m_xWordSpacing->set_value(rAdj.GetPropWordSpacing(), FieldUnit::PERCENT);
|
|
m_xWordSpacingMinimum->set_value(rAdj.GetPropWordSpacingMinimum(), FieldUnit::PERCENT);
|
|
m_xWordSpacingMaximum->set_value(rAdj.GetPropWordSpacingMaximum(), FieldUnit::PERCENT);
|
|
m_xParagraphComposer->set_sensitive(true);
|
|
m_xParagraphComposer->set_active(rAdj.GetParagraphComposer());
|
|
m_xLabelLetterSpacing->set_sensitive(true);
|
|
// TODO add LetterSpacing (CharKern) and LetterSpacingMinimum
|
|
m_xLetterSpacingMaximum->set_sensitive(true);
|
|
m_xLetterSpacingMinimum->set_sensitive(true);
|
|
m_xLetterSpacingMinimum->set_value(rAdj.GetPropLetterSpacingMinimum(), FieldUnit::PERCENT);
|
|
m_xLetterSpacingMaximum->set_value(rAdj.GetPropLetterSpacingMaximum(), FieldUnit::PERCENT);
|
|
m_xCompoundBased->set_sensitive(true);
|
|
m_xCompoundBased->set_active(rAdj.GetCompoundBased());
|
|
// TODO add GlyphScaling (CharScaleWidth)
|
|
m_xGlyphScalingMaximum->set_sensitive(true);
|
|
m_xGlyphScalingMinimum->set_sensitive(true);
|
|
m_xGlyphScalingMinimum->set_value(rAdj.GetPropScaleWidthMinimum(), FieldUnit::PERCENT);
|
|
m_xGlyphScalingMaximum->set_value(rAdj.GetPropScaleWidthMaximum(), FieldUnit::PERCENT);
|
|
}
|
|
else
|
|
{
|
|
m_xLabelWordSpacing->set_sensitive(false);
|
|
m_xLabelMinimum->set_sensitive(false);
|
|
m_xLabelDesired->set_sensitive(false);
|
|
m_xLabelMaximum->set_sensitive(false);
|
|
m_xWordSpacing->set_sensitive(false);
|
|
m_xWordSpacingMinimum->set_sensitive(false);
|
|
m_xWordSpacingMaximum->set_sensitive(false);
|
|
m_xParagraphComposer->set_sensitive(false);
|
|
m_xLabelLetterSpacing->set_sensitive(false);
|
|
m_xLetterSpacingMinimum->set_sensitive(false);
|
|
m_xLetterSpacingMaximum->set_sensitive(false);
|
|
m_xCompoundBased->set_sensitive(false);
|
|
m_xLabelGlyphScaling->set_sensitive(false);
|
|
m_xGlyphScalingMinimum->set_sensitive(false);
|
|
m_xGlyphScalingMaximum->set_sensitive(false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_xLeft->set_active(false);
|
|
m_xStart->set_active(false);
|
|
m_xRight->set_active(false);
|
|
m_xEnd->set_active(false);
|
|
m_xCenter->set_active(false);
|
|
m_xJustify->set_active(false);
|
|
m_xLabelWordSpacing->set_sensitive(false);
|
|
m_xLabelMinimum->set_sensitive(false);
|
|
m_xLabelDesired->set_sensitive(false);
|
|
m_xLabelMaximum->set_sensitive(false);
|
|
m_xWordSpacing->set_sensitive(false);
|
|
m_xWordSpacingMinimum->set_sensitive(false);
|
|
m_xWordSpacingMaximum->set_sensitive(false);
|
|
m_xLabelLetterSpacing->set_sensitive(false);
|
|
m_xLetterSpacingMinimum->set_sensitive(false);
|
|
m_xLetterSpacingMaximum->set_sensitive(false);
|
|
m_xLabelGlyphScaling->set_sensitive(false);
|
|
m_xGlyphScalingMinimum->set_sensitive(false);
|
|
m_xGlyphScalingMaximum->set_sensitive(false);
|
|
}
|
|
m_xLastLineLB->set_active(nLBSelect);
|
|
|
|
sal_uInt16 nHtmlMode = GetHtmlMode_Impl(*rSet);
|
|
if(nHtmlMode & HTMLMODE_ON)
|
|
{
|
|
m_xLastLineLB->hide();
|
|
m_xLastLineFT->hide();
|
|
m_xExpandCB->hide();
|
|
if(!(nHtmlMode & HTMLMODE_FULL_STYLES) )
|
|
m_xJustify->set_sensitive(false);
|
|
m_xSnapToGridCB->hide();
|
|
}
|
|
_nWhich = GetWhich(SID_ATTR_PARA_SNAPTOGRID);
|
|
eItemState = rSet->GetItemState( _nWhich );
|
|
if ( eItemState >= SfxItemState::DEFAULT )
|
|
{
|
|
const SvxParaGridItem& rSnap = static_cast<const SvxParaGridItem&>(rSet->Get( _nWhich ));
|
|
m_xSnapToGridCB->set_active(rSnap.GetValue());
|
|
}
|
|
|
|
_nWhich = m_bSdrVertAlign ? SDRATTR_TEXT_VERTADJUST : GetWhich( SID_PARA_VERTALIGN );
|
|
eItemState = rSet->GetItemState( _nWhich );
|
|
|
|
if ( eItemState >= SfxItemState::DEFAULT )
|
|
{
|
|
m_xVertAlignFL->show();
|
|
|
|
if (m_bSdrVertAlign)
|
|
{
|
|
const SdrTextVertAdjustItem& rAlign = static_cast<const SdrTextVertAdjustItem&>(rSet->Get( _nWhich ));
|
|
m_xVertAlignLB->set_active(rAlign.GetValue());
|
|
}
|
|
else
|
|
{
|
|
const SvxParaVertAlignItem& rAlign = static_cast<const SvxParaVertAlignItem&>(rSet->Get( _nWhich ));
|
|
m_xVertAlignLB->set_active(static_cast<sal_Int32>(rAlign.GetValue()));
|
|
}
|
|
}
|
|
|
|
_nWhich = GetWhich( SID_ATTR_FRAMEDIRECTION );
|
|
//text direction
|
|
if( SfxItemState::DEFAULT <= rSet->GetItemState( _nWhich ) )
|
|
{
|
|
const SvxFrameDirectionItem& rFrameDirItem = static_cast<const SvxFrameDirectionItem&>( rSet->Get( _nWhich ) );
|
|
m_xTextDirectionLB->set_active_id(rFrameDirItem.GetValue());
|
|
m_xTextDirectionLB->save_value();
|
|
}
|
|
|
|
_nWhich = GetWhich(SID_ATTR_PARA_AUTOFRAMEDIRECTION);
|
|
eItemState = rSet->GetItemState(_nWhich);
|
|
if (eItemState >= SfxItemState::DEFAULT)
|
|
{
|
|
const SvxAutoFrameDirectionItem& rSnap
|
|
= static_cast<const SvxAutoFrameDirectionItem&>(rSet->Get(_nWhich));
|
|
m_xAutoTextDirectionCB->set_active(rSnap.GetValue());
|
|
}
|
|
|
|
m_xAutoTextDirectionCB->save_state();
|
|
m_xSnapToGridCB->save_state();
|
|
m_xVertAlignLB->save_value();
|
|
m_xLeft->save_state();
|
|
m_xStart->save_state();
|
|
m_xRight->save_state();
|
|
m_xEnd->save_state();
|
|
m_xCenter->save_state();
|
|
m_xJustify->save_state();
|
|
m_xLastLineLB->save_value();
|
|
m_xExpandCB->save_state();
|
|
m_xWordSpacing->save_value();
|
|
m_xWordSpacingMinimum->save_value();
|
|
m_xWordSpacingMaximum->save_value();
|
|
m_xParagraphComposer->save_state();
|
|
m_xLetterSpacingMinimum->save_value();
|
|
m_xLetterSpacingMaximum->save_value();
|
|
m_xCompoundBased->save_state();
|
|
m_xGlyphScalingMinimum->save_value();
|
|
m_xGlyphScalingMaximum->save_value();
|
|
|
|
UpdateExample_Impl();
|
|
}
|
|
|
|
void SvxParaAlignTabPage::ChangesApplied()
|
|
{
|
|
m_xTextDirectionLB->save_value();
|
|
m_xAutoTextDirectionCB->save_state();
|
|
m_xSnapToGridCB->save_state();
|
|
m_xVertAlignLB->save_value();
|
|
m_xLeft->save_state();
|
|
m_xStart->save_state();
|
|
m_xRight->save_state();
|
|
m_xEnd->save_state();
|
|
m_xCenter->save_state();
|
|
m_xJustify->save_state();
|
|
m_xLastLineLB->save_value();
|
|
m_xExpandCB->save_state();
|
|
m_xWordSpacing->save_value();
|
|
m_xWordSpacingMinimum->save_value();
|
|
m_xWordSpacingMaximum->save_value();
|
|
m_xParagraphComposer->save_state();
|
|
m_xLetterSpacingMinimum->save_value();
|
|
m_xLetterSpacingMaximum->save_value();
|
|
m_xCompoundBased->save_state();
|
|
m_xGlyphScalingMinimum->save_value();
|
|
m_xGlyphScalingMaximum->save_value();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxParaAlignTabPage, AlignHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
bool bJustify = m_xJustify->get_active();
|
|
m_xLastLineFT->set_sensitive(bJustify);
|
|
m_xLastLineLB->set_sensitive(bJustify);
|
|
m_xLabelWordSpacing->set_sensitive(bJustify);
|
|
m_xLabelMinimum->set_sensitive(bJustify);
|
|
m_xLabelDesired->set_sensitive(bJustify);
|
|
m_xLabelMaximum->set_sensitive(bJustify);
|
|
m_xWordSpacing->set_sensitive(bJustify);
|
|
m_xWordSpacingMinimum->set_sensitive(bJustify);
|
|
m_xWordSpacingMaximum->set_sensitive(bJustify);
|
|
m_xWordSpacingMaximum->set_sensitive(bJustify);
|
|
m_xParagraphComposer->set_sensitive(bJustify);
|
|
// TODO visualize CharKerning with percentage
|
|
m_xLetterSpacingMinimum->set_sensitive(bJustify);
|
|
m_xLetterSpacingMaximum->set_sensitive(bJustify);
|
|
m_xCompoundBased->set_sensitive(bJustify);
|
|
m_xLabelGlyphScaling->set_sensitive(bJustify);
|
|
// TODO visualize CharScaleWidth with percentage
|
|
m_xGlyphScalingMinimum->set_sensitive(bJustify);
|
|
m_xGlyphScalingMaximum->set_sensitive(bJustify);
|
|
|
|
bool bLastLineIsBlock = m_xLastLineLB->get_active() == 2;
|
|
m_xExpandCB->set_sensitive(bJustify && bLastLineIsBlock);
|
|
//set last line listbox to entry position 0 if not enabled
|
|
if (!m_xLastLineLB->get_sensitive())
|
|
m_xLastLineLB->set_active(0);
|
|
//uncheck 'Expand ... word' when check box is not enabled
|
|
if (!m_xExpandCB->get_sensitive())
|
|
m_xExpandCB->set_active(false);
|
|
UpdateExample_Impl();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxParaAlignTabPage, LastLineHdl_Impl, weld::ComboBox&, void)
|
|
{
|
|
//fdo#41350 only enable 'Expand last word' if last line is also justified
|
|
bool bLastLineIsBlock = m_xLastLineLB->get_active() == 2;
|
|
m_xExpandCB->set_sensitive(bLastLineIsBlock);
|
|
//uncheck 'Expand ... word' when check box is not enabled
|
|
if (!m_xExpandCB->get_sensitive())
|
|
m_xExpandCB->set_active(false);
|
|
UpdateExample_Impl();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxParaAlignTabPage, TextDirectionHdl_Impl, weld::ComboBox&, void)
|
|
{
|
|
UpdateExample_Impl();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxParaAlignTabPage, WordSpacingHdl_Impl, weld::MetricSpinButton&, void)
|
|
{
|
|
auto nDesired = m_xWordSpacing->get_value(FieldUnit::PERCENT);
|
|
if (nDesired < m_xWordSpacingMinimum->get_value(FieldUnit::PERCENT))
|
|
m_xWordSpacingMinimum->set_value(nDesired, FieldUnit::PERCENT);
|
|
if (nDesired > m_xWordSpacingMaximum->get_value(FieldUnit::PERCENT))
|
|
m_xWordSpacingMaximum->set_value(nDesired, FieldUnit::PERCENT);
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxParaAlignTabPage, WordSpacingMinimumHdl_Impl, weld::MetricSpinButton&, void)
|
|
{
|
|
auto nMinimum = m_xWordSpacingMinimum->get_value(FieldUnit::PERCENT);
|
|
if (nMinimum > m_xWordSpacing->get_value(FieldUnit::PERCENT))
|
|
m_xWordSpacing->set_value(nMinimum, FieldUnit::PERCENT);
|
|
if (nMinimum > m_xWordSpacingMaximum->get_value(FieldUnit::PERCENT))
|
|
m_xWordSpacingMaximum->set_value(nMinimum, FieldUnit::PERCENT);
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxParaAlignTabPage, WordSpacingMaximumHdl_Impl, weld::MetricSpinButton&, void)
|
|
{
|
|
auto nMaximum = m_xWordSpacingMaximum->get_value(FieldUnit::PERCENT);
|
|
if (nMaximum < m_xWordSpacingMinimum->get_value(FieldUnit::PERCENT))
|
|
m_xWordSpacingMinimum->set_value(nMaximum, FieldUnit::PERCENT);
|
|
if (nMaximum < m_xWordSpacing->get_value(FieldUnit::PERCENT))
|
|
m_xWordSpacing->set_value(nMaximum, FieldUnit::PERCENT);
|
|
}
|
|
|
|
void SvxParaAlignTabPage::UpdateExample_Impl()
|
|
{
|
|
bool bParaIsRtl = [&]
|
|
{
|
|
SvxFrameDirection eDir = m_xTextDirectionLB->get_active_id();
|
|
switch (eDir)
|
|
{
|
|
case SvxFrameDirection::Environment:
|
|
return AllSettings::GetLayoutRTL();
|
|
|
|
case SvxFrameDirection::Horizontal_RL_TB:
|
|
return true;
|
|
|
|
default:
|
|
case SvxFrameDirection::Horizontal_LR_TB:
|
|
return false;
|
|
}
|
|
}();
|
|
|
|
if (m_xLeft->get_active())
|
|
{
|
|
m_aExampleWin.EnableRTL(false);
|
|
m_aExampleWin.SetAdjust(SvxAdjust::Left);
|
|
m_aExampleWin.SetLastLine(SvxAdjust::Left);
|
|
}
|
|
else if (m_xStart->get_active())
|
|
{
|
|
m_aExampleWin.EnableRTL(bParaIsRtl);
|
|
m_aExampleWin.SetAdjust(SvxAdjust::Left);
|
|
m_aExampleWin.SetLastLine(SvxAdjust::Left);
|
|
}
|
|
else if (m_xRight->get_active())
|
|
{
|
|
m_aExampleWin.EnableRTL(true);
|
|
m_aExampleWin.SetAdjust(SvxAdjust::Left);
|
|
m_aExampleWin.SetLastLine(SvxAdjust::Left);
|
|
}
|
|
else if (m_xEnd->get_active())
|
|
{
|
|
m_aExampleWin.EnableRTL(!bParaIsRtl);
|
|
m_aExampleWin.SetAdjust(SvxAdjust::Left);
|
|
m_aExampleWin.SetLastLine(SvxAdjust::Left);
|
|
}
|
|
else if (m_xCenter->get_active())
|
|
{
|
|
m_aExampleWin.EnableRTL(bParaIsRtl);
|
|
m_aExampleWin.SetAdjust(SvxAdjust::Center);
|
|
}
|
|
else if (m_xJustify->get_active())
|
|
{
|
|
m_aExampleWin.EnableRTL(bParaIsRtl);
|
|
m_aExampleWin.SetAdjust(SvxAdjust::Block);
|
|
|
|
int nLBPos = m_xLastLineLB->get_active();
|
|
if (nLBPos == 0)
|
|
m_aExampleWin.SetLastLine(SvxAdjust::Left);
|
|
else if (nLBPos == 1)
|
|
m_aExampleWin.SetLastLine(SvxAdjust::Center);
|
|
else if (nLBPos == 2)
|
|
m_aExampleWin.SetLastLine(SvxAdjust::Block);
|
|
}
|
|
|
|
m_aExampleWin.Invalidate();
|
|
}
|
|
|
|
void SvxParaAlignTabPage::EnableJustifyExt()
|
|
{
|
|
m_xLastLineFT->show();
|
|
m_xLastLineLB->show();
|
|
m_xExpandCB->show();
|
|
if (SvtCJKOptions::IsAsianTypographyEnabled())
|
|
m_xSnapToGridCB->show();
|
|
|
|
}
|
|
|
|
void SvxParaAlignTabPage::EnableSdrVertAlign()
|
|
{
|
|
m_bSdrVertAlign = true;
|
|
|
|
m_xVertAlignLB->remove_id(u"0"_ustr);
|
|
m_xVertAlignLB->remove_id(u"1"_ustr);
|
|
m_xVertAlign->set_label(m_xVertAlignSdr->get_label());
|
|
}
|
|
|
|
void SvxParaAlignTabPage::PageCreated (const SfxAllItemSet& aSet)
|
|
{
|
|
const SfxBoolItem* pBoolItem = aSet.GetItem<SfxBoolItem>(SID_SVXPARAALIGNTABPAGE_ENABLEJUSTIFYEXT, false);
|
|
if (pBoolItem && pBoolItem->GetValue())
|
|
EnableJustifyExt();
|
|
}
|
|
|
|
std::unique_ptr<SfxTabPage> SvxExtParagraphTabPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rSet)
|
|
{
|
|
return std::make_unique<SvxExtParagraphTabPage>(pPage, pController, *rSet);
|
|
}
|
|
|
|
bool SvxExtParagraphTabPage::FillItemSet( SfxItemSet* rOutSet )
|
|
{
|
|
bool bModified = false;
|
|
sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_HYPHENZONE );
|
|
const TriState eHyphenState = m_xHyphenBox->get_state();
|
|
const SfxPoolItem* pOld = GetOldItem( *rOutSet, SID_ATTR_PARA_HYPHENZONE );
|
|
|
|
if ( m_xHyphenBox->get_state_changed_from_saved() ||
|
|
m_xHyphenNoCapsBox->get_state_changed_from_saved() ||
|
|
m_xHyphenNoLastWordBox->get_state_changed_from_saved() ||
|
|
m_xAcrossMoveLineBox->get_state_changed_from_saved() ||
|
|
m_xExtHyphenBeforeBox->get_value_changed_from_saved() ||
|
|
m_xExtHyphenAfterBox->get_value_changed_from_saved() ||
|
|
m_xExtCompoundHyphenBeforeBox->get_value_changed_from_saved() ||
|
|
m_xExtCompoundHyphenAfterBox->get_value_changed_from_saved() ||
|
|
m_xMaxHyphenEdit->get_value_changed_from_saved() ||
|
|
m_xMinWordLength->get_value_changed_from_saved() ||
|
|
m_xSliderHyphen->get_value() != nHyphenLevel ||
|
|
m_aHyphenZone.get_value_changed_from_saved() ||
|
|
m_aParagraphEndZone.get_value_changed_from_saved() ||
|
|
m_aColumnEndZone.get_value_changed_from_saved() ||
|
|
m_aPageEndZone.get_value_changed_from_saved() ||
|
|
m_aSpreadEndZone.get_value_changed_from_saved() ||
|
|
m_xAcrossParagraphBox->get_state_changed_from_saved() ||
|
|
m_xAcrossColumnBox->get_state_changed_from_saved() ||
|
|
m_xAcrossPageBox->get_state_changed_from_saved() ||
|
|
m_xAcrossSpreadBox->get_state_changed_from_saved() )
|
|
{
|
|
SvxHyphenZoneItem aHyphen(
|
|
static_cast<const SvxHyphenZoneItem&>(GetItemSet().Get( _nWhich )) );
|
|
aHyphen.SetHyphen( eHyphenState == TRISTATE_TRUE );
|
|
aHyphen.SetNoCapsHyphenation(m_xHyphenNoCapsBox->get_state() != TRISTATE_TRUE);
|
|
aHyphen.SetNoLastWordHyphenation(m_xHyphenNoLastWordBox->get_state() != TRISTATE_TRUE);
|
|
aHyphen.SetKeepLine(m_xAcrossMoveLineBox->get_state() != TRISTATE_TRUE);
|
|
|
|
if ( eHyphenState == TRISTATE_TRUE )
|
|
{
|
|
aHyphen.GetMinLead() = static_cast<sal_uInt8>(m_xExtHyphenBeforeBox->get_value());
|
|
aHyphen.GetMinTrail() = static_cast<sal_uInt8>(m_xExtHyphenAfterBox->get_value());
|
|
aHyphen.GetCompoundMinLead() = static_cast<sal_uInt8>(m_xExtCompoundHyphenBeforeBox->get_value());
|
|
aHyphen.GetCompoundMinTrail() = static_cast<sal_uInt8>(m_xExtCompoundHyphenAfterBox->get_value());
|
|
aHyphen.GetMinWordLength() = static_cast<sal_uInt8>(m_xMinWordLength->get_value());
|
|
}
|
|
aHyphen.GetMaxHyphens() = static_cast<sal_uInt8>(m_xMaxHyphenEdit->get_value());
|
|
aHyphen.GetLevel() = 100 - static_cast<sal_uInt8>(m_xSliderHyphen->get_value());
|
|
|
|
SfxItemPool* pPool = GetItemSet().GetPool();
|
|
DBG_ASSERT( pPool, "Where is the pool?" );
|
|
MapUnit eUnit = pPool->GetMetric( _nWhich );
|
|
aHyphen.GetTextHyphenZone() = static_cast<sal_uInt16>(m_aHyphenZone.GetCoreValue(eUnit));
|
|
aHyphen.GetTextHyphenZoneAlways() = static_cast<sal_uInt16>(m_aParagraphEndZone.GetCoreValue(eUnit));
|
|
aHyphen.GetTextHyphenZoneColumn() = static_cast<sal_uInt16>(m_aColumnEndZone.GetCoreValue(eUnit));
|
|
aHyphen.GetTextHyphenZonePage() = static_cast<sal_uInt16>(m_aPageEndZone.GetCoreValue(eUnit));
|
|
aHyphen.GetTextHyphenZoneSpread() = static_cast<sal_uInt16>(m_aSpreadEndZone.GetCoreValue(eUnit));
|
|
aHyphen.SetHyphen( eHyphenState == TRISTATE_TRUE );
|
|
aHyphen.SetNoLastWordHyphenation(m_xHyphenNoLastWordBox->get_state() != TRISTATE_TRUE);
|
|
const TriState eAcrossParagraphState = m_xAcrossParagraphBox->get_state();
|
|
const TriState eAcrossColumnState = m_xAcrossColumnBox->get_state();
|
|
const TriState eAcrossPageState = m_xAcrossPageBox->get_state();
|
|
const TriState eAcrossSpreadState = m_xAcrossSpreadBox->get_state();
|
|
aHyphen.SetKeep( eAcrossSpreadState != TRISTATE_TRUE );
|
|
if ( eAcrossSpreadState == TRISTATE_TRUE )
|
|
{
|
|
// hyphenate across column, page and spread -> ParaHyphenationKeep = false and
|
|
// set default value 3 (COLUMN)
|
|
aHyphen.GetKeepType() =
|
|
static_cast<sal_uInt8>(css::text::ParagraphHyphenationKeepType::COLUMN);
|
|
}
|
|
else if ( eAcrossPageState == TRISTATE_TRUE )
|
|
{
|
|
// hyphenate across column and page, but not spread -> 1 (SPREAD)
|
|
aHyphen.GetKeepType() =
|
|
static_cast<sal_uInt8>(css::text::ParagraphHyphenationKeepType::SPREAD);
|
|
}
|
|
else if ( eAcrossColumnState == TRISTATE_TRUE )
|
|
{
|
|
// hyphenate across column, but not page and spread -> 2 (PAGE)
|
|
aHyphen.GetKeepType() =
|
|
static_cast<sal_uInt8>(css::text::ParagraphHyphenationKeepType::PAGE);
|
|
}
|
|
else if ( eAcrossParagraphState == TRISTATE_TRUE )
|
|
{
|
|
// hyphenate across last full paragraph line, but not page and spread -> 2 (PAGE)
|
|
aHyphen.GetKeepType() =
|
|
static_cast<sal_uInt8>(css::text::ParagraphHyphenationKeepType::COLUMN);
|
|
}
|
|
else
|
|
{
|
|
// don't hyphenate across last full paragraph line,
|
|
// also column, page and spread -> 4 (COLUMN)
|
|
aHyphen.GetKeepType() =
|
|
static_cast<sal_uInt8>(css::text::ParagraphHyphenationKeepType::ALWAYS);
|
|
}
|
|
|
|
if ( !pOld ||
|
|
*static_cast<const SvxHyphenZoneItem*>(pOld) != aHyphen ||
|
|
m_xHyphenBox->get_state_changed_from_saved())
|
|
{
|
|
rOutSet->Put( aHyphen );
|
|
bModified = true;
|
|
}
|
|
}
|
|
|
|
if (m_xPageNumBox->get_sensitive()
|
|
&& (m_xPageNumBox->get_state_changed_from_saved() || m_xPagenumEdit->get_value_changed_from_saved()))
|
|
{
|
|
pOld = GetOldItem( *rOutSet, SID_ATTR_PARA_PAGENUM );
|
|
|
|
if (TRISTATE_TRUE == m_xPageNumBox->get_state()
|
|
&& (!pOld || IsInvalidItem(pOld)
|
|
|| static_cast<const SfxUInt16Item*>(pOld)->GetValue() != m_xPagenumEdit->get_value()))
|
|
{
|
|
SfxUInt16Item aPageNum(SID_ATTR_PARA_PAGENUM,
|
|
static_cast<sal_uInt16>(m_xPagenumEdit->get_value()));
|
|
rOutSet->Put( aPageNum );
|
|
bModified = true;
|
|
}
|
|
else if (TRISTATE_FALSE == m_xPageNumBox->get_state()
|
|
&& (pOld || IsInvalidItem(pOld)))
|
|
{
|
|
// need to tell sw to remove the item
|
|
rOutSet->DisableItem(SID_ATTR_PARA_PAGENUM);
|
|
bModified = true;
|
|
}
|
|
}
|
|
|
|
// pagebreak
|
|
|
|
TriState eState = m_xApplyCollBtn->get_state();
|
|
bool bIsPageModel = false;
|
|
|
|
OUString sPage;
|
|
if ( m_xApplyCollBtn->get_state_changed_from_saved() ||
|
|
( TRISTATE_TRUE == eState &&
|
|
m_xApplyCollBox->get_value_changed_from_saved() ) )
|
|
{
|
|
if ( eState == TRISTATE_TRUE )
|
|
{
|
|
sPage = m_xApplyCollBox->get_active_text();
|
|
bIsPageModel = !sPage.isEmpty();
|
|
}
|
|
pOld = GetOldItem( *rOutSet, SID_ATTR_PARA_MODEL );
|
|
|
|
if ( !pOld || static_cast<const SvxPageModelItem*>(pOld)->GetValue() != sPage )
|
|
{
|
|
rOutSet->Put( SvxPageModelItem( sPage, false, SID_ATTR_PARA_MODEL ) );
|
|
bModified = true;
|
|
}
|
|
else
|
|
bIsPageModel = false;
|
|
}
|
|
else if(TRISTATE_TRUE == eState && m_xApplyCollBtn->get_sensitive())
|
|
bIsPageModel = true;
|
|
else if (m_xPageBreakBox->get_state() != TRISTATE_INDET)
|
|
rOutSet->Put( SvxPageModelItem( sPage, false, SID_ATTR_PARA_MODEL ) );
|
|
|
|
_nWhich = GetWhich( SID_ATTR_PARA_PAGEBREAK );
|
|
|
|
if ( bIsPageModel )
|
|
// if PageModel is turned on, always turn off PageBreak
|
|
rOutSet->Put( SvxFormatBreakItem( SvxBreak::NONE, _nWhich ) );
|
|
else
|
|
{
|
|
eState = m_xPageBreakBox->get_state();
|
|
SfxItemState eModelState = GetItemSet().GetItemState(SID_ATTR_PARA_MODEL, false);
|
|
|
|
if ( (eModelState == SfxItemState::SET && TRISTATE_TRUE == m_xPageBreakBox->get_state()) ||
|
|
m_xPageBreakBox->get_state_changed_from_saved() ||
|
|
m_xBreakTypeLB->get_value_changed_from_saved() ||
|
|
m_xBreakPositionLB->get_value_changed_from_saved() )
|
|
{
|
|
const SvxFormatBreakItem rOldBreak(
|
|
static_cast<const SvxFormatBreakItem&>(GetItemSet().Get( _nWhich )));
|
|
SvxFormatBreakItem aBreak(rOldBreak.GetBreak(), rOldBreak.Which());
|
|
|
|
switch ( eState )
|
|
{
|
|
case TRISTATE_TRUE:
|
|
{
|
|
bool bBefore = m_xBreakPositionLB->get_active() == 0;
|
|
|
|
if (m_xBreakTypeLB->get_active() == 0)
|
|
{
|
|
if ( bBefore )
|
|
aBreak.SetValue( SvxBreak::PageBefore );
|
|
else
|
|
aBreak.SetValue( SvxBreak::PageAfter );
|
|
}
|
|
else
|
|
{
|
|
if ( bBefore )
|
|
aBreak.SetValue( SvxBreak::ColumnBefore );
|
|
else
|
|
aBreak.SetValue( SvxBreak::ColumnAfter );
|
|
}
|
|
break;
|
|
}
|
|
|
|
case TRISTATE_FALSE:
|
|
aBreak.SetValue( SvxBreak::NONE );
|
|
break;
|
|
default: ; //prevent warning
|
|
}
|
|
pOld = GetOldItem( *rOutSet, SID_ATTR_PARA_PAGEBREAK );
|
|
|
|
if ( eState != m_xPageBreakBox->get_saved_state() ||
|
|
!pOld || !( *static_cast<const SvxFormatBreakItem*>(pOld) == aBreak ) )
|
|
{
|
|
bModified = true;
|
|
rOutSet->Put( aBreak );
|
|
}
|
|
}
|
|
}
|
|
|
|
// paragraph split
|
|
_nWhich = GetWhich( SID_ATTR_PARA_SPLIT );
|
|
eState = m_xAllowSplitBox->get_state();
|
|
|
|
if (m_xAllowSplitBox->get_state_changed_from_saved())
|
|
{
|
|
rOutSet->Put( SvxFormatSplitItem( eState == TRISTATE_TRUE, _nWhich ) );
|
|
bModified = true;
|
|
}
|
|
|
|
// keep paragraphs
|
|
_nWhich = GetWhich( SID_ATTR_PARA_KEEP );
|
|
eState = m_xKeepParaBox->get_state();
|
|
|
|
if (m_xKeepParaBox->get_state_changed_from_saved())
|
|
{
|
|
// if the status has changed, putting is necessary
|
|
rOutSet->Put( SvxFormatKeepItem( eState == TRISTATE_TRUE, _nWhich ) );
|
|
bModified = true;
|
|
}
|
|
|
|
// widows and orphans
|
|
TypedWhichId<SvxWidowsItem> nWidowsWhich = GetWhich( SID_ATTR_PARA_WIDOWS );
|
|
eState = m_xWidowBox->get_state();
|
|
|
|
if ( m_xWidowBox->get_state_changed_from_saved() ||
|
|
m_xWidowRowNo->get_value_changed_from_saved() )
|
|
{
|
|
SvxWidowsItem rItem( eState == TRISTATE_TRUE ?
|
|
static_cast<sal_uInt8>(m_xWidowRowNo->get_value()) : 0, nWidowsWhich );
|
|
pOld = GetOldItem( *rOutSet, SID_ATTR_PARA_WIDOWS );
|
|
|
|
if ( m_xWidowBox->get_state_changed_from_saved() || !pOld || !( *static_cast<const SvxWidowsItem*>(pOld) == rItem ) )
|
|
{
|
|
rOutSet->Put( rItem );
|
|
bModified = true;
|
|
}
|
|
}
|
|
|
|
TypedWhichId<SvxOrphansItem> nOrphansWhich = GetWhich( SID_ATTR_PARA_ORPHANS );
|
|
eState = m_xOrphanBox->get_state();
|
|
|
|
if ( m_xOrphanBox->get_state_changed_from_saved() ||
|
|
m_xOrphanRowNo->get_value_changed_from_saved() )
|
|
{
|
|
SvxOrphansItem rItem( eState == TRISTATE_TRUE ?
|
|
static_cast<sal_uInt8>(m_xOrphanRowNo->get_value()) : 0, nOrphansWhich );
|
|
pOld = GetOldItem( *rOutSet, SID_ATTR_PARA_ORPHANS );
|
|
|
|
if ( m_xOrphanBox->get_state_changed_from_saved() ||
|
|
!pOld ||
|
|
!( *static_cast<const SvxOrphansItem*>(pOld) == rItem ) )
|
|
{
|
|
rOutSet->Put( rItem );
|
|
bModified = true;
|
|
}
|
|
}
|
|
|
|
return bModified;
|
|
}
|
|
void SvxExtParagraphTabPage::Reset( const SfxItemSet* rSet )
|
|
{
|
|
SfxItemPool* pPool = rSet->GetPool();
|
|
DBG_ASSERT( pPool, "Where is the pool?" );
|
|
|
|
// adjust metric
|
|
FieldUnit eFUnit = GetModuleFieldUnit( *rSet );
|
|
if (UseCharUnitInUI(*rSet))
|
|
eFUnit = FieldUnit::CHAR;
|
|
|
|
sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_HYPHENZONE );
|
|
SfxItemState eItemState = rSet->GetItemState( _nWhich );
|
|
|
|
bool bItemAvailable = eItemState >= SfxItemState::DEFAULT;
|
|
bool bIsHyphen = false;
|
|
if( !bHtmlMode && bItemAvailable )
|
|
{
|
|
const SvxHyphenZoneItem& rHyphen =
|
|
static_cast<const SvxHyphenZoneItem&>(rSet->Get( _nWhich ));
|
|
aHyphenState.bTriStateEnabled = false;
|
|
|
|
bIsHyphen = rHyphen.IsHyphen();
|
|
m_xHyphenBox->set_state(bIsHyphen ? TRISTATE_TRUE : TRISTATE_FALSE);
|
|
m_xHyphenNoCapsBox->set_state(rHyphen.IsNoCapsHyphenation() ? TRISTATE_FALSE : TRISTATE_TRUE);
|
|
m_xHyphenNoLastWordBox->set_state(rHyphen.IsNoLastWordHyphenation() ? TRISTATE_FALSE : TRISTATE_TRUE);
|
|
m_xExtHyphenBeforeBox->set_value(rHyphen.GetMinLead());
|
|
m_xExtHyphenAfterBox->set_value(rHyphen.GetMinTrail());
|
|
m_xExtCompoundHyphenBeforeBox->set_value(rHyphen.GetCompoundMinLead());
|
|
m_xExtCompoundHyphenAfterBox->set_value(rHyphen.GetCompoundMinTrail());
|
|
m_xMaxHyphenEdit->set_value(rHyphen.GetMaxHyphens());
|
|
m_xMinWordLength->set_value(rHyphen.GetMinWordLength());
|
|
m_xSliderHyphen->set_value(100 - rHyphen.GetLevel());
|
|
nHyphenLevel = 100 - rHyphen.GetLevel();
|
|
m_aHyphenZone.SetFieldUnit(eFUnit);
|
|
m_aHyphenZone.SetMetricValue(rHyphen.GetTextHyphenZone(), MapUnit::MapTwip);
|
|
m_aParagraphEndZone.SetFieldUnit(eFUnit);
|
|
m_aParagraphEndZone.SetMetricValue(rHyphen.GetTextHyphenZoneAlways(), MapUnit::MapTwip);
|
|
// 0 means inheritance, mark this with empty box
|
|
if ( !rHyphen.GetTextHyphenZoneAlways() )
|
|
m_aParagraphEndZone.set_text(OUString());
|
|
m_aColumnEndZone.SetFieldUnit(eFUnit);
|
|
m_aColumnEndZone.SetMetricValue(rHyphen.GetTextHyphenZoneColumn(), MapUnit::MapTwip);
|
|
// 0 means inheritance, mark this with empty box
|
|
if ( !rHyphen.GetTextHyphenZoneColumn() )
|
|
m_aColumnEndZone.set_text(OUString());
|
|
m_aPageEndZone.SetFieldUnit(eFUnit);
|
|
m_aPageEndZone.SetMetricValue(rHyphen.GetTextHyphenZonePage(), MapUnit::MapTwip);
|
|
// 0 means inheritance, mark this with empty box
|
|
if ( !rHyphen.GetTextHyphenZonePage() )
|
|
m_aPageEndZone.set_text(OUString());
|
|
m_aSpreadEndZone.SetFieldUnit(eFUnit);
|
|
m_aSpreadEndZone.SetMetricValue(rHyphen.GetTextHyphenZoneSpread(), MapUnit::MapTwip);
|
|
// 0 means inheritance, mark this with empty box
|
|
if ( !rHyphen.GetTextHyphenZoneSpread() )
|
|
m_aSpreadEndZone.set_text(OUString());
|
|
m_xAcrossParagraphBox->set_state(!rHyphen.IsKeep() || rHyphen.GetKeepType() < 4 ? TRISTATE_TRUE : TRISTATE_FALSE);
|
|
m_xAcrossColumnBox->set_state(!rHyphen.IsKeep() || rHyphen.GetKeepType() < 3 ? TRISTATE_TRUE : TRISTATE_FALSE);
|
|
m_xAcrossPageBox->set_state(!rHyphen.IsKeep() || rHyphen.GetKeepType() < 2 ? TRISTATE_TRUE : TRISTATE_FALSE);
|
|
m_xAcrossSpreadBox->set_state(!rHyphen.IsKeep() || rHyphen.GetKeepType() == 0 ? TRISTATE_TRUE : TRISTATE_FALSE);
|
|
// always disable MoveLine, if hyphenation is forbidden across spreads
|
|
m_xAcrossMoveLineBox->set_state( m_xAcrossSpreadBox->get_state() == TRISTATE_TRUE || rHyphen.IsKeepLine() ? TRISTATE_FALSE : TRISTATE_TRUE);
|
|
aAcrossParagraphState.bTriStateEnabled = false;
|
|
aAcrossColumnState.bTriStateEnabled = false;
|
|
aAcrossPageState.bTriStateEnabled = false;
|
|
aAcrossSpreadState.bTriStateEnabled = false;
|
|
}
|
|
else
|
|
{
|
|
m_xHyphenBox->set_state(TRISTATE_INDET);
|
|
m_xHyphenNoCapsBox->set_state(TRISTATE_INDET);
|
|
m_xHyphenNoLastWordBox->set_state(TRISTATE_INDET);
|
|
m_xAcrossMoveLineBox->set_state(TRISTATE_INDET);
|
|
}
|
|
bool bEnable = bItemAvailable && bIsHyphen;
|
|
m_xHyphenNoCapsBox->set_sensitive(bEnable);
|
|
m_xHyphenNoLastWordBox->set_sensitive(bEnable);
|
|
m_xExtHyphenBeforeBox->set_sensitive(bEnable);
|
|
m_xExtHyphenAfterBox->set_sensitive(bEnable);
|
|
m_xExtCompoundHyphenBeforeBox->set_sensitive(bEnable);
|
|
m_xExtCompoundHyphenAfterBox->set_sensitive(bEnable);
|
|
m_xBeforeText->set_sensitive(bEnable);
|
|
m_xAfterText->set_sensitive(bEnable);
|
|
m_xCompoundBeforeText->set_sensitive(bEnable);
|
|
m_xCompoundAfterText->set_sensitive(bEnable);
|
|
m_xMaxHyphenLabel->set_sensitive(bEnable);
|
|
m_xMaxHyphenEdit->set_sensitive(bEnable);
|
|
m_xMinWordLabel->set_sensitive(bEnable);
|
|
m_xMinWordLength->set_sensitive(bEnable);
|
|
m_xBetterSpacingLabel->set_sensitive(bEnable);
|
|
m_xLessHyphenLabel->set_sensitive(bEnable);
|
|
m_xSliderHyphen->set_sensitive(bEnable);
|
|
m_xHyphenZoneLabel->set_sensitive(bEnable);
|
|
m_aHyphenZone.set_sensitive(bEnable);
|
|
m_xParagraphEndZoneLabel->set_sensitive(bEnable);
|
|
m_aParagraphEndZone.set_sensitive(bEnable);
|
|
m_xColumnEndZoneLabel->set_sensitive(bEnable);
|
|
m_aColumnEndZone.set_sensitive(bEnable);
|
|
m_xPageEndZoneLabel->set_sensitive(bEnable);
|
|
m_aPageEndZone.set_sensitive(bEnable);
|
|
m_xSpreadEndZoneLabel->set_sensitive(bEnable);
|
|
m_aSpreadEndZone.set_sensitive(bEnable);
|
|
m_xAcrossText->set_sensitive(bEnable);
|
|
m_xAcrossParagraphBox->set_sensitive(bEnable);
|
|
m_xAcrossColumnBox->set_sensitive(bEnable);
|
|
m_xAcrossPageBox->set_sensitive(bEnable);
|
|
m_xAcrossSpreadBox->set_sensitive(bEnable);
|
|
// gray out end zones, if hyphenation across is disabled
|
|
bool bAcross = bEnable && m_xAcrossParagraphBox->get_state() == TRISTATE_TRUE;
|
|
m_xParagraphEndZoneLabel->set_sensitive(bAcross);
|
|
m_aParagraphEndZone.set_sensitive(bAcross);
|
|
bAcross = bEnable && m_xAcrossColumnBox->get_state() == TRISTATE_TRUE;
|
|
m_xColumnEndZoneLabel->set_sensitive(bAcross);
|
|
m_aColumnEndZone.set_sensitive(bAcross);
|
|
bAcross = bEnable && m_xAcrossPageBox->get_state() == TRISTATE_TRUE;
|
|
m_xPageEndZoneLabel->set_sensitive(bAcross);
|
|
m_aPageEndZone.set_sensitive(bAcross);
|
|
bAcross = bEnable && m_xAcrossSpreadBox->get_state() == TRISTATE_TRUE;
|
|
m_xSpreadEndZoneLabel->set_sensitive(bAcross);
|
|
m_aSpreadEndZone.set_sensitive(bAcross);
|
|
// always gray out MoveLine, if hyphenation is forbidden across spreads
|
|
bool bAcrossSpread = m_xAcrossSpreadBox->get_state() == TRISTATE_TRUE;
|
|
m_xAcrossMoveLineBox->set_sensitive( bEnable && !bAcrossSpread );
|
|
|
|
switch (rSet->GetItemState(SID_ATTR_PARA_PAGENUM))
|
|
{
|
|
case SfxItemState::SET:
|
|
{
|
|
aPageNumState.bTriStateEnabled = false;
|
|
m_xPageNumBox->set_state(TRISTATE_TRUE);
|
|
SfxUInt16Item const*const pItem(rSet->GetItem<SfxUInt16Item>(SID_ATTR_PARA_PAGENUM));
|
|
assert(pItem && "has to exist due to GetItemState");
|
|
const sal_uInt16 nPageNum(pItem->GetValue());
|
|
m_xPagenumEdit->set_value(nPageNum);
|
|
break;
|
|
}
|
|
case SfxItemState::INVALID:
|
|
{
|
|
aPageNumState.bTriStateEnabled = true;
|
|
m_xPageNumBox->set_state(TRISTATE_INDET);
|
|
break;
|
|
}
|
|
case SfxItemState::UNKNOWN:
|
|
case SfxItemState::DEFAULT:
|
|
case SfxItemState::DISABLED:
|
|
{
|
|
aPageNumState.bTriStateEnabled = false;
|
|
m_xPageNumBox->set_state(TRISTATE_FALSE);
|
|
break;
|
|
}
|
|
default:
|
|
assert(false); // unexpected
|
|
break;
|
|
}
|
|
|
|
if ( bPageBreak )
|
|
{
|
|
// first handle PageModel
|
|
bool bIsPageModel = false;
|
|
eItemState = rSet->GetItemState( SID_ATTR_PARA_MODEL );
|
|
|
|
if ( eItemState >= SfxItemState::SET )
|
|
{
|
|
aApplyCollState.bTriStateEnabled = false;
|
|
|
|
const SvxPageModelItem& rModel = rSet->Get( SID_ATTR_PARA_MODEL );
|
|
const OUString& aStr( rModel.GetValue() );
|
|
|
|
if (!aStr.isEmpty() && m_xApplyCollBox->find_text(aStr) != -1)
|
|
{
|
|
m_xApplyCollBox->set_active_text(aStr);
|
|
m_xApplyCollBtn->set_state(TRISTATE_TRUE);
|
|
bIsPageModel = true;
|
|
|
|
m_xPageBreakBox->set_sensitive(true);
|
|
aPageBreakState.bTriStateEnabled = false;
|
|
m_xBreakTypeFT->set_sensitive(true);
|
|
m_xBreakTypeLB->set_sensitive(true);
|
|
m_xBreakPositionFT->set_sensitive(true);
|
|
m_xBreakPositionLB->set_sensitive(true);
|
|
m_xApplyCollBtn->set_sensitive(false);
|
|
m_xPageBreakBox->set_state(TRISTATE_TRUE);
|
|
|
|
//select page break
|
|
m_xBreakTypeLB->set_active(0);
|
|
//select break before
|
|
m_xBreakPositionLB->set_active(0);
|
|
}
|
|
else
|
|
{
|
|
m_xApplyCollBox->set_active(-1);
|
|
m_xApplyCollBtn->set_state(TRISTATE_FALSE);
|
|
}
|
|
}
|
|
else if ( SfxItemState::INVALID == eItemState )
|
|
{
|
|
aApplyCollState.bTriStateEnabled = true;
|
|
m_xApplyCollBtn->set_state(TRISTATE_INDET);
|
|
m_xApplyCollBox->set_active(-1);
|
|
}
|
|
else
|
|
{
|
|
m_xApplyCollBtn->set_sensitive(false);
|
|
m_xApplyCollBox->set_sensitive(false);
|
|
m_xPagenumEdit->set_sensitive(false);
|
|
m_xPageNumBox->set_sensitive(false);
|
|
}
|
|
|
|
if ( !bIsPageModel )
|
|
{
|
|
_nWhich = GetWhich( SID_ATTR_PARA_PAGEBREAK );
|
|
eItemState = rSet->GetItemState( _nWhich );
|
|
|
|
if ( eItemState >= SfxItemState::DEFAULT )
|
|
{
|
|
const SvxFormatBreakItem& rPageBreak =
|
|
static_cast<const SvxFormatBreakItem&>(rSet->Get( _nWhich ));
|
|
|
|
SvxBreak eBreak = rPageBreak.GetBreak();
|
|
|
|
// PageBreak not via CTRL-RETURN,
|
|
// then CheckBox can be freed
|
|
m_xPageBreakBox->set_sensitive(true);
|
|
aPageBreakState.bTriStateEnabled = false;
|
|
m_xBreakTypeFT->set_sensitive(true);
|
|
m_xBreakTypeLB->set_sensitive(true);
|
|
m_xBreakPositionFT->set_sensitive(true);
|
|
m_xBreakPositionLB->set_sensitive(true);
|
|
|
|
m_xPageBreakBox->set_state(TRISTATE_TRUE);
|
|
|
|
bool _bEnable = eBreak != SvxBreak::NONE &&
|
|
eBreak != SvxBreak::ColumnBefore &&
|
|
eBreak != SvxBreak::ColumnAfter;
|
|
m_xApplyCollBtn->set_sensitive(_bEnable);
|
|
if (!_bEnable)
|
|
{
|
|
m_xApplyCollBox->set_sensitive(_bEnable);
|
|
m_xPageNumBox->set_sensitive(false);
|
|
m_xPagenumEdit->set_sensitive(_bEnable);
|
|
}
|
|
|
|
if ( eBreak == SvxBreak::NONE )
|
|
m_xPageBreakBox->set_state(TRISTATE_FALSE);
|
|
|
|
sal_Int32 nType = 0; // selection position in break type ListBox : Page
|
|
sal_Int32 nPosition = 0; // selection position in break position ListBox : Before
|
|
switch ( eBreak )
|
|
{
|
|
case SvxBreak::PageBefore:
|
|
break;
|
|
case SvxBreak::PageAfter:
|
|
nPosition = 1;
|
|
break;
|
|
case SvxBreak::ColumnBefore:
|
|
nType = 1;
|
|
break;
|
|
case SvxBreak::ColumnAfter:
|
|
nType = 1;
|
|
nPosition = 1;
|
|
break;
|
|
default: ;//prevent warning
|
|
}
|
|
m_xBreakTypeLB->set_active(nType);
|
|
m_xBreakPositionLB->set_active(nPosition);
|
|
}
|
|
else if ( SfxItemState::INVALID == eItemState )
|
|
m_xPageBreakBox->set_state(TRISTATE_INDET);
|
|
else
|
|
{
|
|
m_xPageBreakBox->set_sensitive(false);
|
|
m_xBreakTypeFT->set_sensitive(false);
|
|
m_xBreakTypeLB->set_sensitive(false);
|
|
m_xBreakPositionFT->set_sensitive(false);
|
|
m_xBreakPositionLB->set_sensitive(false);
|
|
}
|
|
}
|
|
|
|
PageBreakPosHdl_Impl(*m_xBreakPositionLB);
|
|
PageBreakHdl();
|
|
}
|
|
|
|
_nWhich = GetWhich( SID_ATTR_PARA_KEEP );
|
|
eItemState = rSet->GetItemState( _nWhich );
|
|
|
|
if ( eItemState >= SfxItemState::DEFAULT )
|
|
{
|
|
aKeepParaState.bTriStateEnabled = false;
|
|
const SvxFormatKeepItem& rKeep =
|
|
static_cast<const SvxFormatKeepItem&>(rSet->Get( _nWhich ));
|
|
|
|
if ( rKeep.GetValue() )
|
|
m_xKeepParaBox->set_state(TRISTATE_TRUE);
|
|
else
|
|
m_xKeepParaBox->set_state(TRISTATE_FALSE);
|
|
}
|
|
else if ( SfxItemState::INVALID == eItemState )
|
|
m_xKeepParaBox->set_state(TRISTATE_INDET);
|
|
else
|
|
m_xKeepParaBox->set_sensitive(false);
|
|
|
|
_nWhich = GetWhich( SID_ATTR_PARA_SPLIT );
|
|
eItemState = rSet->GetItemState( _nWhich );
|
|
|
|
if ( eItemState >= SfxItemState::DEFAULT )
|
|
{
|
|
const SvxFormatSplitItem& rSplit =
|
|
static_cast<const SvxFormatSplitItem&>(rSet->Get( _nWhich ));
|
|
aAllowSplitState.bTriStateEnabled = false;
|
|
|
|
if ( !rSplit.GetValue() )
|
|
m_xAllowSplitBox->set_state(TRISTATE_FALSE);
|
|
else
|
|
{
|
|
m_xAllowSplitBox->set_state(TRISTATE_TRUE);
|
|
// default widows and orphans to enabled
|
|
m_xWidowBox->set_sensitive(true);
|
|
m_xOrphanBox->set_sensitive(true);
|
|
}
|
|
|
|
// widows and orphans
|
|
_nWhich = GetWhich( SID_ATTR_PARA_WIDOWS );
|
|
SfxItemState eTmpState = rSet->GetItemState( _nWhich );
|
|
|
|
if ( eTmpState >= SfxItemState::DEFAULT )
|
|
{
|
|
const SvxWidowsItem& rWidow =
|
|
static_cast<const SvxWidowsItem&>(rSet->Get( _nWhich ));
|
|
aWidowState.bTriStateEnabled = false;
|
|
const sal_uInt16 nLines = rWidow.GetValue();
|
|
|
|
bool _bEnable = nLines > 0;
|
|
m_xWidowRowNo->set_value(m_xWidowRowNo->normalize(nLines));
|
|
m_xWidowBox->set_state(_bEnable ? TRISTATE_TRUE : TRISTATE_FALSE);
|
|
m_xWidowRowNo->set_sensitive(_bEnable);
|
|
}
|
|
else if ( SfxItemState::INVALID == eTmpState )
|
|
m_xWidowBox->set_state( TRISTATE_INDET );
|
|
else
|
|
m_xWidowBox->set_sensitive(false);
|
|
|
|
_nWhich = GetWhich( SID_ATTR_PARA_ORPHANS );
|
|
eTmpState = rSet->GetItemState( _nWhich );
|
|
|
|
if ( eTmpState >= SfxItemState::DEFAULT )
|
|
{
|
|
const SvxOrphansItem& rOrphan =
|
|
static_cast<const SvxOrphansItem&>(rSet->Get( _nWhich ));
|
|
const sal_uInt16 nLines = rOrphan.GetValue();
|
|
aOrphanState.bTriStateEnabled = false;
|
|
|
|
bool _bEnable = nLines > 0;
|
|
m_xOrphanBox->set_state(_bEnable ? TRISTATE_TRUE : TRISTATE_FALSE);
|
|
m_xOrphanRowNo->set_value(m_xOrphanRowNo->normalize(nLines));
|
|
m_xOrphanRowNo->set_sensitive(_bEnable);
|
|
m_xOrphanRowLabel->set_sensitive(_bEnable);
|
|
|
|
}
|
|
else if ( SfxItemState::INVALID == eTmpState )
|
|
m_xOrphanBox->set_state(TRISTATE_INDET);
|
|
else
|
|
m_xOrphanBox->set_sensitive(false);
|
|
aOrphanState.eState = m_xOrphanBox->get_state();
|
|
}
|
|
else if ( SfxItemState::INVALID == eItemState )
|
|
m_xAllowSplitBox->set_state(TRISTATE_INDET);
|
|
else
|
|
m_xAllowSplitBox->set_sensitive(false);
|
|
|
|
// so that everything is enabled correctly
|
|
AllowSplitHdl();
|
|
WidowHdl();
|
|
OrphanHdl();
|
|
ChangesApplied();
|
|
}
|
|
void SvxExtParagraphTabPage::ChangesApplied()
|
|
{
|
|
m_xHyphenBox->save_state();
|
|
m_xHyphenNoCapsBox->save_state();
|
|
m_xHyphenNoLastWordBox->save_state();
|
|
m_xAcrossMoveLineBox->save_state();
|
|
m_xExtHyphenBeforeBox->save_value();
|
|
m_xExtHyphenAfterBox->save_value();
|
|
m_xExtCompoundHyphenBeforeBox->save_value();
|
|
m_xExtCompoundHyphenAfterBox->save_value();
|
|
m_xMaxHyphenEdit->save_value();
|
|
m_xMinWordLength->save_value();
|
|
m_aHyphenZone.save_value();
|
|
m_aParagraphEndZone.save_value();
|
|
m_aColumnEndZone.save_value();
|
|
m_aPageEndZone.save_value();
|
|
m_aSpreadEndZone.save_value();
|
|
m_xAcrossParagraphBox->save_state();
|
|
m_xAcrossColumnBox->save_state();
|
|
m_xAcrossPageBox->save_state();
|
|
m_xAcrossSpreadBox->save_state();
|
|
m_xPageBreakBox->save_state();
|
|
m_xBreakPositionLB->save_value();
|
|
m_xBreakTypeLB->save_value();
|
|
m_xApplyCollBtn->save_state();
|
|
m_xApplyCollBox->save_value();
|
|
m_xPageNumBox->save_state();
|
|
m_xPagenumEdit->save_value();
|
|
m_xAllowSplitBox->save_state();
|
|
m_xKeepParaBox->save_state();
|
|
m_xWidowBox->save_state();
|
|
m_xOrphanBox->save_state();
|
|
m_xOrphanRowNo->save_value();
|
|
m_xWidowRowNo->save_value();
|
|
}
|
|
|
|
DeactivateRC SvxExtParagraphTabPage::DeactivatePage( SfxItemSet* _pSet )
|
|
{
|
|
if ( _pSet )
|
|
FillItemSet( _pSet );
|
|
return DeactivateRC::LeavePage;
|
|
}
|
|
|
|
void SvxExtParagraphTabPage::DisablePageBreak()
|
|
{
|
|
bPageBreak = false;
|
|
m_xPageBreakBox->set_sensitive(false);
|
|
m_xBreakTypeLB->remove(0);
|
|
m_xBreakPositionFT->set_sensitive(false);
|
|
m_xBreakPositionLB->set_sensitive(false);
|
|
m_xApplyCollBtn->set_sensitive(false);
|
|
m_xApplyCollBox->set_sensitive(false);
|
|
m_xPageNumBox->set_sensitive(false);
|
|
m_xPagenumEdit->set_sensitive(false);
|
|
}
|
|
|
|
SvxExtParagraphTabPage::SvxExtParagraphTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rAttr)
|
|
: SfxTabPage(pPage, pController, u"cui/ui/textflowpage.ui"_ustr, u"TextFlowPage"_ustr, &rAttr)
|
|
, bPageBreak(true)
|
|
, bHtmlMode(false)
|
|
, nStdPos(0)
|
|
, nHyphenLevel(0)
|
|
// Hyphenation
|
|
, m_xHyphenBox(m_xBuilder->weld_check_button(u"checkAuto"_ustr))
|
|
, m_xHyphenNoCapsBox(m_xBuilder->weld_check_button(u"checkNoCaps"_ustr))
|
|
, m_xHyphenNoLastWordBox(m_xBuilder->weld_check_button(u"checkNoLastWord"_ustr))
|
|
, m_xBeforeText(m_xBuilder->weld_label(u"labelLineBegin"_ustr))
|
|
, m_xExtHyphenBeforeBox(m_xBuilder->weld_spin_button(u"spinLineEnd"_ustr))
|
|
, m_xAfterText(m_xBuilder->weld_label(u"labelLineEnd"_ustr))
|
|
, m_xExtHyphenAfterBox(m_xBuilder->weld_spin_button(u"spinLineBegin"_ustr))
|
|
, m_xCompoundBeforeText(m_xBuilder->weld_label(u"labelCompoundLineEnd"_ustr))
|
|
, m_xExtCompoundHyphenBeforeBox(m_xBuilder->weld_spin_button(u"spinCompoundLineEnd"_ustr))
|
|
, m_xCompoundAfterText(m_xBuilder->weld_label(u"labelCompoundLineBegin"_ustr))
|
|
, m_xExtCompoundHyphenAfterBox(m_xBuilder->weld_spin_button(u"spinCompoundLineBegin"_ustr))
|
|
, m_xMaxHyphenLabel(m_xBuilder->weld_label(u"labelMaxNum"_ustr))
|
|
, m_xMaxHyphenEdit(m_xBuilder->weld_spin_button(u"spinMaxNum"_ustr))
|
|
, m_xMinWordLabel(m_xBuilder->weld_label(u"labelMinLen"_ustr))
|
|
, m_xMinWordLength(m_xBuilder->weld_spin_button(u"spinMinLen"_ustr))
|
|
, m_xBetterSpacingLabel(m_xBuilder->weld_label(u"labelBetterSpacing"_ustr))
|
|
, m_xLessHyphenLabel(m_xBuilder->weld_label(u"labelLessHyphen"_ustr))
|
|
, m_xSliderHyphen(m_xBuilder->weld_scale(u"hyphenslider"_ustr))
|
|
, m_xHyphenZoneLabel(m_xBuilder->weld_label(u"labelHyphenZone"_ustr))
|
|
, m_aHyphenZone(m_xBuilder->weld_metric_spin_button(u"spinHyphenZone"_ustr, FieldUnit::CM))
|
|
, m_xParagraphEndZoneLabel(m_xBuilder->weld_label(u"labelParagraphEndZone"_ustr))
|
|
, m_aParagraphEndZone(m_xBuilder->weld_metric_spin_button(u"spinParagraphEndZone"_ustr, FieldUnit::CM))
|
|
, m_xColumnEndZoneLabel(m_xBuilder->weld_label(u"labelColumnEndZone"_ustr))
|
|
, m_aColumnEndZone(m_xBuilder->weld_metric_spin_button(u"spinColumnEndZone"_ustr, FieldUnit::CM))
|
|
, m_xPageEndZoneLabel(m_xBuilder->weld_label(u"labelPageEndZone"_ustr))
|
|
, m_aPageEndZone(m_xBuilder->weld_metric_spin_button(u"spinPageEndZone"_ustr, FieldUnit::CM))
|
|
, m_xSpreadEndZoneLabel(m_xBuilder->weld_label(u"labelSpreadEndZone"_ustr))
|
|
, m_aSpreadEndZone(m_xBuilder->weld_metric_spin_button(u"spinSpreadEndZone"_ustr, FieldUnit::CM))
|
|
//Page break
|
|
, m_xPageBreakBox(m_xBuilder->weld_check_button(u"checkInsert"_ustr))
|
|
, m_xBreakTypeFT(m_xBuilder->weld_label(u"labelType"_ustr))
|
|
, m_xBreakTypeLB(m_xBuilder->weld_combo_box(u"comboBreakType"_ustr))
|
|
, m_xBreakPositionFT(m_xBuilder->weld_label(u"labelPosition"_ustr))
|
|
, m_xBreakPositionLB(m_xBuilder->weld_combo_box(u"comboBreakPosition"_ustr))
|
|
, m_xApplyCollBtn(m_xBuilder->weld_check_button(u"checkPageStyle"_ustr))
|
|
, m_xApplyCollBox(m_xBuilder->weld_combo_box(u"comboPageStyle"_ustr))
|
|
, m_xPageNumBox(m_xBuilder->weld_check_button(u"labelPageNum"_ustr))
|
|
, m_xPagenumEdit(m_xBuilder->weld_spin_button(u"spinPageNumber"_ustr))
|
|
// Options
|
|
, m_xAllowSplitBox(m_xBuilder->weld_check_button(u"checkSplitPara"_ustr))
|
|
, m_xKeepParaBox(m_xBuilder->weld_check_button(u"checkKeepPara"_ustr))
|
|
, m_xOrphanBox(m_xBuilder->weld_check_button(u"checkOrphan"_ustr))
|
|
, m_xOrphanRowNo(m_xBuilder->weld_spin_button(u"spinOrphan"_ustr))
|
|
, m_xOrphanRowLabel(m_xBuilder->weld_label(u"labelOrphan"_ustr))
|
|
, m_xWidowBox(m_xBuilder->weld_check_button(u"checkWidow"_ustr))
|
|
, m_xWidowRowNo(m_xBuilder->weld_spin_button(u"spinWidow"_ustr))
|
|
, m_xWidowRowLabel(m_xBuilder->weld_label(u"labelWidow"_ustr))
|
|
// Avoid hyphenation across
|
|
, m_xAcrossText(m_xBuilder->weld_label(u"labelHyphenAcross"_ustr))
|
|
, m_xAcrossParagraphBox(m_xBuilder->weld_check_button(u"checkAcrossParagraph"_ustr))
|
|
, m_xAcrossColumnBox(m_xBuilder->weld_check_button(u"checkAcrossColumn"_ustr))
|
|
, m_xAcrossPageBox(m_xBuilder->weld_check_button(u"checkAcrossPage"_ustr))
|
|
, m_xAcrossSpreadBox(m_xBuilder->weld_check_button(u"checkAcrossSpread"_ustr))
|
|
, m_xAcrossMoveLineBox(m_xBuilder->weld_check_button(u"checkMoveLine"_ustr))
|
|
{
|
|
// this page needs ExchangeSupport
|
|
SetExchangeSupport();
|
|
|
|
m_xHyphenBox->connect_toggled(LINK(this, SvxExtParagraphTabPage, HyphenClickHdl_Impl));
|
|
m_xPageBreakBox->connect_toggled(LINK(this, SvxExtParagraphTabPage, PageBreakHdl_Impl));
|
|
m_xAllowSplitBox->connect_toggled(LINK(this, SvxExtParagraphTabPage, AllowSplitHdl_Impl));
|
|
m_xWidowBox->connect_toggled(LINK(this, SvxExtParagraphTabPage, WidowHdl_Impl));
|
|
m_xOrphanBox->connect_toggled(LINK(this, SvxExtParagraphTabPage, OrphanHdl_Impl));
|
|
m_xApplyCollBtn->connect_toggled(LINK(this, SvxExtParagraphTabPage, ApplyCollClickHdl_Impl));
|
|
m_xBreakTypeLB->connect_changed(LINK(this, SvxExtParagraphTabPage, PageBreakTypeHdl_Impl));
|
|
m_xBreakPositionLB->connect_changed(LINK(this, SvxExtParagraphTabPage, PageBreakPosHdl_Impl));
|
|
m_xPageNumBox->connect_toggled(LINK(this, SvxExtParagraphTabPage, PageNumBoxClickHdl_Impl));
|
|
m_xKeepParaBox->connect_toggled(LINK(this, SvxExtParagraphTabPage, KeepParaBoxClickHdl_Impl));
|
|
m_xAcrossParagraphBox->connect_toggled(LINK(this, SvxExtParagraphTabPage, AcrossParagraphHdl_Impl));
|
|
m_xAcrossColumnBox->connect_toggled(LINK(this, SvxExtParagraphTabPage, AcrossColumnHdl_Impl));
|
|
m_xAcrossPageBox->connect_toggled(LINK(this, SvxExtParagraphTabPage, AcrossPageHdl_Impl));
|
|
m_xAcrossSpreadBox->connect_toggled(LINK(this, SvxExtParagraphTabPage, AcrossSpreadHdl_Impl));
|
|
|
|
if (SfxObjectShell* pSh = SfxObjectShell::Current())
|
|
{
|
|
SfxStyleSheetBasePool* pPool = pSh->GetStyleSheetPool();
|
|
SfxStyleSheetBase* pStyle = pPool->First(SfxStyleFamily::Page);
|
|
OUString aStdName;
|
|
|
|
// tdf139131 - sort page styles
|
|
m_xApplyCollBox->make_sorted();
|
|
while( pStyle )
|
|
{
|
|
if ( aStdName.isEmpty() )
|
|
// first style == standard style
|
|
aStdName = pStyle->GetName();
|
|
m_xApplyCollBox->append_text(pStyle->GetName());
|
|
pStyle = pPool->Next();
|
|
}
|
|
nStdPos = m_xApplyCollBox->find_text(aStdName);
|
|
}
|
|
|
|
sal_uInt16 nHtmlMode = GetHtmlMode_Impl( rAttr );
|
|
if ( !(nHtmlMode & HTMLMODE_ON) )
|
|
return;
|
|
|
|
bHtmlMode = true;
|
|
m_xHyphenBox->set_sensitive(false);
|
|
m_xHyphenNoCapsBox->set_sensitive(false);
|
|
m_xHyphenNoLastWordBox->set_sensitive(false);
|
|
m_xAcrossMoveLineBox->set_sensitive(false);
|
|
m_xBeforeText->set_sensitive(false);
|
|
m_xExtHyphenBeforeBox->set_sensitive(false);
|
|
m_xAfterText->set_sensitive(false);
|
|
m_xExtHyphenAfterBox->set_sensitive(false);
|
|
m_xCompoundBeforeText->set_sensitive(false);
|
|
m_xCompoundAfterText->set_sensitive(false);
|
|
m_xExtCompoundHyphenBeforeBox->set_sensitive(false);
|
|
m_xExtCompoundHyphenAfterBox->set_sensitive(false);
|
|
m_xMaxHyphenLabel->set_sensitive(false);
|
|
m_xMaxHyphenEdit->set_sensitive(false);
|
|
m_xMinWordLabel->set_sensitive(false);
|
|
m_xMinWordLength->set_sensitive(false);
|
|
m_xBetterSpacingLabel->set_sensitive(false);
|
|
m_xLessHyphenLabel->set_sensitive(false);
|
|
m_xSliderHyphen->set_sensitive(false);
|
|
m_xHyphenZoneLabel->set_sensitive(false);
|
|
m_aHyphenZone.set_sensitive(false);
|
|
m_xParagraphEndZoneLabel->set_sensitive(false);
|
|
m_aParagraphEndZone.set_sensitive(false);
|
|
m_xColumnEndZoneLabel->set_sensitive(false);
|
|
m_aColumnEndZone.set_sensitive(false);
|
|
m_xPageEndZoneLabel->set_sensitive(false);
|
|
m_aPageEndZone.set_sensitive(false);
|
|
m_xSpreadEndZoneLabel->set_sensitive(false);
|
|
m_aSpreadEndZone.set_sensitive(false);
|
|
m_xPageNumBox->set_sensitive(false);
|
|
m_xPagenumEdit->set_sensitive(false);
|
|
m_xAcrossText->set_sensitive(false);
|
|
m_xAcrossParagraphBox->set_sensitive(false);
|
|
m_xAcrossColumnBox->set_sensitive(false);
|
|
m_xAcrossPageBox->set_sensitive(false);
|
|
m_xAcrossSpreadBox->set_sensitive(false);
|
|
// no column break in HTML
|
|
m_xBreakTypeLB->remove(1);
|
|
}
|
|
|
|
SvxExtParagraphTabPage::~SvxExtParagraphTabPage()
|
|
{
|
|
}
|
|
|
|
void SvxExtParagraphTabPage::PageBreakHdl()
|
|
{
|
|
switch (m_xPageBreakBox->get_state())
|
|
{
|
|
case TRISTATE_TRUE:
|
|
m_xBreakTypeFT->set_sensitive(true);
|
|
m_xBreakTypeLB->set_sensitive(true);
|
|
m_xBreakPositionFT->set_sensitive(true);
|
|
m_xBreakPositionLB->set_sensitive(true);
|
|
|
|
if (0 == m_xBreakTypeLB->get_active() && 0 == m_xBreakPositionLB->get_active())
|
|
{
|
|
m_xApplyCollBtn->set_sensitive(true);
|
|
|
|
bool bEnable = TRISTATE_TRUE == m_xApplyCollBtn->get_state() &&
|
|
m_xApplyCollBox->get_count();
|
|
m_xApplyCollBox->set_sensitive(bEnable);
|
|
if(!bHtmlMode)
|
|
{
|
|
m_xPageNumBox->set_sensitive(bEnable);
|
|
m_xPagenumEdit->set_sensitive(bEnable && m_xPageNumBox->get_state() == TRISTATE_TRUE);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case TRISTATE_FALSE:
|
|
case TRISTATE_INDET:
|
|
m_xApplyCollBtn->set_state(TRISTATE_FALSE);
|
|
m_xApplyCollBtn->set_sensitive(false);
|
|
m_xApplyCollBox->set_sensitive(false);
|
|
m_xPageNumBox->set_sensitive(false);
|
|
m_xPagenumEdit->set_sensitive(false);
|
|
m_xBreakTypeFT->set_sensitive(false);
|
|
m_xBreakTypeLB->set_sensitive(false);
|
|
m_xBreakPositionFT->set_sensitive(false);
|
|
m_xBreakPositionLB->set_sensitive(false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, PageBreakHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aPageBreakState.CheckButtonToggled(*m_xPageBreakBox);
|
|
PageBreakHdl();
|
|
}
|
|
|
|
void SvxExtParagraphTabPage::AllowSplitHdl()
|
|
{
|
|
bool bEnable = m_xAllowSplitBox->get_state() == TRISTATE_TRUE;
|
|
m_xWidowBox->set_sensitive(bEnable);
|
|
m_xOrphanBox->set_sensitive(bEnable);
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, AllowSplitHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aAllowSplitState.CheckButtonToggled(*m_xAllowSplitBox);
|
|
AllowSplitHdl();
|
|
}
|
|
|
|
void SvxExtParagraphTabPage::WidowHdl()
|
|
{
|
|
switch (m_xWidowBox->get_state())
|
|
{
|
|
case TRISTATE_TRUE:
|
|
m_xWidowRowNo->set_sensitive(true);
|
|
m_xWidowRowLabel->set_sensitive(true);
|
|
m_xAllowSplitBox->set_sensitive(true);
|
|
break;
|
|
case TRISTATE_FALSE:
|
|
if (m_xOrphanBox->get_state() == TRISTATE_FALSE)
|
|
m_xAllowSplitBox->set_sensitive(false);
|
|
[[fallthrough]];
|
|
case TRISTATE_INDET:
|
|
m_xWidowRowNo->set_sensitive(false);
|
|
m_xWidowRowLabel->set_sensitive(false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, WidowHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aWidowState.CheckButtonToggled(*m_xWidowBox);
|
|
WidowHdl();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, OrphanHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aOrphanState.CheckButtonToggled(*m_xOrphanBox);
|
|
OrphanHdl();
|
|
}
|
|
|
|
void SvxExtParagraphTabPage::OrphanHdl()
|
|
{
|
|
switch (m_xOrphanBox->get_state())
|
|
{
|
|
case TRISTATE_TRUE:
|
|
m_xOrphanRowNo->set_sensitive(true);
|
|
m_xOrphanRowLabel->set_sensitive(true);
|
|
m_xAllowSplitBox->set_sensitive(true);
|
|
break;
|
|
|
|
case TRISTATE_FALSE:
|
|
if (m_xWidowBox->get_state() == TRISTATE_FALSE)
|
|
m_xAllowSplitBox->set_sensitive(true);
|
|
[[fallthrough]];
|
|
case TRISTATE_INDET:
|
|
m_xOrphanRowNo->set_sensitive(false);
|
|
m_xOrphanRowLabel->set_sensitive(false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void SvxExtParagraphTabPage::HyphenClickHdl()
|
|
{
|
|
bool bEnable = m_xHyphenBox->get_state() == TRISTATE_TRUE;
|
|
m_xHyphenNoCapsBox->set_sensitive(bEnable);
|
|
m_xHyphenNoLastWordBox->set_sensitive(bEnable);
|
|
m_xBeforeText->set_sensitive(bEnable);
|
|
m_xExtHyphenBeforeBox->set_sensitive(bEnable);
|
|
m_xAfterText->set_sensitive(bEnable);
|
|
m_xExtHyphenAfterBox->set_sensitive(bEnable);
|
|
m_xCompoundBeforeText->set_sensitive(bEnable);
|
|
m_xCompoundAfterText->set_sensitive(bEnable);
|
|
m_xExtCompoundHyphenBeforeBox->set_sensitive(bEnable);
|
|
m_xExtCompoundHyphenAfterBox->set_sensitive(bEnable);
|
|
m_xMaxHyphenLabel->set_sensitive(bEnable);
|
|
m_xMaxHyphenEdit->set_sensitive(bEnable);
|
|
m_xMinWordLabel->set_sensitive(bEnable);
|
|
m_xMinWordLength->set_sensitive(bEnable);
|
|
m_xBetterSpacingLabel->set_sensitive(bEnable);
|
|
m_xLessHyphenLabel->set_sensitive(bEnable);
|
|
m_xSliderHyphen->set_sensitive(bEnable);
|
|
m_xHyphenZoneLabel->set_sensitive(bEnable);
|
|
m_aHyphenZone.set_sensitive(bEnable);
|
|
m_xAcrossText->set_sensitive(bEnable);
|
|
m_xAcrossParagraphBox->set_sensitive(bEnable);
|
|
bool bAcross = bEnable && m_xAcrossParagraphBox->get_state() == TRISTATE_TRUE;
|
|
m_xParagraphEndZoneLabel->set_sensitive(bAcross);
|
|
m_aParagraphEndZone.set_sensitive(bAcross);
|
|
m_xAcrossColumnBox->set_sensitive(bEnable);
|
|
bAcross = bEnable && m_xAcrossColumnBox->get_state() == TRISTATE_TRUE;
|
|
m_xColumnEndZoneLabel->set_sensitive(bAcross);
|
|
m_aColumnEndZone.set_sensitive(bAcross);
|
|
m_xAcrossPageBox->set_sensitive(bEnable);
|
|
bAcross = bEnable && m_xAcrossPageBox->get_state() == TRISTATE_TRUE;
|
|
m_xPageEndZoneLabel->set_sensitive(bAcross);
|
|
m_aPageEndZone.set_sensitive(bAcross);
|
|
m_xAcrossSpreadBox->set_sensitive(bEnable);
|
|
bAcross = bEnable && m_xAcrossSpreadBox->get_state() == TRISTATE_TRUE;
|
|
m_xSpreadEndZoneLabel->set_sensitive(bAcross);
|
|
m_aSpreadEndZone.set_sensitive(bAcross);
|
|
// only sensitive, if the hyphenation is disabled across spreads
|
|
m_xAcrossMoveLineBox->set_sensitive( bEnable && m_xAcrossSpreadBox->get_state() != TRISTATE_TRUE );
|
|
m_xHyphenBox->set_state(bEnable ? TRISTATE_TRUE : TRISTATE_FALSE);
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, HyphenClickHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aHyphenState.CheckButtonToggled(*m_xHyphenBox);
|
|
HyphenClickHdl();
|
|
}
|
|
|
|
void SvxExtParagraphTabPage::ApplyCollClickHdl()
|
|
{
|
|
bool bEnable = false;
|
|
if (m_xApplyCollBtn->get_state() == TRISTATE_TRUE && m_xApplyCollBox->get_count())
|
|
{
|
|
bEnable = true;
|
|
m_xApplyCollBox->set_active(nStdPos);
|
|
}
|
|
else
|
|
{
|
|
m_xApplyCollBox->set_active(-1);
|
|
}
|
|
m_xApplyCollBox->set_sensitive(bEnable);
|
|
if (!bHtmlMode)
|
|
{
|
|
m_xPageNumBox->set_sensitive(bEnable);
|
|
m_xPagenumEdit->set_sensitive(bEnable && m_xPageNumBox->get_state() == TRISTATE_TRUE);
|
|
}
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, ApplyCollClickHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aApplyCollState.CheckButtonToggled(*m_xApplyCollBtn);
|
|
ApplyCollClickHdl();
|
|
}
|
|
|
|
IMPL_LINK(SvxExtParagraphTabPage, PageBreakPosHdl_Impl, weld::ComboBox&, rListBox, void)
|
|
{
|
|
if (0 == rListBox.get_active())
|
|
{
|
|
m_xApplyCollBtn->set_sensitive(true);
|
|
|
|
bool bEnable = m_xApplyCollBtn->get_state() == TRISTATE_TRUE && m_xApplyCollBox->get_count();
|
|
|
|
m_xApplyCollBox->set_sensitive(bEnable);
|
|
if (!bHtmlMode)
|
|
{
|
|
m_xPageNumBox->set_sensitive(bEnable);
|
|
m_xPagenumEdit->set_sensitive(bEnable && m_xPageNumBox->get_state() == TRISTATE_TRUE);
|
|
}
|
|
}
|
|
else if (1 == rListBox.get_active())
|
|
{
|
|
m_xApplyCollBtn->set_state(TRISTATE_FALSE);
|
|
m_xApplyCollBtn->set_sensitive(false);
|
|
m_xApplyCollBox->set_sensitive(false);
|
|
m_xPageNumBox->set_sensitive(false);
|
|
m_xPagenumEdit->set_sensitive(false);
|
|
}
|
|
}
|
|
|
|
IMPL_LINK(SvxExtParagraphTabPage, PageBreakTypeHdl_Impl, weld::ComboBox&, rListBox, void)
|
|
{
|
|
//column break or break after
|
|
int nBreakPos = m_xBreakPositionLB->get_active();
|
|
if (rListBox.get_active() == 1 || 1 == nBreakPos)
|
|
{
|
|
m_xApplyCollBtn->set_state(TRISTATE_FALSE);
|
|
m_xApplyCollBtn->set_sensitive(false);
|
|
m_xApplyCollBox->set_sensitive(false);
|
|
m_xPageNumBox->set_sensitive(false);
|
|
m_xPagenumEdit->set_sensitive(false);
|
|
}
|
|
else
|
|
PageBreakPosHdl_Impl(*m_xBreakPositionLB);
|
|
}
|
|
|
|
void SvxExtParagraphTabPage::PageNumBoxClickHdl()
|
|
{
|
|
m_xPagenumEdit->set_sensitive(m_xPageNumBox->get_state() == TRISTATE_TRUE);
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, PageNumBoxClickHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aPageNumState.CheckButtonToggled(*m_xPageNumBox);
|
|
PageNumBoxClickHdl();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, KeepParaBoxClickHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aKeepParaState.CheckButtonToggled(*m_xKeepParaBox);
|
|
}
|
|
|
|
void SvxExtParagraphTabPage::PageCreated(const SfxAllItemSet& aSet)
|
|
{
|
|
const SfxBoolItem* pDisablePageBreakItem = aSet.GetItem<SfxBoolItem>(SID_DISABLE_SVXEXTPARAGRAPHTABPAGE_PAGEBREAK, false);
|
|
|
|
if (pDisablePageBreakItem)
|
|
if ( pDisablePageBreakItem->GetValue())
|
|
DisablePageBreak();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, AcrossParagraphHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aAcrossParagraphState.CheckButtonToggled(*m_xAcrossParagraphBox);
|
|
if (m_xAcrossParagraphBox->get_state() != TRISTATE_TRUE )
|
|
{
|
|
m_xAcrossColumnBox->set_state( TRISTATE_FALSE );
|
|
m_xAcrossPageBox->set_state( TRISTATE_FALSE );
|
|
m_xAcrossSpreadBox->set_state( TRISTATE_FALSE );
|
|
m_xAcrossMoveLineBox->set_sensitive( true );
|
|
m_xParagraphEndZoneLabel->set_sensitive(false);
|
|
m_aParagraphEndZone.set_sensitive(false);
|
|
m_xColumnEndZoneLabel->set_sensitive(false);
|
|
m_aColumnEndZone.set_sensitive(false);
|
|
m_xPageEndZoneLabel->set_sensitive(false);
|
|
m_aPageEndZone.set_sensitive(false);
|
|
m_xSpreadEndZoneLabel->set_sensitive(false);
|
|
m_aSpreadEndZone.set_sensitive(false);
|
|
}
|
|
else
|
|
{
|
|
m_xParagraphEndZoneLabel->set_sensitive(true);
|
|
m_aParagraphEndZone.set_sensitive(true);
|
|
}
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, AcrossColumnHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aAcrossColumnState.CheckButtonToggled(*m_xAcrossColumnBox);
|
|
if (m_xAcrossColumnBox->get_state() != TRISTATE_TRUE )
|
|
{
|
|
m_xAcrossPageBox->set_state( TRISTATE_FALSE );
|
|
m_xAcrossSpreadBox->set_state( TRISTATE_FALSE );
|
|
m_xAcrossMoveLineBox->set_sensitive( true );
|
|
m_xColumnEndZoneLabel->set_sensitive(false);
|
|
m_aColumnEndZone.set_sensitive(false);
|
|
m_xPageEndZoneLabel->set_sensitive(false);
|
|
m_aPageEndZone.set_sensitive(false);
|
|
m_xSpreadEndZoneLabel->set_sensitive(false);
|
|
m_aSpreadEndZone.set_sensitive(false);
|
|
}
|
|
else
|
|
{
|
|
m_xAcrossParagraphBox->set_state( TRISTATE_TRUE );
|
|
m_xParagraphEndZoneLabel->set_sensitive(true);
|
|
m_aParagraphEndZone.set_sensitive(true);
|
|
m_xColumnEndZoneLabel->set_sensitive(true);
|
|
m_aColumnEndZone.set_sensitive(true);
|
|
}
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, AcrossPageHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aAcrossPageState.CheckButtonToggled(*m_xAcrossPageBox);
|
|
if (m_xAcrossPageBox->get_state() == TRISTATE_TRUE )
|
|
{
|
|
m_xAcrossParagraphBox->set_state( TRISTATE_TRUE );
|
|
m_xAcrossColumnBox->set_state( TRISTATE_TRUE );
|
|
m_xParagraphEndZoneLabel->set_sensitive(true);
|
|
m_aParagraphEndZone.set_sensitive(true);
|
|
m_xColumnEndZoneLabel->set_sensitive(true);
|
|
m_aColumnEndZone.set_sensitive(true);
|
|
m_xPageEndZoneLabel->set_sensitive(true);
|
|
m_aPageEndZone.set_sensitive(true);
|
|
m_xSpreadEndZoneLabel->set_sensitive(false);
|
|
m_aSpreadEndZone.set_sensitive(false);
|
|
}
|
|
else
|
|
{
|
|
m_xAcrossSpreadBox->set_state( TRISTATE_FALSE );
|
|
m_xAcrossMoveLineBox->set_sensitive( true );
|
|
m_xPageEndZoneLabel->set_sensitive(false);
|
|
m_aPageEndZone.set_sensitive(false);
|
|
m_xSpreadEndZoneLabel->set_sensitive(false);
|
|
m_aSpreadEndZone.set_sensitive(false);
|
|
}
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxExtParagraphTabPage, AcrossSpreadHdl_Impl, weld::Toggleable&, void)
|
|
{
|
|
aAcrossSpreadState.CheckButtonToggled(*m_xAcrossSpreadBox);
|
|
if (m_xAcrossSpreadBox->get_state() == TRISTATE_TRUE )
|
|
{
|
|
m_xAcrossParagraphBox->set_state( TRISTATE_TRUE );
|
|
m_xAcrossColumnBox->set_state( TRISTATE_TRUE );
|
|
m_xAcrossPageBox->set_state( TRISTATE_TRUE );
|
|
m_xParagraphEndZoneLabel->set_sensitive(true);
|
|
m_aParagraphEndZone.set_sensitive(true);
|
|
m_xColumnEndZoneLabel->set_sensitive(true);
|
|
m_aColumnEndZone.set_sensitive(true);
|
|
m_xPageEndZoneLabel->set_sensitive(true);
|
|
m_aPageEndZone.set_sensitive(true);
|
|
m_xSpreadEndZoneLabel->set_sensitive(true);
|
|
m_aSpreadEndZone.set_sensitive(true);
|
|
m_xAcrossMoveLineBox->set_sensitive( false );
|
|
m_xAcrossMoveLineBox->set_state( TRISTATE_FALSE );
|
|
}
|
|
else
|
|
{
|
|
m_xSpreadEndZoneLabel->set_sensitive(false);
|
|
m_aSpreadEndZone.set_sensitive(false);
|
|
// only sensitive, if the hyphenation is disabled across spreads
|
|
m_xAcrossMoveLineBox->set_sensitive( true );
|
|
}
|
|
}
|
|
|
|
SvxAsianTabPage::SvxAsianTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rSet)
|
|
: SfxTabPage(pPage, pController, u"cui/ui/asiantypography.ui"_ustr, u"AsianTypography"_ustr, &rSet)
|
|
, m_xForbiddenRulesCB(m_xBuilder->weld_check_button(u"checkForbidList"_ustr))
|
|
, m_xHangingPunctCB(m_xBuilder->weld_check_button(u"checkHangPunct"_ustr))
|
|
, m_xScriptSpaceCB(m_xBuilder->weld_check_button(u"checkApplySpacing"_ustr))
|
|
{
|
|
SetExchangeSupport();
|
|
}
|
|
|
|
SvxAsianTabPage::~SvxAsianTabPage()
|
|
{
|
|
}
|
|
|
|
DeactivateRC SvxAsianTabPage::DeactivatePage( SfxItemSet* pSet )
|
|
{
|
|
if ( pSet )
|
|
FillItemSet( pSet );
|
|
return DeactivateRC::LeavePage;
|
|
}
|
|
|
|
std::unique_ptr<SfxTabPage> SvxAsianTabPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rSet)
|
|
{
|
|
return std::make_unique<SvxAsianTabPage>(pPage, pController, *rSet);
|
|
}
|
|
|
|
const WhichRangesContainer & SvxAsianTabPage::GetRanges()
|
|
{
|
|
static const auto gRanges = WhichRangesContainer(svl::Items<SID_ATTR_PARA_SCRIPTSPACE, SID_ATTR_PARA_FORBIDDEN_RULES>);
|
|
return gRanges;
|
|
}
|
|
|
|
bool SvxAsianTabPage::FillItemSet( SfxItemSet* rSet )
|
|
{
|
|
bool bRet = false;
|
|
SfxItemPool* pPool = rSet->GetPool();
|
|
if (m_xScriptSpaceCB->get_sensitive() && m_xScriptSpaceCB->get_state_changed_from_saved())
|
|
{
|
|
std::unique_ptr<SfxBoolItem> pNewItem(static_cast<SfxBoolItem*>(rSet->Get(
|
|
pPool->GetWhichIDFromSlotID(SID_ATTR_PARA_SCRIPTSPACE)).Clone()));
|
|
pNewItem->SetValue(m_xScriptSpaceCB->get_active());
|
|
rSet->Put(std::move(pNewItem));
|
|
bRet = true;
|
|
}
|
|
if (m_xHangingPunctCB->get_sensitive() && m_xHangingPunctCB->get_state_changed_from_saved())
|
|
{
|
|
std::unique_ptr<SfxBoolItem> pNewItem(static_cast<SfxBoolItem*>(rSet->Get(
|
|
pPool->GetWhichIDFromSlotID(SID_ATTR_PARA_HANGPUNCTUATION)).Clone()));
|
|
pNewItem->SetValue(m_xHangingPunctCB->get_active());
|
|
rSet->Put(std::move(pNewItem));
|
|
bRet = true;
|
|
}
|
|
if (m_xForbiddenRulesCB->get_sensitive() && m_xForbiddenRulesCB->get_state_changed_from_saved())
|
|
{
|
|
std::unique_ptr<SfxBoolItem> pNewItem(static_cast<SfxBoolItem*>(rSet->Get(
|
|
pPool->GetWhichIDFromSlotID(SID_ATTR_PARA_FORBIDDEN_RULES)).Clone()));
|
|
pNewItem->SetValue(m_xForbiddenRulesCB->get_active());
|
|
rSet->Put(std::move(pNewItem));
|
|
bRet = true;
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
static void lcl_SetBox(const SfxItemSet& rSet, sal_uInt16 nSlotId, weld::CheckButton& rBox)
|
|
{
|
|
sal_uInt16 _nWhich = rSet.GetPool()->GetWhichIDFromSlotID(nSlotId);
|
|
SfxItemState eState = rSet.GetItemState(_nWhich);
|
|
if( eState == SfxItemState::UNKNOWN || eState == SfxItemState::DISABLED )
|
|
rBox.set_sensitive(false);
|
|
else if(eState >= SfxItemState::DEFAULT)
|
|
rBox.set_active(static_cast<const SfxBoolItem&>(rSet.Get(_nWhich)).GetValue());
|
|
else
|
|
rBox.set_state(TRISTATE_INDET);
|
|
rBox.save_state();
|
|
}
|
|
|
|
void SvxAsianTabPage::Reset( const SfxItemSet* rSet )
|
|
{
|
|
lcl_SetBox(*rSet, SID_ATTR_PARA_FORBIDDEN_RULES, *m_xForbiddenRulesCB );
|
|
lcl_SetBox(*rSet, SID_ATTR_PARA_HANGPUNCTUATION, *m_xHangingPunctCB );
|
|
|
|
//character distance not yet available
|
|
lcl_SetBox(*rSet, SID_ATTR_PARA_SCRIPTSPACE, *m_xScriptSpaceCB );
|
|
}
|
|
|
|
void SvxAsianTabPage::ChangesApplied()
|
|
{
|
|
m_xForbiddenRulesCB->save_state();
|
|
m_xHangingPunctCB->save_state();
|
|
m_xScriptSpaceCB->save_state();
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|