diff options
Diffstat (limited to 'sw/source/core/undo/unsort.cxx')
-rw-r--r-- | sw/source/core/undo/unsort.cxx | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/sw/source/core/undo/unsort.cxx b/sw/source/core/undo/unsort.cxx new file mode 100644 index 000000000000..1b72dba58572 --- /dev/null +++ b/sw/source/core/undo/unsort.cxx @@ -0,0 +1,282 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + +#include <UndoSort.hxx> + +#include <doc.hxx> +#include <swundo.hxx> // fuer die UndoIds +#include <pam.hxx> +#include <swtable.hxx> +#include <ndtxt.hxx> +#include <UndoCore.hxx> +#include <UndoTable.hxx> +#include <sortopt.hxx> +#include <docsort.hxx> +#include <redline.hxx> +#include <node2lay.hxx> + + +/*-------------------------------------------------------------------- + Beschreibung: Undo fuers Sorting + --------------------------------------------------------------------*/ + + +SV_IMPL_PTRARR(SwSortList, SwSortUndoElement*) +SV_IMPL_PTRARR(SwUndoSortList, SwNodeIndex*) + + +SwSortUndoElement::~SwSortUndoElement() +{ + // sind String Pointer gespeichert ?? + if( 0xffffffff != SORT_TXT_TBL.TXT.nKenn ) + { + delete SORT_TXT_TBL.TBL.pSource; + delete SORT_TXT_TBL.TBL.pTarget; + } +} + + +SwUndoSort::SwUndoSort(const SwPaM& rRg, const SwSortOptions& rOpt) + : SwUndo(UNDO_SORT_TXT), SwUndRng(rRg), pUndoTblAttr( 0 ), + pRedlData( 0 ) +{ + pSortOpt = new SwSortOptions(rOpt); +} + +SwUndoSort::SwUndoSort( sal_uLong nStt, sal_uLong nEnd, const SwTableNode& rTblNd, + const SwSortOptions& rOpt, sal_Bool bSaveTable ) + : SwUndo(UNDO_SORT_TBL), pUndoTblAttr( 0 ), pRedlData( 0 ) +{ + nSttNode = nStt; + nEndNode = nEnd; + nTblNd = rTblNd.GetIndex(); + + pSortOpt = new SwSortOptions(rOpt); + if( bSaveTable ) + pUndoTblAttr = new SwUndoAttrTbl( rTblNd ); +} + +SwUndoSort::~SwUndoSort() +{ + delete pSortOpt; + delete pUndoTblAttr; + delete pRedlData; +} + +void SwUndoSort::UndoImpl(::sw::UndoRedoContext & rContext) +{ + SwDoc & rDoc = rContext.GetDoc(); + if(pSortOpt->bTable) + { + // Undo Tabelle + RemoveIdxFromSection( rDoc, nSttNode, &nEndNode ); + + if( pUndoTblAttr ) + { + pUndoTblAttr->UndoImpl(rContext); + } + + SwTableNode* pTblNd = rDoc.GetNodes()[ nTblNd ]->GetTableNode(); + + // --> FME 2004-11-26 #i37739# A simple 'MakeFrms' after the node sorting + // does not work if the table is inside a frame and has no prev/next. + SwNode2Layout aNode2Layout( *pTblNd ); + // <-- + + pTblNd->DelFrms(); + const SwTable& rTbl = pTblNd->GetTable(); + + SwMovedBoxes aMovedList; + for( sal_uInt16 i=0; i < aSortList.Count(); i++) + { + const SwTableBox* pSource = rTbl.GetTblBox( + *aSortList[i]->SORT_TXT_TBL.TBL.pSource ); + const SwTableBox* pTarget = rTbl.GetTblBox( + *aSortList[i]->SORT_TXT_TBL.TBL.pTarget ); + + // zurueckverschieben + MoveCell(&rDoc, pTarget, pSource, + USHRT_MAX != aMovedList.GetPos(pSource) ); + + // schon Verschobenen in der Liste merken + aMovedList.Insert(pTarget, aMovedList.Count() ); + } + + // Restore table frames: + // --> FME 2004-11-26 #i37739# A simple 'MakeFrms' after the node sorting + // does not work if the table is inside a frame and has no prev/next. + const sal_uLong nIdx = pTblNd->GetIndex(); + aNode2Layout.RestoreUpperFrms( rDoc.GetNodes(), nIdx, nIdx + 1 ); + // <-- + } + else + { + // Undo Text + SwPaM & rPam( AddUndoRedoPaM(rContext) ); + RemoveIdxFromRange(rPam, true); + + // fuer die sorted Positions einen Index anlegen. + // JP 25.11.97: Die IndexList muss aber nach SourcePosition + // aufsteigend sortiert aufgebaut werden + SwUndoSortList aIdxList( (sal_uInt8)aSortList.Count() ); + sal_uInt16 i; + + for( i = 0; i < aSortList.Count(); ++i) + for( sal_uInt16 ii=0; ii < aSortList.Count(); ++ii ) + if( aSortList[ii]->SORT_TXT_TBL.TXT.nSource == nSttNode + i ) + { + SwNodeIndex* pIdx = new SwNodeIndex( rDoc.GetNodes(), + aSortList[ii]->SORT_TXT_TBL.TXT.nTarget ); + aIdxList.C40_INSERT(SwNodeIndex, pIdx, i ); + break; + } + + for(i=0; i < aSortList.Count(); ++i) + { + SwNodeIndex aIdx( rDoc.GetNodes(), nSttNode + i ); + SwNodeRange aRg( *aIdxList[i], 0, *aIdxList[i], 1 ); + rDoc.MoveNodeRange(aRg, aIdx, + IDocumentContentOperations::DOC_MOVEDEFAULT); + } + // Indixes loeschen + aIdxList.DeleteAndDestroy(0, aIdxList.Count()); + SetPaM(rPam, true); + } +} + +void SwUndoSort::RedoImpl(::sw::UndoRedoContext & rContext) +{ + SwDoc & rDoc = rContext.GetDoc(); + + if(pSortOpt->bTable) + { + // Redo bei Tabelle + RemoveIdxFromSection( rDoc, nSttNode, &nEndNode ); + + SwTableNode* pTblNd = rDoc.GetNodes()[ nTblNd ]->GetTableNode(); + + // --> FME 2004-11-26 #i37739# A simple 'MakeFrms' after the node sorting + // does not work if the table is inside a frame and has no prev/next. + SwNode2Layout aNode2Layout( *pTblNd ); + // <-- + + pTblNd->DelFrms(); + const SwTable& rTbl = pTblNd->GetTable(); + + SwMovedBoxes aMovedList; + for(sal_uInt16 i=0; i < aSortList.Count(); ++i) + { + const SwTableBox* pSource = rTbl.GetTblBox( + (const String&) *aSortList[i]->SORT_TXT_TBL.TBL.pSource ); + const SwTableBox* pTarget = rTbl.GetTblBox( + (const String&) *aSortList[i]->SORT_TXT_TBL.TBL.pTarget ); + + // zurueckverschieben + MoveCell(&rDoc, pSource, pTarget, + USHRT_MAX != aMovedList.GetPos( pTarget ) ); + // schon Verschobenen in der Liste merken + aMovedList.Insert( pSource, aMovedList.Count() ); + } + + if( pUndoTblAttr ) + { + pUndoTblAttr->RedoImpl(rContext); + } + + // Restore table frames: + // --> FME 2004-11-26 #i37739# A simple 'MakeFrms' after the node sorting + // does not work if the table is inside a frame and has no prev/next. + const sal_uLong nIdx = pTblNd->GetIndex(); + aNode2Layout.RestoreUpperFrms( rDoc.GetNodes(), nIdx, nIdx + 1 ); + // <-- + } + else + { + // Redo for Text + SwPaM & rPam( AddUndoRedoPaM(rContext) ); + SetPaM(rPam); + RemoveIdxFromRange(rPam, true); + + SwUndoSortList aIdxList( (sal_uInt8)aSortList.Count() ); + sal_uInt16 i; + + for( i = 0; i < aSortList.Count(); ++i) + { // aktuelle Pos ist die Ausgangslage + SwNodeIndex* pIdx = new SwNodeIndex( rDoc.GetNodes(), + aSortList[i]->SORT_TXT_TBL.TXT.nSource); + aIdxList.C40_INSERT( SwNodeIndex, pIdx, i ); + } + + for(i=0; i < aSortList.Count(); ++i) + { + SwNodeIndex aIdx( rDoc.GetNodes(), nSttNode + i); + SwNodeRange aRg( *aIdxList[i], 0, *aIdxList[i], 1 ); + rDoc.MoveNodeRange(aRg, aIdx, + IDocumentContentOperations::DOC_MOVEDEFAULT); + } + // Indixes loeschen + aIdxList.DeleteAndDestroy(0, aIdxList.Count()); + SetPaM(rPam, true); + SwTxtNode const*const pTNd = rPam.GetNode()->GetTxtNode(); + if( pTNd ) + { + rPam.GetPoint()->nContent = pTNd->GetTxt().Len(); + } + } +} + +void SwUndoSort::RepeatImpl(::sw::RepeatContext & rContext) +{ + // table not repeat capable + if(!pSortOpt->bTable) + { + SwPaM *const pPam = & rContext.GetRepeatPaM(); + SwDoc& rDoc = *pPam->GetDoc(); + + if( !rDoc.IsIdxInTbl( pPam->Start()->nNode ) ) + rDoc.SortText(*pPam, *pSortOpt); + } +} + +void SwUndoSort::Insert( const String& rOrgPos, const String& rNewPos) +{ + SwSortUndoElement* pEle = new SwSortUndoElement(rOrgPos, rNewPos); + aSortList.C40_INSERT( SwSortUndoElement, pEle, aSortList.Count() ); +} + +void SwUndoSort::Insert( sal_uLong nOrgPos, sal_uLong nNewPos) +{ + SwSortUndoElement* pEle = new SwSortUndoElement(nOrgPos, nNewPos); + aSortList.C40_INSERT( SwSortUndoElement, pEle, aSortList.Count() ); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file |