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