xref: /aoo41x/main/sfx2/source/view/orgmgr.cxx (revision 0a999d18)
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 
operator ==(const _FileListEntry & rCmp) const95 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 
operator <(const _FileListEntry & rCmp) const103 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 
_FileListEntry(const String & rFileName,const CollatorWrapper * pColl,const String * pTitle)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 
~_FileListEntry()133 _FileListEntry::~_FileListEntry()
134 {
135 	DeleteObjectShell();
136 }
137 
138 //-------------------------------------------------------------------------
139 
SV_IMPL_OP_PTRARR_SORT(_SfxObjectList,_FileListEntry *)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 
SfxObjectList()204 SfxObjectList::SfxObjectList()
205 {
206 }
207 
208 //-------------------------------------------------------------------------
209 
~SfxObjectList()210 SfxObjectList::~SfxObjectList()
211 {
212 	DeleteAndDestroy(0, Count());
213 }
214 
215 //-------------------------------------------------------------------------
216 
GetBaseName(sal_uInt16 i) const217 const String &SfxObjectList::GetBaseName(sal_uInt16 i) const
218 {
219 	return (*this)[i]->aBaseName;
220 }
221 
222 //-------------------------------------------------------------------------
223 
GetFileName(sal_uInt16 i) const224 const String& SfxObjectList::GetFileName( sal_uInt16 i ) const
225 {
226 	return (*this)[i]->aFileName;
227 }
228 
229 //-------------------------------------------------------------------------
230 
SfxOrganizeMgr(SfxOrganizeListBox_Impl * pLeft,SfxOrganizeListBox_Impl * pRight,SfxDocumentTemplates * pTempl)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 
~SfxOrganizeMgr()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 
CreateObjectShell(sal_uInt16 nIdx)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 
DeleteObjectShell(sal_uInt16 nIdx)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 
CreateObjectShell(sal_uInt16 nRegion,sal_uInt16 nIdx)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 
DeleteObjectShell(sal_uInt16 nRegion,sal_uInt16 nIdx)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 
Copy(sal_uInt16 nTargetRegion,sal_uInt16 nTargetIdx,sal_uInt16 nSourceRegion,sal_uInt16 nSourceIdx)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 
Move(sal_uInt16 nTargetRegion,sal_uInt16 nTargetIdx,sal_uInt16 nSourceRegion,sal_uInt16 nSourceIdx)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 
Delete(SfxOrganizeListBox_Impl * pCaller,sal_uInt16 nRegion,sal_uInt16 nIdx)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 			delete[] pEntriesToDelete;
535 
536 			if ( !pCaller->GetModel()->GetChildCount( pGroupToDelete ) )
537             {
538                 bOk = pTemplates->Delete( nRegion, nIdx );
539                 if ( bOk )
540                     pCaller->GetModel()->Remove( pGroupToDelete );
541             }
542 		}
543 	}
544 	else
545 	{
546 		// deleting of a template
547 		bOk = pTemplates->Delete(nRegion, nIdx);
548 		if(bOk)
549 		{
550 			bModified = 1;
551 				// zu loeschender Eintrag
552 			SvLBoxEntry *pEntryToDelete = pCaller->SvLBox::GetEntry(pCaller->SvLBox::GetEntry(nRegion), nIdx);
553 
554 			pCaller->GetModel()->Remove(pEntryToDelete);
555 		}
556 	}
557 
558 	return bOk;
559 }
560 
561 //-------------------------------------------------------------------------
562 
InsertDir(SfxOrganizeListBox_Impl * pCaller,const String & rText,sal_uInt16 nRegion)563 sal_Bool	SfxOrganizeMgr::InsertDir
564 (
565 	SfxOrganizeListBox_Impl*	pCaller,/*	rufende ListBox; da dieses Event
566 											durch das Men"u oder durch das
567 											Keyboard angetriggert wird,
568 											mu\s das Model der ListBox
569 											anschlie\send aktualisiert werden */
570 	const String&				rText,	//	logischer Name des Bereiches
571 	sal_uInt16						nRegion //	Index des Bereiches
572 )
573 
574 /*	[Beschreibung]
575 
576 	Einf"ugen eines Bereiches
577 
578 
579 	[R"uckgabewert]
580 
581 	Erfolg (sal_True) oder Mi\serfolg (sal_False)
582 
583 
584 	[Querverweise]
585 
586 	<SfxDocumentTemplates::InsertDir(const String &, sal_uInt16 nRegion)>
587 */
588 
589 {
590 	const sal_Bool bOk = pTemplates->InsertDir(rText, nRegion);
591 	if(bOk)
592 	{
593 		bModified = 1;
594 		SvLBoxEntry *pEntry = pCaller->InsertEntry(rText,
595 												   pCaller->GetOpenedBmp(0),
596 												   pCaller->GetClosedBmp(0),
597 												   0, sal_True, nRegion);
598 		pCaller->Update();
599 		pCaller->EditEntry(pEntry);
600 	}
601 	return bOk;
602 }
603 
604 //-------------------------------------------------------------------------
605 
SetName(const String & rName,sal_uInt16 nRegion,sal_uInt16 nIdx)606 sal_Bool SfxOrganizeMgr::SetName(const String &rName,
607 							 sal_uInt16 nRegion, sal_uInt16 nIdx)
608 
609 /*  [Beschreibung]
610 
611 	"Andern eines (logischen) Namens
612 
613 	[Parameter]
614 
615 	const String &rName				der neue Name
616 	sal_uInt16 nRegion					Index des Bereiches
617 	sal_uInt16 nIdx						Index der Dokumentvorlage
618 
619 	[R"uckgabewert]					Erfolg (TRUE) oder Mi"serfolg (FALSE)
620 
621 
622 	[Querverweise]
623 
624 	<SfxDocumentTemplates::SetName(const String &, sal_uInt16 nRegion, sal_uInt16 nIdx)>
625 
626 */
627 
628 {
629 	const sal_Bool bOk = pTemplates->SetName(rName, nRegion, nIdx);
630 	if(bOk)
631 		bModified = 1;
632 	return bOk;
633 }
634 
635 //-------------------------------------------------------------------------
636 
CopyTo(sal_uInt16 nRegion,sal_uInt16 nIdx,const String & rName) const637 sal_Bool SfxOrganizeMgr::CopyTo(sal_uInt16 nRegion, sal_uInt16 nIdx, const String &rName) const
638 
639 /*  [Beschreibung]
640 
641 	Export einer Vorlage
642 
643 	[Parameter]
644 
645 	sal_uInt16 nRegion					Index des Bereiches
646 	sal_uInt16 nIdx						Index der Dokumentvorlage
647 	const String &rName				Dateiname
648 
649 	[R"uckgabewert]					Erfolg (TRUE) oder Mi"serfolg (FALSE)
650 
651 
652 	[Querverweise]
653 
654 	<SfxDocumentTemplates::CopyTo( sal_uInt16 nRegion, sal_uInt16 nIdx, const String &)>
655 
656 */
657 
658 {
659 	return pTemplates->CopyTo(nRegion, nIdx, rName);
660 }
661 
662 //-------------------------------------------------------------------------
663 
CopyFrom(SfxOrganizeListBox_Impl * pCaller,sal_uInt16 nRegion,sal_uInt16 nIdx,String & rName)664 sal_Bool SfxOrganizeMgr::CopyFrom(SfxOrganizeListBox_Impl *pCaller,
665 							  sal_uInt16 nRegion, sal_uInt16 nIdx, String &rName)
666 
667 /*  [Beschreibung]
668 
669 	Import einer Vorlage
670 
671 	[Parameter]
672 
673 	SfxOrganizeListBox *pCaller		rufende ListBox; da dieses
674 									Event durch das Men"u angetriggert wird,
675 									mu"s das Model der ListBox anschlie"send
676 									aktualisiert werden.
677 	sal_uInt16 nRegion					Index des Bereiches
678 	sal_uInt16 nIdx						Index der Dokumentvorlage
679 	String &rName					Dateiname
680 
681 	[R"uckgabewert]					Erfolg (TRUE) oder Mi"serfolg (FALSE)
682 
683 
684 	[Querverweise]
685 
686 	<SfxDocumentTemplates::CopyFrom( sal_uInt16 nRegion, sal_uInt16 nIdx, const String &)>
687 
688 */
689 
690 {
691     SvLBoxEntry *pParent = pCaller->FirstSelected();
692     if( nIdx!=USHRT_MAX )
693         pParent = pCaller->GetParent(pParent);
694     if( pTemplates->CopyFrom( nRegion, nIdx, rName ) )
695     {
696         // pCaller aktualisieren
697         if( nIdx == USHRT_MAX )
698             nIdx = 0;
699         else nIdx++;
700 
701         pCaller->InsertEntry( rName,
702                               pCaller->GetOpenedBmp(1),
703                               pCaller->GetClosedBmp(1),
704                               pParent,
705                               sal_True,
706                               nIdx);
707         pCaller->Update();
708         // pCaller->EditEntry( pEntry );
709         pCaller->Expand( pParent );
710         bModified = sal_True;
711         return sal_True;
712     }
713     return sal_False;
714 }
715 
716 //-------------------------------------------------------------------------
717 
InsertFile(SfxOrganizeListBox_Impl * pCaller,const String & rFileName)718 sal_Bool SfxOrganizeMgr::InsertFile( SfxOrganizeListBox_Impl* pCaller, const String& rFileName )
719 
720 /*  [Beschreibung]
721 
722 	Eine Datei in der Dateiansicht hinzuf"ugen
723 
724 	[Parameter]
725 
726 	SfxOrganizeListBox *pCaller		rufende ListBox; da dieses
727 									Event durch das Men"u angetriggert wird,
728 									mu"s das Model der ListBox anschlie"send
729 									aktualisiert werden.
730 	const String &rFileName			Name der hinzuf"ugenden Datei
731 
732 	[R"uckgabewert]					Erfolg (TRUE) oder Mi"serfolg (FALSE)
733 
734 */
735 
736 {
737 	const CollatorWrapper* pCollator = pImpl->pIntlWrapper->getCaseCollator();
738 	_FileListEntry* pEntry = new _FileListEntry( rFileName, pCollator );
739 	if ( pImpl->pDocList->C40_PTR_INSERT( _FileListEntry, pEntry ) )
740 	{
741 		sal_uInt16 nPos = 0;
742 		pImpl->pDocList->Seek_Entry( pEntry, &nPos );
743 		pCaller->InsertEntry( pEntry->aBaseName, pCaller->GetOpenedBmp(1),
744 							  pCaller->GetClosedBmp(1), 0, sal_True, nPos );
745 		return sal_True;
746 	}
747 	return sal_False;
748 }
749 
750 //-------------------------------------------------------------------------
751 
Rescan()752 sal_Bool SfxOrganizeMgr::Rescan()
753 
754 /*  [Beschreibung]
755 
756 	Aktualisieren der Datenbasis
757 
758 	[R"uckgabewert]
759 
760 	sal_True					es bestanden Unterschiede
761 	FALSE					keine "Anderung
762 
763 	[Querverweise]
764 
765 	<SfxDocumentTemplates::Rescan()>
766 */
767 
768 {
769 	if(pTemplates->Rescan())
770 	{
771 		bModified = sal_True;
772 		return sal_True;
773 	}
774 	return sal_False;
775 }
776 
777 //-------------------------------------------------------------------------
778 
SaveAll(Window * pParent)779 void SfxOrganizeMgr::SaveAll(Window *pParent)
780 
781 /*  [Beschreibung]
782 
783 	Schreiben aller ge"anderten Dokumente
784 
785 	[Parameter]
786 
787 	Window *pParent			Parent der Boxen f"ur Fehlermeldungen
788 
789 */
790 
791 {
792 	sal_uInt16 nRangeCount = pTemplates->GetRegionCount();
793 	sal_uInt16 i;
794 	for(i = 0; i < nRangeCount; ++i)
795 	{
796 		if( pTemplates->IsRegionLoaded( i ))
797 		{
798 			const sal_uInt16 nCount = pTemplates->GetCount(i);
799 			for(sal_uInt16 j = 0; j < nCount; ++j)
800 			{
801 				if(!pTemplates->DeleteObjectShell(i, j))
802 				{
803 					String aText = String(SfxResId(STR_ERROR_SAVE_TEMPLATE));
804 					aText += pTemplates->GetName(i, j);
805 					ErrorBox aBox(pParent,
806 								  WinBits(WB_OK_CANCEL | WB_DEF_CANCEL),
807 								  aText);
808 					if(RET_CANCEL == aBox.Execute())
809 						break;
810 				}
811 			}
812 		}
813 	}
814 	nRangeCount = pImpl->pDocList->Count();
815 	for(i = 0; i < nRangeCount; ++i)
816 	{
817 		_FileListEntry *pEntry = (*pImpl->pDocList)[i];
818 		if(!pEntry->DeleteObjectShell())
819 		{
820 			String aText(SfxResId(STR_ERROR_SAVE_TEMPLATE));
821 			aText += pEntry->aBaseName;
822 			ErrorBox aBox(pParent, WinBits(WB_OK_CANCEL | WB_DEF_CANCEL), aText);
823 			if(RET_CANCEL == aBox.Execute())
824 				break;
825 		}
826 	}
827 }
828 
829 
830