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_sfx2.hxx" 26 #include <com/sun/star/embed/XStorage.hpp> 27 #include <com/sun/star/embed/XTransactedObject.hpp> 28 #include <com/sun/star/embed/ElementModes.hpp> 29 30 #ifndef _MSGBOX_HXX //autogen 31 #include <vcl/msgbox.hxx> 32 #endif 33 #include <tools/urlobj.hxx> 34 #ifndef GCC 35 #endif 36 37 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX 38 #include <comphelper/processfactory.hxx> 39 #endif 40 #include <unotools/intlwrapper.hxx> 41 42 #include <comphelper/storagehelper.hxx> 43 44 #include <sfx2/app.hxx> 45 #include <sfx2/objsh.hxx> 46 #include <sfx2/docfile.hxx> 47 #include <sfx2/docfac.hxx> 48 #include <sfx2/doctempl.hxx> 49 #include "docvor.hxx" 50 #include "orgmgr.hxx" 51 #include "sfxtypes.hxx" 52 #include "sfx2/sfxresid.hxx" 53 #include "view.hrc" 54 #include <sfx2/docfilt.hxx> 55 #include "fltfnc.hxx" 56 57 using namespace ::com::sun::star; 58 59 //========================================================================= 60 61 /* [Beschreibung] 62 63 Implementierungsklasse; einzelner Eintrag in der Dateiansicht 64 65 */ 66 67 struct _FileListEntry 68 { 69 String aFileName; // Dateiname mit komplettem Pfad 70 String aBaseName; // Dateiname 71 const CollatorWrapper* pCollator; 72 SfxObjectShellLock aDocShell; // ObjectShell als Ref-Klasse 73 74 //REMOVE SvStorageRef aStor; // Referenz auf Storage, wenn wir diesen geoeffnet haben 75 //uno::Reference< embed::XStorage > xStorage; 76 77 sal_Bool bFile; // als Datei auf Platte 78 // (!= unbenannt1, nicht als Dok. geladen; 79 // diese werden nicht gespeichert!) 80 sal_Bool bOwner; // selbst erzeugt 81 sal_Bool bNoName; 82 sal_Bool bOwnFormat; 83 84 _FileListEntry( const String& rFileName, 85 const CollatorWrapper* pColl, const String* pTitle = NULL ); 86 ~_FileListEntry(); 87 88 int operator==( const _FileListEntry &rCmp) const; 89 int operator< ( const _FileListEntry &rCmp) const; 90 sal_Bool DeleteObjectShell(); 91 }; 92 93 //------------------------------------------------------------------------- 94 95 inline int _FileListEntry::operator==(const _FileListEntry &rCmp) const 96 { 97 DBG_ASSERT( pCollator, "invalid CollatorWrapper" ); 98 return COMPARE_EQUAL == pCollator->compareString(aBaseName, rCmp.aBaseName); 99 } 100 101 //------------------------------------------------------------------------- 102 103 inline int _FileListEntry::operator< (const _FileListEntry &rCmp) const 104 { 105 DBG_ASSERT( pCollator, "invalid CollatorWrapper" ); 106 return COMPARE_LESS == pCollator->compareString(aBaseName, rCmp.aBaseName); 107 } 108 109 //------------------------------------------------------------------------- 110 111 _FileListEntry::_FileListEntry( const String& rFileName, 112 const CollatorWrapper* pColl, const String* pTitle ) : 113 114 aFileName ( rFileName ), 115 pCollator ( pColl ), 116 bFile ( sal_False ), 117 bOwner ( sal_False ), 118 bNoName ( sal_True ), 119 bOwnFormat ( sal_True ) 120 { 121 if ( pTitle ) 122 aBaseName = *pTitle; 123 else 124 { 125 INetURLObject aObj( rFileName, INET_PROT_FILE ); 126 aBaseName = aObj.getName( INetURLObject::LAST_SEGMENT, true, 127 INetURLObject::DECODE_WITH_CHARSET ); 128 } 129 } 130 131 //------------------------------------------------------------------------- 132 133 _FileListEntry::~_FileListEntry() 134 { 135 DeleteObjectShell(); 136 } 137 138 //------------------------------------------------------------------------- 139 140 SV_IMPL_OP_PTRARR_SORT(_SfxObjectList, _FileListEntry*) 141 142 //========================================================================= 143 144 sal_Bool _FileListEntry::DeleteObjectShell() 145 146 /* [Beschreibung] 147 148 Freigabe der DokumentShell 149 150 [Returnwert] sal_True: alles Ok 151 sal_False: es ist ein Fehler aufgetreten (das 152 Dokument konnte nicht gesichert werden) 153 154 */ 155 156 { 157 sal_Bool bRet = sal_True; 158 //Falls wir die Shell angelegt haben und sie veraendert wurde 159 if(bOwner && aDocShell.Is() && aDocShell->IsModified()) 160 { 161 //Mussten wir konvertieren? 162 if( bOwnFormat ) 163 { 164 if(!aDocShell->Save() ) 165 bRet = sal_False; 166 else 167 { 168 try { 169 uno::Reference< embed::XTransactedObject > xTransact( aDocShell->GetStorage(), uno::UNO_QUERY ); 170 OSL_ENSURE( xTransact.is(), "Storage must implement XTransactedObject!\n" ); 171 if ( !xTransact.is() ) 172 throw uno::RuntimeException(); 173 174 xTransact->commit(); 175 } 176 catch( uno::Exception& ) 177 { 178 } 179 180 // aDocShell->SfxObjectShell::DoSaveCompleted(); 181 } 182 } 183 else 184 { 185 // Falls konvertiert im eigenen Format speichern 186 INetURLObject aObj( aFileName ); 187 String aTitle = aObj.getName( INetURLObject::LAST_SEGMENT, true, 188 INetURLObject::DECODE_WITH_CHARSET ); 189 bRet = aDocShell->PreDoSaveAs_Impl( 190 aTitle, aDocShell->GetFactory().GetFilterContainer()->GetAnyFilter( SFX_FILTER_IMPORT | SFX_FILTER_EXPORT )->GetFilterName(), 0 ); 191 } 192 } 193 194 if( bOwner) 195 { 196 aDocShell.Clear(); 197 } 198 199 return bRet; 200 } 201 202 //------------------------------------------------------------------------- 203 204 SfxObjectList::SfxObjectList() 205 { 206 } 207 208 //------------------------------------------------------------------------- 209 210 SfxObjectList::~SfxObjectList() 211 { 212 DeleteAndDestroy(0, Count()); 213 } 214 215 //------------------------------------------------------------------------- 216 217 const String &SfxObjectList::GetBaseName(sal_uInt16 i) const 218 { 219 return (*this)[i]->aBaseName; 220 } 221 222 //------------------------------------------------------------------------- 223 224 const String& SfxObjectList::GetFileName( sal_uInt16 i ) const 225 { 226 return (*this)[i]->aFileName; 227 } 228 229 //------------------------------------------------------------------------- 230 231 SfxOrganizeMgr::SfxOrganizeMgr( SfxOrganizeListBox_Impl *pLeft, 232 SfxOrganizeListBox_Impl *pRight, 233 SfxDocumentTemplates *pTempl) : 234 pImpl(new SfxOrganizeMgr_Impl), 235 pTemplates(pTempl? pTempl: new SfxDocumentTemplates), 236 pLeftBox(pLeft), 237 pRightBox(pRight), 238 bDeleteTemplates(pTempl == 0), 239 bModified(0) 240 241 /* [Beschreibung] 242 243 Konstruktor 244 245 Das aktuelle Dokument wird in die Liste der Dokumente 246 aufgenommen. 247 248 */ 249 { 250 pImpl->pDocList = new SfxObjectList; 251 pImpl->pIntlWrapper = new IntlWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() ); 252 const CollatorWrapper* pCollator = pImpl->pIntlWrapper->getCaseCollator(); 253 for ( SfxObjectShell* pTmp = SfxObjectShell::GetFirst(); pTmp; pTmp = SfxObjectShell::GetNext(*pTmp) ) 254 { 255 if ( pTmp->GetCreateMode() != SFX_CREATE_MODE_STANDARD || 256 !( pTmp->GetFlags() & SFXOBJECTSHELL_HASOPENDOC ) || !pTmp->GetStyleSheetPool() ) 257 continue; 258 _FileListEntry* pNewEntry = NULL; 259 String aTitle = pTmp->GetTitle( SFX_TITLE_TITLE ); 260 pNewEntry = new _FileListEntry( pTmp->GetMedium()->GetName(), pCollator, &aTitle ); 261 pNewEntry->aDocShell = pTmp; 262 pImpl->pDocList->C40_PTR_INSERT( _FileListEntry, pNewEntry ); 263 } 264 } 265 266 //------------------------------------------------------------------------- 267 268 SfxOrganizeMgr::~SfxOrganizeMgr() 269 { 270 if ( bDeleteTemplates ) 271 delete pTemplates; 272 delete pImpl->pDocList; 273 delete pImpl->pIntlWrapper; 274 delete pImpl; 275 pLeftBox = pRightBox = NULL; 276 } 277 278 //------------------------------------------------------------------------- 279 280 SfxObjectShellRef SfxOrganizeMgr::CreateObjectShell( sal_uInt16 nIdx ) 281 282 /* [Beschreibung] 283 284 Zugriff auf die DokumentShell an der Position nIdx 285 286 [Returnwert] Referenz auf die DokumentShell 287 288 */ 289 290 { 291 _FileListEntry* pEntry = (*pImpl->pDocList)[nIdx]; 292 // andernfalls Doc-Shell anlegen 293 if ( !pEntry->aDocShell.Is() ) 294 { 295 //(mba)/task SfxWaitCursor aWaitCursor; 296 INetURLObject aFileObj( pEntry->aFileName ); 297 sal_Bool bDum = sal_False; 298 SfxApplication* pSfxApp = SFX_APP(); 299 String aFilePath = aFileObj.GetMainURL( INetURLObject::NO_DECODE ); 300 pEntry->aDocShell = pSfxApp->DocAlreadyLoaded( aFilePath, sal_False, bDum ); 301 if ( !pEntry->aDocShell.Is() ) 302 { 303 pEntry->bOwner = sal_True; 304 SfxMedium* pMed = new SfxMedium( 305 aFilePath, ( STREAM_READ | STREAM_SHARE_DENYWRITE ), sal_False, 0 ); 306 const SfxFilter* pFilter = NULL; 307 pMed->UseInteractionHandler(sal_True); 308 if ( 309 pSfxApp->GetFilterMatcher().GuessFilter(*pMed, &pFilter, SFX_FILTER_TEMPLATE, 0) || 310 (pFilter && !pFilter->IsOwnFormat()) || 311 (pFilter && !pFilter->UsesStorage()) 312 ) 313 { 314 pSfxApp->LoadTemplate( pEntry->aDocShell, aFilePath ); 315 pEntry->bOwnFormat = sal_False; 316 delete pMed; 317 if ( pEntry->aDocShell.Is() ) 318 return (SfxObjectShellRef)(SfxObjectShell*)(pEntry->aDocShell); 319 } 320 else 321 { 322 if ( pFilter ) 323 { 324 pEntry->bOwnFormat = sal_True; 325 pEntry->aDocShell = SfxObjectShell::CreateObject( pFilter->GetServiceName(), SFX_CREATE_MODE_ORGANIZER ); 326 if ( pEntry->aDocShell.Is() ) 327 { 328 pEntry->aDocShell->DoInitNew(0); 329 pEntry->aDocShell->LoadFrom( *pMed ); 330 // Medium is now owned by DocShell 331 pEntry->aDocShell->DoSaveCompleted( pMed ); 332 } 333 } 334 } 335 } 336 } 337 return ( SfxObjectShellRef )(SfxObjectShell*)(pEntry->aDocShell); 338 } 339 340 //------------------------------------------------------------------------- 341 342 sal_Bool SfxOrganizeMgr::DeleteObjectShell(sal_uInt16 nIdx) 343 344 /* [Beschreibung] 345 346 Freigabe der DokumentShell an der Position nIdx 347 348 [Returnwert] sal_True: alles Ok 349 sal_False: es ist ein Fehler aufgetreten (das 350 Dokument konnte nicht gesichert werden) 351 352 */ 353 { 354 return (*pImpl->pDocList)[nIdx]->DeleteObjectShell(); 355 } 356 357 //------------------------------------------------------------------------- 358 359 SfxObjectShellRef SfxOrganizeMgr::CreateObjectShell(sal_uInt16 nRegion, 360 sal_uInt16 nIdx) 361 /* [Beschreibung] 362 363 Zugriff auf die DokumentShell an der Position nIdx im Bereich 364 nRegion (Dokumentvorlage) 365 366 [Returnwert] Referenz auf die DokumentShell 367 368 */ 369 { 370 //(mba)/task SfxWaitCursor aWaitCursor; 371 return pTemplates->CreateObjectShell(nRegion, nIdx); 372 } 373 374 //------------------------------------------------------------------------- 375 376 sal_Bool SfxOrganizeMgr::DeleteObjectShell(sal_uInt16 nRegion, sal_uInt16 nIdx) 377 378 /* [Beschreibung] 379 380 Freigabe der DokumentShell an der Position nIdx im Bereich 381 nRegion (Dokumentvorlage) 382 383 [Returnwert] sal_True: alles Ok 384 sal_False: es ist ein Fehler aufgetreten (das 385 Dokument konnte nicht gesichert werden) 386 387 */ 388 389 { 390 return pTemplates->DeleteObjectShell(nRegion, nIdx); 391 } 392 393 //------------------------------------------------------------------------- 394 395 sal_Bool SfxOrganizeMgr::Copy(sal_uInt16 nTargetRegion, 396 sal_uInt16 nTargetIdx, 397 sal_uInt16 nSourceRegion, 398 sal_uInt16 nSourceIdx) 399 400 /* [Beschreibung] 401 402 Kopieren einer Dokumentvorlage 403 404 [Parameter] 405 406 sal_uInt16 nTargetRegion Index des Zielbereiches 407 sal_uInt16 nTargetIdx Index Zielposition 408 sal_uInt16 nSourceRegion Index des Quellbereiches 409 sal_uInt16 nSourceIdx Index der zu kopierenden / z uverschiebenden 410 Dokumentvorlage 411 412 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE) 413 414 415 [Querverweise] 416 417 <SfxDocumentTemplates::Copy(sal_uInt16 nTargetRegion, 418 sal_uInt16 nTargetIdx, 419 sal_uInt16 nSourceRegion, 420 sal_uInt16 nSourceIdx)> 421 422 */ 423 424 { 425 if(nSourceIdx == USHRT_MAX) // keine Verzeichnisse kopieren 426 return sal_False ; 427 const sal_Bool bOk = pTemplates->Copy(nTargetRegion, nTargetIdx, 428 nSourceRegion, nSourceIdx); 429 if(bOk) 430 bModified = 1; 431 return bOk; 432 } 433 434 //------------------------------------------------------------------------- 435 436 sal_Bool SfxOrganizeMgr::Move(sal_uInt16 nTargetRegion, 437 sal_uInt16 nTargetIdx, 438 sal_uInt16 nSourceRegion, 439 sal_uInt16 nSourceIdx) 440 441 /* [Beschreibung] 442 443 Verschieben einer Dokumentvorlage 444 445 [Parameter] 446 447 sal_uInt16 nTargetRegion Index des Zielbereiches 448 sal_uInt16 nTargetIdx Index Zielposition 449 sal_uInt16 nSourceRegion Index des Quellbereiches 450 sal_uInt16 nSourceIdx Index der zu kopierenden / z uverschiebenden 451 Dokumentvorlage 452 453 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE) 454 455 456 [Querverweise] 457 458 <SfxDocumentTemplates::Move(sal_uInt16 nTargetRegion, 459 sal_uInt16 nTargetIdx, 460 sal_uInt16 nSourceRegion, 461 sal_uInt16 nSourceIdx)> 462 463 */ 464 465 { 466 if(nSourceIdx == USHRT_MAX) // keine Verzeichnisse verschieben 467 return sal_False ; 468 const sal_Bool bOk = pTemplates->Move(nTargetRegion, nTargetIdx, 469 nSourceRegion, nSourceIdx); 470 if(bOk) 471 bModified = 1; 472 return bOk; 473 } 474 475 //------------------------------------------------------------------------- 476 477 sal_Bool SfxOrganizeMgr::Delete(SfxOrganizeListBox_Impl *pCaller, 478 sal_uInt16 nRegion, sal_uInt16 nIdx) 479 480 /* [Beschreibung] 481 482 "oschen einer Dokumentvorlage 483 484 [Parameter] 485 486 SfxOrganizeListBox *pCaller rufende ListBox; da dieses 487 Event durch das Men"u oder 488 durch das Keyboard angetriggert wird, 489 mu"s das Model der ListBox anschlie"send 490 aktualisiert werden. 491 sal_uInt16 nRegion Index des Bereiches 492 sal_uInt16 nIdx Index der Dokumentvorlage 493 494 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE) 495 496 497 [Querverweise] 498 499 <SfxDocumentTemplates::Delete(sal_uInt16 nRegion, sal_uInt16 nIdx)> 500 501 */ 502 503 { 504 sal_Bool bOk = sal_False; 505 506 if ( USHRT_MAX == nIdx ) 507 { 508 // deleting of a group 509 510 SvLBoxEntry *pGroupToDelete = pCaller->SvLBox::GetEntry(nRegion); 511 if ( pGroupToDelete ) 512 { 513 sal_uInt16 nItemNum = (sal_uInt16)( pCaller->GetModel()->GetChildCount( pGroupToDelete ) ); 514 sal_uInt16 nToDeleteNum = 0; 515 SvLBoxEntry **pEntriesToDelete = new SvLBoxEntry*[nItemNum]; 516 517 sal_uInt16 nInd = 0; 518 for ( nInd = 0; nInd < nItemNum; nInd++ ) 519 pEntriesToDelete[nInd] = NULL; 520 521 for ( nInd = 0; nInd < nItemNum; nInd++ ) 522 { 523 // TODO/LATER: check that nInd is the same index that is used in pTemplates 524 if ( pTemplates->Delete( nRegion, nInd ) ) 525 { 526 bModified = 1; 527 pEntriesToDelete[nToDeleteNum++] = pCaller->SvLBox::GetEntry( pGroupToDelete, nInd ); 528 } 529 } 530 531 for ( nInd = 0; nInd < nToDeleteNum; nInd++ ) 532 if ( pEntriesToDelete[nInd] ) 533 pCaller->GetModel()->Remove( pEntriesToDelete[nInd] ); 534 535 if ( !pCaller->GetModel()->GetChildCount( pGroupToDelete ) ) 536 { 537 bOk = pTemplates->Delete( nRegion, nIdx ); 538 if ( bOk ) 539 pCaller->GetModel()->Remove( pGroupToDelete ); 540 } 541 } 542 } 543 else 544 { 545 // deleting of a template 546 bOk = pTemplates->Delete(nRegion, nIdx); 547 if(bOk) 548 { 549 bModified = 1; 550 // zu loeschender Eintrag 551 SvLBoxEntry *pEntryToDelete = pCaller->SvLBox::GetEntry(pCaller->SvLBox::GetEntry(nRegion), nIdx); 552 553 pCaller->GetModel()->Remove(pEntryToDelete); 554 } 555 } 556 557 return bOk; 558 } 559 560 //------------------------------------------------------------------------- 561 562 sal_Bool SfxOrganizeMgr::InsertDir 563 ( 564 SfxOrganizeListBox_Impl* pCaller,/* rufende ListBox; da dieses Event 565 durch das Men"u oder durch das 566 Keyboard angetriggert wird, 567 mu\s das Model der ListBox 568 anschlie\send aktualisiert werden */ 569 const String& rText, // logischer Name des Bereiches 570 sal_uInt16 nRegion // Index des Bereiches 571 ) 572 573 /* [Beschreibung] 574 575 Einf"ugen eines Bereiches 576 577 578 [R"uckgabewert] 579 580 Erfolg (sal_True) oder Mi\serfolg (sal_False) 581 582 583 [Querverweise] 584 585 <SfxDocumentTemplates::InsertDir(const String &, sal_uInt16 nRegion)> 586 */ 587 588 { 589 const sal_Bool bOk = pTemplates->InsertDir(rText, nRegion); 590 if(bOk) 591 { 592 bModified = 1; 593 SvLBoxEntry *pEntry = pCaller->InsertEntry(rText, 594 pCaller->GetOpenedBmp(0), 595 pCaller->GetClosedBmp(0), 596 0, sal_True, nRegion); 597 pCaller->Update(); 598 pCaller->EditEntry(pEntry); 599 } 600 return bOk; 601 } 602 603 //------------------------------------------------------------------------- 604 605 sal_Bool SfxOrganizeMgr::SetName(const String &rName, 606 sal_uInt16 nRegion, sal_uInt16 nIdx) 607 608 /* [Beschreibung] 609 610 "Andern eines (logischen) Namens 611 612 [Parameter] 613 614 const String &rName der neue Name 615 sal_uInt16 nRegion Index des Bereiches 616 sal_uInt16 nIdx Index der Dokumentvorlage 617 618 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE) 619 620 621 [Querverweise] 622 623 <SfxDocumentTemplates::SetName(const String &, sal_uInt16 nRegion, sal_uInt16 nIdx)> 624 625 */ 626 627 { 628 const sal_Bool bOk = pTemplates->SetName(rName, nRegion, nIdx); 629 if(bOk) 630 bModified = 1; 631 return bOk; 632 } 633 634 //------------------------------------------------------------------------- 635 636 sal_Bool SfxOrganizeMgr::CopyTo(sal_uInt16 nRegion, sal_uInt16 nIdx, const String &rName) const 637 638 /* [Beschreibung] 639 640 Export einer Vorlage 641 642 [Parameter] 643 644 sal_uInt16 nRegion Index des Bereiches 645 sal_uInt16 nIdx Index der Dokumentvorlage 646 const String &rName Dateiname 647 648 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE) 649 650 651 [Querverweise] 652 653 <SfxDocumentTemplates::CopyTo( sal_uInt16 nRegion, sal_uInt16 nIdx, const String &)> 654 655 */ 656 657 { 658 return pTemplates->CopyTo(nRegion, nIdx, rName); 659 } 660 661 //------------------------------------------------------------------------- 662 663 sal_Bool SfxOrganizeMgr::CopyFrom(SfxOrganizeListBox_Impl *pCaller, 664 sal_uInt16 nRegion, sal_uInt16 nIdx, String &rName) 665 666 /* [Beschreibung] 667 668 Import einer Vorlage 669 670 [Parameter] 671 672 SfxOrganizeListBox *pCaller rufende ListBox; da dieses 673 Event durch das Men"u angetriggert wird, 674 mu"s das Model der ListBox anschlie"send 675 aktualisiert werden. 676 sal_uInt16 nRegion Index des Bereiches 677 sal_uInt16 nIdx Index der Dokumentvorlage 678 String &rName Dateiname 679 680 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE) 681 682 683 [Querverweise] 684 685 <SfxDocumentTemplates::CopyFrom( sal_uInt16 nRegion, sal_uInt16 nIdx, const String &)> 686 687 */ 688 689 { 690 SvLBoxEntry *pParent = pCaller->FirstSelected(); 691 if( nIdx!=USHRT_MAX ) 692 pParent = pCaller->GetParent(pParent); 693 if( pTemplates->CopyFrom( nRegion, nIdx, rName ) ) 694 { 695 // pCaller aktualisieren 696 if( nIdx == USHRT_MAX ) 697 nIdx = 0; 698 else nIdx++; 699 700 pCaller->InsertEntry( rName, 701 pCaller->GetOpenedBmp(1), 702 pCaller->GetClosedBmp(1), 703 pParent, 704 sal_True, 705 nIdx); 706 pCaller->Update(); 707 // pCaller->EditEntry( pEntry ); 708 pCaller->Expand( pParent ); 709 bModified = sal_True; 710 return sal_True; 711 } 712 return sal_False; 713 } 714 715 //------------------------------------------------------------------------- 716 717 sal_Bool SfxOrganizeMgr::InsertFile( SfxOrganizeListBox_Impl* pCaller, const String& rFileName ) 718 719 /* [Beschreibung] 720 721 Eine Datei in der Dateiansicht hinzuf"ugen 722 723 [Parameter] 724 725 SfxOrganizeListBox *pCaller rufende ListBox; da dieses 726 Event durch das Men"u angetriggert wird, 727 mu"s das Model der ListBox anschlie"send 728 aktualisiert werden. 729 const String &rFileName Name der hinzuf"ugenden Datei 730 731 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE) 732 733 */ 734 735 { 736 const CollatorWrapper* pCollator = pImpl->pIntlWrapper->getCaseCollator(); 737 _FileListEntry* pEntry = new _FileListEntry( rFileName, pCollator ); 738 if ( pImpl->pDocList->C40_PTR_INSERT( _FileListEntry, pEntry ) ) 739 { 740 sal_uInt16 nPos = 0; 741 pImpl->pDocList->Seek_Entry( pEntry, &nPos ); 742 pCaller->InsertEntry( pEntry->aBaseName, pCaller->GetOpenedBmp(1), 743 pCaller->GetClosedBmp(1), 0, sal_True, nPos ); 744 return sal_True; 745 } 746 return sal_False; 747 } 748 749 //------------------------------------------------------------------------- 750 751 sal_Bool SfxOrganizeMgr::Rescan() 752 753 /* [Beschreibung] 754 755 Aktualisieren der Datenbasis 756 757 [R"uckgabewert] 758 759 sal_True es bestanden Unterschiede 760 FALSE keine "Anderung 761 762 [Querverweise] 763 764 <SfxDocumentTemplates::Rescan()> 765 */ 766 767 { 768 if(pTemplates->Rescan()) 769 { 770 bModified = sal_True; 771 return sal_True; 772 } 773 return sal_False; 774 } 775 776 //------------------------------------------------------------------------- 777 778 void SfxOrganizeMgr::SaveAll(Window *pParent) 779 780 /* [Beschreibung] 781 782 Schreiben aller ge"anderten Dokumente 783 784 [Parameter] 785 786 Window *pParent Parent der Boxen f"ur Fehlermeldungen 787 788 */ 789 790 { 791 sal_uInt16 nRangeCount = pTemplates->GetRegionCount(); 792 sal_uInt16 i; 793 for(i = 0; i < nRangeCount; ++i) 794 { 795 if( pTemplates->IsRegionLoaded( i )) 796 { 797 const sal_uInt16 nCount = pTemplates->GetCount(i); 798 for(sal_uInt16 j = 0; j < nCount; ++j) 799 { 800 if(!pTemplates->DeleteObjectShell(i, j)) 801 { 802 String aText = String(SfxResId(STR_ERROR_SAVE_TEMPLATE)); 803 aText += pTemplates->GetName(i, j); 804 ErrorBox aBox(pParent, 805 WinBits(WB_OK_CANCEL | WB_DEF_CANCEL), 806 aText); 807 if(RET_CANCEL == aBox.Execute()) 808 break; 809 } 810 } 811 } 812 } 813 nRangeCount = pImpl->pDocList->Count(); 814 for(i = 0; i < nRangeCount; ++i) 815 { 816 _FileListEntry *pEntry = (*pImpl->pDocList)[i]; 817 if(!pEntry->DeleteObjectShell()) 818 { 819 String aText(SfxResId(STR_ERROR_SAVE_TEMPLATE)); 820 aText += pEntry->aBaseName; 821 ErrorBox aBox(pParent, WinBits(WB_OK_CANCEL | WB_DEF_CANCEL), aText); 822 if(RET_CANCEL == aBox.Execute()) 823 break; 824 } 825 } 826 } 827 828 829