1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svtools.hxx" 26 27 #include <svtools/texteng.hxx> 28 #include <svtools/textview.hxx> 29 #include <textundo.hxx> 30 #include <textund2.hxx> 31 #include <svtools/textdata.hxx> 32 #include <textdoc.hxx> 33 #include <textdat2.hxx> 34 35 TYPEINIT1( TextUndo, SfxUndoAction ); 36 TYPEINIT1( TextUndoDelPara, TextUndo ); 37 TYPEINIT1( TextUndoConnectParas, TextUndo ); 38 TYPEINIT1( TextUndoSplitPara, TextUndo ); 39 TYPEINIT1( TextUndoInsertChars, TextUndo ); 40 TYPEINIT1( TextUndoRemoveChars, TextUndo ); 41 TYPEINIT1( TextUndoSetAttribs, TextUndo ); 42 43 44 TextUndoManager::TextUndoManager( TextEngine* p ) 45 { 46 mpTextEngine = p; 47 } 48 49 TextUndoManager::~TextUndoManager() 50 { 51 } 52 53 sal_Bool __EXPORT TextUndoManager::Undo() 54 { 55 if ( GetUndoActionCount() == 0 ) 56 return sal_False; 57 58 UndoRedoStart(); 59 60 mpTextEngine->SetIsInUndo( sal_True ); 61 sal_Bool bDone = SfxUndoManager::Undo(); 62 mpTextEngine->SetIsInUndo( sal_False ); 63 64 UndoRedoEnd(); 65 66 return bDone; 67 } 68 69 sal_Bool __EXPORT TextUndoManager::Redo() 70 { 71 if ( GetRedoActionCount() == 0 ) 72 return sal_False; 73 74 75 UndoRedoStart(); 76 77 mpTextEngine->SetIsInUndo( sal_True ); 78 sal_Bool bDone = SfxUndoManager::Redo(); 79 mpTextEngine->SetIsInUndo( sal_False ); 80 81 UndoRedoEnd(); 82 83 return bDone; 84 } 85 86 void TextUndoManager::UndoRedoStart() 87 { 88 DBG_ASSERT( GetView(), "Undo/Redo: Active View?" ); 89 90 // if ( GetView() ) 91 // GetView()->HideSelection(); 92 } 93 94 void TextUndoManager::UndoRedoEnd() 95 { 96 if ( GetView() ) 97 { 98 TextSelection aNewSel( GetView()->GetSelection() ); 99 aNewSel.GetStart() = aNewSel.GetEnd(); 100 GetView()->ImpSetSelection( aNewSel ); 101 } 102 103 mpTextEngine->UpdateSelections(); 104 105 mpTextEngine->FormatAndUpdate( GetView() ); 106 } 107 108 109 TextUndo::TextUndo( TextEngine* p ) 110 { 111 mpTextEngine = p; 112 } 113 114 TextUndo::~TextUndo() 115 { 116 } 117 118 XubString __EXPORT TextUndo::GetComment() const 119 { 120 // return mpTextEngine->GetUndoComment( this ); 121 return String(); 122 } 123 124 void TextUndo::SetSelection( const TextSelection& rSel ) 125 { 126 if ( GetView() ) 127 GetView()->ImpSetSelection( rSel ); 128 } 129 130 131 TextUndoDelPara::TextUndoDelPara( TextEngine* pTextEngine, TextNode* pNode, sal_uLong nPara ) 132 : TextUndo( pTextEngine ) 133 { 134 mpNode = pNode; 135 mnPara = nPara; 136 mbDelObject = sal_True; 137 } 138 139 TextUndoDelPara::~TextUndoDelPara() 140 { 141 if ( mbDelObject ) 142 delete mpNode; 143 } 144 145 void __EXPORT TextUndoDelPara::Undo() 146 { 147 GetTextEngine()->InsertContent( mpNode, mnPara ); 148 mbDelObject = sal_False; // gehoert wieder der Engine 149 150 if ( GetView() ) 151 { 152 TextSelection aSel( TextPaM( mnPara, 0 ), TextPaM( mnPara, mpNode->GetText().Len() ) ); 153 SetSelection( aSel ); 154 } 155 } 156 157 void __EXPORT TextUndoDelPara::Redo() 158 { 159 // pNode stimmt nicht mehr, falls zwischendurch Undos, in denen 160 // Absaetze verschmolzen sind. 161 mpNode = GetDoc()->GetNodes().GetObject( mnPara ); 162 163 delete GetTEParaPortions()->GetObject( mnPara ); 164 GetTEParaPortions()->Remove( mnPara ); 165 166 // Node nicht loeschen, haengt im Undo! 167 GetDoc()->GetNodes().Remove( mnPara ); 168 GetTextEngine()->ImpParagraphRemoved( mnPara ); 169 170 mbDelObject = sal_True; // gehoert wieder dem Undo 171 172 sal_uLong nParas = GetDoc()->GetNodes().Count(); 173 sal_uLong n = mnPara < nParas ? mnPara : (nParas-1); 174 TextNode* pN = GetDoc()->GetNodes().GetObject( n ); 175 TextPaM aPaM( n, pN->GetText().Len() ); 176 SetSelection( aPaM ); 177 } 178 179 // ----------------------------------------------------------------------- 180 // TextUndoConnectParas 181 // ------------------------------------------------------------------------ 182 TextUndoConnectParas::TextUndoConnectParas( TextEngine* pTextEngine, sal_uLong nPara, sal_uInt16 nPos ) 183 : TextUndo( pTextEngine ) 184 { 185 mnPara = nPara; 186 mnSepPos = nPos; 187 } 188 189 TextUndoConnectParas::~TextUndoConnectParas() 190 { 191 } 192 193 void __EXPORT TextUndoConnectParas::Undo() 194 { 195 TextPaM aPaM = GetTextEngine()->SplitContent( mnPara, mnSepPos ); 196 SetSelection( aPaM ); 197 } 198 199 void __EXPORT TextUndoConnectParas::Redo() 200 { 201 TextPaM aPaM = GetTextEngine()->ConnectContents( mnPara ); 202 SetSelection( aPaM ); 203 } 204 205 206 TextUndoSplitPara::TextUndoSplitPara( TextEngine* pTextEngine, sal_uLong nPara, sal_uInt16 nPos ) 207 : TextUndo( pTextEngine ) 208 { 209 mnPara = nPara; 210 mnSepPos = nPos; 211 } 212 213 TextUndoSplitPara::~TextUndoSplitPara() 214 { 215 } 216 217 void __EXPORT TextUndoSplitPara::Undo() 218 { 219 TextPaM aPaM = GetTextEngine()->ConnectContents( mnPara ); 220 SetSelection( aPaM ); 221 } 222 223 void __EXPORT TextUndoSplitPara::Redo() 224 { 225 TextPaM aPaM = GetTextEngine()->SplitContent( mnPara, mnSepPos ); 226 SetSelection( aPaM ); 227 } 228 229 230 TextUndoInsertChars::TextUndoInsertChars( TextEngine* pTextEngine, const TextPaM& rTextPaM, const XubString& rStr ) 231 : TextUndo( pTextEngine ), 232 maTextPaM( rTextPaM ), maText( rStr ) 233 { 234 } 235 236 void __EXPORT TextUndoInsertChars::Undo() 237 { 238 TextSelection aSel( maTextPaM, maTextPaM ); 239 aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len(); 240 TextPaM aPaM = GetTextEngine()->ImpDeleteText( aSel ); 241 SetSelection( aPaM ); 242 } 243 244 void __EXPORT TextUndoInsertChars::Redo() 245 { 246 TextSelection aSel( maTextPaM, maTextPaM ); 247 GetTextEngine()->ImpInsertText( aSel, maText ); 248 TextPaM aNewPaM( maTextPaM ); 249 aNewPaM.GetIndex() = aNewPaM.GetIndex() + maText.Len(); 250 SetSelection( TextSelection( aSel.GetStart(), aNewPaM ) ); 251 } 252 253 sal_Bool __EXPORT TextUndoInsertChars::Merge( SfxUndoAction* pNextAction ) 254 { 255 if ( !pNextAction->ISA( TextUndoInsertChars ) ) 256 return sal_False; 257 258 TextUndoInsertChars* pNext = (TextUndoInsertChars*)pNextAction; 259 260 if ( maTextPaM.GetPara() != pNext->maTextPaM.GetPara() ) 261 return sal_False; 262 263 if ( ( maTextPaM.GetIndex() + maText.Len() ) == pNext->maTextPaM.GetIndex() ) 264 { 265 maText += pNext->maText; 266 return sal_True; 267 } 268 return sal_False; 269 } 270 271 272 TextUndoRemoveChars::TextUndoRemoveChars( TextEngine* pTextEngine, const TextPaM& rTextPaM, const XubString& rStr ) 273 : TextUndo( pTextEngine ), 274 maTextPaM( rTextPaM ), maText( rStr ) 275 { 276 } 277 278 void __EXPORT TextUndoRemoveChars::Undo() 279 { 280 TextSelection aSel( maTextPaM, maTextPaM ); 281 GetTextEngine()->ImpInsertText( aSel, maText ); 282 aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len(); 283 SetSelection( aSel ); 284 } 285 286 void __EXPORT TextUndoRemoveChars::Redo() 287 { 288 TextSelection aSel( maTextPaM, maTextPaM ); 289 aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len(); 290 TextPaM aPaM = GetTextEngine()->ImpDeleteText( aSel ); 291 SetSelection( aPaM ); 292 } 293 294 295 TextUndoSetAttribs::TextUndoSetAttribs( TextEngine* pTextEngine, const TextSelection& rSel ) 296 : TextUndo( pTextEngine ), maSelection( rSel ) 297 { 298 maSelection.Justify(); 299 // aNewAttribs.Set( rNewItems ); 300 // mbSetIsRemove = sal_False; 301 // mnRemoveWhich = 0; 302 // mnSpecial = 0; 303 } 304 305 TextUndoSetAttribs::~TextUndoSetAttribs() 306 { 307 // ............... 308 } 309 310 void __EXPORT TextUndoSetAttribs::Undo() 311 { 312 for ( sal_uLong nPara = maSelection.GetStart().GetPara(); nPara <= maSelection.GetEnd().GetPara(); nPara++ ) 313 { 314 // ContentAttribsInfo* pInf = aPrevAttribs[ (sal_uInt16)(nPara-aESel.nStartPara) ]; 315 // GetTextEngine()->RemoveCharAttribs( nPara ); 316 // TextNode* pNode = GetTextEngine()->GetTextDoc().GetObject( nPara ); 317 // for ( sal_uInt16 nAttr = 0; nAttr < pInf->GetPrevCharAttribs().Count(); nAttr++ ) 318 // { 319 // GetTextEngine()->GetTextDoc().InsertAttrib( pNode, pX->GetStart(), pX->GetEnd(), *pX->GetItem() ); 320 // } 321 } 322 SetSelection( maSelection ); 323 } 324 325 void __EXPORT TextUndoSetAttribs::Redo() 326 { 327 // if ( !bSetIsRemove ) 328 // GetTextEngine()->SetAttribs( aSel, aNewAttribs, nSpecial ); 329 // else 330 // GetTextEngine()->RemoveCharAttribs( aSel, bRemoveParaAttribs, nRemoveWhich ); 331 SetSelection( maSelection ); 332 } 333