1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: orgmgr.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sfx2.hxx"
33 #include <com/sun/star/embed/XStorage.hpp>
34 #include <com/sun/star/embed/XTransactedObject.hpp>
35 #include <com/sun/star/embed/ElementModes.hpp>
37 #ifndef _MSGBOX_HXX //autogen
38 #include <vcl/msgbox.hxx>
40 #include <tools/urlobj.hxx>
44 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
45 #include <comphelper/processfactory.hxx>
47 #include <unotools/intlwrapper.hxx>
49 #include <comphelper/storagehelper.hxx>
51 #include <sfx2/app.hxx>
52 #include <sfx2/objsh.hxx>
53 #include <sfx2/docfile.hxx>
54 #include <sfx2/docfac.hxx>
55 #include <sfx2/doctempl.hxx>
58 #include "sfxtypes.hxx"
59 #include "sfxresid.hxx"
61 #include <sfx2/docfilt.hxx>
64 using namespace ::com::sun::star
;
66 //=========================================================================
70 Implementierungsklasse; einzelner Eintrag in der Dateiansicht
76 String aFileName
; // Dateiname mit komplettem Pfad
77 String aBaseName
; // Dateiname
78 const CollatorWrapper
* pCollator
;
79 SfxObjectShellLock aDocShell
; // ObjectShell als Ref-Klasse
81 //REMOVE SvStorageRef aStor; // Referenz auf Storage, wenn wir diesen geoeffnet haben
82 //uno::Reference< embed::XStorage > xStorage;
84 BOOL bFile
; // als Datei auf Platte
85 // (!= unbenannt1, nicht als Dok. geladen;
86 // diese werden nicht gespeichert!)
87 BOOL bOwner
; // selbst erzeugt
91 _FileListEntry( const String
& rFileName
,
92 const CollatorWrapper
* pColl
, const String
* pTitle
= NULL
);
95 int operator==( const _FileListEntry
&rCmp
) const;
96 int operator< ( const _FileListEntry
&rCmp
) const;
97 BOOL
DeleteObjectShell();
100 //-------------------------------------------------------------------------
102 inline int _FileListEntry::operator==(const _FileListEntry
&rCmp
) const
104 DBG_ASSERT( pCollator
, "invalid CollatorWrapper" );
105 return COMPARE_EQUAL
== pCollator
->compareString(aBaseName
, rCmp
.aBaseName
);
108 //-------------------------------------------------------------------------
110 inline int _FileListEntry::operator< (const _FileListEntry
&rCmp
) const
112 DBG_ASSERT( pCollator
, "invalid CollatorWrapper" );
113 return COMPARE_LESS
== pCollator
->compareString(aBaseName
, rCmp
.aBaseName
);
116 //-------------------------------------------------------------------------
118 _FileListEntry::_FileListEntry( const String
& rFileName
,
119 const CollatorWrapper
* pColl
, const String
* pTitle
) :
121 aFileName ( rFileName
),
132 INetURLObject
aObj( rFileName
, INET_PROT_FILE
);
133 aBaseName
= aObj
.getName( INetURLObject::LAST_SEGMENT
, true,
134 INetURLObject::DECODE_WITH_CHARSET
);
138 //-------------------------------------------------------------------------
140 _FileListEntry::~_FileListEntry()
145 //-------------------------------------------------------------------------
147 SV_IMPL_OP_PTRARR_SORT(_SfxObjectList
, _FileListEntry
*)
149 //=========================================================================
151 BOOL
_FileListEntry::DeleteObjectShell()
155 Freigabe der DokumentShell
157 [Returnwert] TRUE: alles Ok
158 FALSE: es ist ein Fehler aufgetreten (das
159 Dokument konnte nicht gesichert werden)
165 //Falls wir die Shell angelegt haben und sie veraendert wurde
166 if(bOwner
&& aDocShell
.Is() && aDocShell
->IsModified())
168 //Mussten wir konvertieren?
171 if(!aDocShell
->Save() )
176 uno::Reference
< embed::XTransactedObject
> xTransact( aDocShell
->GetStorage(), uno::UNO_QUERY
);
177 OSL_ENSURE( xTransact
.is(), "Storage must implement XTransactedObject!\n" );
178 if ( !xTransact
.is() )
179 throw uno::RuntimeException();
183 catch( uno::Exception
& )
187 // aDocShell->SfxObjectShell::DoSaveCompleted();
192 // Falls konvertiert im eigenen Format speichern
193 INetURLObject
aObj( aFileName
);
194 String aTitle
= aObj
.getName( INetURLObject::LAST_SEGMENT
, true,
195 INetURLObject::DECODE_WITH_CHARSET
);
196 bRet
= aDocShell
->PreDoSaveAs_Impl(
197 aTitle
, aDocShell
->GetFactory().GetFilterContainer()->GetAnyFilter( SFX_FILTER_IMPORT
| SFX_FILTER_EXPORT
)->GetFilterName(), 0 );
209 //-------------------------------------------------------------------------
211 SfxObjectList::SfxObjectList()
215 //-------------------------------------------------------------------------
217 SfxObjectList::~SfxObjectList()
219 DeleteAndDestroy(0, Count());
222 //-------------------------------------------------------------------------
224 const String
&SfxObjectList::GetBaseName(USHORT i
) const
226 return (*this)[i
]->aBaseName
;
229 //-------------------------------------------------------------------------
231 const String
& SfxObjectList::GetFileName( USHORT i
) const
233 return (*this)[i
]->aFileName
;
236 //-------------------------------------------------------------------------
238 SfxOrganizeMgr::SfxOrganizeMgr( SfxOrganizeListBox_Impl
*pLeft
,
239 SfxOrganizeListBox_Impl
*pRight
,
240 SfxDocumentTemplates
*pTempl
) :
241 pImpl(new SfxOrganizeMgr_Impl
),
242 pTemplates(pTempl
? pTempl
: new SfxDocumentTemplates
),
245 bDeleteTemplates(pTempl
== 0),
252 Das aktuelle Dokument wird in die Liste der Dokumente
257 pImpl
->pDocList
= new SfxObjectList
;
258 pImpl
->pIntlWrapper
= new IntlWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
259 const CollatorWrapper
* pCollator
= pImpl
->pIntlWrapper
->getCaseCollator();
260 for ( SfxObjectShell
* pTmp
= SfxObjectShell::GetFirst(); pTmp
; pTmp
= SfxObjectShell::GetNext(*pTmp
) )
262 if ( pTmp
->GetCreateMode() != SFX_CREATE_MODE_STANDARD
||
263 !( pTmp
->GetFlags() & SFXOBJECTSHELL_HASOPENDOC
) || !pTmp
->GetStyleSheetPool() )
265 _FileListEntry
* pNewEntry
= NULL
;
266 String aTitle
= pTmp
->GetTitle( SFX_TITLE_TITLE
);
267 pNewEntry
= new _FileListEntry( pTmp
->GetMedium()->GetName(), pCollator
, &aTitle
);
268 pNewEntry
->aDocShell
= pTmp
;
269 pImpl
->pDocList
->C40_PTR_INSERT( _FileListEntry
, pNewEntry
);
273 //-------------------------------------------------------------------------
275 SfxOrganizeMgr::~SfxOrganizeMgr()
277 if ( bDeleteTemplates
)
279 delete pImpl
->pDocList
;
280 delete pImpl
->pIntlWrapper
;
282 pLeftBox
= pRightBox
= NULL
;
285 //-------------------------------------------------------------------------
287 SfxObjectShellRef
SfxOrganizeMgr::CreateObjectShell( USHORT nIdx
)
291 Zugriff auf die DokumentShell an der Position nIdx
293 [Returnwert] Referenz auf die DokumentShell
298 _FileListEntry
* pEntry
= (*pImpl
->pDocList
)[nIdx
];
299 // andernfalls Doc-Shell anlegen
300 if ( !pEntry
->aDocShell
.Is() )
302 //(mba)/task SfxWaitCursor aWaitCursor;
303 INetURLObject
aFileObj( pEntry
->aFileName
);
305 SfxApplication
* pSfxApp
= SFX_APP();
306 String aFilePath
= aFileObj
.GetMainURL( INetURLObject::NO_DECODE
);
307 pEntry
->aDocShell
= pSfxApp
->DocAlreadyLoaded( aFilePath
, FALSE
, bDum
);
308 if ( !pEntry
->aDocShell
.Is() )
310 pEntry
->bOwner
= TRUE
;
311 SfxMedium
* pMed
= new SfxMedium(
312 aFilePath
, ( STREAM_READ
| STREAM_SHARE_DENYWRITE
), FALSE
, 0 );
313 const SfxFilter
* pFilter
= NULL
;
314 pMed
->UseInteractionHandler(TRUE
);
316 pSfxApp
->GetFilterMatcher().GuessFilter(*pMed
, &pFilter
, SFX_FILTER_TEMPLATE
, 0) ||
317 (pFilter
&& !pFilter
->IsOwnFormat()) ||
318 (pFilter
&& !pFilter
->UsesStorage())
321 pSfxApp
->LoadTemplate( pEntry
->aDocShell
, aFilePath
);
322 pEntry
->bOwnFormat
= FALSE
;
324 if ( pEntry
->aDocShell
.Is() )
325 return (SfxObjectShellRef
)(SfxObjectShell
*)(pEntry
->aDocShell
);
331 pEntry
->bOwnFormat
= TRUE
;
332 pEntry
->aDocShell
= SfxObjectShell::CreateObject( pFilter
->GetServiceName(), SFX_CREATE_MODE_ORGANIZER
);
333 if ( pEntry
->aDocShell
.Is() )
335 pEntry
->aDocShell
->DoInitNew(0);
336 pEntry
->aDocShell
->LoadFrom( *pMed
);
337 // Medium is now owned by DocShell
338 pEntry
->aDocShell
->DoSaveCompleted( pMed
);
344 return ( SfxObjectShellRef
)(SfxObjectShell
*)(pEntry
->aDocShell
);
347 //-------------------------------------------------------------------------
349 BOOL
SfxOrganizeMgr::DeleteObjectShell(USHORT nIdx
)
353 Freigabe der DokumentShell an der Position nIdx
355 [Returnwert] TRUE: alles Ok
356 FALSE: es ist ein Fehler aufgetreten (das
357 Dokument konnte nicht gesichert werden)
361 return (*pImpl
->pDocList
)[nIdx
]->DeleteObjectShell();
364 //-------------------------------------------------------------------------
366 SfxObjectShellRef
SfxOrganizeMgr::CreateObjectShell(USHORT nRegion
,
370 Zugriff auf die DokumentShell an der Position nIdx im Bereich
371 nRegion (Dokumentvorlage)
373 [Returnwert] Referenz auf die DokumentShell
377 //(mba)/task SfxWaitCursor aWaitCursor;
378 return pTemplates
->CreateObjectShell(nRegion
, nIdx
);
381 //-------------------------------------------------------------------------
383 BOOL
SfxOrganizeMgr::DeleteObjectShell(USHORT nRegion
, USHORT nIdx
)
387 Freigabe der DokumentShell an der Position nIdx im Bereich
388 nRegion (Dokumentvorlage)
390 [Returnwert] TRUE: alles Ok
391 FALSE: es ist ein Fehler aufgetreten (das
392 Dokument konnte nicht gesichert werden)
397 return pTemplates
->DeleteObjectShell(nRegion
, nIdx
);
400 //-------------------------------------------------------------------------
402 BOOL
SfxOrganizeMgr::Copy(USHORT nTargetRegion
,
404 USHORT nSourceRegion
,
409 Kopieren einer Dokumentvorlage
413 USHORT nTargetRegion Index des Zielbereiches
414 USHORT nTargetIdx Index Zielposition
415 USHORT nSourceRegion Index des Quellbereiches
416 USHORT nSourceIdx Index der zu kopierenden / z uverschiebenden
419 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE)
424 <SfxDocumentTemplates::Copy(USHORT nTargetRegion,
426 USHORT nSourceRegion,
432 if(nSourceIdx
== USHRT_MAX
) // keine Verzeichnisse kopieren
434 const BOOL bOk
= pTemplates
->Copy(nTargetRegion
, nTargetIdx
,
435 nSourceRegion
, nSourceIdx
);
441 //-------------------------------------------------------------------------
443 BOOL
SfxOrganizeMgr::Move(USHORT nTargetRegion
,
445 USHORT nSourceRegion
,
450 Verschieben einer Dokumentvorlage
454 USHORT nTargetRegion Index des Zielbereiches
455 USHORT nTargetIdx Index Zielposition
456 USHORT nSourceRegion Index des Quellbereiches
457 USHORT nSourceIdx Index der zu kopierenden / z uverschiebenden
460 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE)
465 <SfxDocumentTemplates::Move(USHORT nTargetRegion,
467 USHORT nSourceRegion,
473 if(nSourceIdx
== USHRT_MAX
) // keine Verzeichnisse verschieben
475 const BOOL bOk
= pTemplates
->Move(nTargetRegion
, nTargetIdx
,
476 nSourceRegion
, nSourceIdx
);
482 //-------------------------------------------------------------------------
484 BOOL
SfxOrganizeMgr::Delete(SfxOrganizeListBox_Impl
*pCaller
,
485 USHORT nRegion
, USHORT nIdx
)
489 "oschen einer Dokumentvorlage
493 SfxOrganizeListBox *pCaller rufende ListBox; da dieses
494 Event durch das Men"u oder
495 durch das Keyboard angetriggert wird,
496 mu"s das Model der ListBox anschlie"send
498 USHORT nRegion Index des Bereiches
499 USHORT nIdx Index der Dokumentvorlage
501 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE)
506 <SfxDocumentTemplates::Delete(USHORT nRegion, USHORT nIdx)>
513 if ( USHRT_MAX
== nIdx
)
515 // deleting of a group
517 SvLBoxEntry
*pGroupToDelete
= pCaller
->SvLBox::GetEntry(nRegion
);
518 if ( pGroupToDelete
)
520 USHORT nItemNum
= (USHORT
)( pCaller
->GetModel()->GetChildCount( pGroupToDelete
) );
521 USHORT nToDeleteNum
= 0;
522 SvLBoxEntry
**pEntriesToDelete
= new SvLBoxEntry
*[nItemNum
];
525 for ( nInd
= 0; nInd
< nItemNum
; nInd
++ )
526 pEntriesToDelete
[nInd
] = NULL
;
528 for ( nInd
= 0; nInd
< nItemNum
; nInd
++ )
530 // TODO/LATER: check that nInd is the same index that is used in pTemplates
531 if ( pTemplates
->Delete( nRegion
, nInd
) )
534 pEntriesToDelete
[nToDeleteNum
++] = pCaller
->SvLBox::GetEntry( pGroupToDelete
, nInd
);
538 for ( nInd
= 0; nInd
< nToDeleteNum
; nInd
++ )
539 if ( pEntriesToDelete
[nInd
] )
540 pCaller
->GetModel()->Remove( pEntriesToDelete
[nInd
] );
542 if ( !pCaller
->GetModel()->GetChildCount( pGroupToDelete
) )
544 bOk
= pTemplates
->Delete( nRegion
, nIdx
);
546 pCaller
->GetModel()->Remove( pGroupToDelete
);
552 // deleting of a template
553 bOk
= pTemplates
->Delete(nRegion
, nIdx
);
557 // zu loeschender Eintrag
558 SvLBoxEntry
*pEntryToDelete
= pCaller
->SvLBox::GetEntry(pCaller
->SvLBox::GetEntry(nRegion
), nIdx
);
560 pCaller
->GetModel()->Remove(pEntryToDelete
);
567 //-------------------------------------------------------------------------
569 BOOL
SfxOrganizeMgr::InsertDir
571 SfxOrganizeListBox_Impl
* pCaller
,/* rufende ListBox; da dieses Event
572 durch das Men"u oder durch das
573 Keyboard angetriggert wird,
574 mu\s das Model der ListBox
575 anschlie\send aktualisiert werden */
576 const String
& rText
, // logischer Name des Bereiches
577 USHORT nRegion
// Index des Bereiches
582 Einf"ugen eines Bereiches
587 Erfolg (TRUE) oder Mi\serfolg (FALSE)
592 <SfxDocumentTemplates::InsertDir(const String &, USHORT nRegion)>
596 const BOOL bOk
= pTemplates
->InsertDir(rText
, nRegion
);
600 SvLBoxEntry
*pEntry
= pCaller
->InsertEntry(rText
,
601 pCaller
->GetOpenedBmp(0),
602 pCaller
->GetClosedBmp(0),
605 pCaller
->EditEntry(pEntry
);
610 //-------------------------------------------------------------------------
612 BOOL
SfxOrganizeMgr::SetName(const String
&rName
,
613 USHORT nRegion
, USHORT nIdx
)
617 "Andern eines (logischen) Namens
621 const String &rName der neue Name
622 USHORT nRegion Index des Bereiches
623 USHORT nIdx Index der Dokumentvorlage
625 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE)
630 <SfxDocumentTemplates::SetName(const String &, USHORT nRegion, USHORT nIdx)>
635 const BOOL bOk
= pTemplates
->SetName(rName
, nRegion
, nIdx
);
641 //-------------------------------------------------------------------------
643 BOOL
SfxOrganizeMgr::CopyTo(USHORT nRegion
, USHORT nIdx
, const String
&rName
) const
651 USHORT nRegion Index des Bereiches
652 USHORT nIdx Index der Dokumentvorlage
653 const String &rName Dateiname
655 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE)
660 <SfxDocumentTemplates::CopyTo( USHORT nRegion, USHORT nIdx, const String &)>
665 return pTemplates
->CopyTo(nRegion
, nIdx
, rName
);
668 //-------------------------------------------------------------------------
670 BOOL
SfxOrganizeMgr::CopyFrom(SfxOrganizeListBox_Impl
*pCaller
,
671 USHORT nRegion
, USHORT nIdx
, String
&rName
)
679 SfxOrganizeListBox *pCaller rufende ListBox; da dieses
680 Event durch das Men"u angetriggert wird,
681 mu"s das Model der ListBox anschlie"send
683 USHORT nRegion Index des Bereiches
684 USHORT nIdx Index der Dokumentvorlage
685 String &rName Dateiname
687 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE)
692 <SfxDocumentTemplates::CopyFrom( USHORT nRegion, USHORT nIdx, const String &)>
697 SvLBoxEntry
*pParent
= pCaller
->FirstSelected();
698 if( nIdx
!=USHRT_MAX
)
699 pParent
= pCaller
->GetParent(pParent
);
700 if( pTemplates
->CopyFrom( nRegion
, nIdx
, rName
) )
702 // pCaller aktualisieren
703 if( nIdx
== USHRT_MAX
)
707 pCaller
->InsertEntry( rName
,
708 pCaller
->GetOpenedBmp(1),
709 pCaller
->GetClosedBmp(1),
714 // pCaller->EditEntry( pEntry );
715 pCaller
->Expand( pParent
);
722 //-------------------------------------------------------------------------
724 BOOL
SfxOrganizeMgr::InsertFile( SfxOrganizeListBox_Impl
* pCaller
, const String
& rFileName
)
728 Eine Datei in der Dateiansicht hinzuf"ugen
732 SfxOrganizeListBox *pCaller rufende ListBox; da dieses
733 Event durch das Men"u angetriggert wird,
734 mu"s das Model der ListBox anschlie"send
736 const String &rFileName Name der hinzuf"ugenden Datei
738 [R"uckgabewert] Erfolg (TRUE) oder Mi"serfolg (FALSE)
743 const CollatorWrapper
* pCollator
= pImpl
->pIntlWrapper
->getCaseCollator();
744 _FileListEntry
* pEntry
= new _FileListEntry( rFileName
, pCollator
);
745 if ( pImpl
->pDocList
->C40_PTR_INSERT( _FileListEntry
, pEntry
) )
748 pImpl
->pDocList
->Seek_Entry( pEntry
, &nPos
);
749 pCaller
->InsertEntry( pEntry
->aBaseName
, pCaller
->GetOpenedBmp(1),
750 pCaller
->GetClosedBmp(1), 0, TRUE
, nPos
);
756 //-------------------------------------------------------------------------
758 BOOL
SfxOrganizeMgr::Rescan()
762 Aktualisieren der Datenbasis
766 TRUE es bestanden Unterschiede
767 FALSE keine "Anderung
771 <SfxDocumentTemplates::Rescan()>
775 if(pTemplates
->Rescan())
783 //-------------------------------------------------------------------------
785 void SfxOrganizeMgr::SaveAll(Window
*pParent
)
789 Schreiben aller ge"anderten Dokumente
793 Window *pParent Parent der Boxen f"ur Fehlermeldungen
798 USHORT nRangeCount
= pTemplates
->GetRegionCount();
800 for(i
= 0; i
< nRangeCount
; ++i
)
802 if( pTemplates
->IsRegionLoaded( i
))
804 const USHORT nCount
= pTemplates
->GetCount(i
);
805 for(USHORT j
= 0; j
< nCount
; ++j
)
807 if(!pTemplates
->DeleteObjectShell(i
, j
))
809 String aText
= String(SfxResId(STR_ERROR_SAVE_TEMPLATE
));
810 aText
+= pTemplates
->GetName(i
, j
);
811 ErrorBox
aBox(pParent
,
812 WinBits(WB_OK_CANCEL
| WB_DEF_CANCEL
),
814 if(RET_CANCEL
== aBox
.Execute())
820 nRangeCount
= pImpl
->pDocList
->Count();
821 for(i
= 0; i
< nRangeCount
; ++i
)
823 _FileListEntry
*pEntry
= (*pImpl
->pDocList
)[i
];
824 if(!pEntry
->DeleteObjectShell())
826 String
aText(SfxResId(STR_ERROR_SAVE_TEMPLATE
));
827 aText
+= pEntry
->aBaseName
;
828 ErrorBox
aBox(pParent
, WinBits(WB_OK_CANCEL
| WB_DEF_CANCEL
), aText
);
829 if(RET_CANCEL
== aBox
.Execute())