diff options
Diffstat (limited to 'editeng/source/items/paraitem.cxx')
-rw-r--r-- | editeng/source/items/paraitem.cxx | 187 |
1 files changed, 162 insertions, 25 deletions
diff --git a/editeng/source/items/paraitem.cxx b/editeng/source/items/paraitem.cxx index 6f5e5f9acd80..4b55fa49026e 100644 --- a/editeng/source/items/paraitem.cxx +++ b/editeng/source/items/paraitem.cxx @@ -20,6 +20,7 @@ #include <com/sun/star/style/TabStop.hpp> #include <com/sun/star/style/LineSpacing.hpp> #include <com/sun/star/style/LineSpacingMode.hpp> +#include <com/sun/star/text/ParagraphHyphenationKeepType.hpp> #include <com/sun/star/uno/Sequence.hxx> #include <libxml/xmlwriter.h> #include <comphelper/extract.hxx> @@ -60,8 +61,8 @@ SfxPoolItem* SvxOrphansItem::CreateDefault() { return new SvxOrphansItem(0, 0); SfxPoolItem* SvxHyphenZoneItem::CreateDefault() { return new SvxHyphenZoneItem(false, 0);} SfxPoolItem* SvxTabStopItem::CreateDefault() { return new SvxTabStopItem(0);} SfxPoolItem* SvxFormatSplitItem::CreateDefault() { return new SvxFormatSplitItem(false, 0);} -SfxPoolItem* SvxPageModelItem::CreateDefault() { return new SvxPageModelItem(0);} -SfxPoolItem* SvxParaVertAlignItem::CreateDefault() { return new SvxParaVertAlignItem(Align::Automatic, 0);} +SfxPoolItem* SvxPageModelItem::CreateDefault() { return new SvxPageModelItem(TypedWhichId<SvxPageModelItem>(0));} +SfxPoolItem* SvxParaVertAlignItem::CreateDefault() { return new SvxParaVertAlignItem(Align::Automatic, TypedWhichId<SvxParaVertAlignItem>(0));} namespace { @@ -338,6 +339,12 @@ void SvxLineSpacingItem::SetEnumValue( sal_uInt16 nVal ) // class SvxAdjustItem --------------------------------------------------- +ItemInstanceManager* SvxAdjustItem::getItemInstanceManager() const +{ + static DefaultItemInstanceManager aInstanceManager(typeid(SvxAdjustItem).hash_code()); + return &aInstanceManager; +} + SvxAdjustItem::SvxAdjustItem(const SvxAdjust eAdjst, const sal_uInt16 nId ) : SfxEnumItemInterface( nId ), bOneBlock( false ), bLastCenter( false ), bLastBlock( false ) @@ -397,6 +404,7 @@ bool SvxAdjustItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) } break; case MID_EXPAND_SINGLE : + ASSERT_CHANGE_REFCOUNTED_ITEM; bOneBlock = Any2Bool(rVal); break; } @@ -553,11 +561,16 @@ bool SvxOrphansItem::GetPresentation SvxHyphenZoneItem::SvxHyphenZoneItem( const bool bHyph, const sal_uInt16 nId ) : SfxPoolItem( nId ), bHyphen(bHyph), - bPageEnd(true), + bKeep(false), bNoCapsHyphenation(false), + bNoLastWordHyphenation(false), nMinLead(0), nMinTrail(0), - nMaxHyphens(255) + nMaxHyphens(255), + nMinWordLength(0), + nTextHyphenZone(0), + nKeepType(css::text::ParagraphHyphenationKeepType::COLUMN), + nCompoundMinLead(0) { } @@ -570,6 +583,9 @@ bool SvxHyphenZoneItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) con case MID_IS_HYPHEN: rVal <<= bHyphen; break; + case MID_HYPHEN_KEEP: + rVal <<= bKeep; + break; case MID_HYPHEN_MIN_LEAD: rVal <<= static_cast<sal_Int16>(nMinLead); break; @@ -582,6 +598,21 @@ bool SvxHyphenZoneItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) con case MID_HYPHEN_NO_CAPS: rVal <<= bNoCapsHyphenation; break; + case MID_HYPHEN_NO_LAST_WORD: + rVal <<= bNoLastWordHyphenation; + break; + case MID_HYPHEN_MIN_WORD_LENGTH: + rVal <<= static_cast<sal_Int16>(nMinWordLength); + break; + case MID_HYPHEN_ZONE: + rVal <<= static_cast<sal_Int16>(nTextHyphenZone); + break; + case MID_HYPHEN_KEEP_TYPE: + rVal <<= static_cast<sal_Int16>(nKeepType); + break; + case MID_HYPHEN_COMPOUND_MIN_LEAD: + rVal <<= static_cast<sal_Int16>(nCompoundMinLead); + break; } return true; } @@ -589,17 +620,23 @@ bool SvxHyphenZoneItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) con bool SvxHyphenZoneItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) { nMemberId &= ~CONVERT_TWIPS; - sal_Int16 nNewVal = 0; + sal_Int32 nNewVal = 0; // sal_Int32 needs for MID_HYPHEN_KEEP_TYPE - if( nMemberId != MID_IS_HYPHEN && nMemberId != MID_HYPHEN_NO_CAPS ) + if( nMemberId != MID_IS_HYPHEN && nMemberId != MID_HYPHEN_NO_CAPS && + nMemberId != MID_HYPHEN_NO_LAST_WORD && nMemberId != MID_HYPHEN_KEEP ) + { if(!(rVal >>= nNewVal)) return false; + } switch(nMemberId) { case MID_IS_HYPHEN: bHyphen = Any2Bool(rVal); break; + case MID_HYPHEN_KEEP: + bKeep = Any2Bool(rVal); + break; case MID_HYPHEN_MIN_LEAD: nMinLead = static_cast<sal_uInt8>(nNewVal); break; @@ -612,6 +649,21 @@ bool SvxHyphenZoneItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) case MID_HYPHEN_NO_CAPS: bNoCapsHyphenation = Any2Bool(rVal); break; + case MID_HYPHEN_NO_LAST_WORD: + bNoLastWordHyphenation = Any2Bool(rVal); + break; + case MID_HYPHEN_MIN_WORD_LENGTH: + nMinWordLength = static_cast<sal_uInt8>(nNewVal); + break; + case MID_HYPHEN_ZONE: + nTextHyphenZone = nNewVal; + break; + case MID_HYPHEN_KEEP_TYPE: + nKeepType = static_cast<sal_uInt8>(nNewVal); + break; + case MID_HYPHEN_COMPOUND_MIN_LEAD: + nCompoundMinLead = static_cast<sal_uInt8>(nNewVal); + break; } return true; } @@ -624,10 +676,15 @@ bool SvxHyphenZoneItem::operator==( const SfxPoolItem& rAttr ) const const SvxHyphenZoneItem& rItem = static_cast<const SvxHyphenZoneItem&>(rAttr); return ( rItem.bHyphen == bHyphen && rItem.bNoCapsHyphenation == bNoCapsHyphenation - && rItem.bPageEnd == bPageEnd + && rItem.bNoLastWordHyphenation == bNoLastWordHyphenation + && rItem.bKeep == bKeep && rItem.nMinLead == nMinLead && rItem.nMinTrail == nMinTrail - && rItem.nMaxHyphens == nMaxHyphens ); + && rItem.nCompoundMinLead == nCompoundMinLead + && rItem.nMaxHyphens == nMaxHyphens + && rItem.nMinWordLength == nMinWordLength + && rItem.nTextHyphenZone == nTextHyphenZone + && rItem.nKeepType == nKeepType ); } SvxHyphenZoneItem* SvxHyphenZoneItem::Clone( SfxItemPool * ) const @@ -638,9 +695,9 @@ SvxHyphenZoneItem* SvxHyphenZoneItem::Clone( SfxItemPool * ) const bool SvxHyphenZoneItem::GetPresentation ( SfxItemPresentation ePres, - MapUnit /*eCoreUnit*/, - MapUnit /*ePresUnit*/, - OUString& rText, const IntlWrapper& + MapUnit eCoreUnit, + MapUnit ePresUnit, + OUString& rText, const IntlWrapper& rIntl ) const { OUString cpDelimTmp(cpDelim); @@ -649,18 +706,28 @@ bool SvxHyphenZoneItem::GetPresentation case SfxItemPresentation::Nameless: { TranslateId pId = RID_SVXITEMS_HYPHEN_FALSE; - if ( bHyphen ) pId = RID_SVXITEMS_HYPHEN_TRUE; - rText = EditResId(pId) + cpDelimTmp; - pId = RID_SVXITEMS_PAGE_END_FALSE; - - if ( bPageEnd ) - pId = RID_SVXITEMS_PAGE_END_TRUE; rText += EditResId(pId) + cpDelimTmp + OUString::number( nMinLead ) + cpDelimTmp + OUString::number( nMinTrail ) + cpDelimTmp + - OUString::number( nMaxHyphens ); + OUString::number( nCompoundMinLead ) + cpDelimTmp + + OUString::number( nMaxHyphens ) + cpDelimTmp + + OUString::number( nMinWordLength ) + cpDelimTmp + + GetMetricText( nTextHyphenZone, eCoreUnit, ePresUnit, &rIntl ) + + " " + EditResId(GetMetricId(ePresUnit)); + + if ( bNoCapsHyphenation ) + rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_NO_CAPS_TRUE); + + if ( bNoLastWordHyphenation ) + rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_LAST_WORD_TRUE); + + if ( bKeep ) + rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_TRUE) + + cpDelimTmp + OUString::number( nKeepType ); + else + rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_FALSE); return true; } case SfxItemPresentation::Complete: @@ -669,18 +736,56 @@ bool SvxHyphenZoneItem::GetPresentation if ( bHyphen ) pId = RID_SVXITEMS_HYPHEN_TRUE; - rText = EditResId(pId) + cpDelimTmp; - pId = RID_SVXITEMS_PAGE_END_FALSE; - - if ( bPageEnd ) - pId = RID_SVXITEMS_PAGE_END_TRUE; rText += EditResId(pId) + cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_MINLEAD).replaceAll("%1", OUString::number(nMinLead)) + cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_MINTRAIL).replaceAll("%1", OUString::number(nMinTrail)) + cpDelimTmp + - EditResId(RID_SVXITEMS_HYPHEN_MAX).replaceAll("%1", OUString::number(nMaxHyphens)); + EditResId(RID_SVXITEMS_HYPHEN_COMPOUND_MINLEAD).replaceAll("%1", OUString::number(nCompoundMinLead)) + + cpDelimTmp + + EditResId(RID_SVXITEMS_HYPHEN_MAX).replaceAll("%1", OUString::number(nMaxHyphens)) + + cpDelimTmp + + EditResId(RID_SVXITEMS_HYPHEN_MINWORDLEN).replaceAll("%1", OUString::number(nMinWordLength)); + + if ( nTextHyphenZone > 0 ) + { + rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_ZONE) + + GetMetricText( nTextHyphenZone, eCoreUnit, ePresUnit, &rIntl ) + + " " + EditResId(GetMetricId(ePresUnit)); + } + + if ( bNoCapsHyphenation ) + rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_NO_CAPS_TRUE); + + if ( bNoLastWordHyphenation ) + rText += cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_LAST_WORD_TRUE); + + if ( bKeep ) + { + rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_TRUE) + cpDelimTmp; + switch ( nKeepType ) + { + case 0: + rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_AUTO); + break; + case 1: + rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_SPREAD); + break; + case 2: + rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_PAGE); + break; + case 3: + rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_COLUMN); + break; + case 4: + rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_ALWAYS); + break; + } + } + else + rText += EditResId(RID_SVXITEMS_HYPHEN_KEEP_FALSE); + return true; } default: ;//prevent warning @@ -768,6 +873,15 @@ sal_uInt16 SvxTabStopItem::GetPos( const sal_Int32 nPos ) const return it != maTabStops.end() ? it - maTabStops.begin() : SVX_TAB_NOTFOUND; } +void SvxTabStopItem::SetDefaultDistance(sal_Int32 nDefaultDistance) +{ + mnDefaultDistance = nDefaultDistance; +} + +sal_Int32 SvxTabStopItem::GetDefaultDistance() const +{ + return mnDefaultDistance; +} bool SvxTabStopItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const { @@ -806,6 +920,11 @@ bool SvxTabStopItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const rVal <<= static_cast<sal_Int32>(bConvert ? convertTwipToMm100(rTab.GetTabPos()) : rTab.GetTabPos()); break; } + case MID_TABSTOP_DEFAULT_DISTANCE: + { + rVal <<= static_cast<sal_Int32>(bConvert ? convertTwipToMm100(mnDefaultDistance) : mnDefaultDistance); + break; + } } return true; } @@ -903,6 +1022,18 @@ bool SvxTabStopItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) Insert( aNewTab ); break; } + case MID_TABSTOP_DEFAULT_DISTANCE: + { + sal_Int32 nNewDefaultDistance = 0; + if (!(rVal >>= nNewDefaultDistance)) + return false; + if (bConvert) + nNewDefaultDistance = o3tl::toTwips(nNewDefaultDistance, o3tl::Length::mm100); + if (nNewDefaultDistance < 0) + return false; + mnDefaultDistance = nNewDefaultDistance; + break; + } } return true; } @@ -914,6 +1045,9 @@ bool SvxTabStopItem::operator==( const SfxPoolItem& rAttr ) const const SvxTabStopItem& rTSI = static_cast<const SvxTabStopItem&>(rAttr); + if ( mnDefaultDistance != rTSI.GetDefaultDistance() ) + return false; + if ( Count() != rTSI.Count() ) return false; @@ -937,6 +1071,7 @@ bool SvxTabStopItem::GetPresentation ) const { rText.clear(); + // TODO also consider mnDefaultTabDistance here bool bComma = false; @@ -985,6 +1120,8 @@ void SvxTabStopItem::Insert( const SvxTabStopItem* pTabs ) void SvxTabStopItem::dumpAsXml(xmlTextWriterPtr pWriter) const { (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SvxTabStopItem")); + (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("mnDefaultDistance"), + BAD_CAST(OString::number(mnDefaultDistance).getStr())); for (const auto& rTabStop : maTabStops) rTabStop.dumpAsXml(pWriter); (void)xmlTextWriterEndElement(pWriter); @@ -1158,7 +1295,7 @@ bool SvxForbiddenRuleItem::GetPresentation( *************************************************************************/ SvxParaVertAlignItem::SvxParaVertAlignItem( Align nValue, - const sal_uInt16 nW ) + TypedWhichId<SvxParaVertAlignItem> nW ) : SfxUInt16Item( nW, static_cast<sal_uInt16>(nValue) ) { } |