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_sw.hxx" 26 27 28 #include <sfx2/docfilt.hxx> 29 #include <sot/storage.hxx> 30 #include <tools/urlobj.hxx> 31 #ifndef SVTOOLS_FSTATHELPER_HXX 32 #include <svl/fstathelper.hxx> 33 #endif 34 #include <svl/macitem.hxx> 35 #include <unotools/charclass.hxx> 36 #include <frmfmt.hxx> 37 #include <doc.hxx> 38 #include <docary.hxx> 39 #include <pam.hxx> 40 #include <shellio.hxx> 41 #include <swblocks.hxx> 42 #include <ndtxt.hxx> 43 #include <mdiexp.hxx> // Progress 44 #include <SwXMLTextBlocks.hxx> 45 #ifndef _DOCSH_HXX 46 #include <docsh.hxx> 47 #endif 48 #include <swunohelper.hxx> 49 50 #ifndef _STATSTR_HRC 51 #include <statstr.hrc> 52 #endif 53 #include <swerror.h> 54 55 SV_IMPL_OP_PTRARR_SORT( SwBlockNames, SwBlockName* ); 56 57 ////////////////////////////////////////////////////////////////////////// 58 59 // Hash-Code errechnen (muss nicht eindeutig sein) 60 61 62 sal_uInt16 SwImpBlocks::Hash( const String& r ) 63 { 64 sal_uInt16 n = 0; 65 xub_StrLen nLen = r.Len(); 66 if( nLen > 8 ) 67 nLen = 8; 68 const sal_Unicode* p = r.GetBuffer(); 69 while( nLen-- ) 70 n = ( n << 1 ) + *p++; 71 return n; 72 } 73 74 75 SwBlockName::SwBlockName( const String& rShort, const String& rLong, long n ) 76 : nPos( n ), aShort( rShort ), aLong( rLong ), aPackageName (rShort), 77 bIsOnlyTxtFlagInit( sal_False ), bIsOnlyTxt( sal_False ) 78 { 79 nHashS = SwImpBlocks::Hash( rShort ); 80 nHashL = SwImpBlocks::Hash( rLong ); 81 } 82 SwBlockName::SwBlockName( const String& rShort, const String& rLong, const String& rPackageName) 83 : nPos( 0 ), aShort( rShort ), aLong( rLong ), aPackageName (rPackageName), 84 bIsOnlyTxtFlagInit( sal_False ), bIsOnlyTxt( sal_False ) 85 { 86 nHashS = SwImpBlocks::Hash( rShort ); 87 nHashL = SwImpBlocks::Hash( rLong ); 88 } 89 90 91 // Ist die angegebene Datei ein Storage oder gibt es sie nicht? 92 93 short SwImpBlocks::GetFileType( const String& rFile ) 94 { 95 if( !FStatHelper::IsDocument( rFile ) ) 96 return SWBLK_NO_FILE; 97 if( SwXMLTextBlocks::IsFileUCBStorage( rFile ) ) 98 return SWBLK_XML; 99 if( SvStorage::IsStorageFile( rFile ) ) 100 return SWBLK_SW3; 101 //otherwise return NONE 102 return SWBLK_NONE; 103 } 104 105 106 SwImpBlocks::SwImpBlocks( const String& rFile, sal_Bool ) 107 : aFile( rFile ), pDoc( 0 ), nCur( (sal_uInt16)-1 ), 108 bReadOnly( sal_True ), bInPutMuchBlocks( sal_False ) 109 { 110 FStatHelper::GetModifiedDateTimeOfFile( rFile, 111 &aDateModified, &aTimeModified ); 112 INetURLObject aObj(rFile); 113 aObj.setExtension( aEmptyStr ); 114 aName = aObj.GetBase(); 115 } 116 117 118 SwImpBlocks::~SwImpBlocks() 119 { 120 aNames.DeleteAndDestroy( 0, aNames.Count() ); 121 } 122 123 // Loeschen des Inhaltes des Dokuments 124 void SwImpBlocks::ClearDoc() 125 { 126 pDoc->ClearDoc(); 127 } 128 129 sal_uLong SwImpBlocks::GetDocForConversion( sal_uInt16 n ) 130 { 131 return GetDoc( n ); 132 } 133 134 // Erzeugen eines PaMs, der das ganze Dokument umfasst 135 SwPaM* SwImpBlocks::MakePaM() 136 { 137 SwPaM* pPam = new SwPaM( pDoc->GetNodes().GetEndOfContent() ); 138 pPam->Move( fnMoveBackward, fnGoDoc ); 139 pPam->SetMark(); 140 pPam->Move( fnMoveForward, fnGoDoc ); 141 pPam->Exchange(); 142 return pPam; 143 } 144 145 146 sal_uInt16 SwImpBlocks::GetCount() const 147 { 148 return aNames.Count(); 149 } 150 151 // Case Insensitive 152 sal_uInt16 SwImpBlocks::GetIndex( const String& rShort ) const 153 { 154 String s( GetAppCharClass().upper( rShort ) ); 155 sal_uInt16 nHash = Hash( s ); 156 for( sal_uInt16 i = 0; i < aNames.Count(); i++ ) 157 { 158 SwBlockName* pName = aNames[ i ]; 159 if( pName->nHashS == nHash 160 && pName->aShort == s ) 161 return i; 162 } 163 return (sal_uInt16) -1; 164 } 165 166 167 sal_uInt16 SwImpBlocks::GetLongIndex( const String& rLong ) const 168 { 169 sal_uInt16 nHash = Hash( rLong ); 170 for( sal_uInt16 i = 0; i < aNames.Count(); i++ ) 171 { 172 SwBlockName* pName = aNames[ i ]; 173 if( pName->nHashL == nHash 174 && pName->aLong == rLong ) 175 return i; 176 } 177 return (sal_uInt16) -1; 178 } 179 180 181 const String& SwImpBlocks::GetShortName( sal_uInt16 n ) const 182 { 183 if( n < aNames.Count() ) 184 return aNames[ n ]->aShort; 185 return aEmptyStr; 186 } 187 188 189 const String& SwImpBlocks::GetLongName( sal_uInt16 n ) const 190 { 191 if( n < aNames.Count() ) 192 return aNames[ n ]->aLong; 193 return aEmptyStr; 194 } 195 196 const String& SwImpBlocks::GetPackageName( sal_uInt16 n ) const 197 { 198 if( n < aNames.Count() ) 199 return aNames[ n ]->aPackageName; 200 return aEmptyStr; 201 } 202 203 void SwImpBlocks::AddName( const String& rShort, const String& rLong, 204 sal_Bool bOnlyTxt ) 205 { 206 sal_uInt16 nIdx = GetIndex( rShort ); 207 if( nIdx != (sal_uInt16) -1 ) 208 aNames.DeleteAndDestroy( nIdx ); 209 SwBlockName* pNew = new SwBlockName( rShort, rLong, 0L ); 210 pNew->bIsOnlyTxtFlagInit = sal_True; 211 pNew->bIsOnlyTxt = bOnlyTxt; 212 aNames.C40_PTR_INSERT( SwBlockName, pNew ); 213 } 214 215 216 217 sal_Bool SwImpBlocks::IsFileChanged() const 218 { 219 Date aTempDateModified( aDateModified ); 220 Time aTempTimeModified( aTimeModified ); 221 return FStatHelper::GetModifiedDateTimeOfFile( aFile, 222 &aTempDateModified, &aTempTimeModified ) && 223 ( aDateModified != aTempDateModified || 224 aTimeModified != aTempTimeModified ); 225 } 226 227 228 void SwImpBlocks::Touch() 229 { 230 FStatHelper::GetModifiedDateTimeOfFile( aFile, 231 &aDateModified, &aTimeModified ); 232 } 233 234 sal_Bool SwImpBlocks::IsOnlyTextBlock( const String& ) const 235 { 236 return sal_False; 237 } 238 239 sal_uLong SwImpBlocks::GetMacroTable( sal_uInt16, SvxMacroTableDtor&, sal_Bool ) 240 { 241 return 0; 242 } 243 244 sal_uLong SwImpBlocks::SetMacroTable( sal_uInt16 , 245 const SvxMacroTableDtor& , sal_Bool ) 246 { 247 return 0; 248 } 249 250 sal_Bool SwImpBlocks::PutMuchEntries( sal_Bool ) 251 { 252 return sal_False; 253 } 254 255 //////////////////////////////////////////////////////////////////////////// 256 257 258 SwTextBlocks::SwTextBlocks( const String& rFile ) 259 : pImp( 0 ), nErr( 0 ) 260 { 261 INetURLObject aObj(rFile); 262 String sFileName = aObj.GetMainURL( INetURLObject::NO_DECODE ); 263 switch( SwImpBlocks::GetFileType( rFile ) ) 264 { 265 //case SWBLK_SW2: pImp = new Sw2TextBlocks( sFileName ); break; 266 //case SWBLK_SW3: pImp = new Sw3TextBlocks( sFileName ); break; 267 case SWBLK_XML: pImp = new SwXMLTextBlocks( sFileName ); break; 268 case SWBLK_NO_FILE: pImp = new SwXMLTextBlocks( sFileName ); break; 269 } 270 if( !pImp ) 271 nErr = ERR_SWG_FILE_FORMAT_ERROR; 272 } 273 274 SwTextBlocks::~SwTextBlocks() 275 { 276 delete pImp; 277 } 278 279 const String& SwTextBlocks::GetName() 280 { 281 return pImp ? pImp->aName : aEmptyStr; 282 } 283 284 285 void SwTextBlocks::SetName( const String& r ) 286 { 287 if( pImp ) 288 pImp->SetName( r ); 289 } 290 291 292 sal_Bool SwTextBlocks::IsOld() const 293 { 294 if (pImp) 295 { 296 short nType = pImp->GetFileType(); 297 if (SWBLK_SW3 == nType || SWBLK_SW2 == nType ) 298 return sal_True; 299 } 300 return sal_False; 301 } 302 303 304 /* 305 sal_uLong SwTextBlocks::ConvertToNew() 306 { 307 // Wir nehmen die aktuelle Datei, benennen diese in .BAK um 308 // und kreieren den neuen Storage 309 if( IsOld() ) 310 { 311 // Erst mal muessen wir die Datei freigeben 312 short nType = pImp->GetFileType(); 313 Sw2TextBlocks *pTwo = NULL; 314 Sw3TextBlocks *pThree = NULL; 315 SwImpBlocks *pOld = NULL; 316 317 pImp->nCur = (sal_uInt16) -1; 318 String aName( pImp->aFile ); 319 delete pImp; pImp = NULL; 320 // Jetzt wird umbenannt 321 INetURLObject aOldFull( aName ); 322 INetURLObject aNewFull( aName ); 323 324 aOldFull.SetExtension( String::CreateFromAscii("bak") ); 325 String aOld( aOldFull.GetMainURL( INetURLObject::NO_DECODE ) ); 326 String aNew( aNewFull.GetMainURL( INetURLObject::NO_DECODE ) ); 327 328 sal_Bool bError = !SWUnoHelper::UCB_CopyFile( aNew, aOld, sal_True ); 329 if( bError ) 330 { 331 if (nType == SWBLK_SW2) 332 pImp = new Sw2TextBlocks( aOld ); 333 else 334 pImp = new Sw3TextBlocks( aOld ); 335 return nErr = ERR_SWG_CANNOT_WRITE; 336 } 337 338 // Die Datei ist erfolgreich umbenannt. Jetzt wird der Storage 339 // aufgesetzt 340 if (nType == SWBLK_SW2) 341 pOld = pTwo = new Sw2TextBlocks( aOld ); 342 else 343 pOld = pThree = new Sw3TextBlocks( aOld ); 344 SwXMLTextBlocks* pNew = new SwXMLTextBlocks( aName ); 345 pNew->SetName ( pOld->GetName()); 346 // Wir kopieren den Doc-Ptr in das alte System 347 // den alten SvPersist heben wir uns aber auf, 348 // da dieser die ganze Zeit leben bleibt 349 // und lesen die Dateivorlagen erneut ein 350 SvPersist* pPersist2 = pOld->pDoc->GetPersist(); 351 if (SWBLK_SW2 == nType ) 352 { 353 delete pOld->pDoc; 354 pOld->pDoc = pNew->pDoc;nLinkCt 355 nErr = pTwo->LoadDoc(); 356 } 357 else 358 { 359 nErr = pThree->OpenFile ( sal_True ); 360 // Within this call, Sw3IoImp::SetDoc calls RemoveLink 361 // on the old document, and deletes it if the 362 // ref count is now zero 363 pThree->SetDoc ( pNew->pDoc ); 364 pOld->pDoc->AddLink(); 365 } 366 if( !nErr && 0 == ( nErr = pNew->OpenFile( sal_False )) ) 367 { 368 nErr = pNew->SetConvertMode( sal_True ); 369 // jetzt werden die Bausteine einfach umkopiert! 370 if( !nErr ) 371 { 372 if (SWBLK_SW2 == nType) 373 pTwo->StatLineStartPercent(); 374 sal_uInt16 nCount = pOld->GetCount(); 375 for( sal_uInt16 i = 0; i < nCount; i++ ) 376 { 377 pNew->ClearDoc(); 378 String aShort( pOld->GetShortName( i ) ); 379 String aLong( pOld->GetLongName( i ) ); 380 pNew->AddName( aShort, aLong ); 381 if ( SWBLK_SW3 == nType && pThree->IsOnlyTextBlock(aShort) ) 382 { 383 String sText; 384 pThree->GetText( aShort, sText ); 385 pNew->PutText( aShort, aLong, sText ); 386 } 387 else 388 { 389 if (SWBLK_SW2 == nType ) 390 { 391 // I think this is how it should work (!!!!!!) mtg 392 pNew->pDoc->SetPersist( pPersist2 ); 393 } 394 nErr = pOld->GetDocForConversion( i ); 395 if( nErr ) 396 break; 397 nErr = pNew->BeginPutDoc( aShort, aLong ); 398 if( nErr ) 399 break; 400 nErr = pNew->PutDoc(); 401 if( nErr ) 402 break; 403 } 404 405 // convert macros, too 406 SvxMacroTableDtor aMacroTable; 407 pOld->GetMacroTable( i, aMacroTable, sal_True ); 408 pNew->SetMacroTable( i, aMacroTable, sal_True ); 409 410 if (SWBLK_SW2 == nType ) 411 pNew->pDoc->SetPersist( 0 ); 412 } 413 if (SWBLK_SW2 == nType ) 414 ::EndProgress( pOld->pDoc->GetDocShell() ); 415 } 416 if( !nErr ) 417 nErr = pNew->SetConvertMode( sal_False ); 418 } 419 if ( SWBLK_SW3 == nType ) 420 { 421 pThree->CloseFile(); 422 } 423 else 424 { 425 // Haben wir es geschafft? 426 pOld->pDoc = NULL; 427 } 428 pNew->ClearDoc(); 429 if( !nErr ) 430 { 431 delete pOld; 432 pImp = pNew; 433 SWUnoHelper::UCB_DeleteFile( aOld ); 434 pNew->MakeBlockList(); 435 } 436 else 437 { 438 delete pOld; delete pNew; 439 SWUnoHelper::UCB_DeleteFile( aNew ); 440 SWUnoHelper::UCB_CopyFile( aOld, aNew, sal_True ); 441 if ( SWBLK_SW2 == nType ) 442 pImp = new Sw2TextBlocks( aOld ); 443 else 444 pImp = new Sw3TextBlocks( aOld ); 445 } 446 pNew->CloseFile(); 447 FStatHelper::GetModifiedDateTimeOfFile( aNew, 448 &pImp->aDateModified, &pImp->aTimeModified ); 449 } 450 return nErr; 451 } */ 452 453 454 sal_uInt16 SwTextBlocks::GetCount() const 455 { 456 return pImp ? pImp->GetCount() : 0; 457 } 458 459 460 sal_uInt16 SwTextBlocks::GetIndex( const String& r ) const 461 { 462 return pImp ? pImp->GetIndex( r ) : (sal_uInt16) -1; 463 } 464 465 466 sal_uInt16 SwTextBlocks::GetLongIndex( const String& r ) const 467 { 468 return pImp ? (sal_uInt16)(pImp->GetLongIndex( r )) : (sal_uInt16) -1; 469 } 470 471 472 const String& SwTextBlocks::GetShortName( sal_uInt16 n ) const 473 { 474 if( pImp ) 475 return pImp->GetShortName( n ); 476 return aEmptyStr; 477 } 478 479 480 const String& SwTextBlocks::GetLongName( sal_uInt16 n ) const 481 { 482 if( pImp ) 483 return pImp->GetLongName( n ); 484 return aEmptyStr; 485 } 486 487 488 sal_Bool SwTextBlocks::Delete( sal_uInt16 n ) 489 { 490 if( pImp && !pImp->bInPutMuchBlocks ) 491 { 492 if( pImp->IsFileChanged() ) 493 nErr = ERR_TXTBLOCK_NEWFILE_ERROR; 494 else if( 0 == (nErr = pImp->OpenFile( sal_False ) )) 495 { 496 nErr = pImp->Delete( n ); 497 if( !nErr ) 498 pImp->aNames.DeleteAndDestroy( n ); 499 if( n == pImp->nCur ) 500 pImp->nCur = (sal_uInt16) -1; 501 if( !nErr ) 502 nErr = pImp->MakeBlockList(); 503 } 504 pImp->CloseFile(); 505 pImp->Touch(); 506 507 return sal_Bool( nErr == 0 ); 508 } 509 return sal_False; 510 } 511 512 513 sal_uInt16 SwTextBlocks::Rename( sal_uInt16 n, const String* s, const String* l ) 514 { 515 sal_uInt16 nIdx = (sal_uInt16)-1; 516 if( pImp && !pImp->bInPutMuchBlocks ) 517 { 518 pImp->nCur = nIdx; 519 String aNew, aLong; 520 if( s ) 521 aNew = aLong = *s; 522 if( l ) 523 aLong = *l; 524 if( !aNew.Len() ) 525 { 526 ASSERT( !this, "Kein Kurzname in Rename angegeben" ); 527 nErr = ERR_SWG_INTERNAL_ERROR; return (sal_uInt16) -1; 528 } 529 530 if( pImp->IsFileChanged() ) 531 nErr = ERR_TXTBLOCK_NEWFILE_ERROR; 532 else if( 0 == ( nErr = pImp->OpenFile( sal_False ))) 533 { 534 // Vorher den neuen Eintrag in die Liste setzen! 535 GetAppCharClass().toUpper( aNew ); 536 nErr = pImp->Rename( n, aNew, aLong ); 537 if( !nErr ) 538 { 539 sal_Bool bOnlyTxt = pImp->aNames[ n ]->bIsOnlyTxt; 540 pImp->aNames.DeleteAndDestroy( n ); 541 pImp->AddName( aNew, aLong, bOnlyTxt ); 542 nErr = pImp->MakeBlockList(); 543 } 544 } 545 pImp->CloseFile(); 546 pImp->Touch(); 547 if( !nErr ) 548 nIdx = pImp->GetIndex( aNew ); 549 } 550 return nIdx; 551 } 552 553 sal_uLong SwTextBlocks::CopyBlock( SwTextBlocks& rSource, String& rSrcShort, 554 const String& rLong ) 555 { 556 sal_Bool bIsOld = sal_False; 557 if (rSource.pImp) 558 { 559 short nType = rSource.pImp->GetFileType(); 560 if (SWBLK_SW2 == nType || SWBLK_SW3 == nType ) 561 bIsOld = sal_True; 562 } 563 if( bIsOld ) //rSource.IsOld() ) 564 nErr = ERR_SWG_OLD_GLOSSARY; 565 else if( pImp->bInPutMuchBlocks ) 566 nErr = ERR_SWG_INTERNAL_ERROR; 567 else 568 nErr = pImp->CopyBlock(*rSource.pImp, rSrcShort, rLong); 569 return nErr; 570 } 571 572 sal_Bool SwTextBlocks::BeginGetDoc( sal_uInt16 n ) 573 { 574 if( pImp && !pImp->bInPutMuchBlocks ) 575 { 576 // diese Optimierierung darf es nicht mehr geben. OLE-Objecte muessen auf 577 // ihre SubStorages zugreifem koennen! 578 // if( n == pImp->nCur ) 579 // return sal_True; 580 581 if( pImp->IsFileChanged() ) 582 nErr = ERR_TXTBLOCK_NEWFILE_ERROR; 583 else if( 0 == ( nErr = pImp->OpenFile( sal_True ))) 584 { 585 pImp->ClearDoc(); 586 nErr = pImp->GetDoc( n ); 587 if( nErr ) 588 pImp->nCur = (sal_uInt16)-1; 589 else 590 pImp->nCur = n; 591 } 592 return sal_Bool( nErr == 0 ); 593 } 594 return sal_False; 595 } 596 597 598 void SwTextBlocks::EndGetDoc() 599 { 600 if( pImp && !pImp->bInPutMuchBlocks ) 601 pImp->CloseFile(); 602 } 603 604 605 sal_Bool SwTextBlocks::BeginPutDoc( const String& s, const String& l ) 606 { 607 if( pImp ) 608 { 609 sal_Bool bOk = pImp->bInPutMuchBlocks; 610 if( !bOk ) 611 { 612 if( pImp->IsFileChanged() ) 613 nErr = ERR_TXTBLOCK_NEWFILE_ERROR; 614 else 615 nErr = pImp->OpenFile( sal_False ); 616 bOk = 0 == nErr; 617 } 618 if( bOk ) 619 { 620 String aNew( s ); 621 GetAppCharClass().toUpper( aNew ); 622 nErr = pImp->BeginPutDoc( aNew, l ); 623 } 624 if( nErr ) 625 pImp->CloseFile(); 626 } 627 return 0 == nErr; 628 } 629 630 631 sal_uInt16 SwTextBlocks::PutDoc() 632 { 633 sal_uInt16 nIdx = (sal_uInt16)-1; 634 if( pImp ) 635 { 636 nErr = pImp->PutDoc(); 637 if( !nErr ) 638 { 639 pImp->nCur = GetIndex( pImp->aShort ); 640 if( pImp->nCur != (sal_uInt16) -1 ) 641 pImp->aNames[ pImp->nCur ]->aLong = pImp->aLong; 642 else 643 { 644 pImp->AddName( pImp->aShort, pImp->aLong ); 645 pImp->nCur = pImp->GetIndex( pImp->aShort ); 646 } 647 if( !pImp->bInPutMuchBlocks ) 648 nErr = pImp->MakeBlockList(); 649 } 650 if( !pImp->bInPutMuchBlocks ) 651 { 652 pImp->CloseFile(); 653 pImp->Touch(); 654 } 655 nIdx = pImp->nCur; 656 } 657 return nIdx; 658 } 659 660 sal_uInt16 SwTextBlocks::PutText( const String& rShort, const String& rName, 661 const String& rTxt ) 662 { 663 sal_uInt16 nIdx = (sal_uInt16) -1; 664 if( pImp ) 665 { 666 sal_Bool bOk = pImp->bInPutMuchBlocks; 667 if( !bOk ) 668 { 669 if( pImp->IsFileChanged() ) 670 nErr = ERR_TXTBLOCK_NEWFILE_ERROR; 671 else 672 nErr = pImp->OpenFile( sal_False ); 673 bOk = 0 == nErr; 674 } 675 if( bOk ) 676 { 677 String aNew( rShort ); 678 GetAppCharClass().toUpper( aNew ); 679 nErr = pImp->PutText( aNew, rName, rTxt ); 680 pImp->nCur = (sal_uInt16) -1; 681 if( !nErr ) 682 { 683 nIdx = GetIndex( pImp->aShort ); 684 if( nIdx != (sal_uInt16) -1 ) 685 pImp->aNames[ nIdx ]->aLong = rName; 686 else 687 { 688 pImp->AddName( pImp->aShort, rName, sal_True ); 689 nIdx = pImp->GetIndex( pImp->aShort ); 690 } 691 if( !pImp->bInPutMuchBlocks ) 692 nErr = pImp->MakeBlockList(); 693 } 694 } 695 if( !pImp->bInPutMuchBlocks ) 696 { 697 pImp->CloseFile(); 698 pImp->Touch(); 699 } 700 } 701 return nIdx; 702 } 703 704 705 SwDoc* SwTextBlocks::GetDoc() 706 { 707 if( pImp ) 708 return pImp->pDoc; 709 return 0; 710 } 711 712 713 void SwTextBlocks::ClearDoc() 714 { 715 if( pImp ) 716 pImp->ClearDoc(); 717 pImp->nCur = (sal_uInt16) -1; 718 } 719 720 721 const String& SwTextBlocks::GetFileName() const 722 { 723 return pImp->GetFileName(); 724 } 725 726 727 sal_Bool SwTextBlocks::IsReadOnly() const 728 { 729 return pImp->bReadOnly; 730 } 731 732 sal_Bool SwTextBlocks::IsOnlyTextBlock( sal_uInt16 nIdx ) const 733 { 734 sal_Bool bRet = sal_False; 735 if( pImp && !pImp->bInPutMuchBlocks ) 736 { 737 SwBlockName* pBlkNm = pImp->aNames[ nIdx ]; 738 if( !pBlkNm->bIsOnlyTxtFlagInit && 739 !pImp->IsFileChanged() && !pImp->OpenFile( sal_True ) ) 740 { 741 pBlkNm->bIsOnlyTxt = pImp->IsOnlyTextBlock( pBlkNm->aShort ); 742 pBlkNm->bIsOnlyTxtFlagInit = sal_True; 743 pImp->CloseFile(); 744 } 745 bRet = pBlkNm->bIsOnlyTxt; 746 } 747 return bRet; 748 } 749 750 sal_Bool SwTextBlocks::IsOnlyTextBlock( const String& rShort ) const 751 { 752 sal_uInt16 nIdx = pImp->GetIndex( rShort ); 753 if( USHRT_MAX != nIdx ) 754 { 755 if( pImp->aNames[ nIdx ]->bIsOnlyTxtFlagInit ) 756 return pImp->aNames[ nIdx ]->bIsOnlyTxt; 757 return IsOnlyTextBlock( nIdx ); 758 } 759 760 ASSERT( !this, "ungueltiger Name" ); 761 return sal_False; 762 } 763 764 sal_Bool SwTextBlocks::GetMacroTable( sal_uInt16 nIdx, SvxMacroTableDtor& rMacroTbl ) 765 { 766 sal_Bool bRet = sal_True; 767 if ( pImp && !pImp->bInPutMuchBlocks ) 768 bRet = ( 0 == pImp->GetMacroTable( nIdx, rMacroTbl ) ); 769 return bRet; 770 } 771 772 sal_Bool SwTextBlocks::SetMacroTable( sal_uInt16 nIdx, 773 const SvxMacroTableDtor& rMacroTbl ) 774 { 775 sal_Bool bRet = sal_True; 776 if ( pImp && !pImp->bInPutMuchBlocks ) 777 bRet = ( 0 == pImp->SetMacroTable( nIdx, rMacroTbl ) ); 778 return bRet; 779 } 780 781 sal_Bool SwTextBlocks::StartPutMuchBlockEntries() 782 { 783 sal_Bool bRet = sal_False; 784 if( !IsOld() && pImp ) 785 bRet = pImp->PutMuchEntries( sal_True ); 786 return bRet; 787 } 788 789 void SwTextBlocks::EndPutMuchBlockEntries() 790 { 791 if( pImp ) 792 pImp->PutMuchEntries( sal_False ); 793 } 794 795 /*-- 20.09.2004 10:25:33--------------------------------------------------- 796 797 -----------------------------------------------------------------------*/ 798 String SwTextBlocks::GetBaseURL() const 799 { 800 String sRet; 801 if(pImp) 802 sRet = pImp->GetBaseURL(); 803 return sRet; 804 } 805 /*-- 20.09.2004 10:25:33--------------------------------------------------- 806 807 -----------------------------------------------------------------------*/ 808 void SwTextBlocks::SetBaseURL( const String& rURL ) 809 { 810 if(pImp) 811 pImp->SetBaseURL(rURL); 812 } 813 814 815