323 lines
10 KiB
C++
323 lines
10 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 <cassert>
|
|
|
|
#include <hintids.hxx>
|
|
#include <i18nlangtag/mslangid.hxx>
|
|
#include <editeng/boxitem.hxx>
|
|
#include <editeng/frmdiritem.hxx>
|
|
#include <osl/diagnose.h>
|
|
#include <doc.hxx>
|
|
#include <IDocumentState.hxx>
|
|
#include <IDocumentStylePoolAccess.hxx>
|
|
#include <IDocumentListsAccess.hxx>
|
|
#include <list.hxx>
|
|
#include <poolfmt.hxx>
|
|
#include <pagedesc.hxx>
|
|
#include <fmtcol.hxx>
|
|
#include <numrule.hxx>
|
|
#include <swtable.hxx>
|
|
#include <tblafmt.hxx>
|
|
#include <hints.hxx>
|
|
|
|
using namespace ::com::sun::star;
|
|
|
|
void SetAllScriptItem( SfxItemSet& rSet, const SfxPoolItem& rItem )
|
|
{
|
|
rSet.Put( rItem );
|
|
sal_uInt16 nWhCJK = 0, nWhCTL = 0;
|
|
switch( rItem.Which() )
|
|
{
|
|
case RES_CHRATR_FONTSIZE:
|
|
nWhCJK = RES_CHRATR_CJK_FONTSIZE;
|
|
nWhCTL = RES_CHRATR_CTL_FONTSIZE;
|
|
break;
|
|
case RES_CHRATR_FONT:
|
|
nWhCJK = RES_CHRATR_CJK_FONT;
|
|
nWhCTL = RES_CHRATR_CTL_FONT;
|
|
break;
|
|
case RES_CHRATR_LANGUAGE:
|
|
nWhCJK = RES_CHRATR_CJK_LANGUAGE;
|
|
nWhCTL = RES_CHRATR_CTL_LANGUAGE;
|
|
break;
|
|
case RES_CHRATR_POSTURE:
|
|
nWhCJK = RES_CHRATR_CJK_POSTURE;
|
|
nWhCTL = RES_CHRATR_CTL_POSTURE;
|
|
break;
|
|
case RES_CHRATR_WEIGHT:
|
|
nWhCJK = RES_CHRATR_CJK_WEIGHT;
|
|
nWhCTL = RES_CHRATR_CTL_WEIGHT;
|
|
break;
|
|
}
|
|
|
|
if( nWhCJK )
|
|
rSet.Put( rItem.CloneSetWhich(nWhCJK) );
|
|
if( nWhCTL )
|
|
rSet.Put( rItem.CloneSetWhich(nWhCTL) );
|
|
}
|
|
|
|
/// Return the AutoCollection by its Id. If it doesn't
|
|
/// exist yet, create it.
|
|
/// If the String pointer is defined, then only query for
|
|
/// the Attribute descriptions. It doesn't create a style!
|
|
SvxFrameDirection GetDefaultFrameDirection(LanguageType nLanguage)
|
|
{
|
|
return MsLangId::isRightToLeft(nLanguage) ?
|
|
SvxFrameDirection::Horizontal_RL_TB : SvxFrameDirection::Horizontal_LR_TB;
|
|
}
|
|
|
|
namespace {
|
|
#ifndef NDEBUG
|
|
bool lcl_isValidUsedStyle(const sw::BroadcastingModify* pModify)
|
|
{
|
|
const bool isParaStyle = dynamic_cast<const SwTextFormatColl*>(pModify);
|
|
const bool isCharStyle = dynamic_cast<const SwCharFormat*>(pModify);
|
|
const bool isFrameStyle = dynamic_cast<const SwFrameFormat*>(pModify);
|
|
const bool isFieldType = dynamic_cast<const SwFieldType*>(pModify); // just for insanity's sake, this is also used on FieldTypes
|
|
return isParaStyle || isCharStyle || isFrameStyle || isFieldType;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
// See if the Paragraph/Character/Frame style or Field Type is in use
|
|
bool SwDoc::IsUsed( const sw::BroadcastingModify& rModify ) const
|
|
{
|
|
assert(lcl_isValidUsedStyle(&rModify));
|
|
|
|
// Check if we have dependent ContentNodes in the Nodes array
|
|
// (also indirect ones for derived Formats)
|
|
bool isUsed = false;
|
|
sw::AutoFormatUsedHint aHint(isUsed, GetNodes());
|
|
rModify.CallSwClientNotify(aHint);
|
|
return isUsed;
|
|
}
|
|
|
|
// See if Table style is in use
|
|
bool SwDoc::IsUsed( const SwTableAutoFormat& rTableAutoFormat) const
|
|
{
|
|
size_t nTableCount = GetTableFrameFormatCount(true);
|
|
for (size_t i=0; i < nTableCount; ++i)
|
|
{
|
|
SwFrameFormat* pFrameFormat = &GetTableFrameFormat(i, true);
|
|
SwTable* pTable = SwTable::FindTable(pFrameFormat);
|
|
if (pTable->GetTableStyleName() == rTableAutoFormat.GetName())
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// See if the NumRule is used
|
|
bool SwDoc::IsUsed( const SwNumRule& rRule ) const
|
|
{
|
|
SwList const*const pList(getIDocumentListsAccess().getListByName(rRule.GetDefaultListId()));
|
|
bool bUsed = rRule.GetTextNodeListSize() > 0 ||
|
|
rRule.GetParagraphStyleListSize() > 0 ||
|
|
rRule.IsUsedByRedline()
|
|
// tdf#135014 default num rule is used if any associated num rule is used
|
|
|| (pList
|
|
&& pList->GetDefaultListStyleName() == rRule.GetName()
|
|
&& pList->HasNodes());
|
|
|
|
return bUsed;
|
|
}
|
|
|
|
const OUString* SwDoc::GetDocPattern(size_t const nPos) const
|
|
{
|
|
if (nPos >= m_PatternNames.size())
|
|
return nullptr;
|
|
return &m_PatternNames[nPos];
|
|
}
|
|
|
|
// Look for the style name's position. If it doesn't exist,
|
|
// insert an anew
|
|
size_t SwDoc::SetDocPattern(const OUString& rPatternName)
|
|
{
|
|
OSL_ENSURE( !rPatternName.isEmpty(), "no Document style name" );
|
|
|
|
auto const iter(
|
|
std::find(m_PatternNames.begin(), m_PatternNames.end(), rPatternName));
|
|
if (iter != m_PatternNames.end())
|
|
{
|
|
return std::distance(m_PatternNames.begin(), iter);
|
|
}
|
|
else
|
|
{
|
|
m_PatternNames.push_back(rPatternName);
|
|
getIDocumentState().SetModified();
|
|
return m_PatternNames.size() - 1;
|
|
}
|
|
}
|
|
|
|
sal_uInt16 GetPoolParent( sal_uInt16 nId )
|
|
{
|
|
sal_uInt16 nRet = USHRT_MAX;
|
|
if( POOLGRP_NOCOLLID & nId ) // 1 == Formats / 0 == Collections
|
|
{
|
|
switch( ( COLL_GET_RANGE_BITS | POOLGRP_NOCOLLID ) & nId )
|
|
{
|
|
case POOLGRP_CHARFMT:
|
|
case POOLGRP_FRAMEFMT:
|
|
nRet = 0; // derived from the default
|
|
break;
|
|
case POOLGRP_PAGEDESC:
|
|
case POOLGRP_NUMRULE:
|
|
break; // there are no derivations
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch( COLL_GET_RANGE_BITS & nId )
|
|
{
|
|
case COLL_TEXT_BITS:
|
|
switch( nId )
|
|
{
|
|
case RES_POOLCOLL_STANDARD:
|
|
nRet = 0; break;
|
|
case RES_POOLCOLL_TEXT_IDENT:
|
|
case RES_POOLCOLL_TEXT_NEGIDENT:
|
|
case RES_POOLCOLL_TEXT_MOVE:
|
|
case RES_POOLCOLL_CONFRONTATION:
|
|
case RES_POOLCOLL_MARGINAL:
|
|
nRet = RES_POOLCOLL_TEXT; break;
|
|
|
|
case RES_POOLCOLL_TEXT:
|
|
case RES_POOLCOLL_GREETING:
|
|
case RES_POOLCOLL_SIGNATURE:
|
|
nRet = RES_POOLCOLL_STANDARD; break;
|
|
}
|
|
break;
|
|
|
|
case COLL_LISTS_BITS:
|
|
switch( nId )
|
|
{
|
|
case RES_POOLCOLL_NUMBER_BULLET_BASE:
|
|
nRet = RES_POOLCOLL_TEXT; break;
|
|
|
|
default:
|
|
nRet = RES_POOLCOLL_NUMBER_BULLET_BASE; break;
|
|
}
|
|
break;
|
|
|
|
case COLL_EXTRA_BITS:
|
|
switch( nId )
|
|
{
|
|
case RES_POOLCOLL_TABLE_HDLN:
|
|
nRet = RES_POOLCOLL_TABLE; break;
|
|
|
|
case RES_POOLCOLL_FRAME:
|
|
case RES_POOLCOLL_TABLE:
|
|
case RES_POOLCOLL_FOOTNOTE:
|
|
case RES_POOLCOLL_ENDNOTE:
|
|
case RES_POOLCOLL_ENVELOPE_ADDRESS:
|
|
case RES_POOLCOLL_SEND_ADDRESS:
|
|
case RES_POOLCOLL_HEADERFOOTER:
|
|
case RES_POOLCOLL_LABEL:
|
|
case RES_POOLCOLL_COMMENT:
|
|
nRet = RES_POOLCOLL_STANDARD; break;
|
|
case RES_POOLCOLL_HEADER:
|
|
nRet = RES_POOLCOLL_HEADERFOOTER; break;
|
|
case RES_POOLCOLL_HEADERL:
|
|
case RES_POOLCOLL_HEADERR:
|
|
nRet = RES_POOLCOLL_HEADER; break;
|
|
case RES_POOLCOLL_FOOTER:
|
|
nRet = RES_POOLCOLL_HEADERFOOTER; break;
|
|
case RES_POOLCOLL_FOOTERL:
|
|
case RES_POOLCOLL_FOOTERR:
|
|
nRet = RES_POOLCOLL_FOOTER; break;
|
|
|
|
case RES_POOLCOLL_LABEL_ABB:
|
|
case RES_POOLCOLL_LABEL_TABLE:
|
|
case RES_POOLCOLL_LABEL_FRAME:
|
|
case RES_POOLCOLL_LABEL_DRAWING:
|
|
case RES_POOLCOLL_LABEL_FIGURE:
|
|
nRet = RES_POOLCOLL_LABEL; break;
|
|
}
|
|
break;
|
|
|
|
case COLL_REGISTER_BITS:
|
|
switch( nId )
|
|
{
|
|
case RES_POOLCOLL_REGISTER_BASE:
|
|
nRet = RES_POOLCOLL_STANDARD; break;
|
|
|
|
case RES_POOLCOLL_TOX_IDXH:
|
|
nRet = RES_POOLCOLL_HEADLINE_BASE; break;
|
|
|
|
case RES_POOLCOLL_TOX_USERH:
|
|
case RES_POOLCOLL_TOX_CNTNTH:
|
|
case RES_POOLCOLL_TOX_ILLUSH:
|
|
case RES_POOLCOLL_TOX_OBJECTH:
|
|
case RES_POOLCOLL_TOX_TABLESH:
|
|
case RES_POOLCOLL_TOX_AUTHORITIESH:
|
|
nRet = RES_POOLCOLL_TOX_IDXH; break;
|
|
|
|
default:
|
|
nRet = RES_POOLCOLL_REGISTER_BASE; break;
|
|
}
|
|
break;
|
|
|
|
case COLL_DOC_BITS:
|
|
switch (nId)
|
|
{
|
|
case RES_POOLCOLL_HEADLINE_BASE:
|
|
nRet = RES_POOLCOLL_STANDARD;
|
|
break;
|
|
default:
|
|
nRet = RES_POOLCOLL_HEADLINE_BASE;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case COLL_HTML_BITS:
|
|
nRet = RES_POOLCOLL_STANDARD;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return nRet;
|
|
}
|
|
|
|
void SwDoc::RemoveAllFormatLanguageDependencies()
|
|
{
|
|
/* Restore the language independent pool defaults and styles. */
|
|
GetAttrPool().ResetUserDefaultItem( RES_PARATR_ADJUST );
|
|
|
|
SwTextFormatColl * pTextFormatColl = getIDocumentStylePoolAccess().GetTextCollFromPool( RES_POOLCOLL_STANDARD );
|
|
|
|
pTextFormatColl->ResetFormatAttr( RES_PARATR_ADJUST );
|
|
/* koreans do not like SvxScriptItem(TRUE) */
|
|
pTextFormatColl->ResetFormatAttr( RES_PARATR_SCRIPTSPACE );
|
|
|
|
SvxFrameDirectionItem aFrameDir( SvxFrameDirection::Horizontal_LR_TB, RES_FRAMEDIR );
|
|
|
|
size_t nCount = GetPageDescCnt();
|
|
for( size_t i=0; i<nCount; ++i )
|
|
{
|
|
SwPageDesc& rDesc = GetPageDesc( i );
|
|
rDesc.GetMaster().SetFormatAttr( aFrameDir );
|
|
rDesc.GetLeft().SetFormatAttr( aFrameDir );
|
|
}
|
|
|
|
//#i16874# AutoKerning as default for new documents
|
|
GetAttrPool().ResetUserDefaultItem( RES_CHRATR_AUTOKERN );
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|