xref: /AOO41X/main/sfx2/source/view/orgmgr.cxx (revision 707fc0d4d52eb4f69d89a98ffec6918ca5de6326)
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