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_sc.hxx" 26 27 #include "editsrc.hxx" 28 29 #include "scitems.hxx" 30 #include <editeng/eeitem.hxx> 31 #include <editeng/unofored.hxx> 32 #include <svx/svdpage.hxx> 33 #include <svx/svditer.hxx> 34 #include <svx/svdocapt.hxx> 35 #include <editeng/outlobj.hxx> 36 #include <editeng/editobj.hxx> 37 #include <editeng/outliner.hxx> 38 #include "textuno.hxx" 39 #include "editutil.hxx" 40 #include "docsh.hxx" 41 #include "docfunc.hxx" 42 #include "hints.hxx" 43 #include "patattr.hxx" 44 #include "unoguard.hxx" 45 #include "drwlayer.hxx" 46 #include "userdat.hxx" 47 #include "postit.hxx" 48 #include "AccessibleText.hxx" 49 50 //------------------------------------------------------------------------ 51 52 TYPEINIT1( ScHeaderFooterChangedHint, SfxHint ); 53 54 ScHeaderFooterChangedHint::ScHeaderFooterChangedHint(sal_uInt16 nP) : 55 nPart( nP ) 56 { 57 } 58 59 ScHeaderFooterChangedHint::~ScHeaderFooterChangedHint() 60 { 61 } 62 63 //------------------------------------------------------------------------ 64 65 ScSharedHeaderFooterEditSource::ScSharedHeaderFooterEditSource( ScHeaderFooterTextData* pData ) : 66 pTextData( pData ) 67 { 68 // pTextData is held by the ScHeaderFooterTextObj. 69 // Text range and cursor keep a reference to their parent text, so the text object is 70 // always alive and the TextData is valid as long as there are children. 71 } 72 73 ScSharedHeaderFooterEditSource::~ScSharedHeaderFooterEditSource() 74 { 75 } 76 77 SvxEditSource* ScSharedHeaderFooterEditSource::Clone() const 78 { 79 return new ScSharedHeaderFooterEditSource( pTextData ); 80 } 81 82 SvxTextForwarder* ScSharedHeaderFooterEditSource::GetTextForwarder() 83 { 84 return pTextData->GetTextForwarder(); 85 } 86 87 void ScSharedHeaderFooterEditSource::UpdateData() 88 { 89 pTextData->UpdateData(); 90 } 91 92 ScEditEngineDefaulter* ScSharedHeaderFooterEditSource::GetEditEngine() 93 { 94 return pTextData->GetEditEngine(); 95 } 96 97 //------------------------------------------------------------------------ 98 99 // each ScHeaderFooterEditSource object has its own ScHeaderFooterTextData 100 101 ScHeaderFooterEditSource::ScHeaderFooterEditSource( ScHeaderFooterContentObj* pContent, 102 sal_uInt16 nP ) : 103 ScSharedHeaderFooterEditSource( new ScHeaderFooterTextData( *pContent, nP ) ) 104 { 105 } 106 107 ScHeaderFooterEditSource::ScHeaderFooterEditSource( ScHeaderFooterContentObj& rContent, 108 sal_uInt16 nP ) : 109 ScSharedHeaderFooterEditSource( new ScHeaderFooterTextData( rContent, nP ) ) 110 { 111 } 112 113 ScHeaderFooterEditSource::~ScHeaderFooterEditSource() 114 { 115 delete GetTextData(); // not accessed in ScSharedHeaderFooterEditSource dtor 116 } 117 118 SvxEditSource* ScHeaderFooterEditSource::Clone() const 119 { 120 const ScHeaderFooterTextData* pData = GetTextData(); 121 return new ScHeaderFooterEditSource( pData->GetContentObj(), pData->GetPart() ); 122 } 123 124 //------------------------------------------------------------------------ 125 126 ScSharedCellEditSource::ScSharedCellEditSource( ScCellTextData* pData ) : 127 pCellTextData( pData ) 128 { 129 // pCellTextData is part of the ScCellTextObj. 130 // Text range and cursor keep a reference to their parent text, so the text object is 131 // always alive and the CellTextData is valid as long as there are children. 132 } 133 134 ScSharedCellEditSource::~ScSharedCellEditSource() 135 { 136 } 137 138 SvxEditSource* ScSharedCellEditSource::Clone() const 139 { 140 return new ScSharedCellEditSource( pCellTextData ); 141 } 142 143 SvxTextForwarder* ScSharedCellEditSource::GetTextForwarder() 144 { 145 return pCellTextData->GetTextForwarder(); 146 } 147 148 void ScSharedCellEditSource::UpdateData() 149 { 150 pCellTextData->UpdateData(); 151 } 152 153 void ScSharedCellEditSource::SetDoUpdateData(sal_Bool bValue) 154 { 155 pCellTextData->SetDoUpdate(bValue); 156 } 157 158 sal_Bool ScSharedCellEditSource::IsDirty() const 159 { 160 return pCellTextData->IsDirty(); 161 } 162 163 ScEditEngineDefaulter* ScSharedCellEditSource::GetEditEngine() 164 { 165 return pCellTextData->GetEditEngine(); 166 } 167 168 //------------------------------------------------------------------------ 169 170 // each ScCellEditSource object has its own ScCellTextData 171 172 ScCellEditSource::ScCellEditSource( ScDocShell* pDocSh, const ScAddress& rP ) : 173 ScSharedCellEditSource( new ScCellTextData( pDocSh, rP ) ) 174 { 175 } 176 177 ScCellEditSource::~ScCellEditSource() 178 { 179 delete GetCellTextData(); // not accessed in ScSharedCellEditSource dtor 180 } 181 182 SvxEditSource* ScCellEditSource::Clone() const 183 { 184 const ScCellTextData* pData = GetCellTextData(); 185 return new ScCellEditSource( pData->GetDocShell(), pData->GetCellPos() ); 186 } 187 188 //------------------------------------------------------------------------ 189 190 ScAnnotationEditSource::ScAnnotationEditSource(ScDocShell* pDocSh, const ScAddress& rP) : 191 pDocShell( pDocSh ), 192 aCellPos( rP ), 193 pEditEngine( NULL ), 194 pForwarder( NULL ), 195 bDataValid( sal_False ) 196 { 197 if (pDocShell) 198 pDocShell->GetDocument()->AddUnoObject(*this); 199 } 200 201 ScAnnotationEditSource::~ScAnnotationEditSource() 202 { 203 ScUnoGuard aGuard; // needed for EditEngine dtor 204 205 if (pDocShell) 206 pDocShell->GetDocument()->RemoveUnoObject(*this); 207 208 delete pForwarder; 209 delete pEditEngine; 210 } 211 212 SvxEditSource* ScAnnotationEditSource::Clone() const 213 { 214 return new ScAnnotationEditSource( pDocShell, aCellPos ); 215 } 216 217 SdrObject* ScAnnotationEditSource::GetCaptionObj() 218 { 219 ScPostIt* pNote = pDocShell->GetDocument()->GetNote( aCellPos ); 220 return pNote ? pNote->GetOrCreateCaption( aCellPos ) : 0; 221 } 222 223 SvxTextForwarder* ScAnnotationEditSource::GetTextForwarder() 224 { 225 if (!pEditEngine) 226 { 227 // Notizen haben keine Felder 228 if ( pDocShell ) 229 { 230 pEditEngine = new ScNoteEditEngine( pDocShell->GetDocument()->GetNoteEngine() ); 231 } 232 else 233 { 234 SfxItemPool* pEnginePool = EditEngine::CreatePool(); 235 pEnginePool->FreezeIdRanges(); 236 pEditEngine = new ScEditEngineDefaulter( pEnginePool, sal_True ); 237 } 238 pForwarder = new SvxEditEngineForwarder(*pEditEngine); 239 } 240 241 if (bDataValid) 242 return pForwarder; 243 244 if ( pDocShell ) 245 if ( ScPostIt* pNote = pDocShell->GetDocument()->GetNote( aCellPos ) ) 246 if ( const EditTextObject* pEditObj = pNote->GetEditTextObject() ) 247 pEditEngine->SetText( *pEditObj ); // incl. Umbrueche 248 249 bDataValid = sal_True; 250 return pForwarder; 251 } 252 253 void ScAnnotationEditSource::UpdateData() 254 { 255 if ( pDocShell && pEditEngine ) 256 { 257 ScDocShellModificator aModificator( *pDocShell ); 258 259 if( SdrObject* pObj = GetCaptionObj() ) 260 { 261 EditTextObject* pEditObj = pEditEngine->CreateTextObject(); 262 OutlinerParaObject* pOPO = new OutlinerParaObject( *pEditObj ); 263 delete pEditObj; 264 pOPO->SetOutlinerMode( OUTLINERMODE_TEXTOBJECT ); 265 pObj->NbcSetOutlinerParaObject( pOPO ); 266 pObj->ActionChanged(); 267 } 268 269 //! Undo !!! 270 271 aModificator.SetDocumentModified(); 272 273 // bDataValid wird bei SetDocumentModified zurueckgesetzt 274 } 275 } 276 277 void ScAnnotationEditSource::Notify( SfxBroadcaster&, const SfxHint& rHint ) 278 { 279 if ( rHint.ISA( ScUpdateRefHint ) ) 280 { 281 // const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint; 282 283 //! Ref-Update 284 } 285 else if ( rHint.ISA( SfxSimpleHint ) ) 286 { 287 sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); 288 if ( nId == SFX_HINT_DYING ) 289 { 290 pDocShell = NULL; // ungueltig geworden 291 292 DELETEZ( pForwarder ); 293 DELETEZ( pEditEngine ); // EditEngine uses document's pool 294 } 295 else if ( nId == SFX_HINT_DATACHANGED ) 296 bDataValid = sal_False; // Text muss neu geholt werden 297 } 298 } 299 300 //------------------------------------------------------------------------ 301 302 ScSimpleEditSource::ScSimpleEditSource( SvxTextForwarder* pForw ) : 303 pForwarder( pForw ) 304 { 305 // The same forwarder (and EditEngine) is shared by all children of the same Text object. 306 // Text range and cursor keep a reference to their parent text, so the text object is 307 // always alive and the forwarder is valid as long as there are children. 308 } 309 310 ScSimpleEditSource::~ScSimpleEditSource() 311 { 312 } 313 314 SvxEditSource* ScSimpleEditSource::Clone() const 315 { 316 return new ScSimpleEditSource( pForwarder ); 317 } 318 319 SvxTextForwarder* ScSimpleEditSource::GetTextForwarder() 320 { 321 return pForwarder; 322 } 323 324 void ScSimpleEditSource::UpdateData() 325 { 326 // nothing 327 } 328 329 //------------------------------------------------------------------------ 330 331 ScAccessibilityEditSource::ScAccessibilityEditSource( ::std::auto_ptr < ScAccessibleTextData > pAccessibleCellTextData ) 332 : mpAccessibleTextData(pAccessibleCellTextData) 333 { 334 } 335 336 ScAccessibilityEditSource::~ScAccessibilityEditSource() 337 { 338 } 339 340 SvxEditSource* ScAccessibilityEditSource::Clone() const 341 { 342 return new ScAccessibilityEditSource(::std::auto_ptr < ScAccessibleTextData > (mpAccessibleTextData->Clone())); 343 } 344 345 SvxTextForwarder* ScAccessibilityEditSource::GetTextForwarder() 346 { 347 return mpAccessibleTextData->GetTextForwarder(); 348 } 349 350 SvxViewForwarder* ScAccessibilityEditSource::GetViewForwarder() 351 { 352 return mpAccessibleTextData->GetViewForwarder(); 353 } 354 355 SvxEditViewForwarder* ScAccessibilityEditSource::GetEditViewForwarder( sal_Bool bCreate ) 356 { 357 return mpAccessibleTextData->GetEditViewForwarder(bCreate); 358 } 359 360 void ScAccessibilityEditSource::UpdateData() 361 { 362 mpAccessibleTextData->UpdateData(); 363 } 364 365 SfxBroadcaster& ScAccessibilityEditSource::GetBroadcaster() const 366 { 367 return mpAccessibleTextData->GetBroadcaster(); 368 } 369 370