xref: /AOO41X/main/sfx2/source/doc/objxtor.cxx (revision d119d52d53d0b2180f2ae51341d882123be2af2b)
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 
27 #include "arrdecl.hxx"
28 #include <map>
29 
30 #include <cppuhelper/implbase1.hxx>
31 
32 #include <com/sun/star/util/XCloseable.hpp>
33 #include <com/sun/star/frame/XComponentLoader.hpp>
34 #include <com/sun/star/util/XCloseBroadcaster.hpp>
35 #include <com/sun/star/util/XCloseListener.hpp>
36 #include <com/sun/star/util/XModifyBroadcaster.hpp>
37 #include <com/sun/star/beans/XPropertySet.hpp>
38 #include <com/sun/star/frame/XTitle.hpp>
39 #include <vos/mutex.hxx>
40 
41 #include <tools/resary.hxx>
42 #include <vcl/msgbox.hxx>
43 #include <vcl/wrkwin.hxx>
44 #include <vcl/svapp.hxx>
45 #include <svl/eitem.hxx>
46 #include <tools/rtti.hxx>
47 #include <svl/lstner.hxx>
48 #include <sfx2/sfxhelp.hxx>
49 #include <basic/sbstar.hxx>
50 #include <svl/stritem.hxx>
51 #include <basic/sbx.hxx>
52 #include <unotools/eventcfg.hxx>
53 
54 #include <sfx2/objsh.hxx>
55 #include <sfx2/signaturestate.hxx>
56 #include <sfx2/sfxmodelfactory.hxx>
57 
58 #include <basic/sbuno.hxx>
59 #include <svtools/sfxecode.hxx>
60 #include <svtools/ehdl.hxx>
61 #include <unotools/printwarningoptions.hxx>
62 #include <comphelper/processfactory.hxx>
63 
64 #include <com/sun/star/document/XStorageBasedDocument.hpp>
65 #include <com/sun/star/script/DocumentDialogLibraryContainer.hpp>
66 #include <com/sun/star/script/DocumentScriptLibraryContainer.hpp>
67 #include <com/sun/star/document/XEmbeddedScripts.hpp>
68 #include <com/sun/star/document/XScriptInvocationContext.hpp>
69 
70 #include <svl/urihelper.hxx>
71 #include <unotools/pathoptions.hxx>
72 #include <svl/sharecontrolfile.hxx>
73 #include <unotools/localfilehelper.hxx>
74 #include <unotools/ucbhelper.hxx>
75 #include <svtools/asynclink.hxx>
76 #include <tools/diagnose_ex.h>
77 #include <sot/clsids.hxx>
78 
79 #include <sfx2/app.hxx>
80 #include <sfx2/docfac.hxx>
81 #include <sfx2/docfile.hxx>
82 #include <sfx2/event.hxx>
83 #include <sfx2/dispatch.hxx>
84 #include <sfx2/viewsh.hxx>
85 #include <sfx2/viewfrm.hxx>
86 #include "sfx2/sfxresid.hxx"
87 #include "objshimp.hxx"
88 #include "appbas.hxx"
89 #include "sfxtypes.hxx"
90 #include <sfx2/evntconf.hxx>
91 #include <sfx2/request.hxx>
92 #include "doc.hrc"
93 #include "sfxlocal.hrc"
94 #include "appdata.hxx"
95 #include <sfx2/appuno.hxx>
96 #include <sfx2/sfxsids.hrc>
97 #include "sfx2/basmgr.hxx"
98 #include "sfx2/QuerySaveDocument.hxx"
99 #include "helpid.hrc"
100 #include <sfx2/msg.hxx>
101 #include "appbaslib.hxx"
102 #include <sfx2/sfxbasemodel.hxx>
103 
104 #include <basic/basicmanagerrepository.hxx>
105 
106 using namespace ::com::sun::star;
107 using namespace ::com::sun::star::uno;
108 using namespace ::com::sun::star::script;
109 using namespace ::com::sun::star::frame;
110 using namespace ::com::sun::star::document;
111 
112 using ::basic::BasicManagerRepository;
113 #include <uno/mapping.hxx>
114 
115 //====================================================================
116 
117 DBG_NAME(SfxObjectShell)
118 
119 #define DocumentInfo
120 #include "sfxslots.hxx"
121 
122 namespace {
123 
124 static WeakReference< XInterface > s_xCurrentComponent;
125 
126 // remember all registered components for VBA compatibility, to be able to remove them on disposing the model
127 typedef ::std::map< XInterface*, ::rtl::OString > VBAConstantNameMap;
128 static VBAConstantNameMap s_aRegisteredVBAConstants;
129 
lclGetVBAGlobalConstName(const Reference<XInterface> & rxComponent)130 ::rtl::OString lclGetVBAGlobalConstName( const Reference< XInterface >& rxComponent )
131 {
132     OSL_ENSURE( rxComponent.is(), "lclGetVBAGlobalConstName - missing component" );
133 
134     VBAConstantNameMap::iterator aIt = s_aRegisteredVBAConstants.find( rxComponent.get() );
135     if( aIt != s_aRegisteredVBAConstants.end() )
136         return aIt->second;
137 
138     uno::Reference< beans::XPropertySet > xProps( rxComponent, uno::UNO_QUERY );
139     if( xProps.is() ) try
140     {
141         ::rtl::OUString aConstName;
142         xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "VBAGlobalConstantName" ) ) ) >>= aConstName;
143         return ::rtl::OUStringToOString( aConstName, RTL_TEXTENCODING_ASCII_US );
144     }
145     catch( uno::Exception& ) // not supported
146     {
147     }
148     return ::rtl::OString();
149 }
150 
151 } // namespace
152 
153 //=========================================================================
154 
155 
156 //=========================================================================
157 
158 class SfxModelListener_Impl : public ::cppu::WeakImplHelper1< ::com::sun::star::util::XCloseListener >
159 {
160     SfxObjectShell* mpDoc;
161 public:
SfxModelListener_Impl(SfxObjectShell * pDoc)162     SfxModelListener_Impl( SfxObjectShell* pDoc ) : mpDoc(pDoc) {};
163     virtual void SAL_CALL queryClosing( const com::sun::star::lang::EventObject& aEvent, sal_Bool bDeliverOwnership )
164         throw ( com::sun::star::uno::RuntimeException, com::sun::star::util::CloseVetoException) ;
165     virtual void SAL_CALL notifyClosing( const com::sun::star::lang::EventObject& aEvent ) throw ( com::sun::star::uno::RuntimeException ) ;
166     virtual void SAL_CALL disposing( const com::sun::star::lang::EventObject& aEvent ) throw ( com::sun::star::uno::RuntimeException ) ;
167 
168 };
169 
queryClosing(const com::sun::star::lang::EventObject &,sal_Bool)170 void SAL_CALL SfxModelListener_Impl::queryClosing( const com::sun::star::lang::EventObject& , sal_Bool )
171     throw ( com::sun::star::uno::RuntimeException, com::sun::star::util::CloseVetoException)
172 {
173 }
174 
notifyClosing(const com::sun::star::lang::EventObject &)175 void SAL_CALL SfxModelListener_Impl::notifyClosing( const com::sun::star::lang::EventObject& ) throw ( com::sun::star::uno::RuntimeException )
176 {
177     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
178     mpDoc->Broadcast( SfxSimpleHint(SFX_HINT_DEINITIALIZING) );
179 }
180 
disposing(const com::sun::star::lang::EventObject & _rEvent)181 void SAL_CALL SfxModelListener_Impl::disposing( const com::sun::star::lang::EventObject& _rEvent ) throw ( com::sun::star::uno::RuntimeException )
182 {
183     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
184 
185     // am I ThisComponent in AppBasic?
186     if ( SfxObjectShell::GetCurrentComponent() == _rEvent.Source )
187     {
188         // remove ThisComponent reference from AppBasic
189         SfxObjectShell::SetCurrentComponent( Reference< XInterface >() );
190     }
191 
192     /*  Remove VBA component from AppBasic. As every application registers its
193         own current component, the disposed component may not be the "current
194         component" of the SfxObjectShell. */
195     if ( _rEvent.Source.is() )
196     {
197         VBAConstantNameMap::iterator aIt = s_aRegisteredVBAConstants.find( _rEvent.Source.get() );
198         if ( aIt != s_aRegisteredVBAConstants.end() )
199         {
200             if ( BasicManager* pAppMgr = SFX_APP()->GetBasicManager() )
201                 pAppMgr->SetGlobalUNOConstant( aIt->second.getStr(), Any( Reference< XInterface >() ) );
202             s_aRegisteredVBAConstants.erase( aIt );
203         }
204     }
205 
206     if ( !mpDoc->Get_Impl()->bClosing )
207         // GCC stuerzt ab, wenn schon im dtor, also vorher Flag abfragen
208         mpDoc->DoClose();
209 }
210 
211 TYPEINIT1(SfxObjectShell, SfxShell);
212 
213 //--------------------------------------------------------------------
SfxObjectShell_Impl(SfxObjectShell & _rDocShell)214 SfxObjectShell_Impl::SfxObjectShell_Impl( SfxObjectShell& _rDocShell )
215     :mpObjectContainer(0)
216     ,pBasicManager( new SfxBasicManagerHolder )
217     ,rDocShell( _rDocShell )
218     ,aMacroMode( *this )
219     ,pProgress( 0)
220     ,nTime()
221     ,nVisualDocumentNumber( USHRT_MAX)
222     ,nDocumentSignatureState( SIGNATURESTATE_UNKNOWN )
223     ,nScriptingSignatureState( SIGNATURESTATE_UNKNOWN )
224     ,bInList( sal_False)
225     ,bClosing( sal_False)
226     ,bIsSaving( sal_False)
227     ,bPasswd( sal_False)
228     ,bIsTmp( sal_False)
229     ,bIsNamedVisible( sal_False)
230     ,bIsTemplate(sal_False)
231     ,bIsAbortingImport ( sal_False)
232     ,bImportDone ( sal_False)
233     ,bInPrepareClose( sal_False )
234     ,bPreparedForClose( sal_False )
235     ,bWaitingForPicklist( sal_True )
236     ,bForbidReload( sal_False )
237     ,bBasicInitialized( sal_False )
238     ,bIsPrintJobCancelable( sal_True )
239     ,bOwnsStorage( sal_True )
240     ,bNoBaseURL( sal_False )
241     ,bInitialized( sal_False )
242     ,bSignatureErrorIsShown( sal_False )
243     ,bModelInitialized( sal_False )
244     ,bPreserveVersions( sal_True )
245     ,m_bMacroSignBroken( sal_False )
246     ,m_bNoBasicCapabilities( sal_False )
247     ,m_bDocRecoverySupport( sal_True )
248     ,bQueryLoadTemplate( sal_True )
249     ,bLoadReadonly( sal_False )
250     ,bUseUserData( sal_True )
251     ,bSaveVersionOnClose( sal_False )
252     ,m_bSharedXMLFlag( sal_False )
253     ,m_bAllowShareControlFileClean( sal_True )
254     ,lErr(ERRCODE_NONE)
255     ,nEventId ( 0)
256     ,pReloadTimer ( 0)
257     ,pMarkData( 0 )
258     ,nLoadedFlags ( SFX_LOADED_ALL )
259     ,nFlagsInProgress( 0 )
260     ,bModalMode( sal_False )
261     ,bRunningMacro( sal_False )
262     ,bReloadAvailable( sal_False )
263     ,nAutoLoadLocks( 0 )
264     ,pModule( 0 )
265     ,eFlags( SFXOBJECTSHELL_UNDEFINED )
266     ,bReadOnlyUI( sal_False )
267     ,bHiddenLockedByAPI( sal_False )
268     ,nStyleFilter( 0 )
269     ,bDisposing( sal_False )
270     ,m_bEnableSetModified( sal_True )
271     ,m_bIsModified( sal_False )
272     ,m_nMapUnit( MAP_100TH_MM )
273     ,m_bCreateTempStor( sal_False )
274     ,m_bIsInit( sal_False )
275     ,m_bIncomplEncrWarnShown( sal_False )
276     ,m_nModifyPasswordHash( 0 )
277     ,m_bModifyPasswordEntered( sal_False )
278 {
279     SfxObjectShell* pDoc = &_rDocShell;
280     SfxObjectShellArr_Impl &rArr = SFX_APP()->GetObjectShells_Impl();
281     rArr.C40_INSERT( SfxObjectShell, pDoc, rArr.Count() );
282     bInList = sal_True;
283 }
284 
285 //--------------------------------------------------------------------
286 
~SfxObjectShell_Impl()287 SfxObjectShell_Impl::~SfxObjectShell_Impl()
288 {
289     delete pBasicManager;
290 }
291 
292 //--------------------------------------------------------------------
293 
SfxObjectShell(const sal_uInt64 i_nCreationFlags)294 SfxObjectShell::SfxObjectShell( const sal_uInt64 i_nCreationFlags )
295     :   pImp( new SfxObjectShell_Impl( *this ) )
296     ,   pMedium(0)
297     ,   pStyleSheetPool(0)
298     ,   eCreateMode( ( i_nCreationFlags & SFXMODEL_EMBEDDED_OBJECT ) ? SFX_CREATE_MODE_EMBEDDED : SFX_CREATE_MODE_STANDARD )
299     ,   bHasName( sal_False )
300 {
301     DBG_CTOR(SfxObjectShell, 0);
302 
303     const bool bScriptSupport = ( i_nCreationFlags & SFXMODEL_DISABLE_EMBEDDED_SCRIPTS ) == 0;
304     if ( !bScriptSupport )
305         SetHasNoBasic();
306 
307     const bool bDocRecovery = ( i_nCreationFlags & SFXMODEL_DISABLE_DOCUMENT_RECOVERY ) == 0;
308     if ( !bDocRecovery )
309         pImp->m_bDocRecoverySupport = sal_False;
310 }
311 
312 //--------------------------------------------------------------------
313 
314 // initializes a document from a file-description
315 
SfxObjectShell(SfxObjectCreateMode eMode)316 SfxObjectShell::SfxObjectShell
317 (
318     SfxObjectCreateMode eMode   /*  Zweck, zu dem die SfxObjectShell
319                                     erzeugt wird:
320 
321                                     SFX_CREATE_MODE_EMBEDDED (default)
322                                         als SO-Server aus einem anderen
323                                         Dokument heraus
324 
325                                     SFX_CREATE_MODE_STANDARD,
326                                         als normales, selbst"aendig ge"offnetes
327                                         Dokument
328 
329                                     SFX_CREATE_MODE_PREVIEW
330                                         um ein Preview durchzuf"uhren,
331                                         ggf. werden weniger Daten ben"otigt
332 
333                                     SFX_CREATE_MODE_ORGANIZER
334                                         um im Organizer dargestellt zu
335                                         werden, hier werden keine Inhalte
336                                         ben"otigt */
337 )
338 
339 /*  [Beschreibung]
340 
341     Konstruktor der Klasse SfxObjectShell.
342 */
343 
344 :   pImp( new SfxObjectShell_Impl( *this ) ),
345     pMedium(0),
346     pStyleSheetPool(0),
347     eCreateMode(eMode),
348     bHasName( sal_False )
349 {
350     DBG_CTOR(SfxObjectShell, 0);
351 }
352 
353 //--------------------------------------------------------------------
354 
355 // virtual dtor of typical base-class SfxObjectShell
356 
~SfxObjectShell()357 SfxObjectShell::~SfxObjectShell()
358 {
359     DBG_DTOR(SfxObjectShell, 0);
360 
361     if ( IsEnableSetModified() )
362         EnableSetModified( sal_False );
363 
364     // Niemals GetInPlaceObject() aufrufen, der Zugriff auf den
365     // Ableitungszweig SfxInternObject ist wegen eines Compiler Bugs nicht
366     // erlaubt
367     SfxObjectShell::Close();
368     pImp->pBaseModel.set( NULL );
369 
370     DELETEX(pImp->pReloadTimer );
371 
372     SfxApplication *pSfxApp = SFX_APP();
373     if ( USHRT_MAX != pImp->nVisualDocumentNumber )
374         pSfxApp->ReleaseIndex(pImp->nVisualDocumentNumber);
375 
376     // Basic-Manager zerst"oren
377     pImp->pBasicManager->reset( NULL );
378 
379     if ( pSfxApp->GetDdeService() )
380         pSfxApp->RemoveDdeTopic( this );
381 
382     pImp->pBaseModel.set( NULL );
383 
384     // don't call GetStorage() here, in case of Load Failure it's possible that a storage was never assigned!
385     if ( pMedium && pMedium->HasStorage_Impl() && pMedium->GetStorage( sal_False ) == pImp->m_xDocStorage )
386         pMedium->CanDisposeStorage_Impl( sal_False );
387 
388     if ( pImp->mpObjectContainer )
389     {
390         pImp->mpObjectContainer->CloseEmbeddedObjects();
391         delete pImp->mpObjectContainer;
392     }
393 
394     if ( pImp->bOwnsStorage && pImp->m_xDocStorage.is() )
395         pImp->m_xDocStorage->dispose();
396 
397     if ( pMedium )
398     {
399         pMedium->CloseAndReleaseStreams_Impl();
400 
401         if ( IsDocShared() )
402             FreeSharedFile();
403 
404         DELETEX( pMedium );
405     }
406 
407     // The removing of the temporary file must be done as the latest step in the document destruction
408     if ( pImp->aTempName.Len() )
409     {
410         String aTmp;
411         ::utl::LocalFileHelper::ConvertPhysicalNameToURL( pImp->aTempName, aTmp );
412         ::utl::UCBContentHelper::Kill( aTmp );
413     }
414 
415     delete pImp;
416 }
417 
418 //--------------------------------------------------------------------
419 
Stamp_SetPrintCancelState(sal_Bool bState)420 void SfxObjectShell::Stamp_SetPrintCancelState(sal_Bool bState)
421 {
422     pImp->bIsPrintJobCancelable = bState;
423 }
424 
425 //--------------------------------------------------------------------
426 
Stamp_GetPrintCancelState() const427 sal_Bool SfxObjectShell::Stamp_GetPrintCancelState() const
428 {
429     return pImp->bIsPrintJobCancelable;
430 }
431 
432 //--------------------------------------------------------------------
433 
ViewAssigned()434 void SfxObjectShell::ViewAssigned()
435 
436 /*  [Beschreibung]
437 
438     Diese Methode wird gerufen, wenn eine View zugewiesen wird.
439 */
440 
441 {
442 }
443 
444 //--------------------------------------------------------------------
445 // closes the Object and all its views
446 
Close()447 sal_Bool SfxObjectShell::Close()
448 {
449     {DBG_CHKTHIS(SfxObjectShell, 0);}
450     SfxObjectShellRef aRef(this);
451     if ( !pImp->bClosing )
452     {
453         // falls noch ein Progress l"auft, nicht schlie\sen
454         if ( !pImp->bDisposing && GetProgress() )
455             return sal_False;
456 
457         pImp->bClosing = sal_True;
458         Reference< util::XCloseable > xCloseable( GetBaseModel(), UNO_QUERY );
459 
460         if ( xCloseable.is() )
461         {
462             try
463             {
464                 xCloseable->close( sal_True );
465             }
466             catch( Exception& )
467             {
468                 pImp->bClosing = sal_False;
469             }
470         }
471 
472         if ( pImp->bClosing )
473         {
474             // aus Document-Liste austragen
475             SfxApplication *pSfxApp = SFX_APP();
476             SfxObjectShellArr_Impl &rDocs = pSfxApp->GetObjectShells_Impl();
477             const SfxObjectShell *pThis = this;
478             sal_uInt16 nPos = rDocs.GetPos(pThis);
479             if ( nPos < rDocs.Count() )
480                 rDocs.Remove( nPos );
481             pImp->bInList = sal_False;
482         }
483     }
484 
485     return sal_True;
486 }
487 
488 //--------------------------------------------------------------------
489 
490 // returns a pointer the first SfxDocument of specified type
491 
GetFirst(const TypeId * pType,sal_Bool bOnlyVisible)492 SfxObjectShell* SfxObjectShell::GetFirst
493 (
494     const TypeId* pType ,
495     sal_Bool            bOnlyVisible
496 )
497 {
498     SfxObjectShellArr_Impl &rDocs = SFX_APP()->GetObjectShells_Impl();
499 
500     // seach for a SfxDocument of the specified type
501     for ( sal_uInt16 nPos = 0; nPos < rDocs.Count(); ++nPos )
502     {
503         SfxObjectShell* pSh = rDocs.GetObject( nPos );
504         if ( bOnlyVisible && pSh->IsPreview() && pSh->IsReadOnly() )
505             continue;
506 
507         if ( ( !pType || pSh->IsA(*pType) ) &&
508              ( !bOnlyVisible || SfxViewFrame::GetFirst( pSh, sal_True )))
509             return pSh;
510     }
511 
512     return 0;
513 }
514 //--------------------------------------------------------------------
515 
516 // returns a pointer to the next SfxDocument of specified type behind *pDoc
517 
GetNext(const SfxObjectShell & rPrev,const TypeId * pType,sal_Bool bOnlyVisible)518 SfxObjectShell* SfxObjectShell::GetNext
519 (
520     const SfxObjectShell&   rPrev,
521     const TypeId*           pType,
522     sal_Bool                    bOnlyVisible
523 )
524 {
525     SfxObjectShellArr_Impl &rDocs = SFX_APP()->GetObjectShells_Impl();
526 
527     // refind the specified predecessor
528     sal_uInt16 nPos;
529     for ( nPos = 0; nPos < rDocs.Count(); ++nPos )
530         if ( rDocs.GetObject(nPos) == &rPrev )
531             break;
532 
533     // search for the next SfxDocument of the specified type
534     for ( ++nPos; nPos < rDocs.Count(); ++nPos )
535     {
536         SfxObjectShell* pSh = rDocs.GetObject( nPos );
537         if ( bOnlyVisible && pSh->IsPreview() && pSh->IsReadOnly() )
538             continue;
539 
540         if ( ( !pType || pSh->IsA(*pType) ) &&
541              ( !bOnlyVisible || SfxViewFrame::GetFirst( pSh, sal_True )))
542             return pSh;
543     }
544     return 0;
545 }
546 
547 //--------------------------------------------------------------------
548 
Current()549 SfxObjectShell* SfxObjectShell::Current()
550 {
551     SfxViewFrame *pFrame = SfxViewFrame::Current();
552     return pFrame ? pFrame->GetObjectShell() : 0;
553 }
554 
555 //-------------------------------------------------------------------------
556 
IsInPrepareClose() const557 sal_Bool SfxObjectShell::IsInPrepareClose() const
558 {
559     return pImp->bInPrepareClose;
560 }
561 
562 //------------------------------------------------------------------------
563 
564 struct BoolEnv_Impl
565 {
566     SfxObjectShell_Impl* pImp;
BoolEnv_ImplBoolEnv_Impl567     BoolEnv_Impl( SfxObjectShell_Impl* pImpP) : pImp( pImpP )
568     { pImpP->bInPrepareClose = sal_True; }
~BoolEnv_ImplBoolEnv_Impl569     ~BoolEnv_Impl() { pImp->bInPrepareClose = sal_False; }
570 };
571 
572 
PrepareClose(sal_Bool bUI,sal_Bool bForBrowsing)573 sal_uInt16 SfxObjectShell::PrepareClose
574 (
575     sal_Bool    bUI,        // sal_True: Dialoge etc. erlaubt, sal_False: silent-mode
576     sal_Bool    bForBrowsing
577 )
578 {
579     if( pImp->bInPrepareClose || pImp->bPreparedForClose )
580         return sal_True;
581     BoolEnv_Impl aBoolEnv( pImp );
582 
583     // DocModalDialog?
584     if ( IsInModalMode() )
585         return sal_False;
586 
587     SfxViewFrame* pFirst = SfxViewFrame::GetFirst( this );
588     if( pFirst && !pFirst->GetFrame().PrepareClose_Impl( bUI, bForBrowsing ) )
589         return sal_False;
590 
591     // prepare views for closing
592     for ( SfxViewFrame* pFrm = SfxViewFrame::GetFirst( this );
593           pFrm; pFrm = SfxViewFrame::GetNext( *pFrm, this ) )
594     {
595         DBG_ASSERT(pFrm->GetViewShell(),"KeineShell");
596         if ( pFrm->GetViewShell() )
597         {
598             sal_uInt16 nRet = pFrm->GetViewShell()->PrepareClose( bUI, bForBrowsing );
599             if ( nRet != sal_True )
600                 return nRet;
601         }
602     }
603 
604     SfxApplication *pSfxApp = SFX_APP();
605     pSfxApp->NotifyEvent( SfxEventHint(SFX_EVENT_PREPARECLOSEDOC, GlobalEventConfig::GetEventName(STR_EVENT_PREPARECLOSEDOC), this) );
606 
607     if( GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
608     {
609         pImp->bPreparedForClose = sal_True;
610         return sal_True;
611     }
612 
613     // ggf. nachfragen, ob gespeichert werden soll
614         // nur fuer in sichtbaren Fenstern dargestellte Dokumente fragen
615     SfxViewFrame *pFrame = SfxObjectShell::Current() == this
616         ? SfxViewFrame::Current() : SfxViewFrame::GetFirst( this );
617 
618     sal_Bool bClose = sal_False;
619     if ( bUI && IsModified() && pFrame )
620     {
621         // minimierte restoren
622         SfxFrame& rTop = pFrame->GetTopFrame();
623         SfxViewFrame::SetViewFrame( rTop.GetCurrentViewFrame() );
624         pFrame->GetFrame().Appear();
625 
626         // fragen, ob gespeichert werden soll
627         short nRet = RET_YES;
628         //TODO/CLEANUP
629         //brauchen wir UI=2 noch?
630         //if( SfxApplication::IsPlugin() == sal_False || bUI == 2 )
631         {
632             //initiate help agent to inform about "print modifies the document"
633             SvtPrintWarningOptions aPrintOptions;
634             if (aPrintOptions.IsModifyDocumentOnPrintingAllowed() &&
635                 HasName() && getDocProperties()->getPrintDate().Month > 0)
636             {
637                 SfxHelp::OpenHelpAgent( &pFirst->GetFrame(), HID_CLOSE_WARNING );
638             }
639             const Reference< XTitle > xTitle( *pImp->pBaseModel.get(), UNO_QUERY_THROW );
640             const ::rtl::OUString     sTitle = xTitle->getTitle ();
641             nRet = ExecuteQuerySaveDocument(&pFrame->GetWindow(),sTitle);
642         }
643         /*HACK for plugin::destroy()*/
644 
645         if ( RET_YES == nRet )
646         {
647             // per Dispatcher speichern
648             const SfxPoolItem *pPoolItem;
649             if ( IsSaveVersionOnClose() )
650             {
651                 SfxStringItem aItem( SID_DOCINFO_COMMENTS, String( SfxResId( STR_AUTOMATICVERSION ) ) );
652                 SfxBoolItem aWarnItem( SID_FAIL_ON_WARNING, bUI );
653                 const SfxPoolItem* ppArgs[] = { &aItem, &aWarnItem, 0 };
654                 pPoolItem = pFrame->GetBindings().ExecuteSynchron( SID_SAVEDOC, ppArgs );
655             }
656             else
657             {
658                 SfxBoolItem aWarnItem( SID_FAIL_ON_WARNING, bUI );
659                 const SfxPoolItem* ppArgs[] = { &aWarnItem, 0 };
660                 pPoolItem = pFrame->GetBindings().ExecuteSynchron( SID_SAVEDOC, ppArgs );
661             }
662 
663             if ( !pPoolItem || pPoolItem->ISA(SfxVoidItem) || ( pPoolItem->ISA(SfxBoolItem) && !( (const SfxBoolItem*) pPoolItem )->GetValue() ) )
664                 return sal_False;
665             else
666                 bClose = sal_True;
667         }
668         else if ( RET_CANCEL == nRet )
669             // abgebrochen
670             return sal_False;
671         else if ( RET_NEWTASK == nRet )
672         {
673             return RET_NEWTASK;
674         }
675         else
676         {
677             // Bei Nein nicht noch Informationlost
678             bClose = sal_True;
679         }
680     }
681 
682     pImp->bPreparedForClose = sal_True;
683     return sal_True;
684 }
685 
686 //--------------------------------------------------------------------
687 namespace
688 {
lcl_getBasicManagerForDocument(const SfxObjectShell & _rDocument)689     static BasicManager* lcl_getBasicManagerForDocument( const SfxObjectShell& _rDocument )
690     {
691         if ( !_rDocument.Get_Impl()->m_bNoBasicCapabilities )
692         {
693             if ( !_rDocument.Get_Impl()->bBasicInitialized )
694                 const_cast< SfxObjectShell& >( _rDocument ).InitBasicManager_Impl();
695             return _rDocument.Get_Impl()->pBasicManager->get();
696         }
697 
698         // assume we do not have Basic ourself, but we can refer to another
699         // document which does (by our model's XScriptInvocationContext::getScriptContainer).
700         // In this case, we return the BasicManager of this other document.
701 
702         OSL_ENSURE( !Reference< XEmbeddedScripts >( _rDocument.GetModel(), UNO_QUERY ).is(),
703             "lcl_getBasicManagerForDocument: inconsistency: no Basic, but an XEmbeddedScripts?" );
704         Reference< XModel > xForeignDocument;
705         Reference< XScriptInvocationContext > xContext( _rDocument.GetModel(), UNO_QUERY );
706         if ( xContext.is() )
707         {
708             xForeignDocument.set( xContext->getScriptContainer(), UNO_QUERY );
709             OSL_ENSURE( xForeignDocument.is() && xForeignDocument != _rDocument.GetModel(),
710                 "lcl_getBasicManagerForDocument: no Basic, but providing ourself as script container?" );
711         }
712 
713         BasicManager* pBasMgr = NULL;
714         if ( xForeignDocument.is() )
715             pBasMgr = ::basic::BasicManagerRepository::getDocumentBasicManager( xForeignDocument );
716 
717         return pBasMgr;
718     }
719 }
720 
721 //--------------------------------------------------------------------
722 
GetBasicManager() const723 BasicManager* SfxObjectShell::GetBasicManager() const
724 {
725     BasicManager* pBasMgr = lcl_getBasicManagerForDocument( *this );
726     if ( !pBasMgr )
727         pBasMgr = SFX_APP()->GetBasicManager();
728     return pBasMgr;
729 }
730 
731 //--------------------------------------------------------------------
732 
SetHasNoBasic()733 void SfxObjectShell::SetHasNoBasic()
734 {
735     pImp->m_bNoBasicCapabilities = sal_True;
736 }
737 
738 //--------------------------------------------------------------------
739 
HasBasic() const740 sal_Bool SfxObjectShell::HasBasic() const
741 {
742     if ( pImp->m_bNoBasicCapabilities )
743         return sal_False;
744 
745     if ( !pImp->bBasicInitialized )
746         const_cast< SfxObjectShell* >( this )->InitBasicManager_Impl();
747 
748     return pImp->pBasicManager->isValid();
749 }
750 
751 //--------------------------------------------------------------------
752 namespace
753 {
754     const Reference< XLibraryContainer >&
lcl_getOrCreateLibraryContainer(bool _bScript,Reference<XLibraryContainer> & _rxContainer,const Reference<XModel> & _rxDocument)755     lcl_getOrCreateLibraryContainer( bool _bScript, Reference< XLibraryContainer >& _rxContainer,
756         const Reference< XModel >& _rxDocument )
757     {
758         if ( !_rxContainer.is() )
759         {
760             try
761             {
762                 Reference< XStorageBasedDocument > xStorageDoc( _rxDocument, UNO_QUERY );
763                 const Reference< XComponentContext > xContext(
764                     ::comphelper::getProcessComponentContext() );
765                 _rxContainer.set (   _bScript
766                                 ?   DocumentScriptLibraryContainer::create(
767                                         xContext, xStorageDoc )
768                                 :   DocumentDialogLibraryContainer::create(
769                                         xContext, xStorageDoc )
770                                 ,   UNO_QUERY_THROW );
771             }
772             catch( const Exception& )
773             {
774                 DBG_UNHANDLED_EXCEPTION();
775             }
776         }
777         return _rxContainer;
778     }
779 }
780 
781 //--------------------------------------------------------------------
782 
GetDialogContainer()783 Reference< XLibraryContainer > SfxObjectShell::GetDialogContainer()
784 {
785     if ( !pImp->m_bNoBasicCapabilities )
786         return lcl_getOrCreateLibraryContainer( false, pImp->xDialogLibraries, GetModel() );
787 
788     BasicManager* pBasMgr = lcl_getBasicManagerForDocument( *this );
789     if ( pBasMgr )
790         return pBasMgr->GetDialogLibraryContainer().get();
791 
792     OSL_ENSURE( false, "SfxObjectShell::GetDialogContainer: falling back to the application - is this really expected here?" );
793     return SFX_APP()->GetDialogContainer();
794 }
795 
796 //--------------------------------------------------------------------
797 
GetBasicContainer()798 Reference< XLibraryContainer > SfxObjectShell::GetBasicContainer()
799 {
800     if ( !pImp->m_bNoBasicCapabilities )
801         return lcl_getOrCreateLibraryContainer( true, pImp->xBasicLibraries, GetModel() );
802 
803     BasicManager* pBasMgr = lcl_getBasicManagerForDocument( *this );
804     if ( pBasMgr )
805         return pBasMgr->GetScriptLibraryContainer().get();
806 
807     OSL_ENSURE( false, "SfxObjectShell::GetBasicContainer: falling back to the application - is this really expected here?" );
808     return SFX_APP()->GetBasicContainer();
809 }
810 
811 //--------------------------------------------------------------------
812 
GetBasic() const813 StarBASIC* SfxObjectShell::GetBasic() const
814 {
815     return GetBasicManager()->GetLib(0);
816 }
817 
818 //--------------------------------------------------------------------
819 
InitBasicManager_Impl()820 void SfxObjectShell::InitBasicManager_Impl()
821 /*  [Beschreibung]
822 
823     creates a document's BasicManager and loads it, if we are already based on
824     a storage.
825 
826     [Anmerkung]
827 
828     Diese Methode mu"s aus den "Uberladungen von <SvPersist::Load()> (mit
829     dem pStor aus dem Parameter von Load()) sowie aus der "Uberladung
830     von <SvPersist::InitNew()> (mit pStor = 0) gerufen werden.
831 */
832 
833 {
834     /*  #163556# (DR) - Handling of recursive calls while creating the Bacic
835         manager.
836 
837         It is possible that (while creating the Basic manager) the code that
838         imports the Basic storage wants to access the Basic manager again.
839         Especially in VBA compatibility mode, there is code that wants to
840         access the "VBA Globals" object which is stored as global UNO constant
841         in the Basic manager.
842 
843         To achieve correct handling of the recursive calls of this function
844         from lcl_getBasicManagerForDocument(), the implementation of the
845         function BasicManagerRepository::getDocumentBasicManager() has been
846         changed to return the Basic manager currently under construction, when
847         called repeatedly.
848 
849         The variable pImp->bBasicInitialized will be set to sal_True after
850         construction now, to ensure that the recursive call of the function
851         lcl_getBasicManagerForDocument() will be routed into this function too.
852 
853         Calling BasicManagerHolder::reset() twice is not a big problem, as it
854         does not take ownership but stores only the raw pointer. Owner of all
855         Basic managers is the global BasicManagerRepository instance.
856      */
857     DBG_ASSERT( !pImp->bBasicInitialized && !pImp->pBasicManager->isValid(), "Lokaler BasicManager bereits vorhanden");
858     pImp->pBasicManager->reset( BasicManagerRepository::getDocumentBasicManager( GetModel() ) );
859     DBG_ASSERT( pImp->pBasicManager->isValid(), "SfxObjectShell::InitBasicManager_Impl: did not get a BasicManager!" );
860     pImp->bBasicInitialized = sal_True;
861 }
862 
863 //--------------------------------------------------------------------
864 
Count()865 sal_uInt16 SfxObjectShell::Count()
866 {
867     return SFX_APP()->GetObjectShells_Impl().Count();
868 }
869 
870 //--------------------------------------------------------------------
871 
DoClose()872 sal_Bool SfxObjectShell::DoClose()
873 {
874     return Close();
875 }
876 
877 //--------------------------------------------------------------------
878 
GetObjectShell()879 SfxObjectShell* SfxObjectShell::GetObjectShell()
880 {
881     return this;
882 }
883 
884 //--------------------------------------------------------------------
885 
GetEventNames()886 uno::Sequence< ::rtl::OUString > SfxObjectShell::GetEventNames()
887 {
888     static uno::Sequence< ::rtl::OUString >* pEventNameContainer = NULL;
889 
890     if ( !pEventNameContainer )
891     {
892         ::vos::OGuard aGuard( Application::GetSolarMutex() );
893         if ( !pEventNameContainer )
894         {
895             static uno::Sequence< ::rtl::OUString > aEventNameContainer = GlobalEventConfig().getElementNames();
896             pEventNameContainer = &aEventNameContainer;
897         }
898     }
899 
900     return *pEventNameContainer;
901 }
902 
903 //--------------------------------------------------------------------
904 
GetModel() const905 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > SfxObjectShell::GetModel() const
906 {
907     return GetBaseModel();
908 }
909 
SetBaseModel(SfxBaseModel * pModel)910 void SfxObjectShell::SetBaseModel( SfxBaseModel* pModel )
911 {
912     OSL_ENSURE( !pImp->pBaseModel.is() || pModel == NULL, "Model already set!" );
913     pImp->pBaseModel.set( pModel );
914     if ( pImp->pBaseModel.is() )
915     {
916         pImp->pBaseModel->addCloseListener( new SfxModelListener_Impl(this) );
917     }
918 }
919 
920 //--------------------------------------------------------------------
921 
GetBaseModel() const922 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > SfxObjectShell::GetBaseModel() const
923 {
924     return pImp->pBaseModel.get();
925 }
926 /* -----------------------------10.09.2001 15:56------------------------------
927 
928  ---------------------------------------------------------------------------*/
SetAutoStyleFilterIndex(sal_uInt16 nSet)929 void SfxObjectShell::SetAutoStyleFilterIndex(sal_uInt16 nSet)
930 {
931     pImp->nStyleFilter = nSet;
932 }
933 
GetAutoStyleFilterIndex()934 sal_uInt16 SfxObjectShell::GetAutoStyleFilterIndex()
935 {
936     return pImp->nStyleFilter;
937 }
938 
939 
SetCurrentComponent(const Reference<XInterface> & _rxComponent)940 void SfxObjectShell::SetCurrentComponent( const Reference< XInterface >& _rxComponent )
941 {
942     Reference< XInterface > xOldCurrentComp(s_xCurrentComponent);
943     if ( _rxComponent == xOldCurrentComp )
944         // nothing to do
945         return;
946     // note that "_rxComponent.get() == s_xCurrentComponent.get().get()" is /sufficient/, but not
947     // /required/ for "_rxComponent == s_xCurrentComponent.get()".
948     // In other words, it's still possible that we here do something which is not necessary,
949     // but we should have filtered quite some unnecessary calls already.
950 
951     BasicManager* pAppMgr = SFX_APP()->GetBasicManager();
952     s_xCurrentComponent = _rxComponent;
953     if ( pAppMgr )
954     {
955         // set "ThisComponent" for Basic
956         pAppMgr->SetGlobalUNOConstant( "ThisComponent", Any( _rxComponent ) );
957 
958         // set new current component for VBA compatibility
959         if ( _rxComponent.is() )
960         {
961             ::rtl::OString aVBAConstName = lclGetVBAGlobalConstName( _rxComponent );
962             if ( aVBAConstName.getLength() > 0 )
963             {
964                 pAppMgr->SetGlobalUNOConstant( aVBAConstName.getStr(), Any( _rxComponent ) );
965                 s_aRegisteredVBAConstants[ _rxComponent.get() ] = aVBAConstName;
966             }
967         }
968         // no new component passed -> remove last registered VBA component
969         else if ( xOldCurrentComp.is() )
970         {
971             ::rtl::OString aVBAConstName = lclGetVBAGlobalConstName( xOldCurrentComp );
972             if ( aVBAConstName.getLength() > 0 )
973             {
974                 pAppMgr->SetGlobalUNOConstant( aVBAConstName.getStr(), Any( Reference< XInterface >() ) );
975                 s_aRegisteredVBAConstants.erase( xOldCurrentComp.get() );
976             }
977         }
978     }
979 }
980 
GetCurrentComponent()981 Reference< XInterface > SfxObjectShell::GetCurrentComponent()
982 {
983     return s_xCurrentComponent;
984 }
985 
986 
GetServiceNameFromFactory(const String & rFact)987 String SfxObjectShell::GetServiceNameFromFactory( const String& rFact )
988 {
989     //! Remove everything behind name!
990     String aFact( rFact );
991     String aPrefix = String::CreateFromAscii( "private:factory/" );
992     if ( aPrefix.Len() == aFact.Match( aPrefix ) )
993         aFact.Erase( 0, aPrefix.Len() );
994     sal_uInt16 nPos = aFact.Search( '?' );
995     String aParam;
996     if ( nPos != STRING_NOTFOUND )
997     {
998         aParam = aFact.Copy( nPos, aFact.Len() );
999         aFact.Erase( nPos, aFact.Len() );
1000         aParam.Erase(0,1);
1001     }
1002     aFact.EraseAllChars('4').ToLowerAscii();
1003 
1004     // HACK: sometimes a real document service name is given here instead of
1005     // a factory short name. Set return value directly to this service name as fallback
1006     // in case next lines of code does nothing ...
1007     // use rFact instead of normed aFact value !
1008     ::rtl::OUString aServiceName = rFact;
1009 
1010     if ( aFact.EqualsAscii("swriter") )
1011     {
1012         aServiceName = ::rtl::OUString::createFromAscii("com.sun.star.text.TextDocument");
1013     }
1014     else if ( aFact.EqualsAscii("sweb") || aFact.EqualsAscii("swriter/web") )
1015     {
1016         aServiceName = ::rtl::OUString::createFromAscii("com.sun.star.text.WebDocument");
1017     }
1018     else if ( aFact.EqualsAscii("sglobal") || aFact.EqualsAscii("swriter/globaldocument") )
1019     {
1020         aServiceName = ::rtl::OUString::createFromAscii("com.sun.star.text.GlobalDocument");
1021     }
1022     else if ( aFact.EqualsAscii("scalc") )
1023     {
1024         aServiceName = ::rtl::OUString::createFromAscii("com.sun.star.sheet.SpreadsheetDocument");
1025     }
1026     else if ( aFact.EqualsAscii("sdraw") )
1027     {
1028         aServiceName = ::rtl::OUString::createFromAscii("com.sun.star.drawing.DrawingDocument");
1029     }
1030     else if ( aFact.EqualsAscii("simpress") )
1031     {
1032         aServiceName = ::rtl::OUString::createFromAscii("com.sun.star.presentation.PresentationDocument");
1033     }
1034     else if ( aFact.EqualsAscii("schart") )
1035     {
1036         aServiceName = ::rtl::OUString::createFromAscii("com.sun.star.chart.ChartDocument");
1037     }
1038     else if ( aFact.EqualsAscii("smath") )
1039     {
1040         aServiceName = ::rtl::OUString::createFromAscii("com.sun.star.formula.FormulaProperties");
1041     }
1042     else if ( aFact.EqualsAscii("sbasic") )
1043     {
1044         aServiceName = ::rtl::OUString::createFromAscii("com.sun.star.script.BasicIDE");
1045     }
1046     else if ( aFact.EqualsAscii("sdatabase") )
1047     {
1048         aServiceName = ::rtl::OUString::createFromAscii("com.sun.star.sdb.OfficeDatabaseDocument");
1049     }
1050 
1051     return aServiceName;
1052 }
1053 
CreateObjectByFactoryName(const String & rFact,SfxObjectCreateMode eMode)1054 SfxObjectShell* SfxObjectShell::CreateObjectByFactoryName( const String& rFact, SfxObjectCreateMode eMode )
1055 {
1056     return CreateObject( GetServiceNameFromFactory( rFact ), eMode );
1057 }
1058 
1059 
CreateObject(const String & rServiceName,SfxObjectCreateMode eCreateMode)1060 SfxObjectShell* SfxObjectShell::CreateObject( const String& rServiceName, SfxObjectCreateMode eCreateMode )
1061 {
1062     if ( rServiceName.Len() )
1063     {
1064         ::com::sun::star::uno::Reference < ::com::sun::star::frame::XModel > xDoc(
1065         ::comphelper::getProcessServiceFactory()->createInstance( rServiceName ), UNO_QUERY );
1066         if ( xDoc.is() )
1067         {
1068             ::com::sun::star::uno::Reference < ::com::sun::star::lang::XUnoTunnel > xObj( xDoc, UNO_QUERY );
1069             ::com::sun::star::uno::Sequence < sal_Int8 > aSeq( SvGlobalName( SFX_GLOBAL_CLASSID ).GetByteSequence() );
1070             sal_Int64 nHandle = xObj->getSomething( aSeq );
1071             if ( nHandle )
1072             {
1073                 SfxObjectShell* pRet = reinterpret_cast< SfxObjectShell* >( sal::static_int_cast< sal_IntPtr >( nHandle ));
1074                 pRet->SetCreateMode_Impl( eCreateMode );
1075                 return pRet;
1076             }
1077         }
1078     }
1079 
1080     return 0;
1081 }
1082 
CreateAndLoadObject(const SfxItemSet & rSet,SfxFrame * pFrame)1083 SfxObjectShell* SfxObjectShell::CreateAndLoadObject( const SfxItemSet& rSet, SfxFrame* pFrame )
1084 {
1085     uno::Sequence < beans::PropertyValue > aProps;
1086     TransformItems( SID_OPENDOC, rSet, aProps );
1087     SFX_ITEMSET_ARG(&rSet, pFileNameItem, SfxStringItem, SID_FILE_NAME, sal_False);
1088     SFX_ITEMSET_ARG(&rSet, pTargetItem, SfxStringItem, SID_TARGETNAME, sal_False);
1089     ::rtl::OUString aURL;
1090     ::rtl::OUString aTarget = rtl::OUString::createFromAscii("_blank");
1091     if ( pFileNameItem )
1092         aURL = pFileNameItem->GetValue();
1093     if ( pTargetItem )
1094         aTarget = pTargetItem->GetValue();
1095 
1096     uno::Reference < frame::XComponentLoader > xLoader;
1097     if ( pFrame )
1098     {
1099         xLoader = uno::Reference < frame::XComponentLoader >( pFrame->GetFrameInterface(), uno::UNO_QUERY );
1100     }
1101     else
1102         xLoader = uno::Reference < frame::XComponentLoader >( comphelper::getProcessServiceFactory()->createInstance(
1103             ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop") ), uno::UNO_QUERY );
1104 
1105     uno::Reference < lang::XUnoTunnel > xObj;
1106     try
1107     {
1108         xObj = uno::Reference< lang::XUnoTunnel >( xLoader->loadComponentFromURL( aURL, aTarget, 0, aProps ), uno::UNO_QUERY );
1109     }
1110     catch( uno::Exception& )
1111     {}
1112 
1113     if ( xObj.is() )
1114     {
1115         ::com::sun::star::uno::Sequence < sal_Int8 > aSeq( SvGlobalName( SFX_GLOBAL_CLASSID ).GetByteSequence() );
1116         sal_Int64 nHandle = xObj->getSomething( aSeq );
1117         if ( nHandle )
1118             return reinterpret_cast< SfxObjectShell* >(sal::static_int_cast< sal_IntPtr >(  nHandle ));
1119     }
1120 
1121     return NULL;
1122 }
1123 
SetInitialized_Impl(const bool i_fromInitNew)1124 void SfxObjectShell::SetInitialized_Impl( const bool i_fromInitNew )
1125 {
1126     pImp->bInitialized = sal_True;
1127     if ( i_fromInitNew )
1128     {
1129         SetActivateEvent_Impl( SFX_EVENT_CREATEDOC );
1130         SFX_APP()->NotifyEvent( SfxEventHint( SFX_EVENT_DOCCREATED, GlobalEventConfig::GetEventName(STR_EVENT_DOCCREATED), this ) );
1131     }
1132     else
1133     {
1134         SFX_APP()->NotifyEvent( SfxEventHint( SFX_EVENT_LOADFINISHED, GlobalEventConfig::GetEventName(STR_EVENT_LOADFINISHED), this ) );
1135     }
1136 }
1137 
1138 
IsChangeRecording() const1139 bool SfxObjectShell::IsChangeRecording() const
1140 {
1141     // currently this function needs to be overwritten by Writer and Calc only
1142     DBG_ASSERT( 0, "function not implemented" );
1143     return false;
1144 }
1145 
1146 
HasChangeRecordProtection() const1147 bool SfxObjectShell::HasChangeRecordProtection() const
1148 {
1149     // currently this function needs to be overwritten by Writer and Calc only
1150     DBG_ASSERT( 0, "function not implemented" );
1151     return false;
1152 }
1153 
1154 
SetChangeRecording(bool)1155 void SfxObjectShell::SetChangeRecording( bool /*bActivate*/ )
1156 {
1157     // currently this function needs to be overwritten by Writer and Calc only
1158     DBG_ASSERT( 0, "function not implemented" );
1159 }
1160 
1161 
SetProtectionPassword(const String &)1162 bool SfxObjectShell::SetProtectionPassword( const String & /*rPassword*/ )
1163 {
1164     // currently this function needs to be overwritten by Writer and Calc only
1165     DBG_ASSERT( 0, "function not implemented" );
1166     return false;
1167 }
1168 
1169 
GetProtectionHash(::com::sun::star::uno::Sequence<sal_Int8> &)1170 bool SfxObjectShell::GetProtectionHash( /*out*/ ::com::sun::star::uno::Sequence< sal_Int8 > & /*rPasswordHash*/ )
1171 {
1172     // currently this function needs to be overwritten by Writer and Calc only
1173     DBG_ASSERT( 0, "function not implemented" );
1174     return false;
1175 }
1176 
1177