/* -*- 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 <uinums.hxx>
#include <unotools/pathoptions.hxx>
#include <tools/stream.hxx>
#include <sfx2/docfile.hxx>
#include <svl/itemiter.hxx>
#include <swtypes.hxx>
#include <utility>
#include <wrtsh.hxx>
#include <poolfmt.hxx>
#include <charfmt.hxx>
using namespace ::com::sun::star;
constexpr OUString CHAPTER_FILENAME = u"chapter.cfg" _ustr;
/*
Description : Saving a rule
Parameter : rCopy - - the rule to save
nIdx - - position , where the rule is to be saved .
An old rule at that position will be overwritten .
*/
SwChapterNumRules::SwChapterNumRules()
{
Init();
}
void SwChapterNumRules::Save()
{
INetURLObject aURL;
SvtPathOptions aPathOpt;
aURL.SetSmartURL( aPathOpt.GetUserConfigPath() );
aURL.setFinalSlash();
aURL.Append(CHAPTER_FILENAME);
SfxMedium aMedium( aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE), StreamMode::WRITE );
SvStream* pStream = aMedium.GetOutStream();
bool bRet = (pStream && pStream->GetError() == ERRCODE_NONE);
if (bRet)
{
sw::ExportStoredChapterNumberingRules(*this , *pStream,CHAPTER_FILENAME);
pStream->FlushBuffer();
aMedium.Commit();
}
}
SwChapterNumRules::~SwChapterNumRules()
{
}
void SwChapterNumRules::Init()
{
for (auto & rpNumRule : m_pNumRules)
rpNumRule.reset();
OUString sNm(CHAPTER_FILENAME);
SvtPathOptions aOpt;
if ( aOpt.SearchFile( sNm ))
{
SfxMedium aStrm( sNm, StreamMode::STD_READ );
sw::ImportStoredChapterNumberingRules(*this , *aStrm.GetInStream(),
CHAPTER_FILENAME);
}
}
void SwChapterNumRules::CreateEmptyNumRule(sal_uInt16 const nIndex)
{
assert(nIndex < nMaxRules);
assert(!m_pNumRules[nIndex]);
m_pNumRules[nIndex].reset(new SwNumRulesWithName);
}
void SwChapterNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 nIdx)
{
assert(nIdx < nMaxRules);
if ( !m_pNumRules[nIdx] )
m_pNumRules[nIdx].reset(new SwNumRulesWithName( rCopy ));
else
*m_pNumRules[nIdx] = rCopy;
Save(); // store it immediately
}
SwNumRulesWithName::SwNumRulesWithName( const SwNumRule &rCopy,
OUString aName )
: maName(std::move(aName))
{
for ( sal_uInt16 n = 0 ; n < MAXLEVEL; ++n )
{
const SwNumFormat* pFormat = rCopy.GetNumFormat( n );
if ( pFormat )
m_aFormats[ n ].reset(new SwNumFormatGlobal( *pFormat ));
else
m_aFormats[ n ].reset();
}
}
SwNumRulesWithName::SwNumRulesWithName( const SwNumRulesWithName& rCopy )
{
*this = rCopy;
}
SwNumRulesWithName::~SwNumRulesWithName()
{
}
SwNumRulesWithName& SwNumRulesWithName::operator =(const SwNumRulesWithName &rCopy)
{
if ( this != &rCopy )
{
maName = rCopy.maName;
for ( int n = 0 ; n < MAXLEVEL; ++n )
{
SwNumFormatGlobal* pFormat = rCopy.m_aFormats[ n ].get();
if ( pFormat )
m_aFormats[ n ].reset(new SwNumFormatGlobal( *pFormat ));
else
m_aFormats[ n ].reset();
}
}
return *this ;
}
void SwNumRulesWithName::ResetNumRule(SwWrtShell& rSh, SwNumRule& rNumRule) const
{
// #i89178#
rNumRule.Reset(maName);
rNumRule.SetAutoRule( false );
for (sal_uInt16 n = 0 ; n < MAXLEVEL; ++n)
{
SwNumFormatGlobal* pFormat = m_aFormats[ n ].get();
if (!pFormat)
continue ;
rNumRule.Set(n, pFormat->MakeNumFormat(rSh));
}
}
void SwNumRulesWithName::GetNumFormat(
size_t const nIndex, SwNumFormat const *& rpNumFormat, UIName const *& rpName) const
{
rpNumFormat = (m_aFormats[nIndex]) ? &m_aFormats[nIndex]->m_aFormat : nullptr;
rpName = (m_aFormats[nIndex]) ? &m_aFormats[nIndex]->m_sCharFormatName : nullptr;
}
void SwNumRulesWithName::SetNumFormat(
size_t const nIndex, SwNumFormat const & rNumFormat, UIName const & rName)
{
m_aFormats[nIndex].reset( new SwNumFormatGlobal(rNumFormat) );
m_aFormats[nIndex]->m_sCharFormatName = rName;
m_aFormats[nIndex]->m_nCharPoolId = USHRT_MAX;
m_aFormats[nIndex]->m_Items.clear();
}
SwNumRulesWithName::SwNumFormatGlobal::SwNumFormatGlobal( const SwNumFormat& rFormat )
: m_aFormat( rFormat ), m_nCharPoolId( USHRT_MAX )
{
// relative gaps?????
SwCharFormat* pFormat = rFormat.GetCharFormat();
if ( !pFormat )
return ;
m_sCharFormatName = pFormat->GetName();
m_nCharPoolId = pFormat->GetPoolFormatId();
if ( pFormat->GetAttrSet().Count() )
{
SfxItemIter aIter( pFormat->GetAttrSet() );
const SfxPoolItem *pCurr = aIter.GetCurItem();
do
{
m_Items.push_back(std::unique_ptr<SfxPoolItem>(pCurr->Clone()));
pCurr = aIter.NextItem();
} while (pCurr);
}
m_aFormat.SetCharFormat( nullptr );
}
SwNumRulesWithName::SwNumFormatGlobal::SwNumFormatGlobal( const SwNumFormatGlobal& rFormat )
:
m_aFormat( rFormat.m_aFormat ),
m_sCharFormatName( rFormat.m_sCharFormatName ),
m_nCharPoolId( rFormat.m_nCharPoolId )
{
for (size_t n = rFormat.m_Items.size(); n; )
{
m_Items.push_back(std::unique_ptr<SfxPoolItem>(rFormat.m_Items[ --n ]->Clone()));
}
}
SwNumRulesWithName::SwNumFormatGlobal::~SwNumFormatGlobal()
{
}
SwNumFormat SwNumRulesWithName::SwNumFormatGlobal::MakeNumFormat(SwWrtShell& rSh) const
{
SwCharFormat* pFormat = nullptr;
if ( !m_sCharFormatName.isEmpty() )
{
// at first, look for the name
sal_uInt16 nArrLen = rSh.GetCharFormatCount();
for ( sal_uInt16 i = 1 ; i < nArrLen; ++i )
{
pFormat = &rSh.GetCharFormat( i );
if (pFormat->GetName()==m_sCharFormatName)
// exists, so leave attributes as they are!
break ;
pFormat = nullptr;
}
if ( !pFormat )
{
if ( IsPoolUserFormat( m_nCharPoolId ) )
{
pFormat = rSh.MakeCharFormat( m_sCharFormatName );
pFormat->SetAuto(false );
}
else
pFormat = rSh.GetCharFormatFromPool( m_nCharPoolId );
if ( !pFormat->HasWriterListeners() ) // set attributes
{
for (size_t n = m_Items.size(); n; )
{
pFormat->SetFormatAttr( *m_Items[ --n ] );
}
}
}
}
const_cast <SwNumFormat&>(m_aFormat).SetCharFormat(pFormat);
SwNumFormat aNew = m_aFormat;
if (pFormat)
const_cast <SwNumFormat&>(m_aFormat).SetCharFormat(nullptr);
return aNew;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Messung V0.5 in Prozent C=95 H=86 G=90
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.4Bemerkung:
¤
*Bot Zugriff