2010-10-14 08:30:41 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2011-03-31 10:05:04 +02:00
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2011-03-31 10:05:04 +02:00
|
|
|
* 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/.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2011-03-31 10:05:04 +02:00
|
|
|
* This file incorporates work covered by the following license notice:
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2011-03-31 10:05:04 +02:00
|
|
|
* 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 .
|
|
|
|
*/
|
2006-09-16 19:54:01 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <hintids.hxx>
|
2011-03-31 10:05:04 +02:00
|
|
|
#include <rtl/random.h>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <tools/resid.hxx>
|
2010-01-08 18:32:51 +01:00
|
|
|
#include <editeng/lrspitem.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <ftninfo.hxx>
|
|
|
|
#include <ftnidx.hxx>
|
|
|
|
#include <doc.hxx>
|
2010-11-25 14:31:08 +01:00
|
|
|
#include <IDocumentUndoRedo.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <pam.hxx>
|
|
|
|
#include <ndtxt.hxx>
|
2013-10-22 15:58:57 +03:00
|
|
|
#include <doctxm.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <poolfmt.hxx>
|
2010-12-15 09:14:14 +01:00
|
|
|
#include <UndoCore.hxx>
|
2010-12-15 09:14:16 +01:00
|
|
|
#include <UndoRedline.hxx>
|
2010-12-15 09:14:15 +01:00
|
|
|
#include <UndoNumbering.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <swundo.hxx>
|
2004-10-22 07:11:47 +00:00
|
|
|
#include <SwUndoFmt.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <rolbck.hxx>
|
|
|
|
#include <paratr.hxx>
|
|
|
|
#include <docary.hxx>
|
|
|
|
#include <mvsave.hxx>
|
|
|
|
#include <txtfrm.hxx>
|
|
|
|
#include <pamtyp.hxx>
|
|
|
|
#include <redline.hxx>
|
|
|
|
#include <comcore.hrc>
|
2013-02-12 13:41:53 -05:00
|
|
|
#include <editeng/adjustitem.hxx>
|
2010-01-08 18:32:51 +01:00
|
|
|
#include <editeng/frmdiritem.hxx>
|
2003-09-04 10:46:01 +00:00
|
|
|
#include <frmatr.hxx>
|
2005-11-08 16:16:30 +00:00
|
|
|
#include <SwStyleNameMapper.hxx>
|
2008-06-13 08:35:27 +00:00
|
|
|
#include <SwNodeNum.hxx>
|
|
|
|
#include <list.hxx>
|
|
|
|
#include <listfunc.hxx>
|
2010-12-17 09:02:23 +01:00
|
|
|
#include <switerator.hxx>
|
2011-08-14 01:37:52 +01:00
|
|
|
#include <comphelper/string.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2005-01-25 12:59:21 +00:00
|
|
|
#include <map>
|
|
|
|
|
2011-06-10 15:46:15 +01:00
|
|
|
namespace {
|
|
|
|
static void lcl_ResetIndentAttrs(SwDoc *pDoc, const SwPaM &rPam, sal_uInt16 marker )
|
|
|
|
{
|
|
|
|
std::set<sal_uInt16> aResetAttrsArray;
|
|
|
|
aResetAttrsArray.insert( marker );
|
|
|
|
// #i114929#
|
|
|
|
// On a selection setup a corresponding Point-and-Mark in order to get
|
|
|
|
// the indentation attribute reset on all paragraphs touched by the selection
|
|
|
|
if ( rPam.HasMark() &&
|
|
|
|
rPam.End()->nNode.GetNode().GetTxtNode() )
|
|
|
|
{
|
|
|
|
SwPaM aPam( rPam.Start()->nNode,
|
|
|
|
rPam.End()->nNode );
|
|
|
|
aPam.Start()->nContent = 0;
|
|
|
|
aPam.End()->nContent = rPam.End()->nNode.GetNode().GetTxtNode()->Len();
|
2012-10-23 18:35:04 +09:00
|
|
|
pDoc->ResetAttrs( aPam, false, aResetAttrsArray );
|
2011-06-10 15:46:15 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-10-23 18:35:04 +09:00
|
|
|
pDoc->ResetAttrs( rPam, false, aResetAttrsArray );
|
2011-06-10 15:46:15 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-27 17:30:49 +02:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
inline sal_uInt8 GetUpperLvlChg( sal_uInt8 nCurLvl, sal_uInt8 nLevel, sal_uInt16 nMask )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if( 1 < nLevel )
|
|
|
|
{
|
|
|
|
if( nCurLvl + 1 >= nLevel )
|
|
|
|
nCurLvl -= nLevel - 1;
|
|
|
|
else
|
|
|
|
nCurLvl = 0;
|
|
|
|
}
|
2011-01-17 15:06:54 +01:00
|
|
|
return static_cast<sal_uInt8>((nMask - 1) & ~(( 1 << nCurLvl ) - 1));
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::SetOutlineNumRule( const SwNumRule& rRule )
|
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
if( mpOutlineRule )
|
|
|
|
(*mpOutlineRule) = rRule;
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
mpOutlineRule = new SwNumRule( rRule );
|
2004-03-30 15:05:30 +00:00
|
|
|
|
2013-02-18 07:54:37 +01:00
|
|
|
AddNumRule(mpOutlineRule); // #i36749#
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2004-03-30 15:05:30 +00:00
|
|
|
|
2013-02-18 07:54:37 +01:00
|
|
|
mpOutlineRule->SetRuleType( OUTLINE_RULE );
|
2013-08-21 08:58:16 +02:00
|
|
|
mpOutlineRule->SetName(SwNumRule::GetOutlineRuleName(), *this);
|
2010-10-18 12:55:43 +01:00
|
|
|
|
2006-10-13 11:19:38 +00:00
|
|
|
// assure that the outline numbering rule is an automatic rule
|
2013-02-18 07:54:37 +01:00
|
|
|
mpOutlineRule->SetAutoRule( sal_True );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// test whether the optional CharFormats are defined in this Document
|
2013-02-18 07:54:37 +01:00
|
|
|
mpOutlineRule->CheckCharFmts( this );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
// notify text nodes, which are registered at the outline style, about the
|
|
|
|
// changed outline style
|
|
|
|
SwNumRule::tTxtNodeList aTxtNodeList;
|
2013-02-18 07:54:37 +01:00
|
|
|
mpOutlineRule->GetTxtNodeList( aTxtNodeList );
|
2008-06-13 08:35:27 +00:00
|
|
|
for ( SwNumRule::tTxtNodeList::iterator aIter = aTxtNodeList.begin();
|
|
|
|
aIter != aTxtNodeList.end(); ++aIter )
|
|
|
|
{
|
|
|
|
SwTxtNode* pTxtNd = *aIter;
|
|
|
|
pTxtNd->NumRuleChgd();
|
2010-10-18 12:55:43 +01:00
|
|
|
|
2009-02-13 10:05:35 +00:00
|
|
|
// assure that list level corresponds to outline level
|
|
|
|
if ( pTxtNd->GetTxtColl()->IsAssignedToListLevelOfOutlineStyle() &&
|
|
|
|
pTxtNd->GetAttrListLevel() != pTxtNd->GetTxtColl()->GetAssignedOutlineStyleLevel() )
|
|
|
|
{
|
|
|
|
pTxtNd->SetAttrListLevel( pTxtNd->GetTxtColl()->GetAssignedOutlineStyleLevel() );
|
|
|
|
}
|
2008-06-13 08:35:27 +00:00
|
|
|
}
|
|
|
|
|
2005-02-21 15:15:34 +00:00
|
|
|
PropagateOutlineRule();
|
2013-02-18 07:54:37 +01:00
|
|
|
mpOutlineRule->SetInvalidRule(sal_True);
|
2005-02-21 15:15:34 +00:00
|
|
|
UpdateNumRule();
|
2005-09-28 10:05:22 +00:00
|
|
|
|
2012-10-13 22:20:33 +02:00
|
|
|
// update if we have foot notes && numbering by chapter
|
2012-07-19 14:07:52 +02:00
|
|
|
if( !GetFtnIdxs().empty() && FTNNUM_CHAPTER == GetFtnInfo().eNum )
|
2005-09-28 10:05:22 +00:00
|
|
|
GetFtnIdxs().UpdateAllFtn();
|
|
|
|
|
2006-08-14 14:59:04 +00:00
|
|
|
UpdateExpFlds(NULL, true);
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
SetModified();
|
|
|
|
}
|
|
|
|
|
2004-12-08 16:41:03 +00:00
|
|
|
void SwDoc::PropagateOutlineRule()
|
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
for (sal_uInt16 n = 0; n < mpTxtFmtCollTbl->size(); n++)
|
2004-12-08 16:41:03 +00:00
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
SwTxtFmtColl *pColl = (*mpTxtFmtCollTbl)[n];
|
2004-12-08 16:41:03 +00:00
|
|
|
|
2013-09-27 14:40:18 +02:00
|
|
|
if(pColl->IsAssignedToListLevelOfOutlineStyle())
|
2004-12-08 16:41:03 +00:00
|
|
|
{
|
2007-01-23 07:30:17 +00:00
|
|
|
// Check only the list style, which is set at the paragraph style
|
2011-01-17 15:06:54 +01:00
|
|
|
const SwNumRuleItem & rCollRuleItem = pColl->GetNumRule( sal_False );
|
2005-11-08 16:16:30 +00:00
|
|
|
|
2007-01-23 07:30:17 +00:00
|
|
|
// Check on document setting OUTLINE_LEVEL_YIELDS_OUTLINE_RULE no longer needed.
|
2013-02-22 11:49:40 +00:00
|
|
|
if ( rCollRuleItem.GetValue().isEmpty() )
|
2005-11-08 16:16:30 +00:00
|
|
|
{
|
2007-09-27 07:36:31 +00:00
|
|
|
SwNumRule * pMyOutlineRule = GetOutlineNumRule();
|
2005-11-08 16:16:30 +00:00
|
|
|
|
2007-09-27 07:36:31 +00:00
|
|
|
if (pMyOutlineRule)
|
2005-11-08 16:16:30 +00:00
|
|
|
{
|
2007-09-27 07:36:31 +00:00
|
|
|
SwNumRuleItem aNumItem( pMyOutlineRule->GetName() );
|
2005-11-08 16:16:30 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
pColl->SetFmtAttr(aNumItem);
|
2005-11-08 16:16:30 +00:00
|
|
|
}
|
|
|
|
}
|
2004-12-08 16:41:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// Increase/Decrease
|
2012-10-30 11:27:06 +09:00
|
|
|
bool SwDoc::OutlineUpDown( const SwPaM& rPam, short nOffset )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-07-19 13:12:17 +02:00
|
|
|
if( GetNodes().GetOutLineNds().empty() || !nOffset )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-10-13 22:20:33 +02:00
|
|
|
// calculate the range
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwOutlineNodes& rOutlNds = GetNodes().GetOutLineNds();
|
|
|
|
const SwNodePtr pSttNd = (SwNodePtr)&rPam.Start()->nNode.GetNode();
|
|
|
|
const SwNodePtr pEndNd = (SwNodePtr)&rPam.End()->nNode.GetNode();
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nSttPos, nEndPos;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( !rOutlNds.Seek_Entry( pSttNd, &nSttPos ) &&
|
|
|
|
!nSttPos-- )
|
2012-01-08 22:38:04 +01:00
|
|
|
// we're not in an "Outline section"
|
2012-10-30 11:27:06 +09:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( rOutlNds.Seek_Entry( pEndNd, &nEndPos ) )
|
|
|
|
++nEndPos;
|
|
|
|
|
2012-10-13 22:20:33 +02:00
|
|
|
// We now have the wanted range in the OutlineNodes array,
|
2012-01-08 22:38:04 +01:00
|
|
|
// so check now if we're not invalidating sublevels
|
|
|
|
// (stepping over the limits)
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 n;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// Here we go:
|
2012-10-13 22:20:33 +02:00
|
|
|
// 1. Create the style array:
|
2000-09-18 23:08:29 +00:00
|
|
|
SwTxtFmtColl* aCollArr[ MAXLEVEL ];
|
|
|
|
memset( aCollArr, 0, sizeof( SwTxtFmtColl* ) * MAXLEVEL );
|
|
|
|
|
2013-02-18 07:54:37 +01:00
|
|
|
for( n = 0; n < mpTxtFmtCollTbl->size(); ++n )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
if((*mpTxtFmtCollTbl)[ n ]->IsAssignedToListLevelOfOutlineStyle())
|
2009-01-07 11:57:24 +00:00
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
const int nLevel = (*mpTxtFmtCollTbl)[ n ]->GetAssignedOutlineStyleLevel();
|
|
|
|
aCollArr[ nLevel ] = (*mpTxtFmtCollTbl)[ n ];
|
2013-09-27 14:40:18 +02:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2003-09-04 10:46:01 +00:00
|
|
|
/* Find the last occupied level (backward). */
|
|
|
|
for (n = MAXLEVEL - 1; n > 0; n--)
|
|
|
|
{
|
|
|
|
if (aCollArr[n] != 0)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If an occupied level is found, choose next level (which IS
|
|
|
|
unoccupied) until a valid level is found. If no occupied level
|
|
|
|
was found n is 0 and aCollArr[0] is 0. In this case no demoting
|
|
|
|
is possible. */
|
|
|
|
if (aCollArr[n] != 0)
|
|
|
|
{
|
|
|
|
while (n < MAXLEVEL - 1)
|
|
|
|
{
|
|
|
|
n++;
|
|
|
|
|
|
|
|
SwTxtFmtColl *aTmpColl =
|
2007-09-27 07:36:31 +00:00
|
|
|
GetTxtCollFromPool(static_cast<sal_uInt16>(RES_POOLCOLL_HEADLINE1 + n));
|
2003-09-04 10:46:01 +00:00
|
|
|
|
2009-01-07 11:57:24 +00:00
|
|
|
if( aTmpColl->IsAssignedToListLevelOfOutlineStyle() &&
|
2013-09-27 14:40:18 +02:00
|
|
|
aTmpColl->GetAssignedOutlineStyleLevel() == n )
|
2003-09-04 10:46:01 +00:00
|
|
|
{
|
|
|
|
aCollArr[n] = aTmpColl;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Find the first occupied level (forward). */
|
|
|
|
for (n = 0; n < MAXLEVEL - 1; n++)
|
|
|
|
{
|
|
|
|
if (aCollArr[n] != 0)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If an occupied level is found, choose previous level (which IS
|
|
|
|
unoccupied) until a valid level is found. If no occupied level
|
|
|
|
was found n is MAXLEVEL - 1 and aCollArr[MAXLEVEL - 1] is 0. In
|
|
|
|
this case no demoting is possible. */
|
|
|
|
if (aCollArr[n] != 0)
|
|
|
|
{
|
|
|
|
while (n > 0)
|
|
|
|
{
|
|
|
|
n--;
|
|
|
|
|
|
|
|
SwTxtFmtColl *aTmpColl =
|
2007-09-27 07:36:31 +00:00
|
|
|
GetTxtCollFromPool(static_cast<sal_uInt16>(RES_POOLCOLL_HEADLINE1 + n));
|
2003-09-04 10:46:01 +00:00
|
|
|
|
2009-01-07 11:57:24 +00:00
|
|
|
if( aTmpColl->IsAssignedToListLevelOfOutlineStyle() &&
|
2013-09-27 14:40:18 +02:00
|
|
|
aTmpColl->GetAssignedOutlineStyleLevel() == n )
|
2003-09-04 10:46:01 +00:00
|
|
|
{
|
|
|
|
aCollArr[n] = aTmpColl;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-05-16 12:51:26 +00:00
|
|
|
/* --> #i13747#
|
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
Build a move table that states from which level to which other level
|
|
|
|
an outline will be moved.
|
2003-09-04 10:46:01 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
the move table:
|
|
|
|
aMoveArr[n] = m: replace aCollArr[n] with aCollArr[m]
|
2003-05-16 12:51:26 +00:00
|
|
|
*/
|
|
|
|
int aMoveArr[MAXLEVEL];
|
|
|
|
int nStep; // step size for searching in aCollArr: -1 or 1
|
|
|
|
int nNum; // amount of steps for stepping in aCollArr
|
|
|
|
|
|
|
|
if (nOffset < 0)
|
|
|
|
{
|
|
|
|
nStep = -1;
|
|
|
|
nNum = -nOffset;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nStep = 1;
|
|
|
|
nNum = nOffset;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* traverse aCollArr */
|
|
|
|
for (n = 0; n < MAXLEVEL; n++)
|
|
|
|
{
|
|
|
|
/* If outline level n has an assigned paragraph style step
|
|
|
|
nNum steps forwards (nStep == 1) or backwards (nStep ==
|
|
|
|
-1). One step is to go to the next non-null entry in
|
|
|
|
aCollArr in the selected direction. If nNum steps were
|
|
|
|
possible write the index of the entry found to aCollArr[n],
|
|
|
|
i.e. outline level n will be replaced by outline level
|
|
|
|
aCollArr[n].
|
|
|
|
|
|
|
|
If outline level n has no assigned paragraph style
|
|
|
|
aMoveArr[n] is set to -1.
|
|
|
|
*/
|
|
|
|
if (aCollArr[n] != NULL)
|
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 m = n;
|
2003-05-16 12:51:26 +00:00
|
|
|
int nCount = nNum;
|
|
|
|
|
|
|
|
while (nCount > 0 && m + nStep >= 0 && m + nStep < MAXLEVEL)
|
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
m = static_cast<sal_uInt16>(m + nStep);
|
2003-05-16 12:51:26 +00:00
|
|
|
|
|
|
|
if (aCollArr[m] != NULL)
|
|
|
|
nCount--;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nCount == 0)
|
|
|
|
aMoveArr[n] = m;
|
|
|
|
else
|
|
|
|
aMoveArr[n] = -1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
aMoveArr[n] = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If moving of the outline levels is applicable, i.e. for all
|
|
|
|
outline levels occuring in the document there has to be a valid
|
|
|
|
target outline level implied by aMoveArr. */
|
|
|
|
bool bMoveApplicable = true;
|
|
|
|
for (n = nSttPos; n < nEndPos; n++)
|
|
|
|
{
|
|
|
|
SwTxtNode* pTxtNd = rOutlNds[ n ]->GetTxtNode();
|
|
|
|
SwTxtFmtColl* pColl = pTxtNd->GetTxtColl();
|
2010-11-18 08:25:05 +01:00
|
|
|
|
2009-01-07 11:57:24 +00:00
|
|
|
if( pColl->IsAssignedToListLevelOfOutlineStyle() )
|
|
|
|
{
|
|
|
|
const int nLevel = pColl->GetAssignedOutlineStyleLevel();
|
|
|
|
if (aMoveArr[nLevel] == -1)
|
|
|
|
bMoveApplicable = false;
|
2013-09-27 14:40:18 +02:00
|
|
|
}
|
2010-10-18 12:55:43 +01:00
|
|
|
|
2009-01-07 11:57:24 +00:00
|
|
|
// Check on outline level attribute of text node, if text node is
|
|
|
|
// not an outline via a to outline style assigned paragraph style.
|
|
|
|
else
|
|
|
|
{
|
|
|
|
const int nNewOutlineLevel = pTxtNd->GetAttrOutlineLevel() + nOffset;
|
|
|
|
if ( nNewOutlineLevel < 1 || nNewOutlineLevel > MAXLEVEL )
|
|
|
|
{
|
|
|
|
bMoveApplicable = false;
|
|
|
|
}
|
|
|
|
}
|
2003-05-16 12:51:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (! bMoveApplicable )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false;
|
2003-05-16 12:51:26 +00:00
|
|
|
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
GetIDocumentUndoRedo().StartUndo(UNDO_OUTLINE_LR, NULL);
|
|
|
|
SwUndo *const pUndoOLR( new SwUndoOutlineLeftRight( rPam, nOffset ) );
|
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndoOLR);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2012-10-13 22:20:33 +02:00
|
|
|
// 2. Apply the new style to all Nodes
|
2003-05-16 12:51:26 +00:00
|
|
|
|
|
|
|
n = nSttPos;
|
|
|
|
while( n < nEndPos)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwTxtNode* pTxtNd = rOutlNds[ n ]->GetTxtNode();
|
|
|
|
SwTxtFmtColl* pColl = pTxtNd->GetTxtColl();
|
2003-05-16 12:51:26 +00:00
|
|
|
|
2009-01-07 11:57:24 +00:00
|
|
|
if( pColl->IsAssignedToListLevelOfOutlineStyle() )
|
|
|
|
{
|
2013-09-27 14:40:18 +02:00
|
|
|
const int nLevel = pColl->GetAssignedOutlineStyleLevel();
|
2003-05-16 12:51:26 +00:00
|
|
|
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE(aMoveArr[nLevel] >= 0,
|
2009-01-07 11:57:24 +00:00
|
|
|
"move table: current TxtColl not found when building table!");
|
2003-05-16 12:51:26 +00:00
|
|
|
|
|
|
|
|
2009-01-07 11:57:24 +00:00
|
|
|
if (nLevel < MAXLEVEL && aMoveArr[nLevel] >= 0)
|
|
|
|
{
|
|
|
|
pColl = aCollArr[ aMoveArr[nLevel] ];
|
2003-05-16 12:51:26 +00:00
|
|
|
|
2009-01-07 11:57:24 +00:00
|
|
|
if (pColl != NULL)
|
|
|
|
pColl = (SwTxtFmtColl*)pTxtNd->ChgFmtColl( pColl );
|
|
|
|
}
|
2003-05-16 12:51:26 +00:00
|
|
|
|
|
|
|
}
|
2013-09-27 14:40:18 +02:00
|
|
|
else if( pTxtNd->GetAttrOutlineLevel() > 0)
|
2009-01-07 11:57:24 +00:00
|
|
|
{
|
|
|
|
int nLevel = pTxtNd->GetAttrOutlineLevel() + nOffset;
|
|
|
|
if( 0 <= nLevel && nLevel <= MAXLEVEL)
|
|
|
|
pTxtNd->SetAttrOutlineLevel( nLevel );
|
|
|
|
|
2013-09-27 14:40:18 +02:00
|
|
|
}
|
2003-05-16 12:51:26 +00:00
|
|
|
|
|
|
|
n++;
|
2000-09-18 23:08:29 +00:00
|
|
|
// Undo ???
|
|
|
|
}
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
|
|
|
{
|
|
|
|
GetIDocumentUndoRedo().EndUndo(UNDO_OUTLINE_LR, NULL);
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2005-11-08 16:16:30 +00:00
|
|
|
ChkCondColls();
|
2000-09-18 23:08:29 +00:00
|
|
|
SetModified();
|
2005-07-18 12:33:55 +00:00
|
|
|
|
2012-10-30 11:27:06 +09:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// Move up/down
|
2012-10-30 11:27:06 +09:00
|
|
|
bool SwDoc::MoveOutlinePara( const SwPaM& rPam, short nOffset )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-10-13 22:20:33 +02:00
|
|
|
// Do not move to special sections in the nodes array
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwPosition& rStt = *rPam.Start(),
|
|
|
|
& rEnd = &rStt == rPam.GetPoint() ? *rPam.GetMark()
|
|
|
|
: *rPam.GetPoint();
|
2012-07-19 13:12:17 +02:00
|
|
|
if( GetNodes().GetOutLineNds().empty() || !nOffset ||
|
2010-12-15 09:13:54 +01:00
|
|
|
(rStt.nNode.GetIndex() < GetNodes().GetEndOfExtras().GetIndex()) ||
|
|
|
|
(rEnd.nNode.GetIndex() < GetNodes().GetEndOfExtras().GetIndex()))
|
|
|
|
{
|
2012-10-30 11:27:06 +09:00
|
|
|
return false;
|
2010-12-15 09:13:54 +01:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nAktPos = 0;
|
2000-09-18 23:08:29 +00:00
|
|
|
SwNodeIndex aSttRg( rStt.nNode ), aEndRg( rEnd.nNode );
|
|
|
|
|
2013-09-27 14:40:18 +02:00
|
|
|
int nOutLineLevel = MAXLEVEL;
|
2006-03-31 08:50:38 +00:00
|
|
|
SwNode* pSrch = &aSttRg.GetNode();
|
2010-11-18 08:25:05 +01:00
|
|
|
|
2009-01-07 11:57:24 +00:00
|
|
|
if( pSrch->IsTxtNode())
|
2013-09-27 14:40:18 +02:00
|
|
|
nOutLineLevel = static_cast<sal_uInt8>(((SwTxtNode*)pSrch)->GetAttrOutlineLevel()-1);
|
2006-03-31 08:50:38 +00:00
|
|
|
SwNode* pEndSrch = &aEndRg.GetNode();
|
|
|
|
if( !GetNodes().GetOutLineNds().Seek_Entry( pSrch, &nAktPos ) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-03-31 08:50:38 +00:00
|
|
|
if( !nAktPos )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false; // Promoting or demoting before the first outline => no.
|
2006-03-31 08:50:38 +00:00
|
|
|
if( --nAktPos )
|
2000-09-18 23:08:29 +00:00
|
|
|
aSttRg = *GetNodes().GetOutLineNds()[ nAktPos ];
|
2006-03-31 08:50:38 +00:00
|
|
|
else if( 0 > nOffset )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false; // Promoting at the top of document?!
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
2006-03-31 08:50:38 +00:00
|
|
|
aSttRg = *GetNodes().GetEndOfContent().StartOfSectionNode();
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nTmpPos = 0;
|
2006-03-31 08:50:38 +00:00
|
|
|
// If the given range ends at an outlined text node we have to decide if it has to be a part of
|
|
|
|
// the moving range or not. Normally it will be a sub outline of our chapter
|
|
|
|
// and has to be moved, too. But if the chapter ends with a table(or a section end),
|
|
|
|
// the next text node will be choosen and this could be the next outline of the same level.
|
|
|
|
// The criteria has to be the outline level: sub level => incorporate, same/higher level => no.
|
|
|
|
if( GetNodes().GetOutLineNds().Seek_Entry( pEndSrch, &nTmpPos ) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-03-31 08:50:38 +00:00
|
|
|
if( !pEndSrch->IsTxtNode() || pEndSrch == pSrch ||
|
2013-09-27 14:40:18 +02:00
|
|
|
nOutLineLevel < ((SwTxtNode*)pEndSrch)->GetAttrOutlineLevel()-1 )
|
2006-03-31 08:50:38 +00:00
|
|
|
++nTmpPos; // For sub outlines only!
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-07-19 13:12:17 +02:00
|
|
|
aEndRg = nTmpPos < GetNodes().GetOutLineNds().size()
|
2006-03-31 08:50:38 +00:00
|
|
|
? *GetNodes().GetOutLineNds()[ nTmpPos ]
|
|
|
|
: GetNodes().GetEndOfContent();
|
|
|
|
if( nOffset >= 0 )
|
|
|
|
nAktPos = nTmpPos;
|
|
|
|
if( aEndRg == aSttRg )
|
|
|
|
{
|
2011-03-12 11:51:35 +01:00
|
|
|
OSL_FAIL( "Moving outlines: Surprising selection" );
|
2012-10-15 23:31:02 +02:00
|
|
|
++aEndRg;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2006-03-31 08:50:38 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwNode* pNd;
|
2006-03-31 08:50:38 +00:00
|
|
|
// The following code corrects the range to handle sections (start/end nodes)
|
|
|
|
// The range will be extended if the least node before the range is a start node
|
|
|
|
// which ends inside the range => The complete section will be moved.
|
|
|
|
// The range will be shrinked if the last position is a start node.
|
|
|
|
// The range will be shrinked if the last node is an end node which starts before the range.
|
|
|
|
aSttRg--;
|
|
|
|
while( aSttRg.GetNode().IsStartNode() )
|
|
|
|
{
|
|
|
|
pNd = aSttRg.GetNode().EndOfSectionNode();
|
|
|
|
if( pNd->GetIndex() >= aEndRg.GetIndex() )
|
|
|
|
break;
|
|
|
|
aSttRg--;
|
|
|
|
}
|
2012-10-15 23:31:02 +02:00
|
|
|
++aSttRg;
|
2006-03-31 08:50:38 +00:00
|
|
|
|
|
|
|
aEndRg--;
|
|
|
|
while( aEndRg.GetNode().IsStartNode() )
|
|
|
|
aEndRg--;
|
2013-08-09 22:41:31 +02:00
|
|
|
|
2006-03-31 08:50:38 +00:00
|
|
|
while( aEndRg.GetNode().IsEndNode() )
|
|
|
|
{
|
2006-08-14 14:59:04 +00:00
|
|
|
pNd = aEndRg.GetNode().StartOfSectionNode();
|
2006-03-31 08:50:38 +00:00
|
|
|
if( pNd->GetIndex() >= aSttRg.GetIndex() )
|
|
|
|
break;
|
|
|
|
aEndRg--;
|
|
|
|
}
|
2012-10-15 23:31:02 +02:00
|
|
|
++aEndRg;
|
2006-03-31 08:50:38 +00:00
|
|
|
|
|
|
|
// calculation of the new position
|
2011-01-17 15:06:54 +01:00
|
|
|
if( nOffset < 0 && nAktPos < sal_uInt16(-nOffset) )
|
2000-09-18 23:08:29 +00:00
|
|
|
pNd = GetNodes().GetEndOfContent().StartOfSectionNode();
|
2012-07-19 13:12:17 +02:00
|
|
|
else if( nAktPos + nOffset >= (sal_uInt16)GetNodes().GetOutLineNds().size() )
|
2000-09-18 23:08:29 +00:00
|
|
|
pNd = &GetNodes().GetEndOfContent();
|
|
|
|
else
|
|
|
|
pNd = GetNodes().GetOutLineNds()[ nAktPos + nOffset ];
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nNewPos = pNd->GetIndex();
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-03-31 08:50:38 +00:00
|
|
|
// And now a correction of the insert position if necessary...
|
|
|
|
SwNodeIndex aInsertPos( *pNd, -1 );
|
|
|
|
while( aInsertPos.GetNode().IsStartNode() )
|
|
|
|
{
|
|
|
|
// Just before the insert position starts a section:
|
|
|
|
// when I'm moving forward I do not want to enter the section,
|
|
|
|
// when I'm moving backward I want to stay in the section if I'm already a part of,
|
|
|
|
// I want to stay outside if I was outside before.
|
|
|
|
if( nOffset < 0 )
|
|
|
|
{
|
|
|
|
pNd = aInsertPos.GetNode().EndOfSectionNode();
|
|
|
|
if( pNd->GetIndex() >= aEndRg.GetIndex() )
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
aInsertPos--;
|
|
|
|
--nNewPos;
|
|
|
|
}
|
2013-08-09 22:41:31 +02:00
|
|
|
|
2006-03-31 08:50:38 +00:00
|
|
|
if( nOffset >= 0 )
|
|
|
|
{
|
|
|
|
// When just before the insert position a section ends, it is okay when I'm moving backward
|
|
|
|
// because I want to stay outside the section.
|
|
|
|
// When moving forward I've to check if I started inside or outside the section
|
|
|
|
// because I don't want to enter of leave such a section
|
|
|
|
while( aInsertPos.GetNode().IsEndNode() )
|
|
|
|
{
|
2006-08-14 14:59:04 +00:00
|
|
|
pNd = aInsertPos.GetNode().StartOfSectionNode();
|
2006-03-31 08:50:38 +00:00
|
|
|
if( pNd->GetIndex() >= aSttRg.GetIndex() )
|
|
|
|
break;
|
|
|
|
aInsertPos--;
|
|
|
|
--nNewPos;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// We do not want to move into tables (at the moment)
|
2012-10-15 23:31:02 +02:00
|
|
|
++aInsertPos;
|
2006-03-31 08:50:38 +00:00
|
|
|
pNd = &aInsertPos.GetNode();
|
|
|
|
if( pNd->IsTableNode() )
|
2006-08-14 14:59:04 +00:00
|
|
|
pNd = pNd->StartOfSectionNode();
|
2006-03-31 08:50:38 +00:00
|
|
|
if( pNd->FindTableNode() )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false;
|
2006-03-31 08:50:38 +00:00
|
|
|
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( aSttRg.GetIndex() > nNewPos || nNewPos >= aEndRg.GetIndex(),
|
2012-10-13 22:20:33 +02:00
|
|
|
"Position lies within Move range" );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-10-13 22:20:33 +02:00
|
|
|
// If a Position inside the special nodes array sections was calculated,
|
|
|
|
// set it to document start instead.
|
|
|
|
// Sections or Tables at the document start will be pushed backwards.
|
2013-04-11 00:21:40 -03:00
|
|
|
nNewPos = std::max( nNewPos, GetNodes().GetEndOfExtras().GetIndex() + 2 );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
long nOffs = nNewPos - ( 0 < nOffset ? aEndRg.GetIndex() : aSttRg.GetIndex());
|
|
|
|
SwPaM aPam( aSttRg, aEndRg, 0, -1 );
|
2012-10-30 11:27:06 +09:00
|
|
|
return MoveParagraph( aPam, nOffs, true );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2013-10-17 09:21:50 +01:00
|
|
|
static sal_uInt16 lcl_FindOutlineName( const SwNodes& rNds, const OUString& rName,
|
2012-10-30 11:27:06 +09:00
|
|
|
bool bExact )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nSavePos = USHRT_MAX;
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwOutlineNodes& rOutlNds = rNds.GetOutLineNds();
|
2012-07-19 13:12:17 +02:00
|
|
|
for( sal_uInt16 n = 0; n < rOutlNds.size(); ++n )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwTxtNode* pTxtNd = rOutlNds[ n ]->GetTxtNode();
|
2013-10-17 09:21:50 +01:00
|
|
|
OUString sTxt( pTxtNd->GetExpandTxt() );
|
|
|
|
if (sTxt == rName)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// Found "exact", set Pos to the Node
|
2000-09-18 23:08:29 +00:00
|
|
|
nSavePos = n;
|
|
|
|
break;
|
|
|
|
}
|
2013-10-17 09:21:50 +01:00
|
|
|
else if( !bExact && USHRT_MAX == nSavePos && sTxt.startsWith(rName) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// maybe we just found the text's first part
|
2000-09-18 23:08:29 +00:00
|
|
|
nSavePos = n;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nSavePos;
|
|
|
|
}
|
|
|
|
|
2013-10-16 09:32:03 +02:00
|
|
|
static sal_uInt16 lcl_FindOutlineNum( const SwNodes& rNds, OUString& rName )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// Valid numbers are (always just offsets!):
|
|
|
|
// ([Number]+\.)+ (as a regular expression!)
|
|
|
|
// (Number follwed by a period, with 5 repetitions)
|
|
|
|
// i.e.: "1.1.", "1.", "1.1.1."
|
2013-03-07 19:35:49 +05:30
|
|
|
sal_Int32 nPos = 0;
|
2013-10-16 09:32:03 +02:00
|
|
|
OUString sNum = rName.getToken( 0, '.', nPos );
|
2013-03-07 19:35:49 +05:30
|
|
|
if( -1 == nPos )
|
2012-01-08 22:38:04 +01:00
|
|
|
return USHRT_MAX; // invalid number!
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
sal_uInt16 nLevelVal[ MAXLEVEL ]; // numbers of all levels
|
2000-09-18 23:08:29 +00:00
|
|
|
memset( nLevelVal, 0, MAXLEVEL * sizeof( nLevelVal[0] ));
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8 nLevel = 0;
|
2013-10-16 09:32:03 +02:00
|
|
|
OUString sName( rName );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2013-03-07 19:35:49 +05:30
|
|
|
while( -1 != nPos )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nVal = 0;
|
2000-09-18 23:08:29 +00:00
|
|
|
sal_Unicode c;
|
2013-10-16 09:32:03 +02:00
|
|
|
for( sal_uInt16 n = 0; n < sNum.getLength(); ++n )
|
|
|
|
if( '0' <= ( c = sNum[ n ]) && c <= '9' )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
nVal *= 10; nVal += c - '0';
|
|
|
|
}
|
|
|
|
else if( nLevel )
|
2012-01-08 22:38:04 +01:00
|
|
|
break; // "almost" valid number
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
2012-01-08 22:38:04 +01:00
|
|
|
return USHRT_MAX; // invalid number!
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( MAXLEVEL > nLevel )
|
|
|
|
nLevelVal[ nLevel++ ] = nVal;
|
|
|
|
|
2013-10-16 09:32:03 +02:00
|
|
|
sName = sName.copy( nPos );
|
2000-09-18 23:08:29 +00:00
|
|
|
nPos = 0;
|
2013-10-16 09:32:03 +02:00
|
|
|
sNum = sName.getToken( 0, '.', nPos );
|
2003-03-27 14:45:43 +00:00
|
|
|
// #i4533# without this check all parts delimited by a dot are treated as outline numbers
|
2011-08-28 01:03:37 +01:00
|
|
|
if(!comphelper::string::isdigitAsciiString(sNum))
|
2013-03-07 19:35:49 +05:30
|
|
|
nPos = -1;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2012-01-08 22:38:04 +01:00
|
|
|
rName = sName; // that's the follow-up text
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// read all levels, so search the document for this outline
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwOutlineNodes& rOutlNds = rNds.GetOutLineNds();
|
2012-01-08 22:38:04 +01:00
|
|
|
// Without OutlineNodes searching doesn't pay off
|
|
|
|
// and we save a crash
|
2012-07-19 13:12:17 +02:00
|
|
|
if( rOutlNds.empty() )
|
2000-09-18 23:08:29 +00:00
|
|
|
return USHRT_MAX;
|
|
|
|
SwTxtNode* pNd;
|
|
|
|
nPos = 0;
|
2012-01-08 22:38:04 +01:00
|
|
|
// search in the existing outline nodes for the required outline num array
|
2013-03-07 19:35:49 +05:30
|
|
|
for( ; nPos < (sal_Int32) rOutlNds.size(); ++nPos )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2004-06-28 11:58:35 +00:00
|
|
|
pNd = rOutlNds[ nPos ]->GetTxtNode();
|
2013-09-27 14:40:18 +02:00
|
|
|
const int nLvl = pNd->GetAttrOutlineLevel()-1;
|
2005-11-08 16:16:30 +00:00
|
|
|
if( nLvl == nLevel - 1)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-18 08:25:05 +01:00
|
|
|
// #i51089#, #i68289#
|
2006-10-13 11:19:38 +00:00
|
|
|
// Assure, that text node has the correct numbering level. Otherwise,
|
|
|
|
// its number vector will not fit to the searched level.
|
|
|
|
if ( pNd->GetNum() &&
|
2008-06-13 08:35:27 +00:00
|
|
|
pNd->GetActualListLevel() == ( nLevel - 1 ) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2005-11-08 16:16:30 +00:00
|
|
|
const SwNodeNum & rNdNum = *(pNd->GetNum());
|
2008-06-13 08:35:27 +00:00
|
|
|
SwNumberTree::tNumberVector aLevelVal = rNdNum.GetNumberVector();
|
2012-01-08 22:38:04 +01:00
|
|
|
// now compare with the one searched for
|
2005-11-08 16:16:30 +00:00
|
|
|
bool bEqual = true;
|
2011-01-17 15:06:54 +01:00
|
|
|
for( sal_uInt8 n = 0; (n < nLevel) && bEqual; ++n )
|
2005-11-08 16:16:30 +00:00
|
|
|
{
|
|
|
|
bEqual = aLevelVal[n] == nLevelVal[n];
|
|
|
|
}
|
|
|
|
if(bEqual)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2005-11-08 16:16:30 +00:00
|
|
|
else
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-02-06 16:19:12 +00:00
|
|
|
// A text node, which has an outline paragraph style applied and
|
|
|
|
// has as hard attribute 'no numbering' set, has an outline level,
|
|
|
|
// but no numbering tree node. Thus, consider this situation in
|
|
|
|
// the assertion condition.
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( !pNd->GetNumRule(),
|
2006-02-06 16:19:12 +00:00
|
|
|
"<lcl_FindOutlineNum(..)> - text node with outline level and numbering rule, but without numbering tree node. This is a serious defect -> inform OD" );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-03-07 19:35:49 +05:30
|
|
|
if( nPos >= (sal_Int32) rOutlNds.size() )
|
2004-06-28 11:58:35 +00:00
|
|
|
nPos = USHRT_MAX;
|
2000-09-18 23:08:29 +00:00
|
|
|
return nPos;
|
|
|
|
}
|
|
|
|
|
2013-04-07 21:29:02 +02:00
|
|
|
// Add this bullet point:
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// A Name can contain a Number and/or the Text.
|
|
|
|
//
|
|
|
|
// First, we try to find the correct Entry via the Number.
|
|
|
|
// If it exists, we compare the Text, to see if it's the right one.
|
|
|
|
// If that's not the case, we search again via the Text. If it is
|
|
|
|
// found, we got the right entry. Or else we use the one found by
|
|
|
|
// searching for the Number.
|
|
|
|
// If we don't have a Number, we search via the Text only.
|
2013-10-11 14:39:49 +02:00
|
|
|
bool SwDoc::GotoOutline( SwPosition& rPos, const OUString& rName ) const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2013-10-11 14:39:49 +02:00
|
|
|
if( !rName.isEmpty() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
const SwOutlineNodes& rOutlNds = GetNodes().GetOutLineNds();
|
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// 1. step: via the Number:
|
2013-10-16 09:32:03 +02:00
|
|
|
OUString sName( rName );
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nFndPos = ::lcl_FindOutlineNum( GetNodes(), sName );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( USHRT_MAX != nFndPos )
|
|
|
|
{
|
|
|
|
SwTxtNode* pNd = rOutlNds[ nFndPos ]->GetTxtNode();
|
2013-10-16 09:32:03 +02:00
|
|
|
OUString sExpandedText = pNd->GetExpandTxt();
|
2003-03-27 14:45:43 +00:00
|
|
|
//#i4533# leading numbers followed by a dot have been remove while
|
|
|
|
//searching for the outline position
|
|
|
|
//to compensate this they must be removed from the paragraphs text content, too
|
2013-03-07 19:35:49 +05:30
|
|
|
sal_Int32 nPos = 0;
|
2013-10-16 09:32:03 +02:00
|
|
|
OUString sTempNum;
|
|
|
|
while(!sExpandedText.isEmpty() && !(sTempNum = sExpandedText.getToken(0, '.', nPos)).isEmpty() &&
|
2013-03-07 19:35:49 +05:30
|
|
|
-1 != nPos &&
|
2011-08-28 01:03:37 +01:00
|
|
|
comphelper::string::isdigitAsciiString(sTempNum))
|
2003-03-27 14:45:43 +00:00
|
|
|
{
|
2013-10-16 09:32:03 +02:00
|
|
|
sExpandedText = sExpandedText.copy(nPos);
|
2003-03-27 14:45:43 +00:00
|
|
|
nPos = 0;
|
|
|
|
}
|
|
|
|
|
2013-10-16 09:32:03 +02:00
|
|
|
if( sExpandedText != sName )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-10-30 11:27:06 +09:00
|
|
|
sal_uInt16 nTmp = ::lcl_FindOutlineName( GetNodes(), sName, true );
|
2012-01-08 22:38:04 +01:00
|
|
|
if( USHRT_MAX != nTmp ) // found via the Name
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
nFndPos = nTmp;
|
|
|
|
pNd = rOutlNds[ nFndPos ]->GetTxtNode();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
rPos.nNode = *pNd;
|
|
|
|
rPos.nContent.Assign( pNd, 0 );
|
2012-10-30 11:27:06 +09:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2012-10-30 11:27:06 +09:00
|
|
|
nFndPos = ::lcl_FindOutlineName( GetNodes(), rName, false );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( USHRT_MAX != nFndPos )
|
|
|
|
{
|
|
|
|
SwTxtNode* pNd = rOutlNds[ nFndPos ]->GetTxtNode();
|
|
|
|
rPos.nNode = *pNd;
|
|
|
|
rPos.nContent.Assign( pNd, 0 );
|
2012-10-30 11:27:06 +09:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2006-10-13 11:19:38 +00:00
|
|
|
|
2011-01-28 11:31:24 +00:00
|
|
|
// #i68289# additional search on hyperlink URL without its outline numbering part
|
2013-10-16 09:32:03 +02:00
|
|
|
if ( sName != rName )
|
2006-10-13 11:19:38 +00:00
|
|
|
{
|
2012-10-30 11:27:06 +09:00
|
|
|
nFndPos = ::lcl_FindOutlineName( GetNodes(), sName, false );
|
2006-10-13 11:19:38 +00:00
|
|
|
if( USHRT_MAX != nFndPos )
|
|
|
|
{
|
|
|
|
SwTxtNode* pNd = rOutlNds[ nFndPos ]->GetTxtNode();
|
|
|
|
rPos.nNode = *pNd;
|
|
|
|
rPos.nContent.Assign( pNd, 0 );
|
2012-10-30 11:27:06 +09:00
|
|
|
return true;
|
2006-10-13 11:19:38 +00:00
|
|
|
}
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2012-10-30 11:27:06 +09:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2012-10-12 16:49:40 +02:00
|
|
|
static void lcl_ChgNumRule( SwDoc& rDoc, const SwNumRule& rRule )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwNumRule* pOld = rDoc.FindNumRulePtr( rRule.GetName() );
|
2012-01-08 22:38:04 +01:00
|
|
|
OSL_ENSURE( pOld, "we cannot proceed without the old NumRule" );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nChgFmtLevel = 0, nMask = 1;
|
|
|
|
sal_uInt8 n;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2003-12-01 15:34:51 +00:00
|
|
|
for( n = 0; n < MAXLEVEL; ++n, nMask <<= 1 )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
const SwNumFmt& rOldFmt = pOld->Get( n ),
|
|
|
|
& rNewFmt = rRule.Get( n );
|
|
|
|
|
|
|
|
if( rOldFmt != rNewFmt )
|
|
|
|
{
|
|
|
|
nChgFmtLevel |= nMask;
|
|
|
|
}
|
2001-02-23 11:45:30 +00:00
|
|
|
else if( SVX_NUM_NUMBER_NONE > rNewFmt.GetNumberingType() && 1 < rNewFmt.GetIncludeUpperLevels() &&
|
|
|
|
0 != (nChgFmtLevel & GetUpperLvlChg( n, rNewFmt.GetIncludeUpperLevels(),nMask )) )
|
2000-09-18 23:08:29 +00:00
|
|
|
nChgFmtLevel |= nMask;
|
|
|
|
}
|
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
if( !nChgFmtLevel ) // Nothing has been changed?
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-05-05 08:14:14 +00:00
|
|
|
const bool bInvalidateNumRule( pOld->IsContinusNum() != rRule.IsContinusNum() );
|
2000-09-18 23:08:29 +00:00
|
|
|
pOld->CheckCharFmts( &rDoc );
|
|
|
|
pOld->SetContinusNum( rRule.IsContinusNum() );
|
2010-10-18 12:55:43 +01:00
|
|
|
|
2006-05-05 08:14:14 +00:00
|
|
|
if ( bInvalidateNumRule )
|
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
pOld->SetInvalidRule(sal_True);
|
2006-05-05 08:14:14 +00:00
|
|
|
}
|
2010-10-18 12:55:43 +01:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
return ;
|
|
|
|
}
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
SwNumRule::tTxtNodeList aTxtNodeList;
|
|
|
|
pOld->GetTxtNodeList( aTxtNodeList );
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8 nLvl( 0 );
|
2008-06-13 08:35:27 +00:00
|
|
|
for ( SwNumRule::tTxtNodeList::iterator aIter = aTxtNodeList.begin();
|
|
|
|
aIter != aTxtNodeList.end(); ++aIter )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
SwTxtNode* pTxtNd = *aIter;
|
2011-01-17 15:06:54 +01:00
|
|
|
nLvl = static_cast<sal_uInt8>(pTxtNd->GetActualListLevel());
|
2005-11-08 16:16:30 +00:00
|
|
|
|
|
|
|
if( nLvl < MAXLEVEL )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if( nChgFmtLevel & ( 1 << nLvl ))
|
|
|
|
{
|
|
|
|
pTxtNd->NumRuleChgd();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for( n = 0; n < MAXLEVEL; ++n )
|
|
|
|
if( nChgFmtLevel & ( 1 << n ))
|
|
|
|
pOld->Set( n, rRule.GetNumFmt( n ));
|
|
|
|
|
|
|
|
pOld->CheckCharFmts( &rDoc );
|
2011-01-17 15:06:54 +01:00
|
|
|
pOld->SetInvalidRule(sal_True);
|
2000-09-18 23:08:29 +00:00
|
|
|
pOld->SetContinusNum( rRule.IsContinusNum() );
|
2005-11-08 16:16:30 +00:00
|
|
|
|
|
|
|
rDoc.UpdateNumRule();
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
void SwDoc::SetNumRule( const SwPaM& rPam,
|
|
|
|
const SwNumRule& rRule,
|
|
|
|
const bool bCreateNewList,
|
2013-10-11 14:39:49 +02:00
|
|
|
const OUString sContinuedListId,
|
2012-10-30 11:27:06 +09:00
|
|
|
bool bSetItem,
|
2008-03-05 15:53:54 +00:00
|
|
|
const bool bResetIndentAttrs )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2005-11-08 16:16:30 +00:00
|
|
|
SwUndoInsNum * pUndo = NULL;
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
// Start/End for attributes!
|
|
|
|
GetIDocumentUndoRedo().StartUndo( UNDO_INSNUM, NULL );
|
|
|
|
pUndo = new SwUndoInsNum( rPam, rRule );
|
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2005-11-08 16:16:30 +00:00
|
|
|
SwNumRule * pNew = FindNumRulePtr( rRule.GetName() );
|
|
|
|
bool bUpdateRule = false;
|
2003-06-10 12:17:20 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
if( !pNew )
|
2003-06-10 12:17:20 +00:00
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
pNew = (*mpNumRuleTbl)[ MakeNumRule( rRule.GetName(), &rRule ) ];
|
2003-06-10 12:17:20 +00:00
|
|
|
}
|
2005-11-08 16:16:30 +00:00
|
|
|
else if (rRule != *pNew)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2005-11-08 16:16:30 +00:00
|
|
|
bUpdateRule = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2005-11-08 16:16:30 +00:00
|
|
|
|
|
|
|
if (bUpdateRule)
|
2004-11-26 12:24:12 +00:00
|
|
|
{
|
|
|
|
if( pUndo )
|
|
|
|
{
|
|
|
|
pUndo->SaveOldNumRule( *pNew );
|
2007-09-27 07:36:31 +00:00
|
|
|
::lcl_ChgNumRule( *this, rRule );
|
2004-11-26 12:24:12 +00:00
|
|
|
pUndo->SetLRSpaceEndPos();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-09-27 07:36:31 +00:00
|
|
|
::lcl_ChgNumRule( *this, rRule );
|
2004-11-26 12:24:12 +00:00
|
|
|
}
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
if ( bSetItem )
|
|
|
|
{
|
|
|
|
if ( bCreateNewList )
|
|
|
|
{
|
2013-10-16 09:32:03 +02:00
|
|
|
OUString sListId;
|
2008-06-13 08:35:27 +00:00
|
|
|
if ( !bUpdateRule )
|
|
|
|
{
|
|
|
|
// apply list id of list, which has been created for the new list style
|
|
|
|
sListId = pNew->GetDefaultListId();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// create new list and apply its list id
|
2013-10-16 09:32:03 +02:00
|
|
|
SwList* pNewList = createList( OUString(), pNew->GetName() );
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pNewList,
|
2008-06-13 08:35:27 +00:00
|
|
|
"<SwDoc::SetNumRule(..)> - could not create new list. Serious defect -> please inform OD." );
|
|
|
|
sListId = pNewList->GetListId();
|
|
|
|
}
|
2013-11-18 11:29:24 +00:00
|
|
|
InsertPoolItem( rPam, SfxStringItem( RES_PARATR_LIST_ID, sListId ), 0 );
|
2008-06-13 08:35:27 +00:00
|
|
|
}
|
2013-10-11 14:39:49 +02:00
|
|
|
else if ( !sContinuedListId.isEmpty() )
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
|
|
|
// apply given list id
|
2013-11-18 11:29:24 +00:00
|
|
|
InsertPoolItem( rPam, SfxStringItem( RES_PARATR_LIST_ID, sContinuedListId ), 0 );
|
2008-06-13 08:35:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-11-08 16:16:30 +00:00
|
|
|
if ( ! rPam.HasMark())
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2005-11-08 16:16:30 +00:00
|
|
|
SwTxtNode * pTxtNd = rPam.GetPoint()->nNode.GetNode().GetTxtNode();
|
2006-11-01 14:10:34 +00:00
|
|
|
// consider case that the PaM doesn't denote a text node - e.g. it denotes a graphic node
|
|
|
|
if ( pTxtNd )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
SwNumRule * pRule = pTxtNd->GetNumRule();
|
2006-11-01 14:10:34 +00:00
|
|
|
|
|
|
|
if (pRule && pRule->GetName() == pNew->GetName())
|
2005-11-08 16:16:30 +00:00
|
|
|
{
|
2012-10-30 11:27:06 +09:00
|
|
|
bSetItem = false;
|
2008-06-13 08:35:27 +00:00
|
|
|
if ( !pTxtNd->IsInList() )
|
|
|
|
{
|
|
|
|
pTxtNd->AddToList();
|
|
|
|
}
|
2006-11-01 14:10:34 +00:00
|
|
|
}
|
2011-01-28 11:31:24 +00:00
|
|
|
// Only clear numbering attribute at text node, if at paragraph
|
|
|
|
// style the new numbering rule is found.
|
2006-11-01 14:10:34 +00:00
|
|
|
else if ( !pRule )
|
|
|
|
{
|
|
|
|
SwTxtFmtColl* pColl = pTxtNd->GetTxtColl();
|
|
|
|
if ( pColl )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-11-01 14:10:34 +00:00
|
|
|
SwNumRule* pCollRule = FindNumRulePtr(pColl->GetNumRule().GetValue());
|
|
|
|
if ( pCollRule && pCollRule->GetName() == pNew->GetName() )
|
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
pTxtNd->ResetAttr( RES_PARATR_NUMRULE );
|
2012-10-30 11:27:06 +09:00
|
|
|
bSetItem = false;
|
2006-11-01 14:10:34 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2005-11-08 16:16:30 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2005-11-08 16:16:30 +00:00
|
|
|
}
|
|
|
|
|
2009-08-27 14:36:29 +00:00
|
|
|
if ( bSetItem )
|
2005-11-08 16:16:30 +00:00
|
|
|
{
|
CWS-TOOLING: integrate CWS odfmetadata3
2009-09-11 Michael Stahl merge DEV300_m58
2009-09-07 Michael Stahl SwFmtFld::Modify(): do nothing on RES_OBJECTDYING
2009-08-27 Michael Stahl #i91565#, #i91566#: TextPortionEnumerationTest.java: add test document
2009-08-27 Michael Stahl #i91565#, #i91566#: add complex test: TextPortionEnumerationTest.java
2009-08-27 Michael Stahl CLiteral::initialize(): zero-length literals probably not an error
2009-08-27 Michael Stahl #i91565#, #i91566#: offapi: new InContentMetadata and MetadataField services
adapt TextPortion for InContentMetadata
2009-08-27 Michael Stahl #i91564#: xmloff: load/store xml:id and RDFa for text:bookmark(-start).
2009-08-27 Michael Stahl #i91564#: sw core: add support for xml:id at bookmarks:
sw::mark::Bookmark: derive from Metadatable.
SwHistoryBookmark, SaveBookmark: store a MetadatableUndo.
ndcopy.cxx: lcl_CopyBookmarks(): copy the xml:id.
SwXBookmark: derive from MetadatableMixin.
2009-08-27 Michael Stahl #i91565#, #i91566#: xmloff: refactor ruby import so nested meta(-field) works:
remove XMLRubyHint_Impl.
XMLImpRubyContext_Impl::~XMLImpRubyContext_Impl(): insert ruby directly.
2009-08-27 Michael Stahl #i91565#, #i91566#: xmloff: fix text:meta(-field) import/export:
new XMLTextParagraphExport::exportTextField() overload for XTextField.
CreateAndInsertMark(): set xml:id after insertion.
fix meta(-field) service names, bugs etc.
2009-08-27 Michael Stahl #i91565#, #i91566#: sw text formatting: paint background of meta(-field) body:
SwFont: add member m_nMetaCount.
txttypes.hxx: add POR_META.
atrstck.cxx: handle RES_TXTATR_META(FIELD).
itrform2.cxx: SwTxtFormatter::WhichTxtPor(): create new class SwMetaPortion.
2009-08-27 Michael Stahl #i91566#: sw text formatting: display meta-field prefix and suffix:
SwAttrIter::GetAttr(): replace with call to GetTxtAttrForCharAt().
SwTxtFormatter::NewExtraPortion(): handle meta-field prefix.
SwTxtFormatter: new member m_nHintEndIndex.
SwTxtFormatter::WhichFirstPortion(): call TryNewNoLengthPortion().
SwTxtFormatter::TryNewNoLengthPortion(): new; handle suffix of meta-field.
SwTxtFormatter::UnderFlow(): UGLY HACK: decrement m_nHintEndIndex.
SwFldPortion: add flag m_bNoLength: portion has zero length (for suffix).
2009-08-27 Michael Stahl #i91565#, #i91566#: extend text:meta(-field) uno wrapper with XText interface:
unoobj.hxx: new CursorType CURSOR_META.
unoobj2.cxx: refactor SwXText implementation to ensure that when the SwXText
belongs to a SwXMeta, content is always inserted inside the meta(-field).
unoobj.cxx: new SwXTextCursor::ForceIntoMeta(): cursor stays in meta(-field).
unometa.hxx: SwXMeta implements XText, forwarding to a member SwXMetaText.
DocInsertStringSplitCR(), SwX*::attachToRange(), SwX*::DeleteAndInsert():
use FORCEHINTEXPAND hack to ensure insert into the meta(-field) at the end.
2009-08-27 Michael Stahl #i91565#, #i91566#: add text:meta(-field) uno wrapper to sw:
fmtmeta.hxx, fmtatr2.cxx: new class sw::MetaField, new sw::MetaFieldManager.
doc.hxx, docnew.cxx: new SwDoc::GetMetaFieldManager().
unocoll.hxx,.cxx: new SW_SERVICE_FIELDTYPE_METAFIELD, SW_SERVICE_TYPE_META.
unomap.hxx,.cxx: new PROPERTY_MAP_METAFIELD.
unoprnms.hxx: new UNO_NAME_META.
unoport.hxx: new PORTION_META; add "InContentMetadata" prop to SwXTextPortion.
new unometa.hxx: new class SwXMeta and SwXMetaField.
unofield.cxx: SwXFieldEnumeration: include meta-fields.
unoportenum.cxx: handle RES_TXTATR_META(FIELD) by using a portion list stack.
unotext.cxx: SwXText::insertTextContent(): handle meta(-field) as attribute.
2009-08-27 Michael Stahl #i91565#, #i91566#: ndhints.cxx: remove sort number from SwTxtAttrNesting
2009-08-27 Michael Stahl #i91565#, #i91566#: add support for hints with end and CH_TXTATR to sw core:
doc.hxx, docedt.cxx: replace SwDoc::Delete(), DeleteAndJoin(), ReplaceRange()
with wrappers that split at left-overlapped end+CH_TXTATR hints.
txatbase.hxx: new member SwTxtAttr::m_bHasDummyChar.
ndtxt.hxx: rename SwTxtNode::GetTxtAttr() to GetTxtAttrForCharAt().
ndtxt.cxx: SwTxtNode::CopyText(): copy end+CH_TXTATR hints iff copy CH_TXTATR.
txtatr2.cxx, thints.cxx: SwTxtMeta gets a CH_TXTATR.
2009-08-27 Michael Stahl #i91565#, #i91566#: add text:meta(-field) to sw core:
txatbase.hxx: new member SwTxtAttr::m_bNesting.
hintids.hxx: new ids RES_TXTATR_META, RES_TXTATR_METAFIELD.
txtatr.hxx: new base class SwTxtAttrNesting.
new hint SwTxtMeta.
SwTxtRuby derives from SwTxtAttrNesting.
txtinet.hxx: SwTxtINetFmt derives from SwTxtAttrNesting.
new header fmtmeta.hxx: new pool item SwFmtMeta. new class sw::Meta.
ndhints.hxx, thints.cxx: new method SwpHints::TryInsertNesting().
thints.cxx: refactoring: BuildPortions() no longer handles Ruby/Hyperlink,
but TryInsertNesting(), which also handles meta(-field).
SwTxtNode::InsertItem(): check if the hint is actually inserted.
ndhints.cxx: sort nesting hints based on sort number.
ndtxt.cxx: lcl_CopyHint(): handle copy of meta/meta-field.
2009-08-27 Michael Stahl enable expanding hints with m_bLockExpandFlag set:
add new InsertFlag: INS_FORCEHINTEXPAND.
add new SetAttrMode: SETATTR_FORCEHINTEXPAND.
rename SwEditShell::Insert() to Insert2() because changed signature fails
to compile when SwWrtShell tries to overwrite these non-virtual members...
SwWrtShell::Insert() sets FOCEHINTEXPAND if range was selected/deleted.
adapt SwUndoInsert to store flags.
2009-08-27 Michael Stahl change formal parameters of item insertion methods to type SetAttrMode
2009-08-27 Michael Stahl fix incorrect resetting of text attributes in SwUndoInsSection, SwUndoInserts
2009-08-27 Michael Stahl clean up SwTxtNode::CutImpl() and lcl_CopyHint()
2009-08-27 Michael Stahl rename SwDoc::Copy() to CopyRange(), and _Copy() to CopyImpl()
2009-08-27 Michael Stahl rename SwNodes::Move() to MoveRange(), and remove unused parameter
2009-08-27 Michael Stahl rename SwDoc::Move() to MoveRange()/MoveNodeRange()
2009-08-27 Michael Stahl rename SwDoc::Insert() to InsertString(), and remove sal_Unicode variant
2009-08-27 Michael Stahl rename SwDoc::Insert() to InsertPoolItem()/InsertItemSet()/InsertSwSection()
2009-08-27 Michael Stahl rename SwDoc::Replace() to ReplaceRange()
2009-08-27 Michael Stahl remove SwDoc::Overwrite() sal_Unicode variant
2009-08-27 Michael Stahl split up SwDoc::DeleteAndJoin(): factor out DeleteAndJoinWithRedline()
2009-08-27 Michael Stahl rename overloaded SwDoc::Delete() to DeleteRange()/DeleteTOXMark()
2009-08-27 Michael Stahl rename SwTxtNode::Copy() to CopyText()
2009-08-27 Michael Stahl rename SwTxtNode::Cut() to CutText(), and _Cut() to CutImpl()
2009-08-27 Michael Stahl rename SwTxtNode::Delete() to DeleteAttribute()/DeleteAttributes()
2009-08-27 Michael Stahl rename SwTxtNode::Replace() to ReplaceText(), and remove the xub_Unicode variant
2009-08-27 Michael Stahl rename SwTxtNode::Erase() to EraseText()
2009-08-27 Michael Stahl rename SwTxtNode::Insert() to InsertText(), and remove the xub_Unicode variant
2009-08-27 Michael Stahl clean up SwTxtNode::Update()
2009-08-27 Michael Stahl remove SwTxtAttr::RemoveFromPool() and make destructor non-public,
to be invoked by new method SwTxtAttr::Destroy()
2009-08-27 Michael Stahl ensure that SwDoc::Insert() for item (set) returns success indicator:
replace SwRegHistory constructor with method InsertItems(), returning bool.
refactor InsAttr() so that it checks if InsertItems() succeeds.
2009-08-27 Michael Stahl move SwXTextPortionEnumeration from unoobj.hxx to unoport.hxx
2009-08-27 Michael Stahl add missing SolarMutex in SwXTextPortion methods
2009-08-27 Michael Stahl SwXTextPortion: new member m_xTextField (so the TextField property need not
be returned indirectly via SwUnoCursorHelper).
factor out function CreateSwXTextField().
2009-08-27 Michael Stahl SwXTextPortion: remove PORTION_CONTROL_CHAR and implementation of XTextField
2009-08-27 Michael Stahl remove obsolete hint SwTxtHardBlank and formats SwFmtHardBlank/SwFmtSoftHyph
2009-08-27 Michael Stahl clean up SwTxtAttr and friends:
remove many accessor methods for obsolete (due to autofmt) char format items.
remove unused flag SwTxtAttr::m_bDontMergeAttr.
MakeRedlineTxtAttr() now dedicated function, no longer calls MakeTxtAttr().
2009-08-27 Michael Stahl remove obsolete attribute SwTxt2Lines
2009-08-27 Michael Stahl SwXTextPortionEnumeration: finish refactoring CreatePortions
change ExportHints so it always returns a text portion for hint w/ CH_TXTATR.
remove special case for handling end of paragraph.
unfortunately had to refactor the fieldmarks export as well (got in the way).
2009-08-27 Michael Stahl SwXTextPortionEnumeration: refactor CreatePortions: frames export
extract function ExportFrames() from CreatePortions().
remove (un)dead code that calls evil MovePara(fnParaCurr, fnParaEnd)
2009-08-27 Michael Stahl clean up SwXParaFrameEnumeration
2009-08-27 Michael Stahl CollectFrameAtNode: replace SwDependArr with STL based FrameDependList_t
2009-08-27 Michael Stahl SwXTextPortionEnumeration: tweak refmark/toxmark export
so ExportHints returns the portion for point marks
2009-08-27 Michael Stahl clean up SwXTextPortionEnumeration:
prefix members, remove casts, replace SvWeirdArray with STL, etc.
make CreatePortions() method a function, and remove lots of members.
extract fieldmarks function from CreatePortions.
2009-08-27 Michael Stahl remove FOREACHUNOPAM_START/END macros
2009-08-27 Michael Stahl clean up SwXTextPortion:
prefix members, remove casts, etc.
remove SwXRubyPortion: replace it with another SwXTextPortion constructor
2009-08-27 Michael Stahl #i102541# SwXReferenceMark::InsertRefMark(): use flag SETATTR_DONTEXPAND
2009-08-27 Michael Stahl rename SwTxtNode::Insert to SwTxtNode::InsertHint, and
fix constness in SwTxtNode::InsertItem
2009-08-27 Michael Stahl turn SwTxtNode::MakeTxtAttr() methods into global functions in ndhints.hxx
2009-08-27 Michael Stahl remove obsolete sw/inc/bookmrk.hxx
2009-08-27 Michael Stahl pam.cxx: fix ComparePosition functions (returned wrong result in one case)
2009-08-27 Michael Stahl #i103613# only import RDF metadata on normal open of a document
2009-09-11 kz CWS-TOOLING: integrate CWS impress176
2009-09-08 20:18:24 +0200 sj r275957 : fixed warning (shadowed variable)
2009-09-08 18:02:05 +0200 cl r275948 : #i104315# added missing tab pages
2009-09-08 17:35:18 +0200 cl r275947 : #i104866# fixed angle import
2009-09-08 17:32:53 +0200 cl r275946 : #i104841# fixed angle import
2009-09-08 17:01:25 +0200 cl r275943 : #i103935# fixed the SID_EVENTCONFIG mess
2009-09-08 14:32:57 +0200 sj r275928 : #i104685# only comments
2009-09-07 12:37:36 +0200 sj r275886 : #i104683# fixed import of bold/italic attributes for normal text shapes
2009-09-04 15:07:46 +0200 sj r275808 : #104689# fixed bullet color problem
2009-09-03 15:25:07 +0200 sj r275753 : #160200# added vertical alignment of table cells
2009-09-11 kz CWS-TOOLING: integrate CWS dv14
2009-09-10 15:16:32 +0200 sg r276035 : #160513# updated wfs scheme to accept ports
2009-09-10 07:41:47 +0200 dv r276019 : #i104942# Better renaming algorithmen
2009-08-31 13:41:11 +0200 dv r275604 : #160505# Setting APP1PRODUCTNAME must not overwrite APP1PRODUCTDEF
2009-09-11 kz CWS-TOOLING: integrate CWS jl131
2009-09-02 16:42:40 +0200 jl r275720 : #i97896#
2009-08-31 13:01:53 +0200 jl r275599 : CWS-TOOLING: rebase CWS jl131 to trunk@275331 (milestone: DEV300:m56)
2009-07-31 14:35:30 +0200 jl r274531 : CWS-TOOLING: rebase CWS jl131 to trunk@274203 (milestone: DEV300:m53)
2009-07-23 14:20:32 +0200 jl r274272 : #i79839# better error text when trying to modify shared layer without having write permission, eg. unopkg add --shared, unopkg remove --shared, unopkg reinstall --shared
2009-07-22 16:38:02 +0200 jl r274252 : #i97896# localize error message for lock file
2009-07-22 16:37:22 +0200 jl r274251 : #i80462# unprecise wording in updatedialog
2009-07-22 16:36:06 +0200 jl r274250 : #i97896# localize error message for lock file
2009-07-22 16:35:20 +0200 jl r274249 : #i97896# localize error message for lock file
2009-07-22 15:07:30 +0200 jl r274242 : #i98873# minimum java version is 1.5 since OOo 3.0
2009-09-11 kz CWS-TOOLING: integrate CWS changehc
2009-08-31 19:38:50 +0200 pl r275633 : remove dbug printf
2009-08-31 17:41:50 +0200 pl r275623 : CWS-TOOLING: rebase CWS changehc to trunk@275331 (milestone: DEV300:m56)
2009-07-15 19:45:46 +0200 pl r274028 : #i35482# use HC flag to decide high contrast mode
2009-07-15 17:40:52 +0200 pl r274020 : #i35482# use HC flag to decide high contrast mode
2009-07-15 17:39:50 +0200 pl r274019 : #i35482# update autohc correctly in MergeSystemSettings
2009-07-15 17:38:57 +0200 pl r274018 : #i35482# update autohc correctly in MergeSystemSettings
2009-09-11 kz CWS-TOOLING: integrate CWS notes10
2009-08-24 07:25:57 +0200 mod r275287 : 2009-07-26 02:38:32 +0200 mod r274343 : #i#i103645#
2009-07-26 02:01:53 +0200 mod r274342 : #i103645#
2009-07-26 01:52:42 +0200 mod r274341 : #i103490#
2009-07-22 08:31:48 +0200 mod r274215 : #i103373#
2009-07-15 00:55:11 +0200 mod r273987 : #i101419#
2009-07-14 07:07:55 +0200 mod r273956 : #i101419#
2009-07-14 07:07:43 +0200 mod r273955 : #i101419#
2009-07-14 07:02:10 +0200 mod r273954 : changes from notes9
2009-07-14 06:14:25 +0200 mod r273953 : #i103476#
2009-09-11 kz CWS-TOOLING: integrate CWS ab70
2009-09-10 15:12:54 +0200 jsk r276034 : #i85434# - mandatory automatic update test
2009-09-10 15:11:06 +0200 jsk r276033 : #i85434# - mandatory automatic update test
2009-09-02 09:49:24 +0200 ab r275698 : #i85434# Dialog Import
2009-09-11 kz CWS-TOOLING: integrate CWS hb32bugs02
2009-09-02 Henning Brinkmann #i102420# revert changes
2009-08-26 Henning Brinkmann merged DEV300_m56
2009-08-19 Henning Brinkmann merged DEV300_m55
2009-08-14 Henning Brinkmann merged changes from wntmsci12
2009-08-12 Henning Brinkmann Implemented NoSpaceEdit constructor and destructor in .cxx to allow compile with debug on wntmsci12.
2009-08-12 Henning Brinkmann Added some SW_DLLPUBLIC to make compilable on wntmsci12.
2009-08-11 Henning Brinkmann #i102420# dbg_out: surround output for SwNodes with <nodes-array>.
2009-08-10 Henning Brinkmann #i102420# rewritten debug output for SwNodes.
2009-08-07 Henning Brinkmann #i102420# debug _MoveNodes: output the destination, too. Break after two iterations.
2009-08-07 Henning Brinkmann #i102420# _MoveNodes: Additionally check if destination index is inside source => false
Check if current range was already handled => loop
Debug output current range
2009-08-06 Henning Brinkmann merged DEV300_m54
2009-08-06 Henning Brinkmann added master fix
2009-08-06 Henning Brinkmann debug output for SwNodeRange
2009-08-04 Henning Brinkmann #i102844# robustness: check for NULL pointer to prevent crash
2009-08-03 Henning Brinkmann #i103475# applied patch and verified
2009-08-03 Henning Brinkmann Removed code preventing build of sw with DEBUG.
2009-09-11 convert-repo update tags
2009-09-10 kz CWS-TOOLING: integrate CWS os2port06dev300
2009-09-05 22:49:00 +0200 ydario r275858 : #i99588# applied os2port06 diff to DEV300 tree.
2009-09-10 kz CWS-TOOLING: integrate CWS mingwport23
2009-08-29 07:07:53 +0200 tono r275555 : i#104522: mingw port graphite
2009-08-29 07:07:26 +0200 tono r275554 : i#104522: mingw port printf format fix
2009-09-10 kz CWS-TOOLING: integrate CWS mh232
2009-08-26 03:52:57 +0200 mh r275385 : #i102182# FreeBSD patch
2009-08-26 03:43:20 +0200 mh r275384 : #i101333# patch for FreeBSD
2009-08-26 03:11:20 +0200 mh r275383 : #i39230
2009-08-26 03:07:51 +0200 mh r275382 : #i39230# more space for initials field
2009-08-26 02:41:19 +0200 mh r275380 : #i39230# use vos::osecurity for reading the user name
2009-08-18 22:06:00 +0200 mh r275130 : #i104243#, line ending problem with newer perl
2009-08-18 21:53:21 +0200 mh r275129 : #i39230# read initials via getpwnam
2009-08-18 21:34:05 +0200 mh r275128 : enable CAIROCANVAS for Linux and Mac, #i88613#
2009-08-17 18:02:59 +0200 mh r275067 : #i95498# make compile with gcc3
2009-09-10 kz CWS-TOOLING: integrate CWS tkr24
2009-09-07 14:31:06 +0200 is r275898 : #160081# adding NO_LICENSE_INTO_COPYRIGHT
2009-09-10 releng #i10000# change KeyMapping to SingletonRef<framework::KeyMapping>
2009-09-11 convert-repo update tags
2009-09-10 kz CWS-TOOLING: integrate CWS os2port06dev300
2009-09-05 22:49:00 +0200 ydario r275858 : #i99588# applied os2port06 diff to DEV300 tree.
2009-09-10 kz CWS-TOOLING: integrate CWS mingwport23
2009-08-29 07:07:53 +0200 tono r275555 : i#104522: mingw port graphite
2009-08-29 07:07:26 +0200 tono r275554 : i#104522: mingw port printf format fix
2009-09-10 kz CWS-TOOLING: integrate CWS mh232
2009-08-26 03:52:57 +0200 mh r275385 : #i102182# FreeBSD patch
2009-08-26 03:43:20 +0200 mh r275384 : #i101333# patch for FreeBSD
2009-08-26 03:11:20 +0200 mh r275383 : #i39230
2009-08-26 03:07:51 +0200 mh r275382 : #i39230# more space for initials field
2009-08-26 02:41:19 +0200 mh r275380 : #i39230# use vos::osecurity for reading the user name
2009-08-18 22:06:00 +0200 mh r275130 : #i104243#, line ending problem with newer perl
2009-08-18 21:53:21 +0200 mh r275129 : #i39230# read initials via getpwnam
2009-08-18 21:34:05 +0200 mh r275128 : enable CAIROCANVAS for Linux and Mac, #i88613#
2009-08-17 18:02:59 +0200 mh r275067 : #i95498# make compile with gcc3
2009-09-10 kz CWS-TOOLING: integrate CWS tkr24
2009-09-07 14:31:06 +0200 is r275898 : #160081# adding NO_LICENSE_INTO_COPYRIGHT
2009-09-10 releng #i10000# change KeyMapping to SingletonRef<framework::KeyMapping>
2009-09-11 14:29:45 +00:00
|
|
|
InsertPoolItem( rPam, SwNumRuleItem( pNew->GetName() ), 0 );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2008-03-05 15:53:54 +00:00
|
|
|
if ( bResetIndentAttrs &&
|
|
|
|
pNew && pNew->Get( 0 ).GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
|
|
|
|
{
|
2011-06-10 15:46:15 +01:00
|
|
|
::lcl_ResetIndentAttrs(this, rPam, RES_LR_SPACE);
|
2008-03-05 15:53:54 +00:00
|
|
|
}
|
|
|
|
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
|
|
|
{
|
|
|
|
GetIDocumentUndoRedo().EndUndo( UNDO_INSNUM, NULL );
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
SetModified();
|
|
|
|
}
|
|
|
|
|
2005-11-08 16:16:30 +00:00
|
|
|
void SwDoc::SetCounted(const SwPaM & rPam, bool bCounted)
|
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
if ( bCounted )
|
|
|
|
{
|
2011-06-10 15:46:15 +01:00
|
|
|
::lcl_ResetIndentAttrs(this, rPam, RES_PARATR_LIST_ISCOUNTED);
|
2008-06-13 08:35:27 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-11-18 11:29:24 +00:00
|
|
|
InsertPoolItem( rPam, SfxBoolItem( RES_PARATR_LIST_ISCOUNTED, sal_False ), 0 );
|
2005-11-08 16:16:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
void SwDoc::SetNumRuleStart( const SwPosition& rPos, sal_Bool bFlag )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwTxtNode* pTxtNd = rPos.nNode.GetNode().GetTxtNode();
|
2005-11-08 16:16:30 +00:00
|
|
|
|
|
|
|
if (pTxtNd)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2005-11-08 16:16:30 +00:00
|
|
|
const SwNumRule* pRule = pTxtNd->GetNumRule();
|
2008-06-13 08:35:27 +00:00
|
|
|
if( pRule && !bFlag != !pTxtNd->IsListRestart())
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2005-11-08 16:16:30 +00:00
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
SwUndo *const pUndo( new SwUndoNumRuleStart(rPos, bFlag) );
|
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2005-11-08 16:16:30 +00:00
|
|
|
}
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
pTxtNd->SetListRestart(bFlag ? true : false);
|
2005-11-08 16:16:30 +00:00
|
|
|
|
|
|
|
SetModified();
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
void SwDoc::SetNodeNumStart( const SwPosition& rPos, sal_uInt16 nStt )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwTxtNode* pTxtNd = rPos.nNode.GetNode().GetTxtNode();
|
2005-11-08 16:16:30 +00:00
|
|
|
|
|
|
|
if (pTxtNd)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
if ( !pTxtNd->HasAttrListRestartValue() ||
|
|
|
|
pTxtNd->GetAttrListRestartValue() != nStt )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2005-11-08 16:16:30 +00:00
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
SwUndo *const pUndo( new SwUndoNumRuleStart(rPos, nStt) );
|
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2005-11-08 16:16:30 +00:00
|
|
|
}
|
2008-06-13 08:35:27 +00:00
|
|
|
pTxtNd->SetAttrListRestartValue( nStt );
|
2005-11-08 16:16:30 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
SetModified();
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// We can only delete if the Rule is unused!
|
2013-10-11 14:39:49 +02:00
|
|
|
bool SwDoc::DelNumRule( const OUString& rName, bool bBroadcast )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nPos = FindNumRule( rName );
|
2008-01-29 07:37:24 +00:00
|
|
|
|
2013-11-08 15:57:04 +01:00
|
|
|
if (nPos == USHRT_MAX)
|
|
|
|
return false;
|
|
|
|
|
2013-02-18 07:54:37 +01:00
|
|
|
if ( (*mpNumRuleTbl)[ nPos ] == GetOutlineNumRule() )
|
2008-01-29 07:37:24 +00:00
|
|
|
{
|
2011-03-12 11:51:35 +01:00
|
|
|
OSL_FAIL( "<SwDoc::DelNumRule(..)> - No deletion of outline list style. This is serious defect - please inform OD" );
|
2012-11-01 08:19:50 +09:00
|
|
|
return false;
|
2008-01-29 07:37:24 +00:00
|
|
|
}
|
|
|
|
|
2013-11-08 15:57:04 +01:00
|
|
|
if( !IsUsed( *(*mpNumRuleTbl)[ nPos ] ))
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2004-09-08 14:17:53 +00:00
|
|
|
{
|
|
|
|
SwUndo * pUndo =
|
2013-02-18 07:54:37 +01:00
|
|
|
new SwUndoNumruleDelete(*(*mpNumRuleTbl)[nPos], this);
|
2010-11-25 14:31:08 +01:00
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2004-09-08 14:17:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (bBroadcast)
|
|
|
|
BroadcastStyleOperation(rName, SFX_STYLE_FAMILY_PSEUDO,
|
|
|
|
SFX_STYLESHEET_ERASED);
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
deleteListForListStyle( rName );
|
|
|
|
{
|
|
|
|
// delete further list, which have the deleted list style as default list style
|
|
|
|
std::vector< SwList* > aListsForDeletion;
|
|
|
|
tHashMapForLists::iterator aListIter = maLists.begin();
|
|
|
|
while ( aListIter != maLists.end() )
|
|
|
|
{
|
|
|
|
SwList* pList = (*aListIter).second;
|
|
|
|
if ( pList->GetDefaultListStyleName() == rName )
|
|
|
|
{
|
|
|
|
aListsForDeletion.push_back( pList );
|
|
|
|
}
|
|
|
|
|
|
|
|
++aListIter;
|
|
|
|
}
|
2012-06-30 18:20:20 +02:00
|
|
|
while ( !aListsForDeletion.empty() )
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
|
|
|
SwList* pList = aListsForDeletion.back();
|
|
|
|
aListsForDeletion.pop_back();
|
|
|
|
deleteList( pList->GetListId() );
|
|
|
|
}
|
|
|
|
}
|
2011-04-16 22:42:13 -03:00
|
|
|
// #i34097# DeleteAndDestroy deletes rName if
|
2004-11-16 14:39:29 +00:00
|
|
|
// rName is directly taken from the numrule.
|
2013-10-16 09:32:03 +02:00
|
|
|
const OUString aTmpName( rName );
|
2013-02-18 07:54:37 +01:00
|
|
|
delete (*mpNumRuleTbl)[ nPos ];
|
|
|
|
mpNumRuleTbl->erase( mpNumRuleTbl->begin() + nPos );
|
2008-06-13 08:35:27 +00:00
|
|
|
maNumRuleMap.erase(aTmpName);
|
2004-10-22 07:11:47 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
SetModified();
|
2012-11-01 08:19:50 +09:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2012-11-01 08:19:50 +09:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2013-09-29 10:45:36 +02:00
|
|
|
void SwDoc::ChgNumRuleFmts( const SwNumRule& rRule )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2013-09-29 10:45:36 +02:00
|
|
|
SwNumRule* pRule = FindNumRulePtr( rRule.GetName() );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pRule )
|
|
|
|
{
|
|
|
|
SwUndoInsNum* pUndo = 0;
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
pUndo = new SwUndoInsNum( *pRule, rRule );
|
2008-01-04 12:20:14 +00:00
|
|
|
pUndo->GetHistory();
|
2010-11-25 14:31:08 +01:00
|
|
|
GetIDocumentUndoRedo().AppendUndo( pUndo );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2007-09-27 07:36:31 +00:00
|
|
|
::lcl_ChgNumRule( *this, rRule );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( pUndo )
|
|
|
|
pUndo->SetLRSpaceEndPos();
|
|
|
|
|
|
|
|
SetModified();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-11 14:39:49 +02:00
|
|
|
bool SwDoc::RenameNumRule(const OUString & rOldName, const OUString & rNewName,
|
2012-11-01 08:19:50 +09:00
|
|
|
bool bBroadcast)
|
2004-09-08 14:17:53 +00:00
|
|
|
{
|
2012-11-01 08:19:50 +09:00
|
|
|
bool bResult = false;
|
2004-09-08 14:17:53 +00:00
|
|
|
SwNumRule * pNumRule = FindNumRulePtr(rOldName);
|
|
|
|
|
|
|
|
if (pNumRule)
|
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2004-09-08 14:17:53 +00:00
|
|
|
{
|
|
|
|
SwUndo * pUndo = new SwUndoNumruleRename(rOldName, rNewName, this);
|
2010-11-25 14:31:08 +01:00
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2004-09-08 14:17:53 +00:00
|
|
|
}
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
SwNumRule::tTxtNodeList aTxtNodeList;
|
|
|
|
pNumRule->GetTxtNodeList( aTxtNodeList );
|
2004-09-08 14:17:53 +00:00
|
|
|
|
2008-07-11 13:13:49 +00:00
|
|
|
pNumRule->SetName( rNewName, *this );
|
2004-09-08 14:17:53 +00:00
|
|
|
|
|
|
|
SwNumRuleItem aItem(rNewName);
|
2010-11-18 08:25:05 +01:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
for ( SwNumRule::tTxtNodeList::iterator aIter = aTxtNodeList.begin();
|
|
|
|
aIter != aTxtNodeList.end(); ++aIter )
|
2004-09-08 14:17:53 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
SwTxtNode * pTxtNd = *aIter;
|
|
|
|
pTxtNd->SetAttr(aItem);
|
2004-09-08 14:17:53 +00:00
|
|
|
}
|
|
|
|
|
2012-11-01 08:19:50 +09:00
|
|
|
bResult = true;
|
2004-09-08 14:17:53 +00:00
|
|
|
|
|
|
|
if (bBroadcast)
|
|
|
|
BroadcastStyleOperation(rOldName, SFX_STYLE_FAMILY_PSEUDO,
|
|
|
|
SFX_STYLESHEET_MODIFIED);
|
|
|
|
}
|
|
|
|
|
|
|
|
return bResult;
|
|
|
|
}
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
void SwDoc::StopNumRuleAnimations( OutputDevice* pOut )
|
|
|
|
{
|
2012-05-16 15:23:09 +02:00
|
|
|
for( sal_uInt16 n = GetNumRuleTbl().size(); n; )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
SwNumRule::tTxtNodeList aTxtNodeList;
|
|
|
|
GetNumRuleTbl()[ --n ]->GetTxtNodeList( aTxtNodeList );
|
|
|
|
for ( SwNumRule::tTxtNodeList::iterator aTxtNodeIter = aTxtNodeList.begin();
|
|
|
|
aTxtNodeIter != aTxtNodeList.end(); ++aTxtNodeIter )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
SwTxtNode* pTNd = *aTxtNodeIter;
|
2010-12-17 09:02:23 +01:00
|
|
|
SwIterator<SwTxtFrm,SwTxtNode> aIter(*pTNd);
|
|
|
|
for(SwTxtFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() )
|
|
|
|
if( pFrm->HasAnimation() )
|
|
|
|
pFrm->StopAnimation( pOut );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-01 08:19:50 +09:00
|
|
|
bool SwDoc::ReplaceNumRule( const SwPosition& rPos,
|
2013-10-11 14:39:49 +02:00
|
|
|
const OUString& rOldRule, const OUString& rNewRule )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-11-01 08:19:50 +09:00
|
|
|
bool bRet = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
SwNumRule *pOldRule = FindNumRulePtr( rOldRule ),
|
|
|
|
*pNewRule = FindNumRulePtr( rNewRule );
|
|
|
|
if( pOldRule && pNewRule && pOldRule != pNewRule )
|
|
|
|
{
|
|
|
|
SwUndoInsNum* pUndo = 0;
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
// Start/End for attributes!
|
|
|
|
GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
|
|
|
|
pUndo = new SwUndoInsNum( rPos, *pNewRule, rOldRule );
|
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
SwNumRule::tTxtNodeList aTxtNodeList;
|
|
|
|
pOldRule->GetTxtNodeList( aTxtNodeList );
|
|
|
|
if ( aTxtNodeList.size() > 0 )
|
2004-06-11 14:46:59 +00:00
|
|
|
{
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
SwRegHistory aRegH( pUndo ? pUndo->GetHistory() : 0 );
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nChgFmtLevel = 0;
|
|
|
|
for( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
|
2004-06-11 14:46:59 +00:00
|
|
|
{
|
|
|
|
const SwNumFmt& rOldFmt = pOldRule->Get( n ),
|
|
|
|
& rNewFmt = pNewRule->Get( n );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2004-06-11 14:46:59 +00:00
|
|
|
if( rOldFmt.GetAbsLSpace() != rNewFmt.GetAbsLSpace() ||
|
|
|
|
rOldFmt.GetFirstLineOffset() != rNewFmt.GetFirstLineOffset() )
|
|
|
|
nChgFmtLevel |= ( 1 << n );
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
const SwTxtNode* pGivenTxtNode = rPos.nNode.GetNode().GetTxtNode();
|
2004-06-11 14:46:59 +00:00
|
|
|
SwNumRuleItem aRule( rNewRule );
|
2008-06-13 08:35:27 +00:00
|
|
|
|
|
|
|
for ( SwNumRule::tTxtNodeList::iterator aIter = aTxtNodeList.begin();
|
|
|
|
aIter != aTxtNodeList.end(); ++aIter )
|
2004-06-11 14:46:59 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
SwTxtNode* pTxtNd = *aIter;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
if ( pGivenTxtNode &&
|
|
|
|
pGivenTxtNode->GetListId() == pTxtNd->GetListId() )
|
|
|
|
{
|
|
|
|
aRegH.RegisterInModify( pTxtNd, *pTxtNd );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
pTxtNd->SetAttr( aRule );
|
|
|
|
pTxtNd->NumRuleChgd();
|
|
|
|
}
|
2004-06-11 14:46:59 +00:00
|
|
|
}
|
2010-11-25 14:31:08 +01:00
|
|
|
GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
|
2004-06-11 14:46:59 +00:00
|
|
|
SetModified();
|
|
|
|
|
2012-11-01 08:19:50 +09:00
|
|
|
bRet = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
2004-06-11 14:46:59 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
namespace
|
|
|
|
{
|
|
|
|
struct ListStyleData
|
|
|
|
{
|
|
|
|
SwNumRule* pReplaceNumRule;
|
|
|
|
bool bCreateNewList;
|
2013-09-29 01:38:27 +02:00
|
|
|
OUString sListId;
|
2008-06-13 08:35:27 +00:00
|
|
|
|
|
|
|
ListStyleData()
|
|
|
|
: pReplaceNumRule( 0 ),
|
|
|
|
bCreateNewList( false ),
|
|
|
|
sListId()
|
|
|
|
{}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2005-01-25 12:59:21 +00:00
|
|
|
void SwDoc::MakeUniqueNumRules(const SwPaM & rPaM)
|
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( rPaM.GetDoc() == this, "need same doc" );
|
2005-03-08 10:21:10 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
::std::map<SwNumRule *, ListStyleData> aMyNumRuleMap;
|
2005-01-25 12:59:21 +00:00
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nStt = rPaM.Start()->nNode.GetIndex();
|
|
|
|
sal_uLong nEnd = rPaM.End()->nNode.GetIndex();
|
2005-01-25 12:59:21 +00:00
|
|
|
|
2005-02-21 15:15:34 +00:00
|
|
|
bool bFirst = true;
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
for (sal_uLong n = nStt; n <= nEnd; n++)
|
2005-01-25 12:59:21 +00:00
|
|
|
{
|
|
|
|
SwTxtNode * pCNd = GetNodes()[n]->GetTxtNode();
|
|
|
|
|
|
|
|
if (pCNd)
|
|
|
|
{
|
|
|
|
SwNumRule * pRule = pCNd->GetNumRule();
|
|
|
|
|
2005-11-08 16:16:30 +00:00
|
|
|
if (pRule && pRule->IsAutoRule() && ! pRule->IsOutlineRule())
|
2005-01-25 12:59:21 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
ListStyleData aListStyleData = aMyNumRuleMap[pRule];
|
2005-01-25 12:59:21 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
if ( aListStyleData.pReplaceNumRule == 0 )
|
2005-01-25 12:59:21 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
if (bFirst)
|
2005-02-21 15:15:34 +00:00
|
|
|
{
|
|
|
|
SwPosition aPos(*pCNd);
|
2008-06-13 08:35:27 +00:00
|
|
|
aListStyleData.pReplaceNumRule =
|
2005-02-21 15:15:34 +00:00
|
|
|
const_cast<SwNumRule *>
|
2009-09-08 13:44:38 +00:00
|
|
|
(SearchNumRule( aPos, false, pCNd->HasNumber(),
|
|
|
|
false, 0,
|
2008-06-13 08:35:27 +00:00
|
|
|
aListStyleData.sListId, true ));
|
2005-02-21 15:15:34 +00:00
|
|
|
}
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
if ( aListStyleData.pReplaceNumRule == 0 )
|
2005-02-21 15:15:34 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
aListStyleData.pReplaceNumRule = new SwNumRule(*pRule);
|
2010-10-18 12:55:43 +01:00
|
|
|
|
2008-07-11 13:13:49 +00:00
|
|
|
aListStyleData.pReplaceNumRule->SetName(
|
|
|
|
GetUniqueNumRuleName(), *this );
|
2010-10-18 12:55:43 +01:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
aListStyleData.bCreateNewList = true;
|
2005-02-21 15:15:34 +00:00
|
|
|
}
|
2005-01-25 12:59:21 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
aMyNumRuleMap[pRule] = aListStyleData;
|
2005-01-25 12:59:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SwPaM aPam(*pCNd);
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
SetNumRule( aPam, *aListStyleData.pReplaceNumRule,
|
|
|
|
aListStyleData.bCreateNewList,
|
|
|
|
aListStyleData.sListId );
|
|
|
|
if ( aListStyleData.bCreateNewList )
|
|
|
|
{
|
|
|
|
aListStyleData.bCreateNewList = false;
|
|
|
|
aListStyleData.sListId = pCNd->GetListId();
|
|
|
|
aMyNumRuleMap[pRule] = aListStyleData;
|
|
|
|
}
|
2005-02-21 15:15:34 +00:00
|
|
|
|
|
|
|
bFirst = false;
|
2005-01-25 12:59:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-01 08:19:50 +09:00
|
|
|
bool SwDoc::NoNum( const SwPaM& rPam )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
|
2012-11-01 08:19:50 +09:00
|
|
|
bool bRet = SplitNode( *rPam.GetPoint(), false );
|
2012-01-08 22:38:04 +01:00
|
|
|
// Do we actually use Numbering at all?
|
2000-09-18 23:08:29 +00:00
|
|
|
if( bRet )
|
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// Set NoNum and Upate
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwNodeIndex& rIdx = rPam.GetPoint()->nNode;
|
|
|
|
SwTxtNode* pNd = rIdx.GetNode().GetTxtNode();
|
|
|
|
const SwNumRule* pRule = pNd->GetNumRule();
|
2005-11-08 16:16:30 +00:00
|
|
|
if( pRule )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
pNd->SetCountedInList(false);
|
2005-11-08 16:16:30 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
SetModified();
|
|
|
|
}
|
|
|
|
else
|
2012-11-01 08:19:50 +09:00
|
|
|
bRet = false; // no Numbering or just always sal_True?
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
void SwDoc::DelNumRules( const SwPaM& rPam )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nStt = rPam.GetPoint()->nNode.GetIndex(),
|
2000-09-18 23:08:29 +00:00
|
|
|
nEnd = rPam.GetMark()->nNode.GetIndex();
|
|
|
|
if( nStt > nEnd )
|
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nTmp = nStt; nStt = nEnd; nEnd = nTmp;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SwUndoDelNum* pUndo;
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
pUndo = new SwUndoDelNum( rPam );
|
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
pUndo = 0;
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
SwRegHistory aRegH( pUndo ? pUndo->GetHistory() : 0 );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2013-10-16 11:18:56 +02:00
|
|
|
SwNumRuleItem aEmptyRule( aEmptyOUStr );
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwNode* pOutlNd = 0;
|
|
|
|
for( ; nStt <= nEnd; ++nStt )
|
|
|
|
{
|
|
|
|
SwTxtNode* pTNd = GetNodes()[ nStt ]->GetTxtNode();
|
2008-06-13 08:35:27 +00:00
|
|
|
SwNumRule* pNumRuleOfTxtNode = pTNd ? pTNd->GetNumRule() : 0;
|
|
|
|
if ( pTNd && pNumRuleOfTxtNode )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
// recognize changes of attribute for undo
|
2000-09-18 23:08:29 +00:00
|
|
|
aRegH.RegisterInModify( pTNd, *pTNd );
|
|
|
|
|
|
|
|
if( pUndo )
|
2011-01-17 15:06:54 +01:00
|
|
|
pUndo->AddNode( *pTNd, sal_False );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
// directly set list style attribute is reset, otherwise empty
|
|
|
|
// list style is applied
|
|
|
|
const SfxItemSet* pAttrSet = pTNd->GetpSwAttrSet();
|
|
|
|
if ( pAttrSet &&
|
2011-01-17 15:06:54 +01:00
|
|
|
pAttrSet->GetItemState( RES_PARATR_NUMRULE, sal_False ) == SFX_ITEM_SET )
|
2008-06-13 08:35:27 +00:00
|
|
|
pTNd->ResetAttr( RES_PARATR_NUMRULE );
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
2008-06-13 08:35:27 +00:00
|
|
|
pTNd->SetAttr( aEmptyRule );
|
|
|
|
|
|
|
|
pTNd->ResetAttr( RES_PARATR_LIST_ID );
|
|
|
|
pTNd->ResetAttr( RES_PARATR_LIST_LEVEL );
|
|
|
|
pTNd->ResetAttr( RES_PARATR_LIST_ISRESTART );
|
|
|
|
pTNd->ResetAttr( RES_PARATR_LIST_RESTARTVALUE );
|
|
|
|
pTNd->ResetAttr( RES_PARATR_LIST_ISCOUNTED );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( RES_CONDTXTFMTCOLL == pTNd->GetFmtColl()->Which() )
|
2013-02-08 14:54:36 +01:00
|
|
|
{
|
2000-09-18 23:08:29 +00:00
|
|
|
pTNd->ChkCondColl();
|
2013-02-08 14:54:36 +01:00
|
|
|
}
|
2009-01-07 11:57:24 +00:00
|
|
|
else if( !pOutlNd &&
|
2013-09-27 14:40:18 +02:00
|
|
|
static_cast<SwTxtFmtColl*>(pTNd->GetFmtColl())->IsAssignedToListLevelOfOutlineStyle() )
|
2013-02-08 14:54:36 +01:00
|
|
|
{
|
2000-09-18 23:08:29 +00:00
|
|
|
pOutlNd = pTNd;
|
2013-02-08 14:54:36 +01:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// Finally, update all
|
2000-09-18 23:08:29 +00:00
|
|
|
UpdateNumRule();
|
|
|
|
|
|
|
|
if( pOutlNd )
|
|
|
|
GetNodes().UpdtOutlineIdx( *pOutlNd );
|
|
|
|
}
|
|
|
|
|
2004-10-22 07:11:47 +00:00
|
|
|
void SwDoc::InvalidateNumRules()
|
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
for (sal_uInt16 n = 0; n < mpNumRuleTbl->size(); ++n)
|
|
|
|
(*mpNumRuleTbl)[n]->SetInvalidRule(sal_True);
|
2004-10-22 07:11:47 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// To the next/preceding Bullet at the same Level
|
2012-11-01 08:19:50 +09:00
|
|
|
static bool lcl_IsNumOk( sal_uInt8 nSrchNum, sal_uInt8& rLower, sal_uInt8& rUpper,
|
|
|
|
bool bOverUpper, sal_uInt8 nNumber )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( nNumber < MAXLEVEL,
|
2008-06-13 08:35:27 +00:00
|
|
|
"<lcl_IsNumOk(..)> - misusage of method" );
|
|
|
|
|
2012-11-01 08:19:50 +09:00
|
|
|
bool bRet = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if( bOverUpper ? nSrchNum == nNumber : nSrchNum >= nNumber )
|
2012-11-01 08:19:50 +09:00
|
|
|
bRet = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
else if( nNumber > rLower )
|
|
|
|
rLower = nNumber;
|
|
|
|
else if( nNumber < rUpper )
|
|
|
|
rUpper = nNumber;
|
|
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
2012-11-01 08:19:50 +09:00
|
|
|
static bool lcl_IsValidPrevNextNumNode( const SwNodeIndex& rIdx )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-11-01 08:19:50 +09:00
|
|
|
bool bRet = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwNode& rNd = rIdx.GetNode();
|
|
|
|
switch( rNd.GetNodeType() )
|
|
|
|
{
|
|
|
|
case ND_ENDNODE:
|
2006-08-14 14:59:04 +00:00
|
|
|
bRet = SwTableBoxStartNode == rNd.StartOfSectionNode()->GetStartNodeType() ||
|
|
|
|
rNd.StartOfSectionNode()->IsSectionNode();
|
2000-09-18 23:08:29 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case ND_STARTNODE:
|
|
|
|
bRet = SwTableBoxStartNode == ((SwStartNode&)rNd).GetStartNodeType();
|
|
|
|
break;
|
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
case ND_SECTIONNODE: // that one's valid, so proceed
|
2012-11-01 08:19:50 +09:00
|
|
|
bRet = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
2012-11-01 08:19:50 +09:00
|
|
|
static bool lcl_GotoNextPrevNum( SwPosition& rPos, bool bNext,
|
|
|
|
bool bOverUpper, sal_uInt8* pUpper, sal_uInt8* pLower )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
const SwTxtNode* pNd = rPos.nNode.GetNode().GetTxtNode();
|
|
|
|
const SwNumRule* pRule;
|
2005-11-08 16:16:30 +00:00
|
|
|
if( !pNd || 0 == ( pRule = pNd->GetNumRule()))
|
2012-11-01 08:19:50 +09:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8 nSrchNum = static_cast<sal_uInt8>(pNd->GetActualListLevel());
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
SwNodeIndex aIdx( rPos.nNode );
|
2008-06-13 08:35:27 +00:00
|
|
|
if( ! pNd->IsCountedInList() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// If NO_NUMLEVEL is switched on, we search the preceding Node with Numbering
|
2012-11-01 08:19:50 +09:00
|
|
|
bool bError = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
do {
|
|
|
|
aIdx--;
|
|
|
|
if( aIdx.GetNode().IsTxtNode() )
|
|
|
|
{
|
|
|
|
pNd = aIdx.GetNode().GetTxtNode();
|
2005-11-08 16:16:30 +00:00
|
|
|
pRule = pNd->GetNumRule();
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8 nTmpNum;
|
2005-11-08 16:16:30 +00:00
|
|
|
|
|
|
|
if( pRule )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
nTmpNum = static_cast<sal_uInt8>(pNd->GetActualListLevel());
|
2008-06-13 08:35:27 +00:00
|
|
|
if( !( ! pNd->IsCountedInList() &&
|
2005-11-08 16:16:30 +00:00
|
|
|
(nTmpNum >= nSrchNum )) )
|
2012-01-08 22:38:04 +01:00
|
|
|
break; // found it!
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else
|
2012-11-01 08:19:50 +09:00
|
|
|
bError = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
bError = !lcl_IsValidPrevNextNumNode( aIdx );
|
|
|
|
|
|
|
|
} while( !bError );
|
|
|
|
if( bError )
|
2012-11-01 08:19:50 +09:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8 nLower = nSrchNum, nUpper = nSrchNum;
|
2012-11-01 08:19:50 +09:00
|
|
|
bool bRet = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
const SwTxtNode* pLast;
|
|
|
|
if( bNext )
|
|
|
|
aIdx++, pLast = pNd;
|
|
|
|
else
|
|
|
|
aIdx--, pLast = 0;
|
|
|
|
|
|
|
|
while( bNext ? ( aIdx.GetIndex() < aIdx.GetNodes().Count() - 1 )
|
|
|
|
: aIdx.GetIndex() )
|
|
|
|
{
|
|
|
|
if( aIdx.GetNode().IsTxtNode() )
|
|
|
|
{
|
|
|
|
pNd = aIdx.GetNode().GetTxtNode();
|
2005-11-08 16:16:30 +00:00
|
|
|
pRule = pNd->GetNumRule();
|
|
|
|
if( pRule )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if( ::lcl_IsNumOk( nSrchNum, nLower, nUpper, bOverUpper,
|
2011-01-17 15:06:54 +01:00
|
|
|
static_cast<sal_uInt8>(pNd->GetActualListLevel()) ))
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
rPos.nNode = aIdx;
|
|
|
|
rPos.nContent.Assign( (SwTxtNode*)pNd, 0 );
|
2012-11-01 08:19:50 +09:00
|
|
|
bRet = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
pLast = pNd;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if( !lcl_IsValidPrevNextNumNode( aIdx ))
|
|
|
|
break;
|
|
|
|
|
|
|
|
if( bNext )
|
2012-10-15 23:31:02 +02:00
|
|
|
++aIdx;
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
|
|
|
aIdx--;
|
|
|
|
}
|
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
if( !bRet && !bOverUpper && pLast ) // do not iterate over higher numbers, but still to the end
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if( bNext )
|
|
|
|
{
|
|
|
|
rPos.nNode = aIdx;
|
|
|
|
if( aIdx.GetNode().IsCntntNode() )
|
|
|
|
rPos.nContent.Assign( aIdx.GetNode().GetCntntNode(), 0 );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
rPos.nNode.Assign( *pLast );
|
|
|
|
rPos.nContent.Assign( (SwTxtNode*)pLast, 0 );
|
|
|
|
}
|
2012-11-01 08:19:50 +09:00
|
|
|
bRet = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if( bRet )
|
|
|
|
{
|
|
|
|
if( pUpper )
|
|
|
|
*pUpper = nUpper;
|
|
|
|
if( pLower )
|
|
|
|
*pLower = nLower;
|
|
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
2012-11-01 08:19:50 +09:00
|
|
|
bool SwDoc::GotoNextNum( SwPosition& rPos, bool bOverUpper,
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8* pUpper, sal_uInt8* pLower )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-11-01 08:19:50 +09:00
|
|
|
return ::lcl_GotoNextPrevNum( rPos, true, bOverUpper, pUpper, pLower );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2009-09-08 13:44:38 +00:00
|
|
|
const SwNumRule * SwDoc::SearchNumRule(const SwPosition & rPos,
|
|
|
|
const bool bForward,
|
|
|
|
const bool bNum,
|
|
|
|
const bool bOutline,
|
2005-11-08 16:16:30 +00:00
|
|
|
int nNonEmptyAllowed,
|
2013-09-29 01:38:27 +02:00
|
|
|
OUString& sListId,
|
2009-09-08 13:44:38 +00:00
|
|
|
const bool bInvestigateStartNode)
|
2004-03-30 15:05:30 +00:00
|
|
|
{
|
|
|
|
const SwNumRule * pResult = NULL;
|
|
|
|
SwTxtNode * pTxtNd = rPos.nNode.GetNode().GetTxtNode();
|
|
|
|
SwNode * pStartFromNode = pTxtNd;
|
|
|
|
|
|
|
|
if (pTxtNd)
|
|
|
|
{
|
|
|
|
SwNodeIndex aIdx(rPos.nNode);
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2005-11-08 16:16:30 +00:00
|
|
|
// - the start node has also been investigated, if requested.
|
2004-03-30 15:05:30 +00:00
|
|
|
const SwNode * pNode = NULL;
|
|
|
|
do
|
|
|
|
{
|
2009-09-08 13:44:38 +00:00
|
|
|
if ( !bInvestigateStartNode )
|
2005-11-08 16:16:30 +00:00
|
|
|
{
|
|
|
|
if (bForward)
|
2012-10-15 23:31:02 +02:00
|
|
|
++aIdx;
|
2005-11-08 16:16:30 +00:00
|
|
|
else
|
|
|
|
aIdx--;
|
|
|
|
}
|
2010-10-18 12:55:43 +01:00
|
|
|
|
2004-03-30 15:05:30 +00:00
|
|
|
if (aIdx.GetNode().IsTxtNode())
|
|
|
|
{
|
|
|
|
pTxtNd = aIdx.GetNode().GetTxtNode();
|
|
|
|
|
|
|
|
const SwNumRule * pNumRule = pTxtNd->GetNumRule();
|
|
|
|
if (pNumRule)
|
|
|
|
{
|
2011-03-14 16:51:14 +00:00
|
|
|
if ( ( pNumRule->IsOutlineRule() == ( bOutline ? sal_True : sal_False ) ) &&
|
2009-09-08 13:44:38 +00:00
|
|
|
( ( bNum && pNumRule->Get(0).IsEnumeration()) ||
|
|
|
|
( !bNum && pNumRule->Get(0).IsItemize() ) ) ) // #i22362#, #i29560#
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
2004-03-30 15:05:30 +00:00
|
|
|
pResult = pTxtNd->GetNumRule();
|
2008-06-13 08:35:27 +00:00
|
|
|
// provide also the list id, to which the text node belongs.
|
|
|
|
sListId = pTxtNd->GetListId();
|
|
|
|
}
|
2004-03-30 15:05:30 +00:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if (pTxtNd->Len() > 0 || NULL != pTxtNd->GetNumRule())
|
|
|
|
{
|
|
|
|
if (nNonEmptyAllowed == 0)
|
|
|
|
break;
|
|
|
|
|
|
|
|
nNonEmptyAllowed--;
|
|
|
|
|
|
|
|
if (nNonEmptyAllowed < 0)
|
|
|
|
nNonEmptyAllowed = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-08 13:44:38 +00:00
|
|
|
if ( bInvestigateStartNode )
|
2005-11-08 16:16:30 +00:00
|
|
|
{
|
|
|
|
if (bForward)
|
2012-10-15 23:31:02 +02:00
|
|
|
++aIdx;
|
2005-11-08 16:16:30 +00:00
|
|
|
else
|
|
|
|
aIdx--;
|
|
|
|
}
|
|
|
|
|
2004-03-30 15:05:30 +00:00
|
|
|
pNode = &aIdx.GetNode();
|
|
|
|
}
|
2010-12-15 09:13:54 +01:00
|
|
|
while (!(pNode == GetNodes().DocumentSectionStartNode(pStartFromNode) ||
|
|
|
|
pNode == GetNodes().DocumentSectionEndNode(pStartFromNode)));
|
2004-03-30 15:05:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return pResult;
|
|
|
|
}
|
2010-10-18 12:55:43 +01:00
|
|
|
|
2012-11-01 08:19:50 +09:00
|
|
|
bool SwDoc::GotoPrevNum( SwPosition& rPos, bool bOverUpper,
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8* pUpper, sal_uInt8* pLower )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-11-01 08:19:50 +09:00
|
|
|
return ::lcl_GotoNextPrevNum( rPos, false, bOverUpper, pUpper, pLower );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2012-10-30 11:27:06 +09:00
|
|
|
bool SwDoc::NumUpDown( const SwPaM& rPam, bool bDown )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nStt = rPam.GetPoint()->nNode.GetIndex(),
|
2000-09-18 23:08:29 +00:00
|
|
|
nEnd = rPam.GetMark()->nNode.GetIndex();
|
|
|
|
if( nStt > nEnd )
|
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nTmp = nStt; nStt = nEnd; nEnd = nTmp;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2011-02-07 20:21:18 +01:00
|
|
|
// -> outline nodes are promoted or demoted differently
|
2004-03-30 15:05:30 +00:00
|
|
|
bool bOnlyOutline = true;
|
|
|
|
bool bOnlyNonOutline = true;
|
2011-01-17 15:06:54 +01:00
|
|
|
for (sal_uLong n = nStt; n <= nEnd; n++)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2004-03-30 15:05:30 +00:00
|
|
|
SwTxtNode * pTxtNd = GetNodes()[n]->GetTxtNode();
|
|
|
|
|
|
|
|
if (pTxtNd)
|
|
|
|
{
|
|
|
|
SwNumRule * pRule = pTxtNd->GetNumRule();
|
|
|
|
|
|
|
|
if (pRule)
|
|
|
|
{
|
|
|
|
if (pRule->IsOutlineRule())
|
|
|
|
bOnlyNonOutline = false;
|
|
|
|
else
|
|
|
|
bOnlyOutline = false;
|
|
|
|
}
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2012-10-30 11:27:06 +09:00
|
|
|
bool bRet = true;
|
2011-10-20 08:32:16 +03:00
|
|
|
sal_Int8 nDiff = bDown ? 1 : -1;
|
2004-03-30 15:05:30 +00:00
|
|
|
|
|
|
|
if (bOnlyOutline)
|
|
|
|
bRet = OutlineUpDown(rPam, nDiff);
|
|
|
|
else if (bOnlyNonOutline)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2011-01-28 11:31:24 +00:00
|
|
|
/* #i24560#
|
2004-04-07 13:25:47 +00:00
|
|
|
Only promote or demote if all selected paragraphs are
|
|
|
|
promotable resp. demotable.
|
|
|
|
*/
|
2011-01-17 15:06:54 +01:00
|
|
|
for (sal_uLong nTmp = nStt; nTmp <= nEnd; ++nTmp)
|
2004-03-30 15:05:30 +00:00
|
|
|
{
|
2004-04-07 13:25:47 +00:00
|
|
|
SwTxtNode* pTNd = GetNodes()[ nTmp ]->GetTxtNode();
|
|
|
|
|
2011-01-28 11:31:24 +00:00
|
|
|
// Make code robust: consider case that the node doesn't denote a
|
|
|
|
// text node.
|
2006-11-01 14:10:34 +00:00
|
|
|
if ( pTNd )
|
2005-11-08 16:16:30 +00:00
|
|
|
{
|
2006-11-01 14:10:34 +00:00
|
|
|
SwNumRule * pRule = pTNd->GetNumRule();
|
|
|
|
|
|
|
|
if (pRule)
|
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8 nLevel = static_cast<sal_uInt8>(pTNd->GetActualListLevel());
|
2006-11-01 14:10:34 +00:00
|
|
|
if( (-1 == nDiff && 0 >= nLevel) ||
|
|
|
|
(1 == nDiff && MAXLEVEL - 1 <= nLevel))
|
2012-10-30 11:27:06 +09:00
|
|
|
bRet = false;
|
2006-11-01 14:10:34 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-03-30 15:05:30 +00:00
|
|
|
if( bRet )
|
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2004-04-07 13:25:47 +00:00
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
SwUndo *const pUndo( new SwUndoNumUpDown(rPam, nDiff) );
|
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2004-04-07 13:25:47 +00:00
|
|
|
}
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
for(sal_uLong nTmp = nStt; nTmp <= nEnd; ++nTmp )
|
2004-04-07 13:25:47 +00:00
|
|
|
{
|
|
|
|
SwTxtNode* pTNd = GetNodes()[ nTmp ]->GetTxtNode();
|
2005-11-08 16:16:30 +00:00
|
|
|
|
2004-04-07 13:25:47 +00:00
|
|
|
if( pTNd)
|
|
|
|
{
|
2005-11-08 16:16:30 +00:00
|
|
|
SwNumRule * pRule = pTNd->GetNumRule();
|
2004-04-07 13:25:47 +00:00
|
|
|
|
2005-11-08 16:16:30 +00:00
|
|
|
if (pRule)
|
2004-04-07 13:25:47 +00:00
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8 nLevel = static_cast<sal_uInt8>(pTNd->GetActualListLevel());
|
2007-09-27 07:36:31 +00:00
|
|
|
nLevel = nLevel + nDiff;
|
2004-04-07 13:25:47 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
pTNd->SetAttrListLevel(nLevel);
|
2004-04-07 13:25:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-11-08 16:16:30 +00:00
|
|
|
ChkCondColls();
|
2004-03-30 15:05:30 +00:00
|
|
|
SetModified();
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2004-03-30 15:05:30 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
2012-10-30 11:27:06 +09:00
|
|
|
bool SwDoc::MoveParagraph( const SwPaM& rPam, long nOffset, bool bIsOutlMv )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
const SwPosition *pStt = rPam.Start(), *pEnd = rPam.End();
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nStIdx = pStt->nNode.GetIndex();
|
|
|
|
sal_uLong nEndIdx = pEnd->nNode.GetIndex();
|
2006-03-31 08:50:38 +00:00
|
|
|
|
|
|
|
// Here are some sophisticated checks whether the wished PaM will be moved or not.
|
|
|
|
// For moving outlines (bIsOutlMv) I've already done some checks, so here are two different
|
|
|
|
// checks...
|
|
|
|
SwNode *pTmp1;
|
|
|
|
SwNode *pTmp2;
|
|
|
|
if( bIsOutlMv )
|
|
|
|
{
|
|
|
|
// For moving chapters (outline) the following reason will deny the move:
|
2012-10-13 22:20:33 +02:00
|
|
|
// if a start node is inside the moved range and its end node outside or vice versa.
|
2006-03-31 08:50:38 +00:00
|
|
|
// If a start node is the first moved paragraph, its end node has to be within the moved
|
2012-10-13 22:20:33 +02:00
|
|
|
// range, too (e.g. as last node).
|
|
|
|
// If an end node is the last node of the moved range, its start node has to be a part of
|
2006-03-31 08:50:38 +00:00
|
|
|
// the moved section, too.
|
|
|
|
pTmp1 = GetNodes()[ nStIdx ];
|
|
|
|
if( pTmp1->IsStartNode() )
|
|
|
|
{ // First is a start node
|
|
|
|
pTmp2 = pTmp1->EndOfSectionNode();
|
|
|
|
if( pTmp2->GetIndex() > nEndIdx )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false; // Its end node is behind the moved range
|
2006-03-31 08:50:38 +00:00
|
|
|
}
|
2006-08-14 14:59:04 +00:00
|
|
|
pTmp1 = pTmp1->StartOfSectionNode()->EndOfSectionNode();
|
2006-03-31 08:50:38 +00:00
|
|
|
if( pTmp1->GetIndex() <= nEndIdx )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false; // End node inside but start node before moved range => no.
|
2006-03-31 08:50:38 +00:00
|
|
|
pTmp1 = GetNodes()[ nEndIdx ];
|
|
|
|
if( pTmp1->IsEndNode() )
|
|
|
|
{ // The last one is an end node
|
2006-08-14 14:59:04 +00:00
|
|
|
pTmp1 = pTmp1->StartOfSectionNode();
|
2006-03-31 08:50:38 +00:00
|
|
|
if( pTmp1->GetIndex() < nStIdx )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false; // Its start node is before the moved range.
|
2006-03-31 08:50:38 +00:00
|
|
|
}
|
2006-08-14 14:59:04 +00:00
|
|
|
pTmp1 = pTmp1->StartOfSectionNode();
|
2006-03-31 08:50:38 +00:00
|
|
|
if( pTmp1->GetIndex() >= nStIdx )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false; // A start node which ends behind the moved range => no.
|
2006-03-31 08:50:38 +00:00
|
|
|
}
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nInStIdx, nInEndIdx;
|
2000-09-18 23:08:29 +00:00
|
|
|
long nOffs = nOffset;
|
|
|
|
if( nOffset > 0 )
|
|
|
|
{
|
|
|
|
nInEndIdx = nEndIdx;
|
|
|
|
nEndIdx += nOffset;
|
|
|
|
++nOffs;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// Impossible to move to negative index
|
2011-01-17 15:06:54 +01:00
|
|
|
if( sal_uLong(abs( nOffset )) > nStIdx)
|
2012-10-30 11:27:06 +09:00
|
|
|
return false;
|
2009-07-03 14:04:55 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
nInEndIdx = nStIdx - 1;
|
|
|
|
nStIdx += nOffset;
|
|
|
|
}
|
|
|
|
nInStIdx = nInEndIdx + 1;
|
2012-01-08 22:38:04 +01:00
|
|
|
// The following paragraphs shall be swapped:
|
|
|
|
// Swap [ nStIdx, nInEndIdx ] with [ nInStIdx, nEndIdx ]
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-03-31 08:50:38 +00:00
|
|
|
if( nEndIdx >= GetNodes().GetEndOfContent().GetIndex() )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-03-31 08:50:38 +00:00
|
|
|
if( !bIsOutlMv )
|
|
|
|
{ // And here the restrictions for moving paragraphs other than chapters (outlines)
|
|
|
|
// The plan is to exchange [nStIdx,nInEndIdx] and [nStartIdx,nEndIdx]
|
|
|
|
// It will checked if the both "start" nodes as well as the both "end" notes belongs to
|
|
|
|
// the same start-end-section. This is more restrictive than the conditions checked above.
|
|
|
|
// E.g. a paragraph will not escape from a section or be inserted to another section.
|
2006-08-14 14:59:04 +00:00
|
|
|
pTmp1 = GetNodes()[ nStIdx ]->StartOfSectionNode();
|
|
|
|
pTmp2 = GetNodes()[ nInStIdx ]->StartOfSectionNode();
|
2006-03-31 08:50:38 +00:00
|
|
|
if( pTmp1 != pTmp2 )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false; // "start" nodes in different sections
|
2006-03-31 08:50:38 +00:00
|
|
|
pTmp1 = GetNodes()[ nEndIdx ];
|
|
|
|
bool bIsEndNode = pTmp1->IsEndNode();
|
|
|
|
if( !pTmp1->IsStartNode() )
|
|
|
|
{
|
2006-08-14 14:59:04 +00:00
|
|
|
pTmp1 = pTmp1->StartOfSectionNode();
|
2006-03-31 08:50:38 +00:00
|
|
|
if( bIsEndNode ) // For end nodes the first start node is of course inside the range,
|
2006-08-14 14:59:04 +00:00
|
|
|
pTmp1 = pTmp1->StartOfSectionNode(); // I've to check the start node of the start node.
|
2006-03-31 08:50:38 +00:00
|
|
|
}
|
|
|
|
pTmp1 = pTmp1->EndOfSectionNode();
|
|
|
|
pTmp2 = GetNodes()[ nInEndIdx ];
|
|
|
|
if( !pTmp2->IsStartNode() )
|
|
|
|
{
|
|
|
|
bIsEndNode = pTmp2->IsEndNode();
|
2006-08-14 14:59:04 +00:00
|
|
|
pTmp2 = pTmp2->StartOfSectionNode();
|
2006-03-31 08:50:38 +00:00
|
|
|
if( bIsEndNode )
|
2006-08-14 14:59:04 +00:00
|
|
|
pTmp2 = pTmp2->StartOfSectionNode();
|
2006-03-31 08:50:38 +00:00
|
|
|
}
|
|
|
|
pTmp2 = pTmp2->EndOfSectionNode();
|
|
|
|
if( pTmp1 != pTmp2 )
|
2012-10-30 11:27:06 +09:00
|
|
|
return false; // The "end" notes are in different sections
|
2006-03-31 08:50:38 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// Test for Redlining - Can the Selection be moved at all, actually?
|
2000-09-18 23:08:29 +00:00
|
|
|
if( !IsIgnoreRedline() )
|
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nRedlPos = GetRedlinePos( pStt->nNode.GetNode(), nsRedlineType_t::REDLINE_DELETE );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( USHRT_MAX != nRedlPos )
|
|
|
|
{
|
|
|
|
SwPosition aStPos( *pStt ), aEndPos( *pEnd );
|
|
|
|
aStPos.nContent = 0;
|
|
|
|
SwCntntNode* pCNd = pEnd->nNode.GetNode().GetCntntNode();
|
|
|
|
aEndPos.nContent = pCNd ? pCNd->Len() : 1;
|
2012-11-03 12:18:57 +09:00
|
|
|
bool bCheckDel = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-10-13 22:20:33 +02:00
|
|
|
// There is a some Redline Delete Object for the range
|
2012-07-20 17:16:03 +02:00
|
|
|
for( ; nRedlPos < GetRedlineTbl().size(); ++nRedlPos )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2014-01-13 17:58:25 +02:00
|
|
|
const SwRangeRedline* pTmp = GetRedlineTbl()[ nRedlPos ];
|
2007-09-27 07:36:31 +00:00
|
|
|
if( !bCheckDel || nsRedlineType_t::REDLINE_DELETE == pTmp->GetType() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
const SwPosition *pRStt = pTmp->Start(), *pREnd = pTmp->End();
|
|
|
|
switch( ComparePosition( *pRStt, *pREnd, aStPos, aEndPos ))
|
|
|
|
{
|
2001-01-26 17:09:51 +00:00
|
|
|
case POS_COLLIDE_START:
|
2012-01-08 22:38:04 +01:00
|
|
|
case POS_BEHIND: // Pos1 comes after Pos2
|
2012-07-20 17:16:03 +02:00
|
|
|
nRedlPos = GetRedlineTbl().size();
|
2000-09-18 23:08:29 +00:00
|
|
|
break;
|
|
|
|
|
2001-01-26 17:09:51 +00:00
|
|
|
case POS_COLLIDE_END:
|
2012-01-08 22:38:04 +01:00
|
|
|
case POS_BEFORE: // Pos1 comes before Pos2
|
2000-09-18 23:08:29 +00:00
|
|
|
break;
|
2012-01-08 22:38:04 +01:00
|
|
|
case POS_INSIDE: // Pos1 is completely inside Pos2
|
|
|
|
// that's valid, but check all following for overlapping
|
2012-11-03 12:18:57 +09:00
|
|
|
bCheckDel = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
break;
|
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
case POS_OUTSIDE: // Pos2 is completely inside Pos1
|
2012-10-13 22:20:33 +02:00
|
|
|
case POS_EQUAL: // Pos1 is equal to Pos2
|
2012-01-08 22:38:04 +01:00
|
|
|
case POS_OVERLAP_BEFORE: // Pos1 overlaps Pos2 in the beginning
|
|
|
|
case POS_OVERLAP_BEHIND: // Pos1 overlaps Pos2 at the end
|
2012-10-30 11:27:06 +09:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// Send DataChanged before moving. We then can detect
|
2012-10-13 22:20:33 +02:00
|
|
|
// which objects are still in the range.
|
2012-01-08 22:38:04 +01:00
|
|
|
// After the move they could come before/after the
|
|
|
|
// Position.
|
2012-09-11 11:25:20 +02:00
|
|
|
SwDataChanged aTmp( rPam );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SwNodeIndex aIdx( nOffset > 0 ? pEnd->nNode : pStt->nNode, nOffs );
|
|
|
|
SwNodeRange aMvRg( pStt->nNode, 0, pEnd->nNode, +1 );
|
|
|
|
|
2014-01-13 17:58:25 +02:00
|
|
|
SwRangeRedline* pOwnRedl = 0;
|
2000-09-18 23:08:29 +00:00
|
|
|
if( IsRedlineOn() )
|
|
|
|
{
|
2012-10-13 22:20:33 +02:00
|
|
|
// If the range is completely in the own Redline, we can move it!
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nRedlPos = GetRedlinePos( pStt->nNode.GetNode(), nsRedlineType_t::REDLINE_INSERT );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( USHRT_MAX != nRedlPos )
|
|
|
|
{
|
2014-01-13 17:58:25 +02:00
|
|
|
SwRangeRedline* pTmp = GetRedlineTbl()[ nRedlPos ];
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwPosition *pRStt = pTmp->Start(), *pREnd = pTmp->End();
|
2014-01-13 17:58:25 +02:00
|
|
|
SwRangeRedline aTmpRedl( nsRedlineType_t::REDLINE_INSERT, rPam );
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwCntntNode* pCEndNd = pEnd->nNode.GetNode().GetCntntNode();
|
2012-10-13 22:20:33 +02:00
|
|
|
// Is completely in the range and is the own Redline too?
|
2000-09-18 23:08:29 +00:00
|
|
|
if( aTmpRedl.IsOwnRedline( *pTmp ) &&
|
|
|
|
(pRStt->nNode < pStt->nNode ||
|
|
|
|
(pRStt->nNode == pStt->nNode && !pRStt->nContent.GetIndex()) ) &&
|
|
|
|
(pEnd->nNode < pREnd->nNode ||
|
|
|
|
(pEnd->nNode == pREnd->nNode &&
|
|
|
|
pCEndNd ? pREnd->nContent.GetIndex() == pCEndNd->Len()
|
|
|
|
: !pREnd->nContent.GetIndex() )) )
|
|
|
|
{
|
|
|
|
pOwnRedl = pTmp;
|
2012-07-20 17:16:03 +02:00
|
|
|
if( nRedlPos + 1 < (sal_uInt16)GetRedlineTbl().size() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
pTmp = GetRedlineTbl()[ nRedlPos+1 ];
|
|
|
|
if( *pTmp->Start() == *pREnd )
|
2012-01-08 22:38:04 +01:00
|
|
|
// then don't!
|
2000-09-18 23:08:29 +00:00
|
|
|
pOwnRedl = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( pOwnRedl &&
|
|
|
|
!( pRStt->nNode <= aIdx && aIdx <= pREnd->nNode ))
|
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// it's not in itself, so don't move it
|
2000-09-18 23:08:29 +00:00
|
|
|
pOwnRedl = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !pOwnRedl )
|
|
|
|
{
|
2010-11-25 14:31:08 +01:00
|
|
|
GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// First the Insert, then the Delete
|
2000-09-18 23:08:29 +00:00
|
|
|
SwPosition aInsPos( aIdx );
|
|
|
|
aInsPos.nContent.Assign( aIdx.GetNode().GetCntntNode(), 0 );
|
|
|
|
|
|
|
|
SwPaM aPam( pStt->nNode, aMvRg.aEnd );
|
|
|
|
|
|
|
|
SwPaM& rOrigPam = (SwPaM&)rPam;
|
|
|
|
rOrigPam.DeleteMark();
|
|
|
|
rOrigPam.GetPoint()->nNode = aIdx.GetIndex() - 1;
|
|
|
|
|
2012-11-03 12:18:57 +09:00
|
|
|
bool bDelLastPara = !aInsPos.nNode.GetNode().IsCntntNode();
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2011-02-07 20:21:18 +01:00
|
|
|
/* When copying to a non-content node Copy will
|
2002-11-14 17:29:22 +00:00
|
|
|
insert a paragraph before that node and insert before
|
|
|
|
that inserted node. Copy creates an SwUndoInserts that
|
|
|
|
does not cover the extra paragraph. Thus we insert the
|
|
|
|
extra paragraph ourselves, _with_ correct undo
|
|
|
|
information. */
|
2002-11-14 16:35:11 +00:00
|
|
|
if (bDelLastPara)
|
|
|
|
{
|
2002-11-14 17:29:22 +00:00
|
|
|
/* aInsPos points to the non-content node. Move it to
|
|
|
|
the previous content node. */
|
2002-11-14 16:35:11 +00:00
|
|
|
SwPaM aInsPam(aInsPos);
|
2013-06-08 21:56:55 +02:00
|
|
|
const bool bMoved = aInsPam.Move(fnMoveBackward);
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE(bMoved, "No content node found!");
|
2002-11-14 16:35:11 +00:00
|
|
|
|
|
|
|
if (bMoved)
|
|
|
|
{
|
2002-11-14 17:29:22 +00:00
|
|
|
/* Append the new node after the content node
|
|
|
|
found. The new position to insert the moved
|
|
|
|
paragraph at is before the inserted
|
|
|
|
paragraph. */
|
2002-11-14 16:35:11 +00:00
|
|
|
AppendTxtNode(*aInsPam.GetPoint());
|
|
|
|
aInsPos = *aInsPam.GetPoint();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
CWS-TOOLING: integrate CWS odfmetadata3
2009-09-11 Michael Stahl merge DEV300_m58
2009-09-07 Michael Stahl SwFmtFld::Modify(): do nothing on RES_OBJECTDYING
2009-08-27 Michael Stahl #i91565#, #i91566#: TextPortionEnumerationTest.java: add test document
2009-08-27 Michael Stahl #i91565#, #i91566#: add complex test: TextPortionEnumerationTest.java
2009-08-27 Michael Stahl CLiteral::initialize(): zero-length literals probably not an error
2009-08-27 Michael Stahl #i91565#, #i91566#: offapi: new InContentMetadata and MetadataField services
adapt TextPortion for InContentMetadata
2009-08-27 Michael Stahl #i91564#: xmloff: load/store xml:id and RDFa for text:bookmark(-start).
2009-08-27 Michael Stahl #i91564#: sw core: add support for xml:id at bookmarks:
sw::mark::Bookmark: derive from Metadatable.
SwHistoryBookmark, SaveBookmark: store a MetadatableUndo.
ndcopy.cxx: lcl_CopyBookmarks(): copy the xml:id.
SwXBookmark: derive from MetadatableMixin.
2009-08-27 Michael Stahl #i91565#, #i91566#: xmloff: refactor ruby import so nested meta(-field) works:
remove XMLRubyHint_Impl.
XMLImpRubyContext_Impl::~XMLImpRubyContext_Impl(): insert ruby directly.
2009-08-27 Michael Stahl #i91565#, #i91566#: xmloff: fix text:meta(-field) import/export:
new XMLTextParagraphExport::exportTextField() overload for XTextField.
CreateAndInsertMark(): set xml:id after insertion.
fix meta(-field) service names, bugs etc.
2009-08-27 Michael Stahl #i91565#, #i91566#: sw text formatting: paint background of meta(-field) body:
SwFont: add member m_nMetaCount.
txttypes.hxx: add POR_META.
atrstck.cxx: handle RES_TXTATR_META(FIELD).
itrform2.cxx: SwTxtFormatter::WhichTxtPor(): create new class SwMetaPortion.
2009-08-27 Michael Stahl #i91566#: sw text formatting: display meta-field prefix and suffix:
SwAttrIter::GetAttr(): replace with call to GetTxtAttrForCharAt().
SwTxtFormatter::NewExtraPortion(): handle meta-field prefix.
SwTxtFormatter: new member m_nHintEndIndex.
SwTxtFormatter::WhichFirstPortion(): call TryNewNoLengthPortion().
SwTxtFormatter::TryNewNoLengthPortion(): new; handle suffix of meta-field.
SwTxtFormatter::UnderFlow(): UGLY HACK: decrement m_nHintEndIndex.
SwFldPortion: add flag m_bNoLength: portion has zero length (for suffix).
2009-08-27 Michael Stahl #i91565#, #i91566#: extend text:meta(-field) uno wrapper with XText interface:
unoobj.hxx: new CursorType CURSOR_META.
unoobj2.cxx: refactor SwXText implementation to ensure that when the SwXText
belongs to a SwXMeta, content is always inserted inside the meta(-field).
unoobj.cxx: new SwXTextCursor::ForceIntoMeta(): cursor stays in meta(-field).
unometa.hxx: SwXMeta implements XText, forwarding to a member SwXMetaText.
DocInsertStringSplitCR(), SwX*::attachToRange(), SwX*::DeleteAndInsert():
use FORCEHINTEXPAND hack to ensure insert into the meta(-field) at the end.
2009-08-27 Michael Stahl #i91565#, #i91566#: add text:meta(-field) uno wrapper to sw:
fmtmeta.hxx, fmtatr2.cxx: new class sw::MetaField, new sw::MetaFieldManager.
doc.hxx, docnew.cxx: new SwDoc::GetMetaFieldManager().
unocoll.hxx,.cxx: new SW_SERVICE_FIELDTYPE_METAFIELD, SW_SERVICE_TYPE_META.
unomap.hxx,.cxx: new PROPERTY_MAP_METAFIELD.
unoprnms.hxx: new UNO_NAME_META.
unoport.hxx: new PORTION_META; add "InContentMetadata" prop to SwXTextPortion.
new unometa.hxx: new class SwXMeta and SwXMetaField.
unofield.cxx: SwXFieldEnumeration: include meta-fields.
unoportenum.cxx: handle RES_TXTATR_META(FIELD) by using a portion list stack.
unotext.cxx: SwXText::insertTextContent(): handle meta(-field) as attribute.
2009-08-27 Michael Stahl #i91565#, #i91566#: ndhints.cxx: remove sort number from SwTxtAttrNesting
2009-08-27 Michael Stahl #i91565#, #i91566#: add support for hints with end and CH_TXTATR to sw core:
doc.hxx, docedt.cxx: replace SwDoc::Delete(), DeleteAndJoin(), ReplaceRange()
with wrappers that split at left-overlapped end+CH_TXTATR hints.
txatbase.hxx: new member SwTxtAttr::m_bHasDummyChar.
ndtxt.hxx: rename SwTxtNode::GetTxtAttr() to GetTxtAttrForCharAt().
ndtxt.cxx: SwTxtNode::CopyText(): copy end+CH_TXTATR hints iff copy CH_TXTATR.
txtatr2.cxx, thints.cxx: SwTxtMeta gets a CH_TXTATR.
2009-08-27 Michael Stahl #i91565#, #i91566#: add text:meta(-field) to sw core:
txatbase.hxx: new member SwTxtAttr::m_bNesting.
hintids.hxx: new ids RES_TXTATR_META, RES_TXTATR_METAFIELD.
txtatr.hxx: new base class SwTxtAttrNesting.
new hint SwTxtMeta.
SwTxtRuby derives from SwTxtAttrNesting.
txtinet.hxx: SwTxtINetFmt derives from SwTxtAttrNesting.
new header fmtmeta.hxx: new pool item SwFmtMeta. new class sw::Meta.
ndhints.hxx, thints.cxx: new method SwpHints::TryInsertNesting().
thints.cxx: refactoring: BuildPortions() no longer handles Ruby/Hyperlink,
but TryInsertNesting(), which also handles meta(-field).
SwTxtNode::InsertItem(): check if the hint is actually inserted.
ndhints.cxx: sort nesting hints based on sort number.
ndtxt.cxx: lcl_CopyHint(): handle copy of meta/meta-field.
2009-08-27 Michael Stahl enable expanding hints with m_bLockExpandFlag set:
add new InsertFlag: INS_FORCEHINTEXPAND.
add new SetAttrMode: SETATTR_FORCEHINTEXPAND.
rename SwEditShell::Insert() to Insert2() because changed signature fails
to compile when SwWrtShell tries to overwrite these non-virtual members...
SwWrtShell::Insert() sets FOCEHINTEXPAND if range was selected/deleted.
adapt SwUndoInsert to store flags.
2009-08-27 Michael Stahl change formal parameters of item insertion methods to type SetAttrMode
2009-08-27 Michael Stahl fix incorrect resetting of text attributes in SwUndoInsSection, SwUndoInserts
2009-08-27 Michael Stahl clean up SwTxtNode::CutImpl() and lcl_CopyHint()
2009-08-27 Michael Stahl rename SwDoc::Copy() to CopyRange(), and _Copy() to CopyImpl()
2009-08-27 Michael Stahl rename SwNodes::Move() to MoveRange(), and remove unused parameter
2009-08-27 Michael Stahl rename SwDoc::Move() to MoveRange()/MoveNodeRange()
2009-08-27 Michael Stahl rename SwDoc::Insert() to InsertString(), and remove sal_Unicode variant
2009-08-27 Michael Stahl rename SwDoc::Insert() to InsertPoolItem()/InsertItemSet()/InsertSwSection()
2009-08-27 Michael Stahl rename SwDoc::Replace() to ReplaceRange()
2009-08-27 Michael Stahl remove SwDoc::Overwrite() sal_Unicode variant
2009-08-27 Michael Stahl split up SwDoc::DeleteAndJoin(): factor out DeleteAndJoinWithRedline()
2009-08-27 Michael Stahl rename overloaded SwDoc::Delete() to DeleteRange()/DeleteTOXMark()
2009-08-27 Michael Stahl rename SwTxtNode::Copy() to CopyText()
2009-08-27 Michael Stahl rename SwTxtNode::Cut() to CutText(), and _Cut() to CutImpl()
2009-08-27 Michael Stahl rename SwTxtNode::Delete() to DeleteAttribute()/DeleteAttributes()
2009-08-27 Michael Stahl rename SwTxtNode::Replace() to ReplaceText(), and remove the xub_Unicode variant
2009-08-27 Michael Stahl rename SwTxtNode::Erase() to EraseText()
2009-08-27 Michael Stahl rename SwTxtNode::Insert() to InsertText(), and remove the xub_Unicode variant
2009-08-27 Michael Stahl clean up SwTxtNode::Update()
2009-08-27 Michael Stahl remove SwTxtAttr::RemoveFromPool() and make destructor non-public,
to be invoked by new method SwTxtAttr::Destroy()
2009-08-27 Michael Stahl ensure that SwDoc::Insert() for item (set) returns success indicator:
replace SwRegHistory constructor with method InsertItems(), returning bool.
refactor InsAttr() so that it checks if InsertItems() succeeds.
2009-08-27 Michael Stahl move SwXTextPortionEnumeration from unoobj.hxx to unoport.hxx
2009-08-27 Michael Stahl add missing SolarMutex in SwXTextPortion methods
2009-08-27 Michael Stahl SwXTextPortion: new member m_xTextField (so the TextField property need not
be returned indirectly via SwUnoCursorHelper).
factor out function CreateSwXTextField().
2009-08-27 Michael Stahl SwXTextPortion: remove PORTION_CONTROL_CHAR and implementation of XTextField
2009-08-27 Michael Stahl remove obsolete hint SwTxtHardBlank and formats SwFmtHardBlank/SwFmtSoftHyph
2009-08-27 Michael Stahl clean up SwTxtAttr and friends:
remove many accessor methods for obsolete (due to autofmt) char format items.
remove unused flag SwTxtAttr::m_bDontMergeAttr.
MakeRedlineTxtAttr() now dedicated function, no longer calls MakeTxtAttr().
2009-08-27 Michael Stahl remove obsolete attribute SwTxt2Lines
2009-08-27 Michael Stahl SwXTextPortionEnumeration: finish refactoring CreatePortions
change ExportHints so it always returns a text portion for hint w/ CH_TXTATR.
remove special case for handling end of paragraph.
unfortunately had to refactor the fieldmarks export as well (got in the way).
2009-08-27 Michael Stahl SwXTextPortionEnumeration: refactor CreatePortions: frames export
extract function ExportFrames() from CreatePortions().
remove (un)dead code that calls evil MovePara(fnParaCurr, fnParaEnd)
2009-08-27 Michael Stahl clean up SwXParaFrameEnumeration
2009-08-27 Michael Stahl CollectFrameAtNode: replace SwDependArr with STL based FrameDependList_t
2009-08-27 Michael Stahl SwXTextPortionEnumeration: tweak refmark/toxmark export
so ExportHints returns the portion for point marks
2009-08-27 Michael Stahl clean up SwXTextPortionEnumeration:
prefix members, remove casts, replace SvWeirdArray with STL, etc.
make CreatePortions() method a function, and remove lots of members.
extract fieldmarks function from CreatePortions.
2009-08-27 Michael Stahl remove FOREACHUNOPAM_START/END macros
2009-08-27 Michael Stahl clean up SwXTextPortion:
prefix members, remove casts, etc.
remove SwXRubyPortion: replace it with another SwXTextPortion constructor
2009-08-27 Michael Stahl #i102541# SwXReferenceMark::InsertRefMark(): use flag SETATTR_DONTEXPAND
2009-08-27 Michael Stahl rename SwTxtNode::Insert to SwTxtNode::InsertHint, and
fix constness in SwTxtNode::InsertItem
2009-08-27 Michael Stahl turn SwTxtNode::MakeTxtAttr() methods into global functions in ndhints.hxx
2009-08-27 Michael Stahl remove obsolete sw/inc/bookmrk.hxx
2009-08-27 Michael Stahl pam.cxx: fix ComparePosition functions (returned wrong result in one case)
2009-08-27 Michael Stahl #i103613# only import RDF metadata on normal open of a document
2009-09-11 kz CWS-TOOLING: integrate CWS impress176
2009-09-08 20:18:24 +0200 sj r275957 : fixed warning (shadowed variable)
2009-09-08 18:02:05 +0200 cl r275948 : #i104315# added missing tab pages
2009-09-08 17:35:18 +0200 cl r275947 : #i104866# fixed angle import
2009-09-08 17:32:53 +0200 cl r275946 : #i104841# fixed angle import
2009-09-08 17:01:25 +0200 cl r275943 : #i103935# fixed the SID_EVENTCONFIG mess
2009-09-08 14:32:57 +0200 sj r275928 : #i104685# only comments
2009-09-07 12:37:36 +0200 sj r275886 : #i104683# fixed import of bold/italic attributes for normal text shapes
2009-09-04 15:07:46 +0200 sj r275808 : #104689# fixed bullet color problem
2009-09-03 15:25:07 +0200 sj r275753 : #160200# added vertical alignment of table cells
2009-09-11 kz CWS-TOOLING: integrate CWS dv14
2009-09-10 15:16:32 +0200 sg r276035 : #160513# updated wfs scheme to accept ports
2009-09-10 07:41:47 +0200 dv r276019 : #i104942# Better renaming algorithmen
2009-08-31 13:41:11 +0200 dv r275604 : #160505# Setting APP1PRODUCTNAME must not overwrite APP1PRODUCTDEF
2009-09-11 kz CWS-TOOLING: integrate CWS jl131
2009-09-02 16:42:40 +0200 jl r275720 : #i97896#
2009-08-31 13:01:53 +0200 jl r275599 : CWS-TOOLING: rebase CWS jl131 to trunk@275331 (milestone: DEV300:m56)
2009-07-31 14:35:30 +0200 jl r274531 : CWS-TOOLING: rebase CWS jl131 to trunk@274203 (milestone: DEV300:m53)
2009-07-23 14:20:32 +0200 jl r274272 : #i79839# better error text when trying to modify shared layer without having write permission, eg. unopkg add --shared, unopkg remove --shared, unopkg reinstall --shared
2009-07-22 16:38:02 +0200 jl r274252 : #i97896# localize error message for lock file
2009-07-22 16:37:22 +0200 jl r274251 : #i80462# unprecise wording in updatedialog
2009-07-22 16:36:06 +0200 jl r274250 : #i97896# localize error message for lock file
2009-07-22 16:35:20 +0200 jl r274249 : #i97896# localize error message for lock file
2009-07-22 15:07:30 +0200 jl r274242 : #i98873# minimum java version is 1.5 since OOo 3.0
2009-09-11 kz CWS-TOOLING: integrate CWS changehc
2009-08-31 19:38:50 +0200 pl r275633 : remove dbug printf
2009-08-31 17:41:50 +0200 pl r275623 : CWS-TOOLING: rebase CWS changehc to trunk@275331 (milestone: DEV300:m56)
2009-07-15 19:45:46 +0200 pl r274028 : #i35482# use HC flag to decide high contrast mode
2009-07-15 17:40:52 +0200 pl r274020 : #i35482# use HC flag to decide high contrast mode
2009-07-15 17:39:50 +0200 pl r274019 : #i35482# update autohc correctly in MergeSystemSettings
2009-07-15 17:38:57 +0200 pl r274018 : #i35482# update autohc correctly in MergeSystemSettings
2009-09-11 kz CWS-TOOLING: integrate CWS notes10
2009-08-24 07:25:57 +0200 mod r275287 : 2009-07-26 02:38:32 +0200 mod r274343 : #i#i103645#
2009-07-26 02:01:53 +0200 mod r274342 : #i103645#
2009-07-26 01:52:42 +0200 mod r274341 : #i103490#
2009-07-22 08:31:48 +0200 mod r274215 : #i103373#
2009-07-15 00:55:11 +0200 mod r273987 : #i101419#
2009-07-14 07:07:55 +0200 mod r273956 : #i101419#
2009-07-14 07:07:43 +0200 mod r273955 : #i101419#
2009-07-14 07:02:10 +0200 mod r273954 : changes from notes9
2009-07-14 06:14:25 +0200 mod r273953 : #i103476#
2009-09-11 kz CWS-TOOLING: integrate CWS ab70
2009-09-10 15:12:54 +0200 jsk r276034 : #i85434# - mandatory automatic update test
2009-09-10 15:11:06 +0200 jsk r276033 : #i85434# - mandatory automatic update test
2009-09-02 09:49:24 +0200 ab r275698 : #i85434# Dialog Import
2009-09-11 kz CWS-TOOLING: integrate CWS hb32bugs02
2009-09-02 Henning Brinkmann #i102420# revert changes
2009-08-26 Henning Brinkmann merged DEV300_m56
2009-08-19 Henning Brinkmann merged DEV300_m55
2009-08-14 Henning Brinkmann merged changes from wntmsci12
2009-08-12 Henning Brinkmann Implemented NoSpaceEdit constructor and destructor in .cxx to allow compile with debug on wntmsci12.
2009-08-12 Henning Brinkmann Added some SW_DLLPUBLIC to make compilable on wntmsci12.
2009-08-11 Henning Brinkmann #i102420# dbg_out: surround output for SwNodes with <nodes-array>.
2009-08-10 Henning Brinkmann #i102420# rewritten debug output for SwNodes.
2009-08-07 Henning Brinkmann #i102420# debug _MoveNodes: output the destination, too. Break after two iterations.
2009-08-07 Henning Brinkmann #i102420# _MoveNodes: Additionally check if destination index is inside source => false
Check if current range was already handled => loop
Debug output current range
2009-08-06 Henning Brinkmann merged DEV300_m54
2009-08-06 Henning Brinkmann added master fix
2009-08-06 Henning Brinkmann debug output for SwNodeRange
2009-08-04 Henning Brinkmann #i102844# robustness: check for NULL pointer to prevent crash
2009-08-03 Henning Brinkmann #i103475# applied patch and verified
2009-08-03 Henning Brinkmann Removed code preventing build of sw with DEBUG.
2009-09-11 convert-repo update tags
2009-09-10 kz CWS-TOOLING: integrate CWS os2port06dev300
2009-09-05 22:49:00 +0200 ydario r275858 : #i99588# applied os2port06 diff to DEV300 tree.
2009-09-10 kz CWS-TOOLING: integrate CWS mingwport23
2009-08-29 07:07:53 +0200 tono r275555 : i#104522: mingw port graphite
2009-08-29 07:07:26 +0200 tono r275554 : i#104522: mingw port printf format fix
2009-09-10 kz CWS-TOOLING: integrate CWS mh232
2009-08-26 03:52:57 +0200 mh r275385 : #i102182# FreeBSD patch
2009-08-26 03:43:20 +0200 mh r275384 : #i101333# patch for FreeBSD
2009-08-26 03:11:20 +0200 mh r275383 : #i39230
2009-08-26 03:07:51 +0200 mh r275382 : #i39230# more space for initials field
2009-08-26 02:41:19 +0200 mh r275380 : #i39230# use vos::osecurity for reading the user name
2009-08-18 22:06:00 +0200 mh r275130 : #i104243#, line ending problem with newer perl
2009-08-18 21:53:21 +0200 mh r275129 : #i39230# read initials via getpwnam
2009-08-18 21:34:05 +0200 mh r275128 : enable CAIROCANVAS for Linux and Mac, #i88613#
2009-08-17 18:02:59 +0200 mh r275067 : #i95498# make compile with gcc3
2009-09-10 kz CWS-TOOLING: integrate CWS tkr24
2009-09-07 14:31:06 +0200 is r275898 : #160081# adding NO_LICENSE_INTO_COPYRIGHT
2009-09-10 releng #i10000# change KeyMapping to SingletonRef<framework::KeyMapping>
2009-09-11 convert-repo update tags
2009-09-10 kz CWS-TOOLING: integrate CWS os2port06dev300
2009-09-05 22:49:00 +0200 ydario r275858 : #i99588# applied os2port06 diff to DEV300 tree.
2009-09-10 kz CWS-TOOLING: integrate CWS mingwport23
2009-08-29 07:07:53 +0200 tono r275555 : i#104522: mingw port graphite
2009-08-29 07:07:26 +0200 tono r275554 : i#104522: mingw port printf format fix
2009-09-10 kz CWS-TOOLING: integrate CWS mh232
2009-08-26 03:52:57 +0200 mh r275385 : #i102182# FreeBSD patch
2009-08-26 03:43:20 +0200 mh r275384 : #i101333# patch for FreeBSD
2009-08-26 03:11:20 +0200 mh r275383 : #i39230
2009-08-26 03:07:51 +0200 mh r275382 : #i39230# more space for initials field
2009-08-26 02:41:19 +0200 mh r275380 : #i39230# use vos::osecurity for reading the user name
2009-08-18 22:06:00 +0200 mh r275130 : #i104243#, line ending problem with newer perl
2009-08-18 21:53:21 +0200 mh r275129 : #i39230# read initials via getpwnam
2009-08-18 21:34:05 +0200 mh r275128 : enable CAIROCANVAS for Linux and Mac, #i88613#
2009-08-17 18:02:59 +0200 mh r275067 : #i95498# make compile with gcc3
2009-09-10 kz CWS-TOOLING: integrate CWS tkr24
2009-09-07 14:31:06 +0200 is r275898 : #160081# adding NO_LICENSE_INTO_COPYRIGHT
2009-09-10 releng #i10000# change KeyMapping to SingletonRef<framework::KeyMapping>
2009-09-11 14:29:45 +00:00
|
|
|
CopyRange( aPam, aInsPos, false );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( bDelLastPara )
|
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// We need to remove the last empty Node again
|
2000-09-18 23:08:29 +00:00
|
|
|
aIdx = aInsPos.nNode;
|
|
|
|
SwCntntNode* pCNd = GetNodes().GoPrevious( &aInsPos.nNode );
|
2013-11-12 00:46:22 +01:00
|
|
|
aInsPos.nContent.Assign( pCNd, pCNd ? pCNd->Len() : 0 );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// All, that are in the to-be-deleted Node, need to be
|
|
|
|
// moved to the next Node
|
2000-09-18 23:08:29 +00:00
|
|
|
SwPosition* pPos;
|
2012-07-20 17:16:03 +02:00
|
|
|
for( sal_uInt16 n = 0; n < GetRedlineTbl().size(); ++n )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2014-01-13 17:58:25 +02:00
|
|
|
SwRangeRedline* pTmp = GetRedlineTbl()[ n ];
|
2011-01-17 15:06:54 +01:00
|
|
|
if( ( pPos = &pTmp->GetBound(sal_True))->nNode == aIdx )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
pPos->nNode++;
|
|
|
|
pPos->nContent.Assign( pPos->nNode.GetNode().GetCntntNode(),0);
|
|
|
|
}
|
2011-01-17 15:06:54 +01:00
|
|
|
if( ( pPos = &pTmp->GetBound(sal_False))->nNode == aIdx )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
pPos->nNode++;
|
|
|
|
pPos->nContent.Assign( pPos->nNode.GetNode().GetCntntNode(),0);
|
|
|
|
}
|
|
|
|
}
|
2011-01-17 15:06:54 +01:00
|
|
|
CorrRel( aIdx, aInsPos, 0, sal_False );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
pCNd->JoinNext();
|
|
|
|
}
|
|
|
|
|
|
|
|
rOrigPam.GetPoint()->nNode++;
|
|
|
|
rOrigPam.GetPoint()->nContent.Assign( rOrigPam.GetCntntNode(), 0 );
|
|
|
|
|
2007-09-27 07:36:31 +00:00
|
|
|
RedlineMode_t eOld = GetRedlineMode();
|
2003-04-01 14:30:16 +00:00
|
|
|
checkRedlining(eOld);
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// Still NEEDS to be optimized (even after 14 years)
|
2006-08-14 14:59:04 +00:00
|
|
|
SetRedlineMode(
|
2007-09-27 07:36:31 +00:00
|
|
|
(RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE));
|
2010-11-25 14:31:08 +01:00
|
|
|
SwUndo *const pUndo(new SwUndoRedlineDelete(aPam, UNDO_DELETE));
|
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2002-10-10 15:29:46 +00:00
|
|
|
|
2014-01-13 17:58:25 +02:00
|
|
|
SwRangeRedline* pNewRedline = new SwRangeRedline( nsRedlineType_t::REDLINE_DELETE, aPam );
|
2002-10-10 15:29:46 +00:00
|
|
|
|
2011-02-07 20:21:18 +01:00
|
|
|
// prevent assertion from aPam's target being deleted
|
2002-10-10 15:29:46 +00:00
|
|
|
// (Alternatively, one could just let aPam go out of scope, but
|
2012-01-08 22:38:04 +01:00
|
|
|
// that requires touching a lot of code.)
|
2011-01-17 15:06:54 +01:00
|
|
|
aPam.GetBound(sal_True).nContent.Assign( NULL, 0 );
|
|
|
|
aPam.GetBound(sal_False).nContent.Assign( NULL, 0 );
|
2002-10-10 15:29:46 +00:00
|
|
|
|
2006-08-14 14:59:04 +00:00
|
|
|
AppendRedline( pNewRedline, true );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-08 22:38:04 +01:00
|
|
|
// Still NEEDS to be optimized!
|
|
|
|
SetRedlineMode( eOld );
|
2010-11-25 14:31:08 +01:00
|
|
|
GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
|
2000-09-18 23:08:29 +00:00
|
|
|
SetModified();
|
2002-11-14 16:35:11 +00:00
|
|
|
|
2012-10-30 11:27:06 +09:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-20 17:16:03 +02:00
|
|
|
if( !pOwnRedl && !IsIgnoreRedline() && !GetRedlineTbl().empty() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2004-07-30 13:55:41 +00:00
|
|
|
SwPaM aTemp(aIdx);
|
|
|
|
SplitRedline(aTemp);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nRedlSttNd(0), nRedlEndNd(0);
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pOwnRedl )
|
|
|
|
{
|
|
|
|
const SwPosition *pRStt = pOwnRedl->Start(), *pREnd = pOwnRedl->End();
|
|
|
|
nRedlSttNd = pRStt->nNode.GetIndex();
|
|
|
|
nRedlEndNd = pREnd->nNode.GetIndex();
|
|
|
|
}
|
|
|
|
|
|
|
|
SwUndoMoveNum* pUndo = 0;
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nMoved = 0;
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2006-03-31 08:50:38 +00:00
|
|
|
{
|
2000-09-18 23:08:29 +00:00
|
|
|
pUndo = new SwUndoMoveNum( rPam, nOffset, bIsOutlMv );
|
2006-03-31 08:50:38 +00:00
|
|
|
nMoved = rPam.End()->nNode.GetIndex() - rPam.Start()->nNode.GetIndex() + 1;
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
CWS-TOOLING: integrate CWS odfmetadata3
2009-09-11 Michael Stahl merge DEV300_m58
2009-09-07 Michael Stahl SwFmtFld::Modify(): do nothing on RES_OBJECTDYING
2009-08-27 Michael Stahl #i91565#, #i91566#: TextPortionEnumerationTest.java: add test document
2009-08-27 Michael Stahl #i91565#, #i91566#: add complex test: TextPortionEnumerationTest.java
2009-08-27 Michael Stahl CLiteral::initialize(): zero-length literals probably not an error
2009-08-27 Michael Stahl #i91565#, #i91566#: offapi: new InContentMetadata and MetadataField services
adapt TextPortion for InContentMetadata
2009-08-27 Michael Stahl #i91564#: xmloff: load/store xml:id and RDFa for text:bookmark(-start).
2009-08-27 Michael Stahl #i91564#: sw core: add support for xml:id at bookmarks:
sw::mark::Bookmark: derive from Metadatable.
SwHistoryBookmark, SaveBookmark: store a MetadatableUndo.
ndcopy.cxx: lcl_CopyBookmarks(): copy the xml:id.
SwXBookmark: derive from MetadatableMixin.
2009-08-27 Michael Stahl #i91565#, #i91566#: xmloff: refactor ruby import so nested meta(-field) works:
remove XMLRubyHint_Impl.
XMLImpRubyContext_Impl::~XMLImpRubyContext_Impl(): insert ruby directly.
2009-08-27 Michael Stahl #i91565#, #i91566#: xmloff: fix text:meta(-field) import/export:
new XMLTextParagraphExport::exportTextField() overload for XTextField.
CreateAndInsertMark(): set xml:id after insertion.
fix meta(-field) service names, bugs etc.
2009-08-27 Michael Stahl #i91565#, #i91566#: sw text formatting: paint background of meta(-field) body:
SwFont: add member m_nMetaCount.
txttypes.hxx: add POR_META.
atrstck.cxx: handle RES_TXTATR_META(FIELD).
itrform2.cxx: SwTxtFormatter::WhichTxtPor(): create new class SwMetaPortion.
2009-08-27 Michael Stahl #i91566#: sw text formatting: display meta-field prefix and suffix:
SwAttrIter::GetAttr(): replace with call to GetTxtAttrForCharAt().
SwTxtFormatter::NewExtraPortion(): handle meta-field prefix.
SwTxtFormatter: new member m_nHintEndIndex.
SwTxtFormatter::WhichFirstPortion(): call TryNewNoLengthPortion().
SwTxtFormatter::TryNewNoLengthPortion(): new; handle suffix of meta-field.
SwTxtFormatter::UnderFlow(): UGLY HACK: decrement m_nHintEndIndex.
SwFldPortion: add flag m_bNoLength: portion has zero length (for suffix).
2009-08-27 Michael Stahl #i91565#, #i91566#: extend text:meta(-field) uno wrapper with XText interface:
unoobj.hxx: new CursorType CURSOR_META.
unoobj2.cxx: refactor SwXText implementation to ensure that when the SwXText
belongs to a SwXMeta, content is always inserted inside the meta(-field).
unoobj.cxx: new SwXTextCursor::ForceIntoMeta(): cursor stays in meta(-field).
unometa.hxx: SwXMeta implements XText, forwarding to a member SwXMetaText.
DocInsertStringSplitCR(), SwX*::attachToRange(), SwX*::DeleteAndInsert():
use FORCEHINTEXPAND hack to ensure insert into the meta(-field) at the end.
2009-08-27 Michael Stahl #i91565#, #i91566#: add text:meta(-field) uno wrapper to sw:
fmtmeta.hxx, fmtatr2.cxx: new class sw::MetaField, new sw::MetaFieldManager.
doc.hxx, docnew.cxx: new SwDoc::GetMetaFieldManager().
unocoll.hxx,.cxx: new SW_SERVICE_FIELDTYPE_METAFIELD, SW_SERVICE_TYPE_META.
unomap.hxx,.cxx: new PROPERTY_MAP_METAFIELD.
unoprnms.hxx: new UNO_NAME_META.
unoport.hxx: new PORTION_META; add "InContentMetadata" prop to SwXTextPortion.
new unometa.hxx: new class SwXMeta and SwXMetaField.
unofield.cxx: SwXFieldEnumeration: include meta-fields.
unoportenum.cxx: handle RES_TXTATR_META(FIELD) by using a portion list stack.
unotext.cxx: SwXText::insertTextContent(): handle meta(-field) as attribute.
2009-08-27 Michael Stahl #i91565#, #i91566#: ndhints.cxx: remove sort number from SwTxtAttrNesting
2009-08-27 Michael Stahl #i91565#, #i91566#: add support for hints with end and CH_TXTATR to sw core:
doc.hxx, docedt.cxx: replace SwDoc::Delete(), DeleteAndJoin(), ReplaceRange()
with wrappers that split at left-overlapped end+CH_TXTATR hints.
txatbase.hxx: new member SwTxtAttr::m_bHasDummyChar.
ndtxt.hxx: rename SwTxtNode::GetTxtAttr() to GetTxtAttrForCharAt().
ndtxt.cxx: SwTxtNode::CopyText(): copy end+CH_TXTATR hints iff copy CH_TXTATR.
txtatr2.cxx, thints.cxx: SwTxtMeta gets a CH_TXTATR.
2009-08-27 Michael Stahl #i91565#, #i91566#: add text:meta(-field) to sw core:
txatbase.hxx: new member SwTxtAttr::m_bNesting.
hintids.hxx: new ids RES_TXTATR_META, RES_TXTATR_METAFIELD.
txtatr.hxx: new base class SwTxtAttrNesting.
new hint SwTxtMeta.
SwTxtRuby derives from SwTxtAttrNesting.
txtinet.hxx: SwTxtINetFmt derives from SwTxtAttrNesting.
new header fmtmeta.hxx: new pool item SwFmtMeta. new class sw::Meta.
ndhints.hxx, thints.cxx: new method SwpHints::TryInsertNesting().
thints.cxx: refactoring: BuildPortions() no longer handles Ruby/Hyperlink,
but TryInsertNesting(), which also handles meta(-field).
SwTxtNode::InsertItem(): check if the hint is actually inserted.
ndhints.cxx: sort nesting hints based on sort number.
ndtxt.cxx: lcl_CopyHint(): handle copy of meta/meta-field.
2009-08-27 Michael Stahl enable expanding hints with m_bLockExpandFlag set:
add new InsertFlag: INS_FORCEHINTEXPAND.
add new SetAttrMode: SETATTR_FORCEHINTEXPAND.
rename SwEditShell::Insert() to Insert2() because changed signature fails
to compile when SwWrtShell tries to overwrite these non-virtual members...
SwWrtShell::Insert() sets FOCEHINTEXPAND if range was selected/deleted.
adapt SwUndoInsert to store flags.
2009-08-27 Michael Stahl change formal parameters of item insertion methods to type SetAttrMode
2009-08-27 Michael Stahl fix incorrect resetting of text attributes in SwUndoInsSection, SwUndoInserts
2009-08-27 Michael Stahl clean up SwTxtNode::CutImpl() and lcl_CopyHint()
2009-08-27 Michael Stahl rename SwDoc::Copy() to CopyRange(), and _Copy() to CopyImpl()
2009-08-27 Michael Stahl rename SwNodes::Move() to MoveRange(), and remove unused parameter
2009-08-27 Michael Stahl rename SwDoc::Move() to MoveRange()/MoveNodeRange()
2009-08-27 Michael Stahl rename SwDoc::Insert() to InsertString(), and remove sal_Unicode variant
2009-08-27 Michael Stahl rename SwDoc::Insert() to InsertPoolItem()/InsertItemSet()/InsertSwSection()
2009-08-27 Michael Stahl rename SwDoc::Replace() to ReplaceRange()
2009-08-27 Michael Stahl remove SwDoc::Overwrite() sal_Unicode variant
2009-08-27 Michael Stahl split up SwDoc::DeleteAndJoin(): factor out DeleteAndJoinWithRedline()
2009-08-27 Michael Stahl rename overloaded SwDoc::Delete() to DeleteRange()/DeleteTOXMark()
2009-08-27 Michael Stahl rename SwTxtNode::Copy() to CopyText()
2009-08-27 Michael Stahl rename SwTxtNode::Cut() to CutText(), and _Cut() to CutImpl()
2009-08-27 Michael Stahl rename SwTxtNode::Delete() to DeleteAttribute()/DeleteAttributes()
2009-08-27 Michael Stahl rename SwTxtNode::Replace() to ReplaceText(), and remove the xub_Unicode variant
2009-08-27 Michael Stahl rename SwTxtNode::Erase() to EraseText()
2009-08-27 Michael Stahl rename SwTxtNode::Insert() to InsertText(), and remove the xub_Unicode variant
2009-08-27 Michael Stahl clean up SwTxtNode::Update()
2009-08-27 Michael Stahl remove SwTxtAttr::RemoveFromPool() and make destructor non-public,
to be invoked by new method SwTxtAttr::Destroy()
2009-08-27 Michael Stahl ensure that SwDoc::Insert() for item (set) returns success indicator:
replace SwRegHistory constructor with method InsertItems(), returning bool.
refactor InsAttr() so that it checks if InsertItems() succeeds.
2009-08-27 Michael Stahl move SwXTextPortionEnumeration from unoobj.hxx to unoport.hxx
2009-08-27 Michael Stahl add missing SolarMutex in SwXTextPortion methods
2009-08-27 Michael Stahl SwXTextPortion: new member m_xTextField (so the TextField property need not
be returned indirectly via SwUnoCursorHelper).
factor out function CreateSwXTextField().
2009-08-27 Michael Stahl SwXTextPortion: remove PORTION_CONTROL_CHAR and implementation of XTextField
2009-08-27 Michael Stahl remove obsolete hint SwTxtHardBlank and formats SwFmtHardBlank/SwFmtSoftHyph
2009-08-27 Michael Stahl clean up SwTxtAttr and friends:
remove many accessor methods for obsolete (due to autofmt) char format items.
remove unused flag SwTxtAttr::m_bDontMergeAttr.
MakeRedlineTxtAttr() now dedicated function, no longer calls MakeTxtAttr().
2009-08-27 Michael Stahl remove obsolete attribute SwTxt2Lines
2009-08-27 Michael Stahl SwXTextPortionEnumeration: finish refactoring CreatePortions
change ExportHints so it always returns a text portion for hint w/ CH_TXTATR.
remove special case for handling end of paragraph.
unfortunately had to refactor the fieldmarks export as well (got in the way).
2009-08-27 Michael Stahl SwXTextPortionEnumeration: refactor CreatePortions: frames export
extract function ExportFrames() from CreatePortions().
remove (un)dead code that calls evil MovePara(fnParaCurr, fnParaEnd)
2009-08-27 Michael Stahl clean up SwXParaFrameEnumeration
2009-08-27 Michael Stahl CollectFrameAtNode: replace SwDependArr with STL based FrameDependList_t
2009-08-27 Michael Stahl SwXTextPortionEnumeration: tweak refmark/toxmark export
so ExportHints returns the portion for point marks
2009-08-27 Michael Stahl clean up SwXTextPortionEnumeration:
prefix members, remove casts, replace SvWeirdArray with STL, etc.
make CreatePortions() method a function, and remove lots of members.
extract fieldmarks function from CreatePortions.
2009-08-27 Michael Stahl remove FOREACHUNOPAM_START/END macros
2009-08-27 Michael Stahl clean up SwXTextPortion:
prefix members, remove casts, etc.
remove SwXRubyPortion: replace it with another SwXTextPortion constructor
2009-08-27 Michael Stahl #i102541# SwXReferenceMark::InsertRefMark(): use flag SETATTR_DONTEXPAND
2009-08-27 Michael Stahl rename SwTxtNode::Insert to SwTxtNode::InsertHint, and
fix constness in SwTxtNode::InsertItem
2009-08-27 Michael Stahl turn SwTxtNode::MakeTxtAttr() methods into global functions in ndhints.hxx
2009-08-27 Michael Stahl remove obsolete sw/inc/bookmrk.hxx
2009-08-27 Michael Stahl pam.cxx: fix ComparePosition functions (returned wrong result in one case)
2009-08-27 Michael Stahl #i103613# only import RDF metadata on normal open of a document
2009-09-11 kz CWS-TOOLING: integrate CWS impress176
2009-09-08 20:18:24 +0200 sj r275957 : fixed warning (shadowed variable)
2009-09-08 18:02:05 +0200 cl r275948 : #i104315# added missing tab pages
2009-09-08 17:35:18 +0200 cl r275947 : #i104866# fixed angle import
2009-09-08 17:32:53 +0200 cl r275946 : #i104841# fixed angle import
2009-09-08 17:01:25 +0200 cl r275943 : #i103935# fixed the SID_EVENTCONFIG mess
2009-09-08 14:32:57 +0200 sj r275928 : #i104685# only comments
2009-09-07 12:37:36 +0200 sj r275886 : #i104683# fixed import of bold/italic attributes for normal text shapes
2009-09-04 15:07:46 +0200 sj r275808 : #104689# fixed bullet color problem
2009-09-03 15:25:07 +0200 sj r275753 : #160200# added vertical alignment of table cells
2009-09-11 kz CWS-TOOLING: integrate CWS dv14
2009-09-10 15:16:32 +0200 sg r276035 : #160513# updated wfs scheme to accept ports
2009-09-10 07:41:47 +0200 dv r276019 : #i104942# Better renaming algorithmen
2009-08-31 13:41:11 +0200 dv r275604 : #160505# Setting APP1PRODUCTNAME must not overwrite APP1PRODUCTDEF
2009-09-11 kz CWS-TOOLING: integrate CWS jl131
2009-09-02 16:42:40 +0200 jl r275720 : #i97896#
2009-08-31 13:01:53 +0200 jl r275599 : CWS-TOOLING: rebase CWS jl131 to trunk@275331 (milestone: DEV300:m56)
2009-07-31 14:35:30 +0200 jl r274531 : CWS-TOOLING: rebase CWS jl131 to trunk@274203 (milestone: DEV300:m53)
2009-07-23 14:20:32 +0200 jl r274272 : #i79839# better error text when trying to modify shared layer without having write permission, eg. unopkg add --shared, unopkg remove --shared, unopkg reinstall --shared
2009-07-22 16:38:02 +0200 jl r274252 : #i97896# localize error message for lock file
2009-07-22 16:37:22 +0200 jl r274251 : #i80462# unprecise wording in updatedialog
2009-07-22 16:36:06 +0200 jl r274250 : #i97896# localize error message for lock file
2009-07-22 16:35:20 +0200 jl r274249 : #i97896# localize error message for lock file
2009-07-22 15:07:30 +0200 jl r274242 : #i98873# minimum java version is 1.5 since OOo 3.0
2009-09-11 kz CWS-TOOLING: integrate CWS changehc
2009-08-31 19:38:50 +0200 pl r275633 : remove dbug printf
2009-08-31 17:41:50 +0200 pl r275623 : CWS-TOOLING: rebase CWS changehc to trunk@275331 (milestone: DEV300:m56)
2009-07-15 19:45:46 +0200 pl r274028 : #i35482# use HC flag to decide high contrast mode
2009-07-15 17:40:52 +0200 pl r274020 : #i35482# use HC flag to decide high contrast mode
2009-07-15 17:39:50 +0200 pl r274019 : #i35482# update autohc correctly in MergeSystemSettings
2009-07-15 17:38:57 +0200 pl r274018 : #i35482# update autohc correctly in MergeSystemSettings
2009-09-11 kz CWS-TOOLING: integrate CWS notes10
2009-08-24 07:25:57 +0200 mod r275287 : 2009-07-26 02:38:32 +0200 mod r274343 : #i#i103645#
2009-07-26 02:01:53 +0200 mod r274342 : #i103645#
2009-07-26 01:52:42 +0200 mod r274341 : #i103490#
2009-07-22 08:31:48 +0200 mod r274215 : #i103373#
2009-07-15 00:55:11 +0200 mod r273987 : #i101419#
2009-07-14 07:07:55 +0200 mod r273956 : #i101419#
2009-07-14 07:07:43 +0200 mod r273955 : #i101419#
2009-07-14 07:02:10 +0200 mod r273954 : changes from notes9
2009-07-14 06:14:25 +0200 mod r273953 : #i103476#
2009-09-11 kz CWS-TOOLING: integrate CWS ab70
2009-09-10 15:12:54 +0200 jsk r276034 : #i85434# - mandatory automatic update test
2009-09-10 15:11:06 +0200 jsk r276033 : #i85434# - mandatory automatic update test
2009-09-02 09:49:24 +0200 ab r275698 : #i85434# Dialog Import
2009-09-11 kz CWS-TOOLING: integrate CWS hb32bugs02
2009-09-02 Henning Brinkmann #i102420# revert changes
2009-08-26 Henning Brinkmann merged DEV300_m56
2009-08-19 Henning Brinkmann merged DEV300_m55
2009-08-14 Henning Brinkmann merged changes from wntmsci12
2009-08-12 Henning Brinkmann Implemented NoSpaceEdit constructor and destructor in .cxx to allow compile with debug on wntmsci12.
2009-08-12 Henning Brinkmann Added some SW_DLLPUBLIC to make compilable on wntmsci12.
2009-08-11 Henning Brinkmann #i102420# dbg_out: surround output for SwNodes with <nodes-array>.
2009-08-10 Henning Brinkmann #i102420# rewritten debug output for SwNodes.
2009-08-07 Henning Brinkmann #i102420# debug _MoveNodes: output the destination, too. Break after two iterations.
2009-08-07 Henning Brinkmann #i102420# _MoveNodes: Additionally check if destination index is inside source => false
Check if current range was already handled => loop
Debug output current range
2009-08-06 Henning Brinkmann merged DEV300_m54
2009-08-06 Henning Brinkmann added master fix
2009-08-06 Henning Brinkmann debug output for SwNodeRange
2009-08-04 Henning Brinkmann #i102844# robustness: check for NULL pointer to prevent crash
2009-08-03 Henning Brinkmann #i103475# applied patch and verified
2009-08-03 Henning Brinkmann Removed code preventing build of sw with DEBUG.
2009-09-11 convert-repo update tags
2009-09-10 kz CWS-TOOLING: integrate CWS os2port06dev300
2009-09-05 22:49:00 +0200 ydario r275858 : #i99588# applied os2port06 diff to DEV300 tree.
2009-09-10 kz CWS-TOOLING: integrate CWS mingwport23
2009-08-29 07:07:53 +0200 tono r275555 : i#104522: mingw port graphite
2009-08-29 07:07:26 +0200 tono r275554 : i#104522: mingw port printf format fix
2009-09-10 kz CWS-TOOLING: integrate CWS mh232
2009-08-26 03:52:57 +0200 mh r275385 : #i102182# FreeBSD patch
2009-08-26 03:43:20 +0200 mh r275384 : #i101333# patch for FreeBSD
2009-08-26 03:11:20 +0200 mh r275383 : #i39230
2009-08-26 03:07:51 +0200 mh r275382 : #i39230# more space for initials field
2009-08-26 02:41:19 +0200 mh r275380 : #i39230# use vos::osecurity for reading the user name
2009-08-18 22:06:00 +0200 mh r275130 : #i104243#, line ending problem with newer perl
2009-08-18 21:53:21 +0200 mh r275129 : #i39230# read initials via getpwnam
2009-08-18 21:34:05 +0200 mh r275128 : enable CAIROCANVAS for Linux and Mac, #i88613#
2009-08-17 18:02:59 +0200 mh r275067 : #i95498# make compile with gcc3
2009-09-10 kz CWS-TOOLING: integrate CWS tkr24
2009-09-07 14:31:06 +0200 is r275898 : #160081# adding NO_LICENSE_INTO_COPYRIGHT
2009-09-10 releng #i10000# change KeyMapping to SingletonRef<framework::KeyMapping>
2009-09-11 convert-repo update tags
2009-09-10 kz CWS-TOOLING: integrate CWS os2port06dev300
2009-09-05 22:49:00 +0200 ydario r275858 : #i99588# applied os2port06 diff to DEV300 tree.
2009-09-10 kz CWS-TOOLING: integrate CWS mingwport23
2009-08-29 07:07:53 +0200 tono r275555 : i#104522: mingw port graphite
2009-08-29 07:07:26 +0200 tono r275554 : i#104522: mingw port printf format fix
2009-09-10 kz CWS-TOOLING: integrate CWS mh232
2009-08-26 03:52:57 +0200 mh r275385 : #i102182# FreeBSD patch
2009-08-26 03:43:20 +0200 mh r275384 : #i101333# patch for FreeBSD
2009-08-26 03:11:20 +0200 mh r275383 : #i39230
2009-08-26 03:07:51 +0200 mh r275382 : #i39230# more space for initials field
2009-08-26 02:41:19 +0200 mh r275380 : #i39230# use vos::osecurity for reading the user name
2009-08-18 22:06:00 +0200 mh r275130 : #i104243#, line ending problem with newer perl
2009-08-18 21:53:21 +0200 mh r275129 : #i39230# read initials via getpwnam
2009-08-18 21:34:05 +0200 mh r275128 : enable CAIROCANVAS for Linux and Mac, #i88613#
2009-08-17 18:02:59 +0200 mh r275067 : #i95498# make compile with gcc3
2009-09-10 kz CWS-TOOLING: integrate CWS tkr24
2009-09-07 14:31:06 +0200 is r275898 : #160081# adding NO_LICENSE_INTO_COPYRIGHT
2009-09-10 releng #i10000# change KeyMapping to SingletonRef<framework::KeyMapping>
2009-09-11 14:29:45 +00:00
|
|
|
MoveNodeRange( aMvRg, aIdx, DOC_MOVEREDLINES );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( pUndo )
|
|
|
|
{
|
2006-03-31 08:50:38 +00:00
|
|
|
// i57907: Under circumstances (sections at the end of a chapter)
|
|
|
|
// the rPam.Start() is not moved to the new position.
|
2012-01-08 22:38:04 +01:00
|
|
|
// But aIdx should be at the new end position and as long as the
|
|
|
|
// number of moved paragraphs is nMoved, I know, where the new
|
|
|
|
// position is.
|
2006-03-31 08:50:38 +00:00
|
|
|
pUndo->SetStartNode( aIdx.GetIndex() - nMoved );
|
2010-11-25 14:31:08 +01:00
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if( pOwnRedl )
|
|
|
|
{
|
|
|
|
SwPosition *pRStt = pOwnRedl->Start(), *pREnd = pOwnRedl->End();
|
|
|
|
if( pRStt->nNode.GetIndex() != nRedlSttNd )
|
|
|
|
{
|
|
|
|
pRStt->nNode = nRedlSttNd;
|
|
|
|
pRStt->nContent.Assign( pRStt->nNode.GetNode().GetCntntNode(),0);
|
|
|
|
}
|
|
|
|
if( pREnd->nNode.GetIndex() != nRedlEndNd )
|
|
|
|
{
|
|
|
|
pREnd->nNode = nRedlEndNd;
|
|
|
|
SwCntntNode* pCNd = pREnd->nNode.GetNode().GetCntntNode();
|
2013-11-12 00:46:22 +01:00
|
|
|
pREnd->nContent.Assign( pCNd, pCNd ? pCNd->Len() : 0 );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SetModified();
|
2012-10-30 11:27:06 +09:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2012-11-03 12:18:57 +09:00
|
|
|
bool SwDoc::NumOrNoNum( const SwNodeIndex& rIdx, sal_Bool bDel )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-11-03 12:18:57 +09:00
|
|
|
bool bResult = false;
|
2005-11-08 16:16:30 +00:00
|
|
|
SwTxtNode * pTxtNd = rIdx.GetNode().GetTxtNode();
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
if (pTxtNd && pTxtNd->GetNumRule() != NULL &&
|
2005-11-08 16:16:30 +00:00
|
|
|
(pTxtNd->HasNumber() || pTxtNd->HasBullet()))
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
if ( !pTxtNd->IsCountedInList() == !bDel)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2013-09-29 19:06:02 +02:00
|
|
|
sal_Bool bOldNum = bDel;
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_Bool bNewNum = bDel ? sal_False : sal_True;
|
2008-06-13 08:35:27 +00:00
|
|
|
pTxtNd->SetCountedInList(bNewNum ? true : false);
|
2004-03-30 15:05:30 +00:00
|
|
|
|
2005-11-08 16:16:30 +00:00
|
|
|
SetModified();
|
2004-05-13 09:42:18 +00:00
|
|
|
|
2012-11-03 12:18:57 +09:00
|
|
|
bResult = true;
|
2004-05-13 09:42:18 +00:00
|
|
|
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2004-03-30 15:05:30 +00:00
|
|
|
{
|
2005-11-08 16:16:30 +00:00
|
|
|
SwUndoNumOrNoNum * pUndo =
|
|
|
|
new SwUndoNumOrNoNum(rIdx, bOldNum, bNewNum);
|
2004-03-30 15:05:30 +00:00
|
|
|
|
2010-11-25 14:31:08 +01:00
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2005-11-08 16:16:30 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2011-01-17 15:06:54 +01:00
|
|
|
else if (bDel && pTxtNd->GetNumRule(sal_False) &&
|
2008-06-13 08:35:27 +00:00
|
|
|
pTxtNd->GetActualListLevel() >= 0 &&
|
|
|
|
pTxtNd->GetActualListLevel() < MAXLEVEL)
|
2004-03-30 15:05:30 +00:00
|
|
|
{
|
2005-11-08 16:16:30 +00:00
|
|
|
SwPaM aPam(*pTxtNd);
|
2004-03-30 15:05:30 +00:00
|
|
|
DelNumRules(aPam);
|
|
|
|
|
2012-11-03 12:18:57 +09:00
|
|
|
bResult = true;
|
2004-03-30 15:05:30 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2004-03-30 15:05:30 +00:00
|
|
|
|
2005-11-08 16:16:30 +00:00
|
|
|
return bResult;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SwNumRule* SwDoc::GetCurrNumRule( const SwPosition& rPos ) const
|
|
|
|
{
|
|
|
|
SwNumRule* pRet = 0;
|
2004-11-26 12:24:12 +00:00
|
|
|
SwTxtNode* pTNd = rPos.nNode.GetNode().GetTxtNode();
|
|
|
|
|
|
|
|
if( pTNd )
|
2005-11-08 16:16:30 +00:00
|
|
|
{
|
2004-03-08 11:24:21 +00:00
|
|
|
pRet = pTNd->GetNumRule();
|
2005-11-08 16:16:30 +00:00
|
|
|
}
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
return pRet;
|
|
|
|
}
|
|
|
|
|
2013-10-11 14:39:49 +02:00
|
|
|
sal_uInt16 SwDoc::FindNumRule( const OUString& rName ) const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
for( sal_uInt16 n = mpNumRuleTbl->size(); n; )
|
|
|
|
if( (*mpNumRuleTbl)[ --n ]->GetName() == rName )
|
2000-09-18 23:08:29 +00:00
|
|
|
return n;
|
2006-08-14 14:59:04 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
return USHRT_MAX;
|
|
|
|
}
|
|
|
|
|
2013-10-11 14:39:49 +02:00
|
|
|
SwNumRule* SwDoc::FindNumRulePtr( const OUString& rName ) const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2004-10-22 07:11:47 +00:00
|
|
|
SwNumRule * pResult = 0;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
pResult = maNumRuleMap[rName];
|
2004-10-22 07:11:47 +00:00
|
|
|
|
2004-11-27 10:40:56 +00:00
|
|
|
if ( !pResult )
|
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
for (sal_uInt16 n = 0; n < mpNumRuleTbl->size(); ++n)
|
2004-11-27 10:40:56 +00:00
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
if ((*mpNumRuleTbl)[n]->GetName() == rName)
|
2004-11-27 10:40:56 +00:00
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
pResult = (*mpNumRuleTbl)[n];
|
2004-11-27 10:40:56 +00:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-10-22 07:11:47 +00:00
|
|
|
return pResult;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2004-11-27 10:40:56 +00:00
|
|
|
void SwDoc::AddNumRule(SwNumRule * pRule)
|
|
|
|
{
|
2013-02-18 07:54:37 +01:00
|
|
|
if ((SAL_MAX_UINT16 - 1) <= mpNumRuleTbl->size())
|
2012-07-27 17:30:49 +02:00
|
|
|
{
|
|
|
|
OSL_ENSURE(false, "SwDoc::AddNumRule: table full.");
|
|
|
|
abort(); // this should never happen on real documents
|
|
|
|
}
|
2013-02-18 07:54:37 +01:00
|
|
|
mpNumRuleTbl->push_back(pRule);
|
2008-06-13 08:35:27 +00:00
|
|
|
maNumRuleMap[pRule->GetName()] = pRule;
|
|
|
|
pRule->SetNumRuleMap(&maNumRuleMap);
|
2005-11-08 16:16:30 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
createListForListStyle( pRule->GetName() );
|
2004-11-27 10:40:56 +00:00
|
|
|
}
|
|
|
|
|
2013-08-19 23:17:40 +02:00
|
|
|
sal_uInt16 SwDoc::MakeNumRule( const OUString &rName,
|
2008-03-05 15:53:54 +00:00
|
|
|
const SwNumRule* pCpy,
|
2012-11-03 12:18:57 +09:00
|
|
|
bool bBroadcast,
|
2008-03-05 15:53:54 +00:00
|
|
|
const SvxNumberFormat::SvxNumPositionAndSpaceMode eDefaultNumberFormatPositionAndSpaceMode )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwNumRule* pNew;
|
|
|
|
if( pCpy )
|
|
|
|
{
|
|
|
|
pNew = new SwNumRule( *pCpy );
|
2005-11-08 16:16:30 +00:00
|
|
|
|
2008-07-11 13:13:49 +00:00
|
|
|
pNew->SetName( GetUniqueNumRuleName( &rName ), *this );
|
2010-10-18 12:55:43 +01:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pNew->GetName() != rName )
|
|
|
|
{
|
|
|
|
pNew->SetPoolFmtId( USHRT_MAX );
|
|
|
|
pNew->SetPoolHelpId( USHRT_MAX );
|
|
|
|
pNew->SetPoolHlpFileId( UCHAR_MAX );
|
2013-10-16 09:32:03 +02:00
|
|
|
pNew->SetDefaultListId( OUString() );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
pNew->CheckCharFmts( this );
|
|
|
|
}
|
|
|
|
else
|
2008-03-05 15:53:54 +00:00
|
|
|
{
|
|
|
|
pNew = new SwNumRule( GetUniqueNumRuleName( &rName ),
|
|
|
|
eDefaultNumberFormatPositionAndSpaceMode );
|
|
|
|
}
|
2005-11-08 16:16:30 +00:00
|
|
|
|
2013-02-18 07:54:37 +01:00
|
|
|
sal_uInt16 nRet = mpNumRuleTbl->size();
|
2004-09-08 14:17:53 +00:00
|
|
|
|
2010-10-18 12:55:43 +01:00
|
|
|
AddNumRule(pNew);
|
2004-10-22 07:11:47 +00:00
|
|
|
|
2010-11-25 14:31:08 +01:00
|
|
|
if (GetIDocumentUndoRedo().DoesUndo())
|
2004-09-08 14:17:53 +00:00
|
|
|
{
|
|
|
|
SwUndo * pUndo = new SwUndoNumruleCreate(pNew, this);
|
2010-11-25 14:31:08 +01:00
|
|
|
GetIDocumentUndoRedo().AppendUndo(pUndo);
|
2004-09-08 14:17:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (bBroadcast)
|
|
|
|
BroadcastStyleOperation(pNew->GetName(), SFX_STYLE_FAMILY_PSEUDO,
|
|
|
|
SFX_STYLESHEET_CREATED);
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
return nRet;
|
|
|
|
}
|
|
|
|
|
2013-08-19 23:17:40 +02:00
|
|
|
OUString SwDoc::GetUniqueNumRuleName( const OUString* pChkStr, bool bAutoNum ) const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2013-08-19 23:17:40 +02:00
|
|
|
OUString aName;
|
2000-09-18 23:08:29 +00:00
|
|
|
if( bAutoNum )
|
|
|
|
{
|
2013-10-02 13:09:23 +03:00
|
|
|
static bool bHack = (getenv("LIBO_ONEWAY_STABLE_ODF_EXPORT") != NULL);
|
|
|
|
|
|
|
|
if (bHack)
|
|
|
|
{
|
|
|
|
static sal_Int64 nIdCounter = SAL_CONST_INT64(8000000000);
|
|
|
|
aName = OUString::number(nIdCounter++);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
static rtlRandomPool s_RandomPool( rtl_random_createPool() );
|
|
|
|
sal_Int64 n;
|
|
|
|
rtl_random_getBytes( s_RandomPool, &n, sizeof(n) );
|
|
|
|
aName = OUString::number( (n < 0 ? -n : n) );
|
|
|
|
}
|
2013-08-19 23:17:40 +02:00
|
|
|
if( pChkStr && pChkStr->isEmpty() )
|
2000-09-18 23:08:29 +00:00
|
|
|
pChkStr = 0;
|
|
|
|
}
|
2013-08-19 23:17:40 +02:00
|
|
|
else if( pChkStr && !pChkStr->isEmpty() )
|
2000-09-18 23:08:29 +00:00
|
|
|
aName = *pChkStr;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pChkStr = 0;
|
|
|
|
aName = SW_RESSTR( STR_NUMRULE_DEFNAME );
|
|
|
|
}
|
|
|
|
|
2013-02-18 07:54:37 +01:00
|
|
|
sal_uInt16 nNum(0), nTmp, nFlagSize = ( mpNumRuleTbl->size() / 8 ) +2;
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8* pSetFlags = new sal_uInt8[ nFlagSize ];
|
2000-09-18 23:08:29 +00:00
|
|
|
memset( pSetFlags, 0, nFlagSize );
|
|
|
|
|
2013-08-19 23:17:40 +02:00
|
|
|
sal_Int32 nNmLen = aName.getLength();
|
2000-09-18 23:08:29 +00:00
|
|
|
if( !bAutoNum && pChkStr )
|
|
|
|
{
|
2013-08-19 23:17:40 +02:00
|
|
|
while( nNmLen-- && '0' <= aName[nNmLen] && aName[nNmLen] <= '9' )
|
2000-09-18 23:08:29 +00:00
|
|
|
; //nop
|
|
|
|
|
2013-08-19 23:17:40 +02:00
|
|
|
if( ++nNmLen < aName.getLength() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2013-08-19 23:17:40 +02:00
|
|
|
aName = aName.copy(0, nNmLen );
|
2000-09-18 23:08:29 +00:00
|
|
|
pChkStr = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const SwNumRule* pNumRule;
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 n;
|
2003-12-01 15:34:51 +00:00
|
|
|
|
2013-02-18 07:54:37 +01:00
|
|
|
for( n = 0; n < mpNumRuleTbl->size(); ++n )
|
|
|
|
if( 0 != ( pNumRule = (*mpNumRuleTbl)[ n ] ) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2013-08-19 23:17:40 +02:00
|
|
|
const OUString sNm = pNumRule->GetName();
|
|
|
|
if( sNm.startsWith( aName ) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// Determine Number and set the Flag
|
2013-08-19 23:17:40 +02:00
|
|
|
nNum = (sal_uInt16)sNm.copy( nNmLen ).toInt32();
|
2013-02-18 07:54:37 +01:00
|
|
|
if( nNum-- && nNum < mpNumRuleTbl->size() )
|
2000-09-18 23:08:29 +00:00
|
|
|
pSetFlags[ nNum / 8 ] |= (0x01 << ( nNum & 0x07 ));
|
|
|
|
}
|
2013-08-19 23:17:40 +02:00
|
|
|
if( pChkStr && *pChkStr==sNm )
|
2000-09-18 23:08:29 +00:00
|
|
|
pChkStr = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !pChkStr )
|
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// All Numbers have been flagged accordingly, so identify the right Number
|
2013-02-18 07:54:37 +01:00
|
|
|
nNum = mpNumRuleTbl->size();
|
2000-09-18 23:08:29 +00:00
|
|
|
for( n = 0; n < nFlagSize; ++n )
|
|
|
|
if( 0xff != ( nTmp = pSetFlags[ n ] ))
|
|
|
|
{
|
2012-01-08 22:38:04 +01:00
|
|
|
// identify the Number
|
2000-09-18 23:08:29 +00:00
|
|
|
nNum = n * 8;
|
|
|
|
while( nTmp & 1 )
|
|
|
|
++nNum, nTmp >>= 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2004-02-04 13:06:52 +00:00
|
|
|
delete [] pSetFlags;
|
2013-08-19 23:17:40 +02:00
|
|
|
if( pChkStr && !pChkStr->isEmpty() )
|
2000-09-18 23:08:29 +00:00
|
|
|
return *pChkStr;
|
2013-08-19 23:17:40 +02:00
|
|
|
return aName + OUString::number( ++nNum );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::UpdateNumRule()
|
|
|
|
{
|
2004-11-27 10:40:56 +00:00
|
|
|
const SwNumRuleTbl& rNmTbl = GetNumRuleTbl();
|
2012-05-16 15:23:09 +02:00
|
|
|
for( sal_uInt16 n = 0; n < rNmTbl.size(); ++n )
|
2000-09-18 23:08:29 +00:00
|
|
|
if( rNmTbl[ n ]->IsInvalidRule() )
|
2005-11-08 16:16:30 +00:00
|
|
|
rNmTbl[ n ]->Validate();
|
2004-03-08 11:24:21 +00:00
|
|
|
}
|
|
|
|
|
2013-10-11 14:39:49 +02:00
|
|
|
void SwDoc::MarkListLevel( const OUString& sListId,
|
2008-06-13 08:35:27 +00:00
|
|
|
const int nListLevel,
|
2012-11-03 12:18:57 +09:00
|
|
|
const bool bValue )
|
2004-05-17 15:13:16 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
SwList* pList = getListByName( sListId );
|
2004-05-17 15:13:16 +00:00
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
if ( pList )
|
2004-05-17 15:13:16 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
MarkListLevel( *pList, nListLevel, bValue );
|
2004-05-17 15:13:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-06-13 08:35:27 +00:00
|
|
|
void SwDoc::MarkListLevel( SwList& rList,
|
|
|
|
const int nListLevel,
|
2012-11-03 12:18:57 +09:00
|
|
|
const bool bValue )
|
2004-05-17 15:13:16 +00:00
|
|
|
{
|
2008-06-13 08:35:27 +00:00
|
|
|
// Set new marked list level and notify all affected nodes of the changed mark.
|
|
|
|
rList.MarkListLevel( nListLevel, bValue );
|
2004-05-17 15:13:16 +00:00
|
|
|
}
|
|
|
|
|
2012-11-03 12:18:57 +09:00
|
|
|
bool SwDoc::IsFirstOfNumRule(SwPosition & rPos)
|
2004-04-14 10:00:12 +00:00
|
|
|
{
|
2012-11-03 12:18:57 +09:00
|
|
|
bool bResult = false;
|
2004-04-14 10:00:12 +00:00
|
|
|
SwTxtNode * pTxtNode = rPos.nNode.GetNode().GetTxtNode();
|
|
|
|
|
|
|
|
if (pTxtNode)
|
|
|
|
{
|
|
|
|
SwNumRule * pNumRule = pTxtNode->GetNumRule();
|
|
|
|
|
|
|
|
if (pNumRule)
|
2005-11-08 16:16:30 +00:00
|
|
|
bResult = pTxtNode->IsFirstOfNumRule();
|
2004-04-14 10:00:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return bResult;
|
|
|
|
}
|
2008-02-26 09:37:38 +00:00
|
|
|
|
|
|
|
// implementation for interface <IDocumentListItems>
|
|
|
|
bool SwDoc::lessThanNodeNum::operator()( const SwNodeNum* pNodeNumOne,
|
|
|
|
const SwNodeNum* pNodeNumTwo ) const
|
|
|
|
{
|
|
|
|
return pNodeNumOne->LessThan( *pNodeNumTwo );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::addListItem( const SwNodeNum& rNodeNum )
|
|
|
|
{
|
|
|
|
if ( mpListItemsList == 0 )
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const bool bAlreadyInserted(
|
|
|
|
mpListItemsList->find( &rNodeNum ) != mpListItemsList->end() );
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( !bAlreadyInserted,
|
2008-02-26 09:37:38 +00:00
|
|
|
"<SwDoc::InsertListItem(..)> - <SwNodeNum> instance already registered as numbered item!" );
|
|
|
|
if ( !bAlreadyInserted )
|
|
|
|
{
|
|
|
|
mpListItemsList->insert( &rNodeNum );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::removeListItem( const SwNodeNum& rNodeNum )
|
|
|
|
{
|
|
|
|
if ( mpListItemsList == 0 )
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const tImplSortedNodeNumList::size_type nDeleted = mpListItemsList->erase( &rNodeNum );
|
|
|
|
if ( nDeleted > 1 )
|
|
|
|
{
|
2011-03-12 11:51:35 +01:00
|
|
|
OSL_FAIL( "<SwDoc::RemoveListItem(..)> - <SwNodeNum> was registered more than once as numbered item!" );
|
2008-02-26 09:37:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-11 12:07:47 +02:00
|
|
|
OUString SwDoc::getListItemText( const SwNodeNum& rNodeNum,
|
2008-02-26 09:37:38 +00:00
|
|
|
const bool bWithNumber,
|
|
|
|
const bool bWithSpacesForLevel ) const
|
|
|
|
{
|
|
|
|
return rNodeNum.GetTxtNode()
|
2013-11-14 10:01:08 +00:00
|
|
|
? rNodeNum.GetTxtNode()->GetExpandTxt( 0, -1, bWithNumber,
|
2008-02-26 09:37:38 +00:00
|
|
|
bWithNumber, bWithSpacesForLevel )
|
2013-08-05 17:05:44 +02:00
|
|
|
: OUString();
|
2008-02-26 09:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::getListItems( tSortedNodeNumList& orNodeNumList ) const
|
|
|
|
{
|
|
|
|
orNodeNumList.clear();
|
|
|
|
orNodeNumList.reserve( mpListItemsList->size() );
|
|
|
|
|
|
|
|
tImplSortedNodeNumList::iterator aIter;
|
|
|
|
tImplSortedNodeNumList::iterator aEndIter = mpListItemsList->end();
|
|
|
|
for ( aIter = mpListItemsList->begin(); aIter != aEndIter; ++aIter )
|
|
|
|
{
|
|
|
|
orNodeNumList.push_back( (*aIter) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::getNumItems( tSortedNodeNumList& orNodeNumList ) const
|
|
|
|
{
|
|
|
|
orNodeNumList.clear();
|
|
|
|
orNodeNumList.reserve( mpListItemsList->size() );
|
|
|
|
|
|
|
|
tImplSortedNodeNumList::iterator aIter;
|
|
|
|
tImplSortedNodeNumList::iterator aEndIter = mpListItemsList->end();
|
|
|
|
for ( aIter = mpListItemsList->begin(); aIter != aEndIter; ++aIter )
|
|
|
|
{
|
|
|
|
const SwNodeNum* pNodeNum = (*aIter);
|
|
|
|
if ( pNodeNum->IsCounted() &&
|
|
|
|
pNodeNum->GetTxtNode() && pNodeNum->GetTxtNode()->HasNumber() )
|
|
|
|
{
|
|
|
|
orNodeNumList.push_back( pNodeNum );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// implementation for interface <IDocumentOutlineNodes>
|
|
|
|
sal_Int32 SwDoc::getOutlineNodesCount() const
|
|
|
|
{
|
2012-07-19 13:12:17 +02:00
|
|
|
return GetNodes().GetOutLineNds().size();
|
2008-02-26 09:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int SwDoc::getOutlineLevel( const sal_Int32 nIdx ) const
|
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
return GetNodes().GetOutLineNds()[ static_cast<sal_uInt16>(nIdx) ]->
|
2013-09-27 14:40:18 +02:00
|
|
|
GetTxtNode()->GetAttrOutlineLevel()-1;
|
2008-02-26 09:37:38 +00:00
|
|
|
}
|
|
|
|
|
2013-10-11 11:36:51 +02:00
|
|
|
OUString SwDoc::getOutlineText( const sal_Int32 nIdx,
|
2008-02-26 09:37:38 +00:00
|
|
|
const bool bWithNumber,
|
2013-11-20 07:55:57 +01:00
|
|
|
const bool bWithSpacesForLevel,
|
|
|
|
const bool bWithFtn ) const
|
2008-02-26 09:37:38 +00:00
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
return GetNodes().GetOutLineNds()[ static_cast<sal_uInt16>(nIdx) ]->
|
2013-11-14 10:01:08 +00:00
|
|
|
GetTxtNode()->GetExpandTxt( 0, -1, bWithNumber,
|
2013-11-20 07:55:57 +01:00
|
|
|
bWithNumber, bWithSpacesForLevel, bWithFtn );
|
2008-02-26 09:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SwTxtNode* SwDoc::getOutlineNode( const sal_Int32 nIdx ) const
|
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
return GetNodes().GetOutLineNds()[ static_cast<sal_uInt16>(nIdx) ]->GetTxtNode();
|
2008-02-26 09:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::getOutlineNodes( IDocumentOutlineNodes::tSortedOutlineNodeList& orOutlineNodeList ) const
|
|
|
|
{
|
|
|
|
orOutlineNodeList.clear();
|
|
|
|
orOutlineNodeList.reserve( getOutlineNodesCount() );
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
const sal_uInt16 nOutlCount( static_cast<sal_uInt16>(getOutlineNodesCount()) );
|
|
|
|
for ( sal_uInt16 i = 0; i < nOutlCount; ++i )
|
2008-02-26 09:37:38 +00:00
|
|
|
{
|
|
|
|
orOutlineNodeList.push_back(
|
|
|
|
GetNodes().GetOutLineNds()[i]->GetTxtNode() );
|
|
|
|
}
|
|
|
|
}
|
2008-06-13 08:35:27 +00:00
|
|
|
|
|
|
|
// implementation of interface IDocumentListsAccess
|
2013-10-11 11:55:52 +02:00
|
|
|
SwList* SwDoc::createList( const OUString& rListId,
|
|
|
|
const OUString& sDefaultListStyleName )
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
2013-10-11 11:55:52 +02:00
|
|
|
OUString sListId = rListId;
|
|
|
|
if ( sListId.isEmpty() )
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
|
|
|
sListId = listfunc::CreateUniqueListId( *this );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( getListByName( sListId ) )
|
|
|
|
{
|
2011-03-12 11:51:35 +01:00
|
|
|
OSL_FAIL( "<SwDoc::createList(..)> - provided list id already used. Serious defect -> please inform OD." );
|
2008-06-13 08:35:27 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
SwNumRule* pDefaultNumRuleForNewList = FindNumRulePtr( sDefaultListStyleName );
|
|
|
|
if ( !pDefaultNumRuleForNewList )
|
|
|
|
{
|
2011-03-12 11:51:35 +01:00
|
|
|
OSL_FAIL( "<SwDoc::createList(..)> - for provided default list style name no list style is found. Serious defect -> please inform OD." );
|
2008-06-13 08:35:27 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
SwList* pNewList = new SwList( sListId, *pDefaultNumRuleForNewList, GetNodes() );
|
|
|
|
maLists[sListId] = pNewList;
|
|
|
|
|
|
|
|
return pNewList;
|
|
|
|
}
|
|
|
|
|
2013-10-11 11:55:52 +02:00
|
|
|
void SwDoc::deleteList( const OUString& sListId )
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
|
|
|
SwList* pList = getListByName( sListId );
|
|
|
|
if ( pList )
|
|
|
|
{
|
|
|
|
maLists.erase( sListId );
|
|
|
|
delete pList;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-11 11:55:52 +02:00
|
|
|
SwList* SwDoc::getListByName( const OUString& sListId ) const
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
|
|
|
SwList* pList = 0;
|
|
|
|
|
2013-10-02 13:34:02 +01:00
|
|
|
boost::unordered_map< OUString, SwList*, OUStringHash >::const_iterator
|
2008-06-13 08:35:27 +00:00
|
|
|
aListIter = maLists.find( sListId );
|
|
|
|
if ( aListIter != maLists.end() )
|
|
|
|
{
|
|
|
|
pList = (*aListIter).second;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pList;
|
|
|
|
}
|
|
|
|
|
2013-10-11 11:55:52 +02:00
|
|
|
SwList* SwDoc::createListForListStyle( const OUString& sListStyleName )
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
2013-10-11 11:55:52 +02:00
|
|
|
if ( sListStyleName.isEmpty() )
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
2011-03-12 11:51:35 +01:00
|
|
|
OSL_FAIL( "<SwDoc::createListForListStyle(..)> - no list style name provided. Serious defect -> please inform OD." );
|
2008-06-13 08:35:27 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( getListForListStyle( sListStyleName ) )
|
|
|
|
{
|
2011-03-12 11:51:35 +01:00
|
|
|
OSL_FAIL( "<SwDoc::createListForListStyle(..)> - a list for the provided list style name already exists. Serious defect -> please inform OD." );
|
2008-06-13 08:35:27 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
SwNumRule* pNumRule = FindNumRulePtr( sListStyleName );
|
|
|
|
if ( !pNumRule )
|
|
|
|
{
|
2011-03-12 11:51:35 +01:00
|
|
|
OSL_FAIL( "<SwDoc::createListForListStyle(..)> - for provided list style name no list style is found. Serious defect -> please inform OD." );
|
2008-06-13 08:35:27 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-10-16 09:32:03 +02:00
|
|
|
OUString sListId( pNumRule->GetDefaultListId() ); // can be empty String
|
2008-06-13 08:35:27 +00:00
|
|
|
if ( getListByName( sListId ) )
|
|
|
|
{
|
2013-10-16 09:32:03 +02:00
|
|
|
sListId = OUString();
|
2008-06-13 08:35:27 +00:00
|
|
|
}
|
|
|
|
SwList* pNewList = createList( sListId, sListStyleName );
|
|
|
|
maListStyleLists[sListStyleName] = pNewList;
|
|
|
|
pNumRule->SetDefaultListId( pNewList->GetListId() );
|
|
|
|
|
|
|
|
return pNewList;
|
|
|
|
}
|
|
|
|
|
2013-10-11 11:55:52 +02:00
|
|
|
SwList* SwDoc::getListForListStyle( const OUString& sListStyleName ) const
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
|
|
|
SwList* pList = 0;
|
|
|
|
|
2013-10-02 13:34:02 +01:00
|
|
|
boost::unordered_map< OUString, SwList*, OUStringHash >::const_iterator
|
2008-06-13 08:35:27 +00:00
|
|
|
aListIter = maListStyleLists.find( sListStyleName );
|
|
|
|
if ( aListIter != maListStyleLists.end() )
|
|
|
|
{
|
|
|
|
pList = (*aListIter).second;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pList;
|
|
|
|
}
|
|
|
|
|
2013-10-11 11:55:52 +02:00
|
|
|
void SwDoc::deleteListForListStyle( const OUString& sListStyleName )
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
2013-10-16 09:32:03 +02:00
|
|
|
OUString sListId;
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
|
|
|
SwList* pList = getListForListStyle( sListStyleName );
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pList,
|
2008-06-13 08:35:27 +00:00
|
|
|
"<SwDoc::deleteListForListStyle(..)> - misusage of method: no list found for given list style name" );
|
|
|
|
if ( pList )
|
|
|
|
{
|
|
|
|
sListId = pList->GetListId();
|
|
|
|
}
|
|
|
|
}
|
2013-10-16 09:32:03 +02:00
|
|
|
if ( !sListId.isEmpty() )
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
|
|
|
maListStyleLists.erase( sListStyleName );
|
|
|
|
deleteList( sListId );
|
|
|
|
}
|
|
|
|
}
|
2010-10-18 12:55:43 +01:00
|
|
|
|
2013-10-11 11:55:52 +02:00
|
|
|
void SwDoc::trackChangeOfListStyleName( const OUString& sListStyleName,
|
|
|
|
const OUString& sNewListStyleName )
|
2008-07-11 13:13:49 +00:00
|
|
|
{
|
|
|
|
SwList* pList = getListForListStyle( sListStyleName );
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pList,
|
2008-07-11 13:13:49 +00:00
|
|
|
"<SwDoc::changeOfListStyleName(..)> - misusage of method: no list found for given list style name" );
|
2008-06-13 08:35:27 +00:00
|
|
|
|
2008-07-11 13:13:49 +00:00
|
|
|
if ( pList != 0 )
|
|
|
|
{
|
|
|
|
maListStyleLists.erase( sListStyleName );
|
|
|
|
maListStyleLists[sNewListStyleName] = pList;
|
|
|
|
}
|
|
|
|
}
|
2008-06-13 08:35:27 +00:00
|
|
|
|
|
|
|
namespace listfunc
|
|
|
|
{
|
2013-10-16 09:32:03 +02:00
|
|
|
const OUString MakeListIdUnique( const SwDoc& rDoc,
|
|
|
|
const OUString aSuggestedUniqueListId )
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
|
|
|
long nHitCount = 0;
|
2013-10-16 09:32:03 +02:00
|
|
|
OUString aTmpStr = aSuggestedUniqueListId;
|
2008-06-13 08:35:27 +00:00
|
|
|
while ( rDoc.getListByName( aTmpStr ) )
|
|
|
|
{
|
|
|
|
++nHitCount;
|
|
|
|
aTmpStr = aSuggestedUniqueListId;
|
2013-02-20 00:18:07 +01:00
|
|
|
aTmpStr += OUString::number( nHitCount );
|
2008-06-13 08:35:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return aTmpStr;
|
|
|
|
}
|
2013-10-10 14:42:12 +02:00
|
|
|
const OUString CreateUniqueListId( const SwDoc& rDoc )
|
2008-06-13 08:35:27 +00:00
|
|
|
{
|
Add hack to optionally get stable ODF output from the same input
To be used in regression testing and similar scenarios, where the output ODF
is *not* intended to be further manipulated in LibreOffice. An environment
variable LIBO_ONEWAY_STABLE_ODF_EXPORT is used to toggle this behaviour. I am
not 100% sure whether the generated ODF with the hack toggled on is even fully
correct, but correctness is not the purpose of the hack anyway.
Two classes of issues handled: 1) Automatic style names and 2) use of
randomness.
For class 1), when the hack toggle is in effect, we generate the names at
first as strings based on all the properties of the style, and sort them based
on those, and then rename them (for brevity in the output) to the "normal"
form of a short prefix plus a number (like "P12").
Sure, it would have been better to just figure out *why* the automatic style
naming currently is not stable in the first place, but outputs the styles in
different order (with some styles being assigned different numbers) in
separate invokations of LibreOffice), but I was unable to understand that.
Possibly this code could be used in all cases, except that it does break some
unit test (can't recall which right now). I don't know whether that is simply
because the unit test assumes too much knowledge of the internal workings of
the automatic style name generation, or whether the generated ODF is actually
invalid.
For 2), I found a handful of places where randomness was used to generated
various kinds of identifiers in ODF output. I changed those to just use large
(64-bit) non-overlapping integers instead. I assume there *is* a point in the
original code in each case that explains why randomness is needed, so the hack
definitely needs to be optional and used only for the above mentioned
scenarios.
Change-Id: I17b657197e38bcf24abdfe61ad4a277f4339eeae
2013-09-30 15:23:35 +03:00
|
|
|
static bool bHack = (getenv("LIBO_ONEWAY_STABLE_ODF_EXPORT") != NULL);
|
2008-06-13 08:35:27 +00:00
|
|
|
|
Add hack to optionally get stable ODF output from the same input
To be used in regression testing and similar scenarios, where the output ODF
is *not* intended to be further manipulated in LibreOffice. An environment
variable LIBO_ONEWAY_STABLE_ODF_EXPORT is used to toggle this behaviour. I am
not 100% sure whether the generated ODF with the hack toggled on is even fully
correct, but correctness is not the purpose of the hack anyway.
Two classes of issues handled: 1) Automatic style names and 2) use of
randomness.
For class 1), when the hack toggle is in effect, we generate the names at
first as strings based on all the properties of the style, and sort them based
on those, and then rename them (for brevity in the output) to the "normal"
form of a short prefix plus a number (like "P12").
Sure, it would have been better to just figure out *why* the automatic style
naming currently is not stable in the first place, but outputs the styles in
different order (with some styles being assigned different numbers) in
separate invokations of LibreOffice), but I was unable to understand that.
Possibly this code could be used in all cases, except that it does break some
unit test (can't recall which right now). I don't know whether that is simply
because the unit test assumes too much knowledge of the internal workings of
the automatic style name generation, or whether the generated ODF is actually
invalid.
For 2), I found a handful of places where randomness was used to generated
various kinds of identifiers in ODF output. I changed those to just use large
(64-bit) non-overlapping integers instead. I assume there *is* a point in the
original code in each case that explains why randomness is needed, so the hack
definitely needs to be optional and used only for the above mentioned
scenarios.
Change-Id: I17b657197e38bcf24abdfe61ad4a277f4339eeae
2013-09-30 15:23:35 +03:00
|
|
|
if (bHack)
|
|
|
|
{
|
|
|
|
static sal_Int64 nIdCounter = SAL_CONST_INT64(7000000000);
|
|
|
|
return MakeListIdUnique( rDoc, OUString( "list" + OUString::number(nIdCounter++) ) );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// #i92478#
|
|
|
|
OUString aNewListId( "list" );
|
|
|
|
// #o12311627#
|
|
|
|
static rtlRandomPool s_RandomPool( rtl_random_createPool() );
|
|
|
|
sal_Int64 n;
|
|
|
|
rtl_random_getBytes( s_RandomPool, &n, sizeof(n) );
|
|
|
|
aNewListId += OUString::number( (n < 0 ? -n : n) );
|
|
|
|
|
|
|
|
return MakeListIdUnique( rDoc, aNewListId );
|
|
|
|
}
|
2008-06-13 08:35:27 +00:00
|
|
|
}
|
|
|
|
}
|
2010-10-14 08:30:41 +02:00
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|