/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #include #include #include // fuer die UndoIds #include #include #include #include #include #include #include #include #include /*-------------------------------------------------------------------- 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() ); }