xref: /aoo42x/main/sfx2/source/view/viewfrm.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sfx2.hxx"
30 
31 #include <stdio.h>
32 
33 #include <sfx2/viewfrm.hxx>
34 #include <com/sun/star/document/MacroExecMode.hpp>
35 #include <com/sun/star/frame/XLoadable.hpp>
36 #include <com/sun/star/frame/XLayoutManager.hpp>
37 #include <com/sun/star/frame/XComponentLoader.hpp>
38 
39 #include <toolkit/unohlp.hxx>
40 #include <vcl/splitwin.hxx>
41 #include <unotools/moduleoptions.hxx>
42 #include <svl/intitem.hxx>
43 #include <svl/visitem.hxx>
44 #include <svl/stritem.hxx>
45 #include <svl/eitem.hxx>
46 #include <svl/slstitm.hxx>
47 #include <svl/whiter.hxx>
48 #include <svl/undo.hxx>
49 #include <vcl/msgbox.hxx>
50 #include <svtools/sfxecode.hxx>
51 #include <svtools/ehdl.hxx>
52 #include <tools/diagnose_ex.h>
53 #include <com/sun/star/container/XIndexAccess.hpp>
54 #include <com/sun/star/frame/XFramesSupplier.hpp>
55 #include <com/sun/star/frame/FrameSearchFlag.hpp>
56 #include <com/sun/star/frame/XFrame.hpp>
57 #include <com/sun/star/frame/XFrames.hpp>
58 #include <com/sun/star/frame/XFramesSupplier.hpp>
59 #include <com/sun/star/awt/XWindow.hpp>
60 #include <com/sun/star/frame/XController.hpp>
61 #include <com/sun/star/frame/XModel2.hpp>
62 #include <com/sun/star/util/XURLTransformer.hpp>
63 #include <com/sun/star/util/XCloseable.hpp>
64 #include <com/sun/star/frame/XDispatchRecorderSupplier.hpp>
65 #include <com/sun/star/document/MacroExecMode.hpp>
66 #include <com/sun/star/document/UpdateDocMode.hpp>
67 #include <com/sun/star/beans/XPropertySet.hpp>
68 #include <com/sun/star/uri/XUriReferenceFactory.hpp>
69 #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
70 #include <com/sun/star/embed/XStorage.hpp>
71 #include <com/sun/star/embed/EmbedStates.hpp>
72 #include <com/sun/star/document/XViewDataSupplier.hpp>
73 #include <com/sun/star/container/XIndexContainer.hpp>
74 #include <rtl/ustrbuf.hxx>
75 
76 #include <unotools/localfilehelper.hxx>
77 #include <unotools/ucbhelper.hxx>
78 #include <comphelper/processfactory.hxx>
79 #include <comphelper/componentcontext.hxx>
80 #include <comphelper/namedvaluecollection.hxx>
81 #include <comphelper/configurationhelper.hxx>
82 #include <comphelper/docpasswordrequest.hxx>
83 #include <comphelper/docpasswordhelper.hxx>
84 
85 #include <com/sun/star/uno/Reference.h>
86 #include <com/sun/star/ucb/XContent.hpp>
87 
88 #include <basic/basmgr.hxx>
89 #include <basic/sbmod.hxx>
90 #include <basic/sbmeth.hxx>
91 #include <basic/sbx.hxx>
92 #include <comphelper/storagehelper.hxx>
93 #include <svtools/asynclink.hxx>
94 #include <svl/sharecontrolfile.hxx>
95 #include <svtools/svtools.hrc>
96 #include <svtools/svtdata.hxx>
97 #include <framework/framelistanalyzer.hxx>
98 
99 #include <boost/optional.hpp>
100 
101 using namespace ::com::sun::star;
102 using namespace ::com::sun::star::uno;
103 using namespace ::com::sun::star::ucb;
104 using namespace ::com::sun::star::frame;
105 using namespace ::com::sun::star::lang;
106 using ::com::sun::star::awt::XWindow;
107 using ::com::sun::star::beans::PropertyValue;
108 using ::com::sun::star::document::XViewDataSupplier;
109 using ::com::sun::star::container::XIndexContainer;
110 namespace css = ::com::sun::star;
111 
112 // wg. ViewFrame::Current
113 #include "appdata.hxx"
114 #include <sfx2/taskpane.hxx>
115 #include <sfx2/app.hxx>
116 #include <sfx2/objface.hxx>
117 #include "openflag.hxx"
118 #include "objshimp.hxx"
119 #include <sfx2/viewsh.hxx>
120 #include <sfx2/objsh.hxx>
121 #include <sfx2/bindings.hxx>
122 #include <sfx2/dispatch.hxx>
123 #include "arrdecl.hxx"
124 #include "sfxtypes.hxx"
125 #include <sfx2/request.hxx>
126 #include <sfx2/docfac.hxx>
127 #include <sfx2/ipclient.hxx>
128 #include "sfx2/sfxresid.hxx"
129 #include "appbas.hxx"
130 #include <sfx2/objitem.hxx>
131 #include "sfx2/viewfac.hxx"
132 #include <sfx2/event.hxx>
133 #include "fltfnc.hxx"
134 #include <sfx2/docfile.hxx>
135 #include <sfx2/module.hxx>
136 #include <sfx2/msgpool.hxx>
137 #include <sfx2/viewfrm.hxx>
138 #include "viewimp.hxx"
139 #include <sfx2/sfxbasecontroller.hxx>
140 #include <sfx2/sfx.hrc>
141 #include "view.hrc"
142 #include <sfx2/frmdescr.hxx>
143 #include <sfx2/sfxuno.hxx>
144 #include <sfx2/progress.hxx>
145 #include "workwin.hxx"
146 #include "helper.hxx"
147 #include "macro.hxx"
148 #include "sfx2/minfitem.hxx"
149 #include "../appl/app.hrc"
150 #include "impviewframe.hxx"
151 
152 //-------------------------------------------------------------------------
153 DBG_NAME(SfxViewFrame)
154 
155 #define SfxViewFrame
156 #include "sfxslots.hxx"
157 #undef SfxViewFrame
158 
159 //-------------------------------------------------------------------------
160 
161 SFX_IMPL_INTERFACE(SfxViewFrame,SfxShell,SfxResId(0))
162 {
163     SFX_CHILDWINDOW_REGISTRATION( SID_BROWSER );
164     SFX_CHILDWINDOW_REGISTRATION( SID_RECORDING_FLOATWINDOW );
165 
166     SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_FULLSCREEN | SFX_VISIBILITY_FULLSCREEN, SfxResId(RID_FULLSCREENTOOLBOX) );
167     SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_APPLICATION | SFX_VISIBILITY_STANDARD, SfxResId(RID_ENVTOOLBOX) );
168 }
169 
170 TYPEINIT2(SfxViewFrame,SfxShell,SfxListener);
171 TYPEINIT1(SfxViewFrameItem, SfxPoolItem);
172 
173 //=========================================================================
174 
175 //-------------------------------------------------------------------------
176 namespace
177 {
178     bool moduleHasToolPanels( SfxViewFrame_Impl& i_rViewFrameImpl )
179     {
180         if ( !i_rViewFrameImpl.aHasToolPanels )
181         {
182             i_rViewFrameImpl.aHasToolPanels.reset( ::sfx2::ModuleTaskPane::ModuleHasToolPanels(
183                 i_rViewFrameImpl.rFrame.GetFrameInterface() ) );
184         }
185         return *i_rViewFrameImpl.aHasToolPanels;
186     }
187 }
188 
189 //-------------------------------------------------------------------------
190 static sal_Bool AskPasswordToModify_Impl( const uno::Reference< task::XInteractionHandler >& xHandler, const ::rtl::OUString& aPath, const SfxFilter* pFilter, sal_uInt32 nPasswordHash, const uno::Sequence< beans::PropertyValue > aInfo )
191 {
192     // TODO/LATER: In future the info should replace the direct hash completely
193     sal_Bool bResult = ( !nPasswordHash && !aInfo.getLength() );
194 
195     OSL_ENSURE( pFilter && ( pFilter->GetFilterFlags() & SFX_FILTER_PASSWORDTOMODIFY ), "PasswordToModify feature is active for a filter that does not support it!" );
196 
197     if ( pFilter && xHandler.is() )
198     {
199         sal_Bool bCancel = sal_False;
200         sal_Bool bFirstTime = sal_True;
201 
202         while ( !bResult && !bCancel )
203         {
204             sal_Bool bMSType = !pFilter->IsOwnFormat();
205 
206             ::rtl::Reference< ::comphelper::DocPasswordRequest > pPasswordRequest(
207                  new ::comphelper::DocPasswordRequest(
208                  bMSType ? ::comphelper::DocPasswordRequestType_MS : ::comphelper::DocPasswordRequestType_STANDARD,
209                  bFirstTime ? ::com::sun::star::task::PasswordRequestMode_PASSWORD_ENTER : ::com::sun::star::task::PasswordRequestMode_PASSWORD_REENTER,
210                  aPath,
211                  sal_True ) );
212 
213             uno::Reference< com::sun::star::task::XInteractionRequest > rRequest( pPasswordRequest.get() );
214             xHandler->handle( rRequest );
215 
216             if ( pPasswordRequest->isPassword() )
217             {
218                 if ( aInfo.getLength() )
219                 {
220                     bResult = ::comphelper::DocPasswordHelper::IsModifyPasswordCorrect( pPasswordRequest->getPasswordToModify(), aInfo );
221                 }
222                 else
223                 {
224                     // the binary format
225                     bResult = ( SfxMedium::CreatePasswordToModifyHash( pPasswordRequest->getPasswordToModify(), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.TextDocument" ) ).equals( pFilter->GetServiceName() ) ) == nPasswordHash );
226                 }
227             }
228             else
229                 bCancel = sal_True;
230 
231             bFirstTime = sal_False;
232         }
233     }
234 
235     return bResult;
236 }
237 
238 //-------------------------------------------------------------------------
239 void SfxViewFrame::SetDowning_Impl()
240 {
241     pImp->bIsDowning = sal_True;
242 }
243 
244 //-------------------------------------------------------------------------
245 sal_Bool SfxViewFrame::IsDowning_Impl() const
246 {
247     return pImp->bIsDowning;
248 }
249 
250 
251 //--------------------------------------------------------------------
252 class SfxViewNotificatedFrameList_Impl :
253     public SfxListener, public SfxViewFrameArr_Impl
254 {
255 public:
256 
257     void InsertViewFrame( SfxViewFrame* pFrame )
258     {
259         StartListening( *pFrame );
260         C40_INSERT( SfxViewFrame, pFrame, Count() );
261     }
262     void Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
263 };
264 
265 //-------------------------------------------------------------------------
266 void SfxViewNotificatedFrameList_Impl::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
267 {
268     if ( rHint.IsA(TYPE(SfxSimpleHint)) )
269     {
270         switch( ( (SfxSimpleHint&) rHint ).GetId() )
271         {
272             case SFX_HINT_DYING:
273                 SfxViewFrame* pFrame = (SfxViewFrame*) &rBC;
274                 if( pFrame )
275                 {
276                     sal_uInt16 nPos = C40_GETPOS( SfxViewFrame, pFrame );
277                     if( nPos != USHRT_MAX )
278 						Remove( nPos );
279                 }
280                 break;
281         }
282     }
283 }
284 
285 //-------------------------------------------------------------------------
286 
287 long ReloadDecouple_Impl( void* pObj, void* pArg )
288 {
289     ((SfxViewFrame*) pObj)->ExecReload_Impl( *(SfxRequest*)pArg );
290     return 0;
291 }
292 
293 void SfxViewFrame::ExecReload_Impl( SfxRequest& rReq, sal_Bool bAsync )
294 {
295 	if( bAsync )
296 	{
297 		if( !pImp->pReloader )
298             pImp->pReloader = new svtools::AsynchronLink(
299 				Link( this, ReloadDecouple_Impl ) );
300 		pImp->pReloader->Call( new SfxRequest( rReq ) );
301 	}
302 	else ExecReload_Impl( rReq );
303 }
304 
305 void SfxViewFrame::ExecReload_Impl( SfxRequest& rReq )
306 {
307     SfxFrame *pParent = GetFrame().GetParentFrame();
308 	if ( rReq.GetSlot() == SID_RELOAD )
309 	{
310         // Bei CTRL-Reload den aktiven Frame reloaden
311         SfxViewFrame* pActFrame = this;
312         while ( pActFrame )
313             pActFrame = pActFrame->GetActiveChildFrame_Impl();
314 
315         if ( pActFrame )
316         {
317             sal_uInt16 nModifier = rReq.GetModifier();
318             if ( nModifier & KEY_MOD1 )
319             {
320                 pActFrame->ExecReload_Impl( rReq );
321                 return;
322             }
323         }
324 
325 		// Wenn nur ein Reload der Graphiken eines oder mehrerer ChildFrames
326 		// gemacht werden soll
327 		SfxFrame& rFrame = GetFrame();
328 		if ( pParent == &rFrame && rFrame.GetChildFrameCount() )
329 		{
330 			sal_Bool bReloadAvailable = sal_False;
331 			SfxFrameIterator aIter( rFrame, sal_False );
332 			SfxFrame *pChild = aIter.FirstFrame();
333 			while ( pChild )
334 			{
335 				SfxFrame *pNext = aIter.NextFrame( *pChild );
336 				SfxObjectShell *pShell = pChild->GetCurrentDocument();
337 				if( pShell && pShell->Get_Impl()->bReloadAvailable )
338 				{
339 					bReloadAvailable = sal_True;
340 					pChild->GetCurrentViewFrame()->ExecuteSlot( rReq );
341 				}
342 				pChild = pNext;
343 			}
344 
345 			// Der TopLevel-Frame selbst het keine Graphiken!
346 			if ( bReloadAvailable )
347 				return;
348 		}
349     }
350     else
351     {
352         // Bei CTRL-Edit den TopFrame bearbeiten
353         sal_uInt16 nModifier = rReq.GetModifier();
354 
355         if ( ( nModifier & KEY_MOD1 ) && pParent )
356         {
357             SfxViewFrame *pTop = GetTopViewFrame();
358             pTop->ExecReload_Impl( rReq );
359             return;
360         }
361     }
362 
363     SfxObjectShell* pSh = GetObjectShell();
364     switch ( rReq.GetSlot() )
365     {
366         case SID_EDITDOC:
367         {
368 			if ( GetFrame().HasComponent() )
369 				break;
370 
371             // Wg. Doppeltbelegung in Toolboxen (mit/ohne Ctrl) ist es auch
372             // m"oglich, da\s der Slot zwar enabled ist, aber Ctrl-Click
373             // trotzdem nicht geht!
374             if( !pSh || !pSh->HasName() || !(pSh->Get_Impl()->nLoadedFlags & SFX_LOADED_MAINDOCUMENT ))
375                 break;
376 
377             SfxMedium* pMed = pSh->GetMedium();
378 
379             SFX_ITEMSET_ARG( pSh->GetMedium()->GetItemSet(), pItem, SfxBoolItem, SID_VIEWONLY, sal_False );
380         	if ( pItem && pItem->GetValue() )
381 			{
382 				SfxApplication* pApp = SFX_APP();
383 				SfxAllItemSet aSet( pApp->GetPool() );
384 				aSet.Put( SfxStringItem( SID_FILE_NAME, pMed->GetURLObject().GetMainURL(INetURLObject::NO_DECODE) ) );
385 				aSet.Put( SfxBoolItem( SID_TEMPLATE, sal_True ) );
386 				aSet.Put( SfxStringItem( SID_TARGETNAME, String::CreateFromAscii("_blank") ) );
387                 SFX_ITEMSET_ARG( pMed->GetItemSet(), pReferer, SfxStringItem, SID_REFERER, sal_False );
388 				if ( pReferer )
389 					aSet.Put( *pReferer );
390 		        SFX_ITEMSET_ARG( pSh->GetMedium()->GetItemSet(), pVersionItem, SfxInt16Item, SID_VERSION, sal_False );
391 				if ( pVersionItem )
392 					aSet.Put( *pVersionItem );
393 
394 				if( pMed->GetFilter() )
395 				{
396                     aSet.Put( SfxStringItem( SID_FILTER_NAME, pMed->GetFilter()->GetFilterName() ) );
397 			        SFX_ITEMSET_ARG( pMed->GetItemSet(), pOptions, SfxStringItem, SID_FILE_FILTEROPTIONS, sal_False );
398 					if ( pOptions )
399 						aSet.Put( *pOptions );
400 				}
401 
402                 GetDispatcher()->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, aSet );
403                 return;
404 			}
405 
406             sal_uInt16 nOpenMode;
407             sal_Bool bNeedsReload = sal_False;
408             if ( !pSh->IsReadOnly() )
409             {
410                 // Speichern und Readonly Reloaden
411                 if( pSh->IsModified() )
412                 {
413                     if ( pSh->PrepareClose() )
414                     {
415                         // the storing could let the medium be changed
416                         pMed = pSh->GetMedium();
417                         bNeedsReload = sal_True;
418                     }
419                     else
420                     {
421                         rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), sal_False ) );
422                         return;
423                     }
424                 }
425                 nOpenMode = SFX_STREAM_READONLY;
426             }
427             else
428 			{
429                 if ( pSh->IsReadOnlyMedium()
430                   && ( pSh->GetModifyPasswordHash() || pSh->GetModifyPasswordInfo().getLength() )
431                   && !pSh->IsModifyPasswordEntered() )
432                 {
433                     ::rtl::OUString aDocumentName = INetURLObject( pMed->GetOrigURL() ).GetMainURL( INetURLObject::DECODE_WITH_CHARSET );
434                     if( !AskPasswordToModify_Impl( pMed->GetInteractionHandler(), aDocumentName, pMed->GetOrigFilter(), pSh->GetModifyPasswordHash(), pSh->GetModifyPasswordInfo() ) )
435                     {
436                         // this is a read-only document, if it has "Password to modify"
437                         // the user should enter password before he can edit the document
438                         rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), sal_False ) );
439                         return;
440                     }
441 
442                     pSh->SetModifyPasswordEntered();
443                 }
444 
445                 nOpenMode = SFX_STREAM_READWRITE;
446                 pSh->SetReadOnlyUI( sal_False );
447 
448                 // if only the view was in the readonly mode then there is no need to do the reload
449                 if ( !pSh->IsReadOnly() )
450                     return;
451 			}
452 
453 			// Parameter auswerten
454             // sal_Bool bReload = sal_True;
455 			if ( rReq.IsAPI() )
456 			{
457 				// per API steuern ob r/w oder r/o
458             	SFX_REQUEST_ARG(rReq, pEditItem, SfxBoolItem, SID_EDITDOC, sal_False);
459 				if ( pEditItem )
460 					nOpenMode = pEditItem->GetValue() ? SFX_STREAM_READWRITE : SFX_STREAM_READONLY;
461 			}
462 
463 			// doing
464 
465             String aTemp;
466             utl::LocalFileHelper::ConvertPhysicalNameToURL( pMed->GetPhysicalName(), aTemp );
467             INetURLObject aPhysObj( aTemp );
468             SFX_ITEMSET_ARG( pSh->GetMedium()->GetItemSet(),
469                              pVersionItem, SfxInt16Item, SID_VERSION, sal_False );
470 
471             INetURLObject aMedObj( pMed->GetName() );
472 
473             // the logic below is following, if the document seems not to need to be reloaded and the physical name is different
474             // to the logical one, then on file system it can be checked that the copy is still newer than the original and no document reload is required
475             if ( ( !bNeedsReload && ( (aMedObj.GetProtocol() == INET_PROT_FILE &&
476                     aMedObj.getFSysPath(INetURLObject::FSYS_DETECT) != aPhysObj.getFSysPath(INetURLObject::FSYS_DETECT) &&
477                     !::utl::UCBContentHelper::IsYounger( aMedObj.GetMainURL( INetURLObject::NO_DECODE ), aPhysObj.GetMainURL( INetURLObject::NO_DECODE ) ))
478                   || pMed->IsRemote() ) )
479                || pVersionItem )
480             {
481                 sal_Bool bOK = sal_False;
482                 if ( !pVersionItem )
483                 {
484                     sal_Bool bHasStorage = pMed->HasStorage_Impl();
485                     // switching edit mode could be possible without reload
486                     if ( bHasStorage && pMed->GetStorage() == pSh->GetStorage() )
487                     {
488                         // TODO/LATER: faster creation of copy
489                         if ( !pSh->ConnectTmpStorage_Impl( pMed->GetStorage(), pMed ) )
490                             return;
491                     }
492 
493                     pMed->CloseAndRelease();
494                     pMed->GetItemSet()->Put( SfxBoolItem( SID_DOC_READONLY, !( nOpenMode & STREAM_WRITE ) ) );
495                     pMed->SetOpenMode( nOpenMode, pMed->IsDirect() );
496 
497                     pMed->CompleteReOpen();
498                     if ( nOpenMode & STREAM_WRITE )
499                         pMed->LockOrigFileOnDemand( sal_False, sal_True );
500 
501                     // LockOrigFileOnDemand might set the readonly flag itself, it should be set back
502                     pMed->GetItemSet()->Put( SfxBoolItem( SID_DOC_READONLY, !( nOpenMode & STREAM_WRITE ) ) );
503 
504                     if ( !pMed->GetErrorCode() )
505                         bOK = sal_True;
506                 }
507 
508                 if( !bOK )
509                 {
510                     ErrCode nErr = pMed->GetErrorCode();
511                     if ( pVersionItem )
512                         nErr = ERRCODE_IO_ACCESSDENIED;
513                     else
514                     {
515                         pMed->ResetError();
516                         pMed->SetOpenMode( SFX_STREAM_READONLY, pMed->IsDirect() );
517                         pMed->ReOpen();
518                         pSh->DoSaveCompleted( pMed );
519                     }
520 
521                     // r/o-Doc kann nicht in Editmode geschaltet werden?
522                     rReq.Done( sal_False );
523 
524                     if ( nOpenMode == SFX_STREAM_READWRITE && !rReq.IsAPI() )
525                     {
526                         // dem ::com::sun::star::sdbcx::User anbieten, als Vorlage zu oeffnen
527                         QueryBox aBox( &GetWindow(), SfxResId(MSG_QUERY_OPENASTEMPLATE) );
528                         if ( RET_YES == aBox.Execute() )
529                         {
530                             SfxApplication* pApp = SFX_APP();
531                             SfxAllItemSet aSet( pApp->GetPool() );
532                             aSet.Put( SfxStringItem( SID_FILE_NAME, pMed->GetName() ) );
533                             SFX_ITEMSET_ARG( pMed->GetItemSet(), pReferer, SfxStringItem, SID_REFERER, sal_False );
534                             if ( pReferer )
535                                 aSet.Put( *pReferer );
536                             aSet.Put( SfxBoolItem( SID_TEMPLATE, sal_True ) );
537                             if ( pVersionItem )
538                                 aSet.Put( *pVersionItem );
539 
540                             if( pMed->GetFilter() )
541                             {
542                                 aSet.Put( SfxStringItem( SID_FILTER_NAME, pMed->GetFilter()->GetFilterName() ) );
543                                 SFX_ITEMSET_ARG( pMed->GetItemSet(), pOptions,
544                                                  SfxStringItem, SID_FILE_FILTEROPTIONS, sal_False );
545                                 if ( pOptions )
546                                     aSet.Put( *pOptions );
547                             }
548 
549                             GetDispatcher()->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, aSet );
550                             return;
551                         }
552                         else
553                             nErr = 0;
554                     }
555 
556                     ErrorHandler::HandleError( nErr );
557                     rReq.SetReturnValue(
558                         SfxBoolItem( rReq.GetSlot(), sal_False ) );
559                     return;
560                 }
561                 else
562                 {
563                     pSh->DoSaveCompleted( pMed );
564                     pSh->Broadcast( SfxSimpleHint(SFX_HINT_MODECHANGED) );
565                     rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), sal_True ) );
566                     rReq.Done( sal_True );
567                     // if( nOpenMode == SFX_STREAM_READONLY )
568                     //    pMed->Close();
569                     return;
570                 }
571             }
572 
573             rReq.AppendItem( SfxBoolItem( SID_FORCERELOAD, sal_True) );
574             rReq.AppendItem( SfxBoolItem( SID_SILENT, sal_True ));
575         }
576 
577         case SID_RELOAD:
578         {
579             // Wg. Doppeltbelegung in Toolboxen (mit/ohne Ctrl) ist es auch
580             // m"oglich, da\s der Slot zwar enabled ist, aber Ctrl-Click
581             // trotzdem nicht geht!
582             if ( !pSh || !pSh->CanReload_Impl() )
583                 break;
584             SfxApplication* pApp = SFX_APP();
585             SFX_REQUEST_ARG(rReq, pForceReloadItem, SfxBoolItem,
586                             SID_FORCERELOAD, sal_False);
587             if(  pForceReloadItem && !pForceReloadItem->GetValue() &&
588                 !pSh->GetMedium()->IsExpired() )
589                 return;
590             if( pImp->bReloading || pSh->IsInModalMode() )
591                 return;
592 
593             // AutoLoad ist ggf. verboten
594             SFX_REQUEST_ARG(rReq, pAutoLoadItem, SfxBoolItem, SID_AUTOLOAD, sal_False);
595             if ( pAutoLoadItem && pAutoLoadItem->GetValue() &&
596                  GetFrame().IsAutoLoadLocked_Impl() )
597                 return;
598 
599             SfxObjectShellLock xOldObj( pSh );
600             pImp->bReloading = sal_True;
601             SFX_REQUEST_ARG(rReq, pURLItem, SfxStringItem,
602                             SID_FILE_NAME, sal_False);
603             // editierbar "offnen?
604             sal_Bool bForEdit = !pSh->IsReadOnly();
605             if ( rReq.GetSlot() == SID_EDITDOC )
606                 bForEdit = !bForEdit;
607 
608             // ggf. beim User nachfragen
609             sal_Bool bDo = ( GetViewShell()->PrepareClose() != sal_False );
610             SFX_REQUEST_ARG(rReq, pSilentItem, SfxBoolItem, SID_SILENT, sal_False);
611             if ( bDo && GetFrame().DocIsModified_Impl() &&
612 				 !rReq.IsAPI() && ( !pSilentItem || !pSilentItem->GetValue() ) )
613             {
614                 QueryBox aBox( &GetWindow(), SfxResId(MSG_QUERY_LASTVERSION) );
615                 bDo = ( RET_YES == aBox.Execute() );
616             }
617 
618             if ( bDo )
619             {
620                 SfxMedium *pMedium = xOldObj->GetMedium();
621 
622 				// Frameset abziehen, bevor FramesetView evtl. verschwindet
623 				String aURL = pURLItem ? pURLItem->GetValue() :
624 								pMedium->GetName();
625 
626                 sal_Bool bHandsOff =
627                     ( pMedium->GetURLObject().GetProtocol() == INET_PROT_FILE && !xOldObj->IsDocShared() );
628 
629                 // bestehende SfxMDIFrames f"ur dieses Doc leeren
630                 // eigenes Format oder R/O jetzt editierbar "offnen?
631                 SfxObjectShellLock xNewObj;
632 
633                 // collect the views of the document
634                 // TODO: when UNO ViewFactories are available for SFX-based documents, the below code should
635                 // be UNOized, too
636                 typedef ::std::pair< Reference< XFrame >, sal_uInt16 >  ViewDescriptor;
637                 ::std::list< ViewDescriptor > aViewFrames;
638                 SfxViewFrame *pView = GetFirst( xOldObj );
639 				while ( pView )
640 				{
641                     Reference< XFrame > xFrame( pView->GetFrame().GetFrameInterface() );
642                     OSL_ENSURE( xFrame.is(), "SfxViewFrame::ExecReload_Impl: no XFrame?!" );
643 					aViewFrames.push_back( ViewDescriptor( xFrame, pView->GetCurViewId() ) );
644 
645                     pView = GetNext( *pView, xOldObj );
646 				}
647 
648                 DELETEZ( xOldObj->Get_Impl()->pReloadTimer );
649 
650                 SfxItemSet* pNewSet = 0;
651                 const SfxFilter *pFilter = pMedium->GetFilter();
652                 if( pURLItem )
653 				{
654 					pNewSet = new SfxAllItemSet( pApp->GetPool() );
655 					pNewSet->Put( *pURLItem );
656 
657 					// Filter Detection
658 					SfxMedium aMedium( pURLItem->GetValue(), SFX_STREAM_READWRITE );
659 					SfxFilterMatcher().GuessFilter( aMedium, &pFilter );
660 					if ( pFilter )
661 	                    pNewSet->Put( SfxStringItem( SID_FILTER_NAME, pFilter->GetName() ) );
662 					pNewSet->Put( *aMedium.GetItemSet() );
663 				}
664 				else
665 				{
666 					pNewSet = new SfxAllItemSet( *pMedium->GetItemSet() );
667 					pNewSet->ClearItem( SID_VIEW_ID );
668 					pNewSet->ClearItem( SID_STREAM );
669 					pNewSet->ClearItem( SID_INPUTSTREAM );
670                     pNewSet->Put( SfxStringItem( SID_FILTER_NAME, pMedium->GetFilter()->GetName() ) );
671 
672                     // let the current security settings be checked again
673                     pNewSet->Put( SfxUInt16Item( SID_MACROEXECMODE, document::MacroExecMode::USE_CONFIG ) );
674 
675                     if ( rReq.GetSlot() == SID_EDITDOC || !bForEdit )
676                         // edit mode is switched or reload of readonly document
677                         pNewSet->Put( SfxBoolItem( SID_DOC_READONLY, !bForEdit ) );
678                     else
679                         // Reload of file opened for writing
680                         pNewSet->ClearItem( SID_DOC_READONLY );
681 				}
682 
683 				// Falls eine salvagede Datei vorliegt, nicht nochmals die
684 				// OrigURL mitschicken, denn die Tempdate ist nach Reload
685 				// ungueltig
686                 SFX_ITEMSET_ARG( pNewSet, pSalvageItem, SfxStringItem, SID_DOC_SALVAGE, sal_False);
687 				if( pSalvageItem )
688 				{
689 					aURL = pSalvageItem->GetValue();
690 					pNewSet->ClearItem( SID_DOC_SALVAGE );
691 				}
692 
693                 // TODO/LATER: Temporary solution, the SfxMedium must know the original URL as aLogicName
694                 //             SfxMedium::Transfer_Impl() will be vorbidden then.
695                 if ( xOldObj->IsDocShared() )
696                     pNewSet->Put( SfxStringItem( SID_FILE_NAME, xOldObj->GetSharedFileURL() ) );
697 
698                 //pNewMedium = new SfxMedium( aURL, nMode, pMedium->IsDirect(), bUseFilter ? pMedium->GetFilter() : 0, pNewSet );
699                 //pNewSet = pNewMedium->GetItemSet();
700                 if ( pURLItem )
701 					pNewSet->Put( SfxStringItem( SID_REFERER, pMedium->GetName() ) );
702                 else
703                     pNewSet->Put( SfxStringItem( SID_REFERER, String() ) );
704 
705                 xOldObj->CancelTransfers();
706 
707                 // eigentliches Reload
708                 //pNewSet->Put( SfxFrameItem ( SID_DOCFRAME, GetFrame() ) );
709 
710                 if ( pSilentItem && pSilentItem->GetValue() )
711                     pNewSet->Put( SfxBoolItem( SID_SILENT, sal_True ) );
712 
713 		        SFX_ITEMSET_ARG(pNewSet, pInteractionItem, SfxUnoAnyItem, SID_INTERACTIONHANDLER, sal_False);
714 		        SFX_ITEMSET_ARG(pNewSet, pMacroExecItem  , SfxUInt16Item, SID_MACROEXECMODE     , sal_False);
715 		        SFX_ITEMSET_ARG(pNewSet, pDocTemplateItem, SfxUInt16Item, SID_UPDATEDOCMODE     , sal_False);
716 
717 		        if (!pInteractionItem)
718 		        {
719 		            Reference < ::com::sun::star::task::XInteractionHandler > xHdl( ::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.comp.uui.UUIInteractionHandler")), UNO_QUERY );
720 		            if (xHdl.is())
721 		                pNewSet->Put( SfxUnoAnyItem(SID_INTERACTIONHANDLER,::com::sun::star::uno::makeAny(xHdl)) );
722 		        }
723 
724 		        if (!pMacroExecItem)
725 		            pNewSet->Put( SfxUInt16Item(SID_MACROEXECMODE,::com::sun::star::document::MacroExecMode::USE_CONFIG) );
726 		        if (!pDocTemplateItem)
727 		            pNewSet->Put( SfxUInt16Item(SID_UPDATEDOCMODE,::com::sun::star::document::UpdateDocMode::ACCORDING_TO_CONFIG) );
728 
729 				xOldObj->SetModified( sal_False );
730                 // Altes Dok nicht cachen! Gilt nicht, wenn anderes
731 				// Doc geladen wird.
732 
733                 SFX_ITEMSET_ARG( pMedium->GetItemSet(), pSavedOptions, SfxStringItem, SID_FILE_FILTEROPTIONS, sal_False);
734                 SFX_ITEMSET_ARG( pMedium->GetItemSet(), pSavedReferer, SfxStringItem, SID_REFERER, sal_False);
735 
736                 sal_Bool bHasStorage = pMedium->HasStorage_Impl();
737                 if( bHandsOff )
738                 {
739                     if ( bHasStorage && pMedium->GetStorage() == xOldObj->GetStorage() )
740                     {
741                         // TODO/LATER: faster creation of copy
742 						if ( !xOldObj->ConnectTmpStorage_Impl( pMedium->GetStorage(), pMedium ) )
743                             return;
744                     }
745 
746                     pMedium->CloseAndRelease();
747                 }
748 
749                 xNewObj = SfxObjectShell::CreateObject( pFilter->GetServiceName(), SFX_CREATE_MODE_STANDARD );
750 
751                 if ( xOldObj->IsModifyPasswordEntered() )
752                     xNewObj->SetModifyPasswordEntered();
753 
754                 uno::Sequence < beans::PropertyValue > aLoadArgs;
755                 TransformItems( SID_OPENDOC, *pNewSet, aLoadArgs );
756                 try
757                 {
758                     uno::Reference < frame::XLoadable > xLoad( xNewObj->GetModel(), uno::UNO_QUERY );
759                     xLoad->load( aLoadArgs );
760                 }
761                 catch ( uno::Exception& )
762                 {
763                     xNewObj->DoClose();
764                     xNewObj = 0;
765                 }
766 
767 				DELETEZ( pNewSet );
768 
769                 if( !xNewObj.Is() )
770                 {
771 					if( bHandsOff )
772                     {
773                         // back to old medium
774                         pMedium->ReOpen();
775                         pMedium->LockOrigFileOnDemand( sal_False, sal_True );
776 
777                         xOldObj->DoSaveCompleted( pMedium );
778                     }
779 
780                     // r/o-Doc couldn't be switched to writing mode
781                     if ( bForEdit && SID_EDITDOC == rReq.GetSlot() )
782                     {
783                         // ask user for opening as template
784                         QueryBox aBox( &GetWindow(), SfxResId(MSG_QUERY_OPENASTEMPLATE) );
785                         if ( RET_YES == aBox.Execute() )
786                         {
787 							SfxAllItemSet aSet( pApp->GetPool() );
788                             aSet.Put( SfxStringItem( SID_FILE_NAME, pMedium->GetName() ) );
789                             aSet.Put( SfxStringItem( SID_TARGETNAME, String::CreateFromAscii("_blank") ) );
790                             if ( pSavedOptions )
791                                 aSet.Put( *pSavedOptions );
792                             if ( pSavedReferer )
793                                 aSet.Put( *pSavedReferer );
794 							aSet.Put( SfxBoolItem( SID_TEMPLATE, sal_True ) );
795                             if( pFilter )
796                                 aSet.Put( SfxStringItem( SID_FILTER_NAME, pFilter->GetFilterName() ) );
797                             GetDispatcher()->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, aSet );
798                         }
799                     }
800 					else
801 					{
802                         // an error handling should be done here?!
803                         // if ( !pSilentItem || !pSilentItem->GetValue() )
804                         //    ErrorHandler::HandleError( nLoadError );
805 					}
806                 }
807                 else
808                 {
809                     if ( xNewObj->GetModifyPasswordHash() && xNewObj->GetModifyPasswordHash() != xOldObj->GetModifyPasswordHash() )
810                     {
811                         xNewObj->SetModifyPasswordEntered( sal_False );
812                         xNewObj->SetReadOnly();
813                     }
814                     else if ( rReq.GetSlot() == SID_EDITDOC && bForEdit && !xNewObj->IsReadOnlyMedium() )
815                     {
816                         // the filter might request setting of the document to readonly state
817                         // but in case of SID_EDITDOC it should not happen if the document
818                         // can be opened for editing
819                         xNewObj->SetReadOnlyUI( sal_False );
820                     }
821 
822                     if ( xNewObj->IsDocShared() )
823                     {
824                         // the file is shared but the closing can change the sharing control file
825                         xOldObj->DoNotCleanShareControlFile();
826                     }
827 
828                     // the Reload and Silent items were only temporary, remove them
829 					xNewObj->GetMedium()->GetItemSet()->ClearItem( SID_RELOAD );
830 					xNewObj->GetMedium()->GetItemSet()->ClearItem( SID_SILENT );
831                     TransformItems( SID_OPENDOC, *xNewObj->GetMedium()->GetItemSet(), aLoadArgs );
832 
833 					UpdateDocument_Impl();
834 
835                     try
836                     {
837                         while ( !aViewFrames.empty() )
838                         {
839                             LoadViewIntoFrame_Impl( *xNewObj, aViewFrames.front().first, aLoadArgs, aViewFrames.front().second, false );
840                             aViewFrames.pop_front();
841                         }
842                     }
843                     catch( const Exception& )
844                     {
845                         // close the remaining frames
846                         // Don't catch exceptions herein, if this fails, then we're left in an indetermined state, and
847                         // crashing is better than trying to proceed
848                         while ( !aViewFrames.empty() )
849                         {
850                             Reference< util::XCloseable > xClose( aViewFrames.front().first, UNO_QUERY_THROW );
851                             xClose->close( sal_True );
852                             aViewFrames.pop_front();
853                         }
854                     }
855 
856                     // Propagate document closure.
857                     SFX_APP()->NotifyEvent( SfxEventHint( SFX_EVENT_CLOSEDOC, GlobalEventConfig::GetEventName( STR_EVENT_CLOSEDOC ), xOldObj ) );
858                 }
859 
860                 // als erledigt recorden
861                 rReq.Done( sal_True );
862                 rReq.SetReturnValue(SfxBoolItem(rReq.GetSlot(), sal_True));
863                 return;
864             }
865             else
866             {
867                 // als nicht erledigt recorden
868                 rReq.Done();
869                 rReq.SetReturnValue(SfxBoolItem(rReq.GetSlot(), sal_False));
870                 pImp->bReloading = sal_False;
871                 return;
872             }
873         }
874     }
875 }
876 
877 //-------------------------------------------------------------------------
878 void SfxViewFrame::StateReload_Impl( SfxItemSet& rSet )
879 {
880     SfxObjectShell* pSh = GetObjectShell();
881 	if ( !pSh )
882 		// Ich bin gerade am Reloaden und Yielde so vor mich hin ...
883 		return;
884 
885     GetFrame().GetParentFrame();
886     SfxWhichIter aIter( rSet );
887     for ( sal_uInt16 nWhich = aIter.FirstWhich(); nWhich; nWhich = aIter.NextWhich() )
888     {
889 		if ( GetFrame().HasComponent() )
890 		{
891 			// Wenn die Komponente es nicht selbst dispatched, dann
892 			// macht es auch keinen Sinn!
893 			rSet.DisableItem( nWhich );
894 			continue;
895 		}
896 
897         switch ( nWhich )
898         {
899             case SID_EDITDOC:
900             {
901 		        if ( !pSh || !pSh->HasName() || !( pSh->Get_Impl()->nLoadedFlags &  SFX_LOADED_MAINDOCUMENT )
902 				  || pSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
903 		            rSet.DisableItem( SID_EDITDOC );
904 		        else
905 				{
906 					SFX_ITEMSET_ARG( pSh->GetMedium()->GetItemSet(), pItem, SfxBoolItem, SID_EDITDOC, sal_False );
907 					if ( pItem && !pItem->GetValue() )
908 						rSet.DisableItem( SID_EDITDOC );
909 					else
910 						rSet.Put( SfxBoolItem( nWhich, !pSh->IsReadOnly() ) );
911 				}
912                 break;
913             }
914 
915             case SID_RELOAD:
916             {
917 				SfxFrame* pFrame = &GetTopFrame();
918 
919                 if ( !pSh || !pSh->CanReload_Impl() || pSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
920                     rSet.DisableItem(nWhich);
921                 else
922 				{
923 					// Wenn irgendein ChildFrame reloadable ist, wird der Slot
924 					// enabled, damit man CTRL-Reload machen kann
925 					sal_Bool bReloadAvailable = sal_False;
926 					SfxFrameIterator aFrameIter( *pFrame, sal_True );
927 					for( SfxFrame* pNextFrame = aFrameIter.FirstFrame();
928 							pFrame;
929 							pNextFrame = pNextFrame ?
930 								aFrameIter.NextFrame( *pNextFrame ) : 0 )
931 					{
932 						SfxObjectShell *pShell = pFrame->GetCurrentDocument();
933 						if( pShell && pShell->Get_Impl()->bReloadAvailable )
934 						{
935 							bReloadAvailable = sal_True;
936 							break;
937 						}
938 						pFrame = pNextFrame;
939 					}
940 
941                     rSet.Put( SfxBoolItem( nWhich, bReloadAvailable));
942 				}
943 
944                 break;
945             }
946         }
947     }
948 }
949 
950 
951 //--------------------------------------------------------------------
952 void SfxViewFrame::ExecHistory_Impl( SfxRequest &rReq )
953 {
954     // gibt es an der obersten Shell einen Undo-Manager?
955     SfxShell *pSh = GetDispatcher()->GetShell(0);
956     ::svl::IUndoManager* pShUndoMgr = pSh->GetUndoManager();
957     sal_Bool bOK = sal_False;
958     if ( pShUndoMgr )
959     {
960         switch ( rReq.GetSlot() )
961         {
962             case SID_CLEARHISTORY:
963                 pShUndoMgr->Clear();
964                 bOK = sal_True;
965                 break;
966 
967             case SID_UNDO:
968                 pShUndoMgr->Undo();
969                 GetBindings().InvalidateAll(sal_False);
970                 bOK = sal_True;
971                 break;
972 
973             case SID_REDO:
974                 pShUndoMgr->Redo();
975                 GetBindings().InvalidateAll(sal_False);
976                 bOK = sal_True;
977                 break;
978 
979             case SID_REPEAT:
980                 if ( pSh->GetRepeatTarget() )
981                     pShUndoMgr->Repeat( *pSh->GetRepeatTarget() );
982                 bOK = sal_True;
983                 break;
984         }
985     }
986     else if ( GetViewShell() )
987     {
988         // der SW hat eigenes Undo an der View
989         const SfxPoolItem *pRet = GetViewShell()->ExecuteSlot( rReq );
990         if ( pRet )
991             bOK = ((SfxBoolItem*)pRet)->GetValue();
992     }
993 
994     rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), bOK ) );
995     rReq.Done();
996 }
997 
998 //--------------------------------------------------------------------
999 void SfxViewFrame::StateHistory_Impl( SfxItemSet &rSet )
1000 {
1001     // Undo-Manager suchen
1002     SfxShell *pSh = GetDispatcher()->GetShell(0);
1003 	if ( !pSh )
1004 		// Ich bin gerade am Reloaden und Yielde so vor mich hin ...
1005 		return;
1006 
1007     ::svl::IUndoManager *pShUndoMgr = pSh->GetUndoManager();
1008     if ( !pShUndoMgr )
1009     {
1010         // der SW hat eigenes Undo an der View
1011         SfxWhichIter aIter( rSet );
1012         SfxViewShell *pViewSh = GetViewShell();
1013         if( !pViewSh ) return;
1014         for ( sal_uInt16 nSID = aIter.FirstWhich(); nSID; nSID = aIter.NextWhich() )
1015             pViewSh->GetSlotState( nSID, 0, &rSet );
1016         return;
1017     }
1018 
1019     if ( pShUndoMgr->GetUndoActionCount() == 0 &&
1020          pShUndoMgr->GetRedoActionCount() == 0 &&
1021          pShUndoMgr->GetRepeatActionCount() == 0 )
1022         rSet.DisableItem( SID_CLEARHISTORY );
1023 
1024     if ( pShUndoMgr && pShUndoMgr->GetUndoActionCount() )
1025 	{
1026         String aTmp( SvtResId( STR_UNDO ) );
1027 		aTmp+= pShUndoMgr->GetUndoActionComment(0);
1028 		rSet.Put( SfxStringItem( SID_UNDO, aTmp ) );
1029 	}
1030     else
1031         rSet.DisableItem( SID_UNDO );
1032 
1033     if ( pShUndoMgr && pShUndoMgr->GetRedoActionCount() )
1034 	{
1035         String aTmp( SvtResId(STR_REDO) );
1036 		aTmp += pShUndoMgr->GetRedoActionComment(0);
1037 	    rSet.Put( SfxStringItem( SID_REDO, aTmp ) );
1038 	}
1039     else
1040         rSet.DisableItem( SID_REDO );
1041     SfxRepeatTarget *pTarget = pSh->GetRepeatTarget();
1042     if ( pShUndoMgr && pTarget && pShUndoMgr->GetRepeatActionCount() &&
1043          pShUndoMgr->CanRepeat(*pTarget) )
1044 	{
1045         String aTmp( SvtResId(STR_REPEAT) );
1046 		aTmp += pShUndoMgr->GetRepeatActionComment(*pTarget);
1047 		rSet.Put( SfxStringItem( SID_REPEAT, aTmp ) );
1048 	}
1049     else
1050         rSet.DisableItem( SID_REPEAT );
1051 }
1052 
1053 //--------------------------------------------------------------------
1054 void SfxViewFrame::PopShellAndSubShells_Impl( SfxViewShell& i_rViewShell )
1055 {
1056     i_rViewShell.PopSubShells_Impl();
1057     sal_uInt16 nLevel = pDispatcher->GetShellLevel( i_rViewShell );
1058     if ( nLevel != USHRT_MAX )
1059     {
1060         if ( nLevel )
1061         {
1062             // more sub shells on the stack, which were not affected by PopSubShells_Impl
1063             SfxShell *pSubShell = pDispatcher->GetShell( nLevel-1 );
1064             if ( pSubShell == i_rViewShell.GetSubShell() )
1065                 // "real" sub shells will be deleted elsewhere
1066                 pDispatcher->Pop( *pSubShell, SFX_SHELL_POP_UNTIL );
1067             else
1068                 pDispatcher->Pop( *pSubShell, SFX_SHELL_POP_UNTIL | SFX_SHELL_POP_DELETE );
1069         }
1070         pDispatcher->Pop( i_rViewShell );
1071         pDispatcher->Flush();
1072     }
1073 
1074 }
1075 
1076 //--------------------------------------------------------------------
1077 void SfxViewFrame::ReleaseObjectShell_Impl()
1078 
1079 /*  [Beschreibung]
1080 
1081     Diese Methode entleert den SfxViewFrame, d.h. nimmt die <SfxObjectShell>
1082     vom Dispatcher und beendet seine <SfxListener>-Beziehung zu dieser
1083     SfxObjectShell (wodurch sie sich ggf. selbst zerst"ort).
1084 
1085     Somit kann durch Aufruf von ReleaseObjectShell() und SetObjectShell()
1086     die SfxObjectShell ausgetauscht werden.
1087 
1088     Zwischen RealeaseObjectShell() und SetObjectShell() darf die Kontrolle
1089     nicht an das System abgegeben werden.
1090 
1091 
1092     [Querverweise]
1093 
1094     <SfxViewFrame::SetObjectShell(SfxObjectShell&)>
1095 */
1096 {
1097     DBG_CHKTHIS(SfxViewFrame, 0);
1098     DBG_ASSERT( xObjSh.Is(), "no SfxObjectShell to release!" );
1099 
1100 	GetFrame().ReleasingComponent_Impl( sal_True );
1101 	if ( GetWindow().HasChildPathFocus( sal_True ) )
1102 	{
1103 		DBG_ASSERT( !GetActiveChildFrame_Impl(), "Wrong active child frame!" );
1104 		GetWindow().GrabFocus();
1105 	}
1106 
1107 	SfxViewShell *pDyingViewSh = GetViewShell();
1108     if ( pDyingViewSh )
1109     {
1110         PopShellAndSubShells_Impl( *pDyingViewSh );
1111         pDyingViewSh->DisconnectAllClients();
1112         SetViewShell_Impl(0);
1113         delete pDyingViewSh;
1114     }
1115 #ifdef DBG_UTIL
1116     else
1117         DBG_ERROR("Keine Shell");
1118 #endif
1119 
1120     if ( xObjSh.Is() )
1121     {
1122          pImp->aLastType = xObjSh->Type();
1123         pDispatcher->Pop( *xObjSh );
1124         SfxModule* pModule = xObjSh->GetModule();
1125         if( pModule )
1126             pDispatcher->RemoveShell_Impl( *pModule );
1127         pDispatcher->Flush();
1128         EndListening( *xObjSh );
1129 
1130         Notify( *xObjSh, SfxSimpleHint(SFX_HINT_TITLECHANGED) );
1131         Notify( *xObjSh, SfxSimpleHint(SFX_HINT_DOCCHANGED) );
1132 
1133         if ( 1 == xObjSh->GetOwnerLockCount() && pImp->bObjLocked && xObjSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
1134             xObjSh->DoClose();
1135         SfxObjectShellRef xDyingObjSh = xObjSh;
1136         xObjSh.Clear();
1137         if( ( GetFrameType() & SFXFRAME_HASTITLE ) && pImp->nDocViewNo )
1138             xDyingObjSh->GetNoSet_Impl().ReleaseIndex(pImp->nDocViewNo-1);
1139         if ( pImp->bObjLocked )
1140         {
1141             xDyingObjSh->OwnerLock( sal_False );
1142             pImp->bObjLocked = sal_False;
1143         }
1144     }
1145 
1146 	GetDispatcher()->SetDisableFlags( 0 );
1147 }
1148 
1149 //--------------------------------------------------------------------
1150 sal_Bool SfxViewFrame::Close()
1151 {
1152     DBG_CHKTHIS(SfxViewFrame, 0);
1153 
1154     DBG_ASSERT( GetFrame().IsClosing_Impl() || !GetFrame().GetFrameInterface().is(), "ViewFrame closed too early!" );
1155 
1156 	// Wenn bis jetzt noch nicht gespeichert wurde, sollen eingebettete Objekte
1157 	// auch nicht mehr automatisch gespeichert werden!
1158 	if ( GetViewShell() )
1159 		GetViewShell()->DiscardClients_Impl();
1160 	Broadcast( SfxSimpleHint( SFX_HINT_DYING ) );
1161 
1162     if (SfxViewFrame::Current() == this)
1163         SfxViewFrame::SetViewFrame( NULL );
1164 
1165 	// Da der Dispatcher leer ger"aumt wird, kann man ihn auch nicht mehr
1166 	// vern"unftig verwenden - also besser still legen
1167 	GetDispatcher()->Lock(sal_True);
1168 	delete this;
1169 
1170 	return sal_True;
1171 }
1172 
1173 //--------------------------------------------------------------------
1174 
1175 void SfxViewFrame::DoActivate( sal_Bool bUI, SfxViewFrame* pOldFrame )
1176 {
1177     DBG_CHKTHIS(SfxViewFrame, 0);
1178     SFX_APP();
1179 
1180     pDispatcher->DoActivate_Impl( bUI, pOldFrame );
1181 
1182     // Wenn ich einen parent habe und dieser ist kein parent des alten
1183     // ViewFrames, erh"alt er ein ParentActivate
1184     if ( bUI )
1185     {
1186 /*
1187 		SfxMedium* pMed = GetObjectShell() ? GetObjectShell()->GetMedium() : NULL;
1188 		if( pMed )
1189 		{
1190             SFX_ITEMSET_ARG(
1191                 pMed->GetItemSet(), pInterceptorItem, SfxSlotInterceptorItem,
1192                 SID_INTERCEPTOR, sal_False );
1193 			if( pInterceptorItem )
1194 			{
1195 				SfxSlotInterceptor* pInter = pInterceptorItem->GetValue();
1196 				if( !pInter->GetBindings() )
1197 					pInter->SetBindings( &GetBindings() );
1198 				pInter->Activate( sal_True );
1199 			}
1200 		}
1201  */
1202         SfxViewFrame *pFrame = GetParentViewFrame();
1203         while ( pFrame )
1204         {
1205             if ( !pOldFrame || !pOldFrame->GetFrame().IsParent( &pFrame->GetFrame() ) )
1206                 pFrame->pDispatcher->DoParentActivate_Impl();
1207             pFrame = pFrame->GetParentViewFrame();
1208         }
1209     }
1210 }
1211 
1212 //--------------------------------------------------------------------
1213 void SfxViewFrame::DoDeactivate(sal_Bool bUI, SfxViewFrame* pNewFrame )
1214 {
1215     DBG_CHKTHIS(SfxViewFrame, 0);
1216     SFX_APP();
1217     pDispatcher->DoDeactivate_Impl( bUI, pNewFrame );
1218 
1219     // Wenn ich einen parent habe und dieser ist kein parent des neuen
1220     // ViewFrames, erh"alt er ein ParentDeactivate
1221     if ( bUI )
1222     {
1223 //        if ( GetFrame().GetWorkWindow_Impl() )
1224 //            GetFrame().GetWorkWindow_Impl()->SaveStatus_Impl();
1225 /*
1226 		SfxMedium* pMed = GetObjectShell() ? GetObjectShell()->GetMedium() : NULL;
1227 		if( pMed )
1228 		{
1229             SFX_ITEMSET_ARG(
1230                 pMed->GetItemSet(), pInterceptorItem, SfxSlotInterceptorItem,
1231                 SID_INTERCEPTOR, sal_False );
1232 			if( pInterceptorItem )
1233 				pInterceptorItem->GetValue()->Activate( sal_False );
1234 		}
1235 */
1236         SfxViewFrame *pFrame = GetParentViewFrame();
1237         while ( pFrame )
1238         {
1239             if ( !pNewFrame || !pNewFrame->GetFrame().IsParent( &pFrame->GetFrame() ) )
1240                 pFrame->pDispatcher->DoParentDeactivate_Impl();
1241             pFrame = pFrame->GetParentViewFrame();
1242         }
1243     }
1244 }
1245 
1246 //------------------------------------------------------------------------
1247 void SfxViewFrame::InvalidateBorderImpl( const SfxViewShell* pSh )
1248 {
1249     if( pSh && !nAdjustPosPixelLock )
1250     {
1251         if ( GetViewShell() && GetWindow().IsVisible() )
1252         {
1253             if ( GetFrame().IsInPlace() )
1254             {
1255                 /*
1256                 Size aSize( GetViewShell()->GetWindow()->GetSizePixel() );
1257 
1258                 //Size aBorderSz( pEnv->GetBorderWin()->GetHatchBorderPixel() );
1259                 Point aOfs; //( aBorderSz.Width(), aBorderSz.Height() );
1260 
1261                 DoAdjustPosSizePixel( GetViewShell(), aOfs, aSize );*/
1262                 return;
1263             }
1264 
1265             DoAdjustPosSizePixel( (SfxViewShell *) GetViewShell(), Point(),
1266                                             GetWindow().GetOutputSizePixel() );
1267         }
1268     }
1269 }
1270 
1271 //------------------------------------------------------------------------
1272 sal_Bool SfxViewFrame::SetBorderPixelImpl
1273 (
1274     const SfxViewShell* pVSh,
1275     const SvBorder&     rBorder
1276 )
1277 
1278 {
1279     pImp->aBorder = rBorder;
1280 
1281     if ( IsResizeInToOut_Impl() && !GetFrame().IsInPlace() )
1282 	{
1283 		Size aSize = pVSh->GetWindow()->GetOutputSizePixel();
1284 		if ( aSize.Width() && aSize.Height() )
1285 		{
1286 			aSize.Width() += rBorder.Left() + rBorder.Right();
1287 			aSize.Height() += rBorder.Top() + rBorder.Bottom();
1288 
1289 			Size aOldSize = GetWindow().GetOutputSizePixel();
1290 			GetWindow().SetOutputSizePixel( aSize );
1291 			Window* pParent = &GetWindow();
1292 			while ( pParent->GetParent() )
1293 				pParent = pParent->GetParent();
1294 			Size aOuterSize = pParent->GetOutputSizePixel();
1295 			aOuterSize.Width() += ( aSize.Width() - aOldSize.Width() );
1296 			aOuterSize.Height() += ( aSize.Height() - aOldSize.Height() );
1297 			pParent->SetOutputSizePixel( aOuterSize );
1298 		}
1299 	}
1300 	else
1301 	{
1302 		Point aPoint;
1303 		Rectangle aEditArea( aPoint, GetWindow().GetOutputSizePixel() );
1304 		aEditArea.Left() += rBorder.Left();
1305 		aEditArea.Right() -= rBorder.Right();
1306 		aEditArea.Top() += rBorder.Top();
1307 		aEditArea.Bottom() -= rBorder.Bottom();
1308 		pVSh->GetWindow()->SetPosSizePixel( aEditArea.TopLeft(), aEditArea.GetSize() );
1309 	}
1310 
1311 	return sal_True;
1312 }
1313 
1314 //------------------------------------------------------------------------
1315 const SvBorder& SfxViewFrame::GetBorderPixelImpl
1316 (
1317     const SfxViewShell* /*pSh*/
1318 )   const
1319 
1320 {
1321     return pImp->aBorder;
1322 }
1323 
1324 //--------------------------------------------------------------------
1325 void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
1326 {
1327     {DBG_CHKTHIS(SfxViewFrame, 0);}
1328 
1329     if( IsDowning_Impl())
1330         return;
1331 
1332     // we know only SimpleHints
1333     if ( rHint.IsA(TYPE(SfxSimpleHint)) )
1334     {
1335         switch( ( (SfxSimpleHint&) rHint ).GetId() )
1336         {
1337             case SFX_HINT_MODECHANGED:
1338             {
1339                 UpdateTitle();
1340 
1341                 if ( !xObjSh.Is() )
1342                     break;
1343 
1344                 // r/o Umschaltung?
1345                 SfxBindings& rBind = GetBindings();
1346                 rBind.Invalidate( SID_RELOAD );
1347                 SfxDispatcher *pDispat = GetDispatcher();
1348                 sal_Bool bWasReadOnly = pDispat->GetReadOnly_Impl();
1349                 sal_Bool bIsReadOnly = xObjSh->IsReadOnly();
1350                 if ( !bWasReadOnly != !bIsReadOnly )
1351             	{
1352 					// Dann auch TITLE_CHANGED
1353 					UpdateTitle();
1354 	                rBind.Invalidate( SID_FILE_NAME );
1355 	                rBind.Invalidate( SID_DOCINFO_TITLE );
1356 					rBind.Invalidate( SID_EDITDOC );
1357 
1358                     pDispat->GetBindings()->InvalidateAll(sal_True);
1359                     pDispat->SetReadOnly_Impl( bIsReadOnly );
1360 
1361 					// Dispatcher-Update nur erzwingen, wenn es nicht sowieso
1362 					// demn"achst kommt, anderenfalls ist Zappelei oder gar
1363 					// GPF m"oglich, da Writer z.B. gerne mal im Resize irgendwelche
1364 					// Aktionen t"atigt, die ein SetReadOnlyUI am Dispatcher zur
1365 					// Folge haben!
1366 					if ( pDispat->IsUpdated_Impl() )
1367                     	pDispat->Update_Impl(sal_True);
1368                 }
1369 
1370                 Enable( !xObjSh->IsInModalMode() );
1371 				break;
1372             }
1373 
1374             case SFX_HINT_TITLECHANGED:
1375             {
1376 				UpdateTitle();
1377                 SfxBindings& rBind = GetBindings();
1378                 rBind.Invalidate( SID_FILE_NAME );
1379                 rBind.Invalidate( SID_DOCINFO_TITLE );
1380 				rBind.Invalidate( SID_EDITDOC );
1381 				rBind.Invalidate( SID_RELOAD );
1382                 break;
1383             }
1384 
1385             case SFX_HINT_DEINITIALIZING:
1386                 GetFrame().DoClose();
1387                 break;
1388             case SFX_HINT_DYING:
1389                 // when the Object is being deleted, destroy the view too
1390                 if ( xObjSh.Is() )
1391                     ReleaseObjectShell_Impl();
1392                 else
1393                     GetFrame().DoClose();
1394                 break;
1395 
1396         }
1397     }
1398     else if ( rHint.IsA(TYPE(SfxEventHint)) )
1399     {
1400         // Wenn das Document asynchron geladen wurde, wurde der Dispatcher
1401         // auf ReadOnly gesetzt, was zur"?ckgenommen werden mu\s, wenn
1402         // das Document selbst nicht ReadOnly ist und das Laden fertig ist.
1403         switch ( ((SfxEventHint&)rHint).GetEventId() )
1404         {
1405             case SFX_EVENT_MODIFYCHANGED:
1406             {
1407                 SfxBindings& rBind = GetBindings();
1408                 rBind.Invalidate( SID_DOC_MODIFIED );
1409                 rBind.Invalidate( SID_SAVEDOC );
1410                 rBind.Invalidate( SID_RELOAD );
1411                 rBind.Invalidate( SID_EDITDOC );
1412                 break;
1413             }
1414 
1415             case SFX_EVENT_OPENDOC:
1416             case SFX_EVENT_CREATEDOC:
1417             {
1418                 if ( !xObjSh.Is() )
1419                     break;
1420 
1421                 SfxBindings& rBind = GetBindings();
1422                 rBind.Invalidate( SID_RELOAD );
1423                 rBind.Invalidate( SID_EDITDOC );
1424                 if ( !xObjSh->IsReadOnly() )
1425                 {
1426                     // Im Gegensatz zu oben (TITLE_CHANGED) mu\s das UI nicht
1427                     // upgedated werden, da es nicht gehidet war!
1428 
1429                     // #i21560# InvalidateAll() causes the assertion
1430                     // 'SfxBindings::Invalidate while in update" when
1431                     // the sfx slot SID_BASICIDE_APPEAR is executed
1432                     // via API from another thread (Java).
1433                     // According to MBA this call is not necessary anymore,
1434                     // because each document has its own SfxBindings.
1435                     //
1436                     //GetDispatcher()->GetBindings()->InvalidateAll(sal_True);
1437                 }
1438 
1439                 break;
1440             }
1441 
1442             case SFX_EVENT_TOGGLEFULLSCREENMODE:
1443             {
1444                 if ( GetFrame().OwnsBindings_Impl() )
1445                     GetBindings().GetDispatcher_Impl()->Update_Impl( sal_True );
1446                 break;
1447             }
1448         }
1449     }
1450 }
1451 
1452 //------------------------------------------------------------------------
1453 void SfxViewFrame::Construct_Impl( SfxObjectShell *pObjSh )
1454 {
1455     pImp->bResizeInToOut = sal_True;
1456     pImp->bDontOverwriteResizeInToOut = sal_False;
1457     pImp->bObjLocked = sal_False;
1458     pImp->pFocusWin = 0;
1459     pImp->pActiveChild = NULL;
1460     pImp->nCurViewId = 0;
1461     pImp->bReloading = sal_False;
1462     pImp->bIsDowning = sal_False;
1463     pImp->bModal = sal_False;
1464     pImp->bEnabled = sal_True;
1465     pImp->nDocViewNo = 0;
1466     pImp->aMargin = Size( -1, -1 );
1467 	pImp->pWindow = 0;
1468 
1469 	SetPool( &SFX_APP()->GetPool() );
1470     pDispatcher = new SfxDispatcher(this);
1471     if ( !GetBindings().GetDispatcher() )
1472         GetBindings().SetDispatcher( pDispatcher );
1473 
1474     xObjSh = pObjSh;
1475 	if ( xObjSh.Is() && xObjSh->IsPreview() )
1476 		SetQuietMode_Impl( sal_True );
1477 
1478     if ( pObjSh )
1479     {
1480         pDispatcher->Push( *SFX_APP() );
1481         SfxModule* pModule = xObjSh->GetModule();
1482         if( pModule )
1483             pDispatcher->Push( *pModule );
1484         pDispatcher->Push( *this );
1485         pDispatcher->Push( *pObjSh );
1486         pDispatcher->Flush();
1487         StartListening( *pObjSh );
1488         pObjSh->ViewAssigned();
1489         Notify( *pObjSh, SfxSimpleHint(SFX_HINT_TITLECHANGED) );
1490         Notify( *pObjSh, SfxSimpleHint(SFX_HINT_DOCCHANGED) );
1491         pDispatcher->SetReadOnly_Impl( pObjSh->IsReadOnly() );
1492     }
1493     else
1494     {
1495         pDispatcher->Push( *SFX_APP() );
1496         pDispatcher->Push( *this );
1497         pDispatcher->Flush();
1498     }
1499 
1500     SfxViewFrame *pThis = this; // wegen der kranken Array-Syntax
1501     SfxViewFrameArr_Impl &rViewArr = SFX_APP()->GetViewFrames_Impl();
1502     rViewArr.C40_INSERT(SfxViewFrame, pThis, rViewArr.Count() );
1503 }
1504 
1505 SfxViewFrame::SfxViewFrame
1506 (
1507 	SfxFrame&           rFrame,
1508 	SfxObjectShell*     pObjShell
1509 )
1510 
1511 /*	[Beschreibung]
1512 
1513 	Ctor des SfxViewFrame f"ur eine <SfxObjectShell> aus der Ressource.
1514 	Die 'nViewId' der zu erzeugenden <SfxViewShell> kann angegeben werden
1515 	(default ist die zuerst registrierte SfxViewShell-Subklasse).
1516 */
1517 
1518     : pImp( new SfxViewFrame_Impl( rFrame ) )
1519     , pDispatcher(0)
1520     , pBindings( new SfxBindings )
1521     , nAdjustPosPixelLock( 0 )
1522 {
1523     DBG_CTOR( SfxViewFrame, NULL );
1524 
1525     rFrame.SetCurrentViewFrame_Impl( this );
1526     rFrame.SetFrameType_Impl( GetFrameType() | SFXFRAME_HASTITLE );
1527     Construct_Impl( pObjShell );
1528 
1529     pImp->pWindow = new SfxFrameViewWindow_Impl( this, rFrame.GetWindow() );
1530     pImp->pWindow->SetSizePixel( rFrame.GetWindow().GetOutputSizePixel() );
1531 	rFrame.SetOwnsBindings_Impl( sal_True );
1532     rFrame.CreateWorkWindow_Impl();
1533 }
1534 
1535 //------------------------------------------------------------------------
1536 SfxViewFrame::~SfxViewFrame()
1537 {
1538     DBG_DTOR(SfxViewFrame, 0);
1539 
1540 	SetDowning_Impl();
1541 
1542     if ( SfxViewFrame::Current() == this )
1543         SfxViewFrame::SetViewFrame( NULL );
1544 
1545 	ReleaseObjectShell_Impl();
1546 
1547     if ( GetFrame().OwnsBindings_Impl() )
1548 		// Die Bindings l"oscht der Frame!
1549 		KillDispatcher_Impl();
1550 
1551     delete pImp->pWindow;
1552 
1553     if ( GetFrame().GetCurrentViewFrame() == this )
1554         GetFrame().SetCurrentViewFrame_Impl( NULL );
1555 
1556     // von Frame-Liste abmelden
1557     SfxApplication *pSfxApp = SFX_APP();
1558     SfxViewFrameArr_Impl &rFrames = pSfxApp->GetViewFrames_Impl();
1559     const SfxViewFrame *pThis = this;
1560     rFrames.Remove( rFrames.GetPos(pThis) );
1561 
1562     // Member l"oschen
1563     KillDispatcher_Impl();
1564 
1565     delete pImp;
1566 }
1567 
1568 //------------------------------------------------------------------------
1569 void SfxViewFrame::KillDispatcher_Impl()
1570 
1571 // Dispatcher abr"aumen und l"oschen
1572 
1573 {
1574     DBG_CHKTHIS(SfxViewFrame, 0);
1575 
1576     SfxModule* pModule = xObjSh.Is() ? xObjSh->GetModule() : 0;
1577     if ( xObjSh.Is() )
1578         ReleaseObjectShell_Impl();
1579     if ( pDispatcher )
1580     {
1581         if( pModule )
1582 			pDispatcher->Pop( *pModule, SFX_SHELL_POP_UNTIL );
1583         else
1584 			pDispatcher->Pop( *this );
1585         DELETEZ(pDispatcher);
1586     }
1587 }
1588 
1589 //------------------------------------------------------------------------
1590 SfxViewFrame* SfxViewFrame::Current()
1591 {
1592     return SfxApplication::Get() ? SFX_APP()->Get_Impl()->pViewFrame : NULL;
1593 }
1594 
1595 //--------------------------------------------------------------------
1596 sal_uInt16 SfxViewFrame::Count()
1597 
1598 /*  [Beschreibung]
1599 
1600     Liefert die Anzahl der sichtbaren <SfxViewFrame>-Instanzen.
1601 */
1602 
1603 {
1604     SfxApplication *pSfxApp = SFX_APP();
1605     SfxViewFrameArr_Impl& rFrames = pSfxApp->GetViewFrames_Impl();
1606     const sal_uInt16 nCount = rFrames.Count();
1607     sal_uInt16 nFound = 0;
1608     for ( sal_uInt16 i = 0; i < nCount; ++i )
1609     {
1610         SfxViewFrame *pFrame = rFrames[i];
1611         if ( pFrame->IsVisible() )
1612             ++nFound;
1613     }
1614     return nFound;
1615 }
1616 
1617 //--------------------------------------------------------------------
1618 // returns the first window of spec. type viewing the specified doc.
1619 SfxViewFrame* SfxViewFrame::GetFirst
1620 (
1621     const SfxObjectShell*   pDoc,
1622     sal_Bool                    bOnlyIfVisible
1623 )
1624 {
1625     SfxApplication *pSfxApp = SFX_APP();
1626     SfxViewFrameArr_Impl &rFrames = pSfxApp->GetViewFrames_Impl();
1627 
1628     // search for a SfxDocument of the specified type
1629     for ( sal_uInt16 nPos = 0; nPos < rFrames.Count(); ++nPos )
1630     {
1631         SfxViewFrame *pFrame = rFrames.GetObject(nPos);
1632         if  (   ( !pDoc || pDoc == pFrame->GetObjectShell() )
1633             &&  ( !bOnlyIfVisible || pFrame->IsVisible() )
1634             )
1635             return pFrame;
1636     }
1637 
1638     return 0;
1639 }
1640 //--------------------------------------------------------------------
1641 
1642 // returns thenext window of spec. type viewing the specified doc.
1643 SfxViewFrame* SfxViewFrame::GetNext
1644 (
1645     const SfxViewFrame&     rPrev,
1646     const SfxObjectShell*   pDoc,
1647     sal_Bool                    bOnlyIfVisible
1648 )
1649 {
1650     SfxApplication *pSfxApp = SFX_APP();
1651     SfxViewFrameArr_Impl &rFrames = pSfxApp->GetViewFrames_Impl();
1652 
1653     // refind the specified predecessor
1654 	sal_uInt16 nPos;
1655     for ( nPos = 0; nPos < rFrames.Count(); ++nPos )
1656         if ( rFrames.GetObject(nPos) == &rPrev )
1657             break;
1658 
1659     // search for a Frame of the specified type
1660     for ( ++nPos; nPos < rFrames.Count(); ++nPos )
1661     {
1662         SfxViewFrame *pFrame = rFrames.GetObject(nPos);
1663         if  (   ( !pDoc || pDoc == pFrame->GetObjectShell() )
1664             &&  ( !bOnlyIfVisible || pFrame->IsVisible() )
1665             )
1666             return pFrame;
1667     }
1668     return 0;
1669 }
1670 
1671 void SfxViewFrame::CloseHiddenFrames_Impl()
1672 {
1673     SfxApplication *pSfxApp = SFX_APP();
1674     SfxViewFrameArr_Impl &rFrames = pSfxApp->GetViewFrames_Impl();
1675     for ( sal_uInt16 nPos=0; nPos<rFrames.Count(); )
1676     {
1677         SfxViewFrame *pFrame = rFrames.GetObject(nPos);
1678         if ( !pFrame->IsVisible() )
1679 			pFrame->DoClose();
1680 		else
1681 			nPos++;
1682 	}
1683 }
1684 
1685 //--------------------------------------------------------------------
1686 SfxProgress* SfxViewFrame::GetProgress() const
1687 {
1688     SfxObjectShell *pObjSh = GetObjectShell();
1689     return pObjSh ? pObjSh->GetProgress() : 0;
1690 }
1691 
1692 //--------------------------------------------------------------------
1693 void SfxViewFrame::ShowStatusText( const String& /*rText*/)
1694 {
1695 /* OBSOLETE: If this is used, framework/uielement/progressbarwrapper.[h|c]xx &
1696              framework/uielement/statusindicatorinterfacewrapper.[h|c]xx must be
1697              extended to support a new interface to support ShowStatusText/HideStatusText
1698     SfxWorkWindow* pWorkWin = GetFrame().GetWorkWindow_Impl();
1699     SfxStatusBarManager *pMgr = pWorkWin->GetStatusBarManager_Impl();
1700 	if ( pMgr )
1701 	{
1702 		pMgr->GetStatusBar()->HideItems();
1703 		pMgr->GetStatusBar()->SetText( rText );
1704 	}
1705 */
1706 }
1707 
1708 //--------------------------------------------------------------------
1709 void SfxViewFrame::HideStatusText()
1710 {
1711 /* OBSOLETE: If this is used, framework/uielement/progressbarwrapper.[h|c]xx &
1712              framework/uielement/statusindicatorinterfacewrapper.[h|c]xx must be
1713              extended to support a new interface to support ShowStatusText/HideStatusText
1714     SfxWorkWindow* pWorkWin = GetFrame().GetWorkWindow_Impl();
1715     SfxStatusBarManager *pMgr = pWorkWin->GetStatusBarManager_Impl();
1716 	if ( pMgr )
1717 		pMgr->GetStatusBar()->ShowItems();
1718 */
1719 }
1720 
1721 
1722 //--------------------------------------------------------------------
1723 #ifdef ENABLE_INIMANAGER//MUSTINI
1724 SfxIniManager* SfxViewFrame::GetIniManager() const
1725 {
1726 /*  SfxIniManager *pIniMgr = GetObjectShell()
1727             ? GetObjectShell()->GetFactory().GetIniManager()
1728             : 0;
1729     if ( !pIniMgr )*/ //!
1730         return SFX_APP()->GetAppIniManager();
1731 //  return pIniMgr;
1732 }
1733 #endif
1734 
1735 //--------------------------------------------------------------------
1736 void SfxViewFrame::DoAdjustPosSizePixel //! teilen in Inner.../Outer...
1737 (
1738     SfxViewShell*   pSh,
1739     const Point&    rPos,
1740     const Size&     rSize
1741 )
1742 {
1743     DBG_CHKTHIS(SfxViewFrame, 0);
1744 
1745 	// Components benutzen diese Methode nicht!
1746     if( pSh && pSh->GetWindow() && !nAdjustPosPixelLock )
1747     {
1748         nAdjustPosPixelLock++;
1749         if ( pImp->bResizeInToOut )
1750             pSh->InnerResizePixel( rPos, rSize );
1751         else
1752             pSh->OuterResizePixel( rPos, rSize );
1753         nAdjustPosPixelLock--;
1754     }
1755 }
1756 
1757 //========================================================================
1758 
1759 int SfxViewFrameItem::operator==( const SfxPoolItem &rItem ) const
1760 {
1761      return PTR_CAST(SfxViewFrameItem, &rItem)->pFrame== pFrame;
1762 }
1763 
1764 //--------------------------------------------------------------------
1765 String SfxViewFrameItem::GetValueText() const
1766 {
1767     return String();
1768 }
1769 
1770 //--------------------------------------------------------------------
1771 SfxPoolItem* SfxViewFrameItem::Clone( SfxItemPool *) const
1772 {
1773     return new SfxViewFrameItem( pFrame);
1774 }
1775 
1776 //--------------------------------------------------------------------
1777 void SfxViewFrame::SetViewShell_Impl( SfxViewShell *pVSh )
1778 
1779 /*  [Beschreibung]
1780 
1781     Interne Methode zum setzen der jeweils aktuellen <SfxViewShell>-Instanz,
1782     die in diesem SfxViewFrame aktiv ist.
1783 */
1784 
1785 {
1786     SfxShell::SetViewShell_Impl( pVSh );
1787 
1788     // Hack: InPlaceMode
1789     if ( pVSh )
1790         pImp->bResizeInToOut = sal_False;
1791 }
1792 
1793 //--------------------------------------------------------------------
1794 /*
1795     Beschreibung:
1796     Der ParentViewFrame ist der ViewFrame des Containers bei internem InPlace
1797 */
1798 
1799 //TODO/LATER: is it still necessary? is there a replacement for GetParentViewFrame_Impl?
1800 SfxViewFrame* SfxViewFrame::GetParentViewFrame_Impl() const
1801 {
1802     return NULL;
1803 }
1804 
1805 //--------------------------------------------------------------------
1806 void SfxViewFrame::ForceOuterResize_Impl(sal_Bool bOn)
1807 {
1808 	if ( !pImp->bDontOverwriteResizeInToOut )
1809     	pImp->bResizeInToOut = !bOn;
1810 }
1811 
1812 void SfxViewFrame::ForceInnerResize_Impl(sal_Bool bOn)
1813 {
1814 	pImp->bDontOverwriteResizeInToOut = bOn;
1815 }
1816 
1817 //--------------------------------------------------------------------
1818 sal_Bool SfxViewFrame::IsResizeInToOut_Impl() const
1819 {
1820     return pImp->bResizeInToOut;
1821 }
1822 //--------------------------------------------------------------------
1823 void SfxViewFrame::DoAdjustPosSize( SfxViewShell *pSh,
1824                                 const Point rPos, const Size &rSize )
1825 {
1826     DBG_CHKTHIS(SfxViewFrame, 0);
1827     if( pSh && !nAdjustPosPixelLock )
1828     {
1829         Window *pWindow = pSh->GetWindow();
1830         Point aPos = pWindow->LogicToPixel(rPos);
1831         Size aSize = pWindow->LogicToPixel(rSize);
1832         DoAdjustPosSizePixel(pSh, aPos, aSize);
1833     }
1834 }
1835 
1836 //--------------------------------------------------------------------
1837 void SfxViewFrame::GetDocNumber_Impl()
1838 {
1839     DBG_ASSERT( GetObjectShell(), "Kein Dokument!" );
1840     GetObjectShell()->SetNamedVisibility_Impl();
1841     pImp->nDocViewNo = GetObjectShell()->GetNoSet_Impl().GetFreeIndex()+1;
1842 }
1843 
1844 //--------------------------------------------------------------------
1845 
1846 void SfxViewFrame::Enable( sal_Bool bEnable )
1847 {
1848     if ( bEnable != pImp->bEnabled )
1849     {
1850         pImp->bEnabled = bEnable;
1851 
1852         // e.g. InPlace-Frames have a parent...
1853         SfxViewFrame *pParent = GetParentViewFrame_Impl();
1854         if ( pParent )
1855         {
1856             pParent->Enable( bEnable );
1857         }
1858         else
1859         {
1860             Window *pWindow = &GetFrame().GetTopFrame().GetWindow();
1861             if ( !bEnable )
1862                 pImp->bWindowWasEnabled = pWindow->IsInputEnabled();
1863             if ( !bEnable || pImp->bWindowWasEnabled )
1864                 pWindow->EnableInput( bEnable, sal_True );
1865         }
1866 
1867         // cursor and focus
1868         SfxViewShell* pViewSh = GetViewShell();
1869         if ( bEnable )
1870         {
1871             // show cursor
1872             if ( pViewSh )
1873                 pViewSh->ShowCursor();
1874         }
1875         else
1876         {
1877             // hide cursor
1878             if ( pViewSh )
1879                 pViewSh->ShowCursor(sal_False);
1880         }
1881 /*
1882         if ( !bEnable )
1883             GetBindings().ENTERREGISTRATIONS();
1884         GetDispatcher()->Lock( !bEnable );
1885         if ( bEnable )
1886             GetBindings().LEAVEREGISTRATIONS();
1887 */
1888     }
1889 }
1890 
1891 //--------------------------------------------------------------------
1892 void SfxViewFrame::Show()
1893 
1894 /*  [Beschreibung]
1895 
1896     Diese Methode macht das Frame-Window sichtbar und ermittelt vorher
1897     den Fenstername. Au\serdem wird das Dokument festgehalten. Man darf
1898     i.d.R. nie das Window direkt showen!
1899 */
1900 
1901 {
1902     // zuerst locken damit in UpdateTitle() gilt: IsVisible() == sal_True (:#)
1903     if ( xObjSh.Is() )
1904     {
1905         xObjSh->GetMedium()->GetItemSet()->ClearItem( SID_HIDDEN );
1906         if ( !pImp->bObjLocked )
1907             LockObjectShell_Impl( sal_True );
1908 
1909         // Doc-Shell Titel-Nummer anpassen, get unique view-no
1910         if ( 0 == pImp->nDocViewNo  )
1911         {
1912             GetDocNumber_Impl();
1913             UpdateTitle();
1914         }
1915     }
1916     else
1917         UpdateTitle();
1918 
1919     // Frame-Window anzeigen, aber nur wenn der ViewFrame kein eigenes Window
1920 	// hat oder wenn er keine Component enth"alt
1921 	if ( &GetWindow() == &GetFrame().GetWindow() || !GetFrame().HasComponent() )
1922     	GetWindow().Show();
1923     GetFrame().GetWindow().Show();
1924 
1925 /*    SfxViewFrame* pCurrent = SfxViewFrame::Current();
1926 	if ( GetFrame().GetFrameInterface()->isActive() &&
1927 			pCurrent != this &&
1928 			( !pCurrent || pCurrent->GetParentViewFrame_Impl() != this ) &&
1929 			!GetActiveChildFrame_Impl() )
1930         MakeActive_Impl( sal_False );*/
1931     if ( xObjSh.Is() && xObjSh->Get_Impl()->bHiddenLockedByAPI )
1932     {
1933         xObjSh->Get_Impl()->bHiddenLockedByAPI = sal_False;
1934         xObjSh->OwnerLock(sal_False);
1935     }
1936 }
1937 
1938 //--------------------------------------------------------------------
1939 sal_Bool SfxViewFrame::IsVisible() const
1940 {
1941     return pImp->bObjLocked;
1942 }
1943 
1944 //--------------------------------------------------------------------
1945 void SfxViewFrame::Hide()
1946 {
1947     GetWindow().Hide();
1948     if ( pImp->bObjLocked )
1949         LockObjectShell_Impl( sal_False );
1950 }
1951 
1952 //--------------------------------------------------------------------
1953 void SfxViewFrame::LockObjectShell_Impl( sal_Bool bLock )
1954 {
1955     DBG_ASSERT( pImp->bObjLocked != bLock, "Falscher Locked-Status!" );
1956 
1957     DBG_ASSERT( GetObjectShell(), "Kein Dokument!" );
1958     GetObjectShell()->OwnerLock(bLock);
1959     pImp->bObjLocked = bLock;
1960 }
1961 
1962 //--------------------------------------------------------------------
1963 void SfxViewFrame::MakeActive_Impl( sal_Bool bGrabFocus )
1964 {
1965 	if ( GetViewShell() && !GetFrame().IsClosing_Impl() )
1966 	{
1967         if ( IsVisible() )
1968         {
1969             if ( GetViewShell() )
1970             {
1971                 sal_Bool bPreview = sal_False;
1972                 if ( GetObjectShell()->IsPreview() )
1973                 {
1974                     bPreview = sal_True;
1975                 }
1976                 else
1977                 {
1978                     SfxViewFrame* pParent = GetParentViewFrame();
1979                     if ( pParent )
1980                         pParent->SetActiveChildFrame_Impl( this );
1981                 }
1982 
1983                 SfxViewFrame* pCurrent = SfxViewFrame::Current();
1984                 css::uno::Reference< css::frame::XFrame > xFrame = GetFrame().GetFrameInterface();
1985                 if ( !bPreview )
1986                 {
1987                     SetViewFrame( this );
1988                     GetBindings().SetActiveFrame( css::uno::Reference< css::frame::XFrame >() );
1989                     uno::Reference< frame::XFramesSupplier > xSupp( xFrame, uno::UNO_QUERY );
1990                     if ( xSupp.is() )
1991                         xSupp->setActiveFrame( uno::Reference < frame::XFrame >() );
1992 
1993                     css::uno::Reference< css::awt::XWindow > xContainerWindow = xFrame->getContainerWindow();
1994                     Window* pWindow = VCLUnoHelper::GetWindow(xContainerWindow);
1995                     if (pWindow && pWindow->HasChildPathFocus() && bGrabFocus)
1996                     {
1997                         SfxInPlaceClient *pCli = GetViewShell()->GetUIActiveClient();
1998                         if ( ( !pCli || !pCli->IsObjectUIActive() ) &&
1999                             ( !pCurrent || pCurrent->GetParentViewFrame_Impl() != this ) )
2000                                 GetFrame().GrabFocusOnComponent_Impl();
2001                     }
2002                 }
2003                 else
2004                 {
2005                     GetBindings().SetDispatcher( GetDispatcher() );
2006                     GetBindings().SetActiveFrame( ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > () );
2007                     GetDispatcher()->Update_Impl( sal_False );
2008                 }
2009             }
2010         }
2011 	}
2012 }
2013 
2014 //-------------------------------------------------------------------------
2015 
2016 void SfxViewFrame::SetQuietMode_Impl( sal_Bool bOn )
2017 {
2018     GetDispatcher()->SetQuietMode_Impl( bOn );
2019 }
2020 
2021 //-------------------------------------------------------------------------
2022 
2023 SfxObjectShell* SfxViewFrame::GetObjectShell()
2024 {
2025     return xObjSh;
2026 }
2027 
2028 const Size& SfxViewFrame::GetMargin_Impl() const
2029 {
2030     return pImp->aMargin;
2031 }
2032 
2033 void SfxViewFrame::SetActiveChildFrame_Impl( SfxViewFrame *pViewFrame )
2034 {
2035 	if ( pViewFrame != pImp->pActiveChild )
2036 	{
2037 	    if ( !pImp->pActiveChild )
2038 	        GetDispatcher()->LockUI_Impl( sal_False );
2039 
2040 	    pImp->pActiveChild = pViewFrame;
2041 
2042 		Reference< XFramesSupplier > xFrame( GetFrame().GetFrameInterface(), UNO_QUERY );
2043 		Reference< XFrame >  xActive;
2044 		if ( pViewFrame )
2045 			xActive = pViewFrame->GetFrame().GetFrameInterface();
2046 
2047 		if ( xFrame.is() )	// PB: #74432# xFrame cann be NULL
2048 			xFrame->setActiveFrame( xActive );
2049 	}
2050 }
2051 
2052 SfxViewFrame* SfxViewFrame::GetActiveChildFrame_Impl() const
2053 {
2054     SfxViewFrame *pViewFrame = pImp->pActiveChild;
2055 /*
2056     if ( !pViewFrame )
2057     {
2058         // Wenn es keinen aktiven ChildFrame gibt, irgendeinen nehmen
2059         for ( sal_uInt16 n=0; n<GetChildFrameCount(); n++ )
2060         {
2061             pViewFrame =
2062                 PTR_CAST( SfxViewFrame, GetChildFrame(n)->GetChildFrame(0) );
2063             if ( pViewFrame )
2064                 break;
2065         }
2066     }
2067 
2068     pImp->pActiveChild = pViewFrame;
2069 */
2070     return pViewFrame;
2071 }
2072 
2073 //--------------------------------------------------------------------
2074 SfxViewFrame* SfxViewFrame::LoadViewIntoFrame_Impl_NoThrow( const SfxObjectShell& i_rDoc, const Reference< XFrame >& i_rFrame,
2075                                                    const sal_uInt16 i_nViewId, const bool i_bHidden )
2076 {
2077     Reference< XFrame > xFrame( i_rFrame );
2078     bool bOwnFrame = false;
2079     SfxViewShell* pSuccessView = NULL;
2080     try
2081     {
2082         if ( !xFrame.is() )
2083         {
2084             ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
2085             Reference < XFrame > xDesktop( aContext.createComponent( "com.sun.star.frame.Desktop" ), UNO_QUERY_THROW );
2086 
2087             if ( !i_bHidden )
2088             {
2089                 try
2090                 {
2091                     // if there is a backing component, use it
2092                     Reference< XFramesSupplier > xTaskSupplier( xDesktop , css::uno::UNO_QUERY_THROW );
2093                     ::framework::FrameListAnalyzer aAnalyzer( xTaskSupplier, Reference< XFrame >(), ::framework::FrameListAnalyzer::E_BACKINGCOMPONENT );
2094 
2095                     if ( aAnalyzer.m_xBackingComponent.is() )
2096                         xFrame = aAnalyzer.m_xBackingComponent;
2097                 }
2098                 catch( uno::Exception& )
2099                 {}
2100             }
2101 
2102             if ( !xFrame.is() )
2103                 xFrame.set( xDesktop->findFrame( DEFINE_CONST_UNICODE("_blank"), 0 ), UNO_SET_THROW );
2104 
2105             bOwnFrame = true;
2106         }
2107 
2108         pSuccessView = LoadViewIntoFrame_Impl(
2109             i_rDoc,
2110             xFrame,
2111             Sequence< PropertyValue >(),    // means "reuse existing model's args"
2112             i_nViewId,
2113             i_bHidden
2114         );
2115 
2116         if ( bOwnFrame && !i_bHidden )
2117         {
2118             // ensure the frame/window is visible
2119             Reference< XWindow > xContainerWindow( xFrame->getContainerWindow(), UNO_SET_THROW );
2120             xContainerWindow->setVisible( sal_True );
2121         }
2122     }
2123     catch( const Exception& )
2124     {
2125     	DBG_UNHANDLED_EXCEPTION();
2126     }
2127 
2128     if ( pSuccessView )
2129         return pSuccessView->GetViewFrame();
2130 
2131     if ( bOwnFrame )
2132     {
2133         try
2134         {
2135             xFrame->dispose();
2136         }
2137         catch( const Exception& )
2138         {
2139         	DBG_UNHANDLED_EXCEPTION();
2140         }
2141     }
2142 
2143     return NULL;
2144 }
2145 
2146 //--------------------------------------------------------------------
2147 SfxViewShell* SfxViewFrame::LoadViewIntoFrame_Impl( const SfxObjectShell& i_rDoc, const Reference< XFrame >& i_rFrame,
2148                                            const Sequence< PropertyValue >& i_rLoadArgs, const sal_uInt16 i_nViewId,
2149                                            const bool i_bHidden )
2150 {
2151     Reference< XModel > xDocument( i_rDoc.GetModel(), UNO_SET_THROW );
2152 
2153     ::comphelper::NamedValueCollection aTransformLoadArgs( i_rLoadArgs.getLength() ? i_rLoadArgs : xDocument->getArgs() );
2154     aTransformLoadArgs.put( "Model", xDocument );
2155     if ( i_nViewId )
2156         aTransformLoadArgs.put( "ViewId", sal_Int16( i_nViewId ) );
2157     if ( i_bHidden )
2158         aTransformLoadArgs.put( "Hidden", i_bHidden );
2159     else
2160         aTransformLoadArgs.remove( "Hidden" );
2161 
2162     ::rtl::OUString sURL( RTL_CONSTASCII_USTRINGPARAM( "private:object" ) );
2163     if ( !sURL.getLength() )
2164         sURL = i_rDoc.GetFactory().GetFactoryURL();
2165 
2166     Reference< XComponentLoader > xLoader( i_rFrame, UNO_QUERY_THROW );
2167     xLoader->loadComponentFromURL( sURL, ::rtl::OUString::createFromAscii( "_self" ), 0,
2168         aTransformLoadArgs.getPropertyValues() );
2169 
2170     SfxViewShell* pViewShell = SfxViewShell::Get( i_rFrame->getController() );
2171     ENSURE_OR_THROW( pViewShell,
2172         "SfxViewFrame::LoadViewIntoFrame_Impl: loading an SFX doc into a frame resulted in a non-SFX view - quite impossible" );
2173     return pViewShell;
2174 }
2175 
2176 //--------------------------------------------------------------------
2177 
2178 SfxViewFrame* SfxViewFrame::LoadHiddenDocument( SfxObjectShell& i_rDoc, const sal_uInt16 i_nViewId )
2179 {
2180     return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, Reference< XFrame >(), i_nViewId, true );
2181 }
2182 
2183 //--------------------------------------------------------------------
2184 
2185 SfxViewFrame* SfxViewFrame::LoadDocument( SfxObjectShell& i_rDoc, const sal_uInt16 i_nViewId )
2186 {
2187     return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, Reference< XFrame >(), i_nViewId, false );
2188 }
2189 
2190 //--------------------------------------------------------------------
2191 
2192 SfxViewFrame* SfxViewFrame::LoadDocumentIntoFrame( SfxObjectShell& i_rDoc, const Reference< XFrame >& i_rTargetFrame, const sal_uInt16 i_nViewId )
2193 {
2194     return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, i_rTargetFrame, i_nViewId, false );
2195 }
2196 
2197 //--------------------------------------------------------------------
2198 
2199 SfxViewFrame* SfxViewFrame::LoadDocumentIntoFrame( SfxObjectShell& i_rDoc, const SfxFrameItem* i_pFrameItem, const sal_uInt16 i_nViewId )
2200 {
2201     return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, i_pFrameItem && i_pFrameItem->GetFrame() ? i_pFrameItem->GetFrame()->GetFrameInterface() : NULL, i_nViewId, false );
2202 }
2203 
2204 //--------------------------------------------------------------------
2205 SfxViewFrame* SfxViewFrame::DisplayNewDocument( SfxObjectShell& i_rDoc, const SfxRequest& i_rCreateDocRequest, const sal_uInt16 i_nViewId )
2206 {
2207     SFX_REQUEST_ARG( i_rCreateDocRequest, pFrameItem, SfxUnoFrameItem, SID_FILLFRAME, sal_False );
2208     SFX_REQUEST_ARG( i_rCreateDocRequest, pHiddenItem, SfxBoolItem, SID_HIDDEN, sal_False );
2209 
2210     return LoadViewIntoFrame_Impl_NoThrow(
2211         i_rDoc,
2212         pFrameItem ? pFrameItem->GetFrame() : NULL,
2213         i_nViewId,
2214         pHiddenItem ? pHiddenItem->GetValue() : false
2215     );
2216 }
2217 
2218 //--------------------------------------------------------------------
2219 
2220 SfxViewFrame* SfxViewFrame::Get( const Reference< XController>& i_rController, const SfxObjectShell* i_pDoc )
2221 {
2222     if ( !i_rController.is() )
2223         return NULL;
2224 
2225     const SfxObjectShell* pDoc = i_pDoc;
2226     if ( !pDoc )
2227     {
2228         Reference< XModel > xDocument( i_rController->getModel() );
2229         for (   pDoc = SfxObjectShell::GetFirst( 0, false );
2230                 pDoc;
2231                 pDoc = SfxObjectShell::GetNext( *pDoc, 0, false )
2232             )
2233         {
2234             if ( pDoc->GetModel() == xDocument )
2235                 break;
2236         }
2237     }
2238 
2239     SfxViewFrame* pViewFrame = NULL;
2240     for (   pViewFrame = SfxViewFrame::GetFirst( pDoc, sal_False );
2241             pViewFrame;
2242             pViewFrame = SfxViewFrame::GetNext( *pViewFrame, pDoc, sal_False )
2243         )
2244     {
2245         if ( pViewFrame->GetViewShell()->GetController() == i_rController )
2246             break;
2247     }
2248 
2249     return pViewFrame;
2250 }
2251 
2252 //--------------------------------------------------------------------
2253 
2254 void SfxViewFrame::SaveCurrentViewData_Impl( const sal_uInt16 i_nNewViewId )
2255 {
2256     SfxViewShell* pCurrentShell = GetViewShell();
2257     ENSURE_OR_RETURN_VOID( pCurrentShell != NULL, "SfxViewFrame::SaveCurrentViewData_Impl: no current view shell -> no current view data!" );
2258 
2259     // determine the logical (API) view name
2260     const SfxObjectFactory& rDocFactory( pCurrentShell->GetObjectShell()->GetFactory() );
2261     const sal_uInt16 nCurViewNo = rDocFactory.GetViewNo_Impl( GetCurViewId(), 0 );
2262     const String sCurrentViewName = rDocFactory.GetViewFactory( nCurViewNo ).GetAPIViewName();
2263     const sal_uInt16 nNewViewNo = rDocFactory.GetViewNo_Impl( i_nNewViewId, 0 );
2264     const String sNewViewName = rDocFactory.GetViewFactory( nNewViewNo ).GetAPIViewName();
2265     if ( ( sCurrentViewName.Len() == 0 ) || ( sNewViewName.Len() == 0 ) )
2266     {
2267         // can't say anything about the view, the respective application did not yet migrate its code to
2268         // named view factories => bail out
2269         OSL_ENSURE( false, "SfxViewFrame::SaveCurrentViewData_Impl: views without API names? Shouldn't happen anymore?" );
2270         return;
2271     }
2272     OSL_ENSURE( !sNewViewName.Equals( sCurrentViewName ), "SfxViewFrame::SaveCurrentViewData_Impl: suspicious: new and old view name are identical!" );
2273 
2274     // save the view data only when we're moving from a non-print-preview to the print-preview view
2275     if ( !sNewViewName.EqualsAscii( "PrintPreview" ) )
2276         return;
2277 
2278     // retrieve the view data from the view
2279     Sequence< PropertyValue > aViewData;
2280     pCurrentShell->WriteUserDataSequence( aViewData );
2281 
2282     try
2283     {
2284         // retrieve view data (for *all* views) from the model
2285         const Reference< XController > xController( pCurrentShell->GetController(), UNO_SET_THROW );
2286         const Reference< XViewDataSupplier > xViewDataSupplier( xController->getModel(), UNO_QUERY_THROW );
2287         const Reference< XIndexContainer > xViewData( xViewDataSupplier->getViewData(), UNO_QUERY_THROW );
2288 
2289         // look up the one view data item which corresponds to our current view, and remove it
2290         const sal_Int32 nCount = xViewData->getCount();
2291         for ( sal_Int32 i=0; i<nCount; ++i )
2292         {
2293             const ::comphelper::NamedValueCollection aCurViewData( xViewData->getByIndex(i) );
2294             ::rtl::OUString sViewId( aCurViewData.getOrDefault( "ViewId", ::rtl::OUString() ) );
2295             if ( sViewId.getLength() == 0 )
2296                 continue;
2297 
2298             const SfxViewFactory* pViewFactory = rDocFactory.GetViewFactoryByViewName( sViewId );
2299             if ( pViewFactory == NULL )
2300                 continue;
2301 
2302             if ( pViewFactory->GetOrdinal() == GetCurViewId() )
2303             {
2304                 xViewData->removeByIndex(i);
2305                 break;
2306             }
2307         }
2308 
2309         // then replace it with the most recent view data we just obtained
2310         xViewData->insertByIndex( 0, makeAny( aViewData ) );
2311     }
2312     catch( const Exception& )
2313     {
2314     	DBG_UNHANDLED_EXCEPTION();
2315     }
2316 }
2317 
2318 //--------------------------------------------------------------------
2319 
2320 sal_Bool SfxViewFrame::SwitchToViewShell_Impl
2321 (
2322     sal_uInt16  nViewIdOrNo,    /*  > 0
2323                                 Registrierungs-Id der View, auf die umge-
2324                                 schaltet werden soll, bzw. die erstmalig
2325                                 erzeugt werden soll.
2326 
2327                                 == 0
2328                                 Es soll die Default-View verwendet werden. */
2329 
2330     sal_Bool    bIsIndex        /*  sal_True
2331                                 'nViewIdOrNo' ist keine Registrations-Id sondern
2332                                 ein Index in die f"ur die in diesem
2333                                 <SfxViewFrame> dargestellte <SfxObjectShell>.
2334                                 */
2335 )
2336 
2337 /*  [Beschreibung]
2338 
2339     Interne Methode zum Umschalten auf eine andere <SfxViewShell>-Subklasse,
2340     die in diesem SfxMDIFrame erzeugt werden soll. Existiert noch
2341     keine SfxViewShell in diesem SfxMDIFrame, so wird erstmalig eine
2342     erzeugt.
2343 
2344 
2345     [R"uckgabewert]
2346 
2347     sal_Bool                        sal_True
2348                                 die angeforderte SfxViewShell wurde erzeugt
2349                                 und eine ggf. bestehende gel"oscht
2350 
2351                                 sal_False
2352                                 die angeforderte SfxViewShell konnte nicht
2353                                 erzeugt werden, die bestehende SfxViewShell
2354                                 existiert daher weiterhin
2355 */
2356 
2357 {
2358     try
2359     {
2360         ENSURE_OR_THROW( GetObjectShell() != NULL, "not possible without a document" );
2361 
2362         // if we already have a view shell, remove it
2363         SfxViewShell* pOldSh = GetViewShell();
2364         OSL_PRECOND( pOldSh, "SfxViewFrame::SwitchToViewShell_Impl: that's called *switch* (not for *initial-load*) for a reason" );
2365         if ( pOldSh )
2366         {
2367             // ask wether it can be closed
2368             if ( !pOldSh->PrepareClose( sal_True ) )
2369                 return sal_False;
2370 
2371             // remove sub shells from Dispatcher before switching to new ViewShell
2372             PopShellAndSubShells_Impl( *pOldSh );
2373         }
2374 
2375         GetBindings().ENTERREGISTRATIONS();
2376         LockAdjustPosSizePixel();
2377 
2378         // ID of the new view
2379         SfxObjectFactory& rDocFact = GetObjectShell()->GetFactory();
2380         const sal_uInt16 nViewId = ( bIsIndex || !nViewIdOrNo ) ? rDocFact.GetViewFactory( nViewIdOrNo ).GetOrdinal() : nViewIdOrNo;
2381 
2382         // save the view data of the old view, so it can be restored later on (when needed)
2383         SaveCurrentViewData_Impl( nViewId );
2384 
2385         // create and load new ViewShell
2386         SfxViewShell* pNewSh = LoadViewIntoFrame_Impl(
2387             *GetObjectShell(),
2388             GetFrame().GetFrameInterface(),
2389             Sequence< PropertyValue >(),    // means "reuse existing model's args"
2390             nViewId,
2391             false
2392         );
2393 
2394         // allow resize events to be processed
2395         UnlockAdjustPosSizePixel();
2396 
2397         if ( GetWindow().IsReallyVisible() )
2398             DoAdjustPosSizePixel( pNewSh, Point(), GetWindow().GetOutputSizePixel() );
2399 
2400 	    GetBindings().LEAVEREGISTRATIONS();
2401         delete pOldSh;
2402     }
2403     catch ( const com::sun::star::uno::Exception& )
2404     {
2405         // the SfxCode is not able to cope with exceptions thrown while creating views
2406         // the code will crash in the stack unwinding procedure, so we shouldn't let exceptions go through here
2407         DBG_UNHANDLED_EXCEPTION();
2408         return sal_False;
2409     }
2410 
2411     DBG_ASSERT( SFX_APP()->GetViewFrames_Impl().Count() == SFX_APP()->GetViewShells_Impl().Count(), "Inconsistent view arrays!" );
2412     return sal_True;
2413 }
2414 
2415 //-------------------------------------------------------------------------
2416 void SfxViewFrame::SetCurViewId_Impl( const sal_uInt16 i_nID )
2417 {
2418     pImp->nCurViewId = i_nID;
2419 }
2420 
2421 //-------------------------------------------------------------------------
2422 sal_uInt16 SfxViewFrame::GetCurViewId() const
2423 {
2424     return pImp->nCurViewId;
2425 }
2426 
2427 //-------------------------------------------------------------------------
2428 void SfxViewFrame::ExecView_Impl
2429 (
2430     SfxRequest& rReq        // der auszuf"uhrende <SfxRequest>
2431 )
2432 
2433 /*  [Beschreibung]
2434 
2435     Interne Methode zum Ausf"uhren der f"ur die <SfxShell> Subklasse
2436     SfxViewFrame in der <SVIDL> beschriebenen Slots.
2437 */
2438 
2439 {
2440     DBG_CHKTHIS(SfxViewFrame, 0);
2441 
2442     // Wenn gerade die Shells ausgetauscht werden...
2443     if ( !GetObjectShell() || !GetViewShell() )
2444         return;
2445 
2446     switch ( rReq.GetSlot() )
2447     {
2448         case SID_TERMINATE_INPLACEACTIVATION :
2449         {
2450             SfxInPlaceClient* pClient = GetViewShell()->GetUIActiveClient();
2451             if ( pClient )
2452                 pClient->DeactivateObject();
2453             break;
2454         }
2455 
2456         case SID_VIEWSHELL:
2457         {
2458             const SfxPoolItem *pItem = 0;
2459             if  (   rReq.GetArgs()
2460                 &&  SFX_ITEM_SET == rReq.GetArgs()->GetItemState( SID_VIEWSHELL, sal_False, &pItem )
2461                 )
2462             {
2463                 const sal_uInt16 nViewId = static_cast< const SfxUInt16Item* >( pItem )->GetValue();
2464                 sal_Bool bSuccess = SwitchToViewShell_Impl( nViewId );
2465                 rReq.SetReturnValue( SfxBoolItem( 0, bSuccess ) );
2466             }
2467             break;
2468         }
2469 
2470         case SID_VIEWSHELL0:
2471         case SID_VIEWSHELL1:
2472         case SID_VIEWSHELL2:
2473         case SID_VIEWSHELL3:
2474         case SID_VIEWSHELL4:
2475         {
2476             const sal_uInt16 nViewNo = rReq.GetSlot() - SID_VIEWSHELL0;
2477             sal_Bool bSuccess = SwitchToViewShell_Impl( nViewNo, sal_True );
2478             rReq.SetReturnValue( SfxBoolItem( 0, bSuccess ) );
2479             break;
2480         }
2481 
2482         case SID_NEWWINDOW:
2483         {
2484             // Hack. demnaechst virtuelle Funktion
2485             if ( !GetViewShell()->NewWindowAllowed() )
2486             {
2487                 OSL_ENSURE( false, "You should have disabled the 'Window/New Window' slot!" );
2488                 return;
2489             }
2490 
2491 			// ViewData bei FrameSets rekursiv holen
2492 			GetFrame().GetViewData_Impl();
2493 			SfxMedium* pMed = GetObjectShell()->GetMedium();
2494 
2495             // do not open the new window hidden
2496 			pMed->GetItemSet()->ClearItem( SID_HIDDEN );
2497 
2498             // the view ID (optional arg. TODO: this is currently not supported in the slot definition ...)
2499             SFX_REQUEST_ARG( rReq, pViewIdItem, SfxUInt16Item, SID_VIEW_ID, sal_False );
2500             const sal_uInt16 nViewId = pViewIdItem ? pViewIdItem->GetValue() : GetCurViewId();
2501 
2502         	Reference < XFrame > xFrame;
2503             // the frame (optional arg. TODO: this is currently not supported in the slot definition ...)
2504             SFX_REQUEST_ARG( rReq, pFrameItem, SfxUnoFrameItem, SID_FILLFRAME, sal_False );
2505             if ( pFrameItem )
2506                 xFrame = pFrameItem->GetFrame();
2507 
2508             LoadViewIntoFrame_Impl_NoThrow( *GetObjectShell(), xFrame, nViewId, false );
2509 
2510 			rReq.Done();
2511             break;
2512         }
2513 
2514         case SID_OBJECT:
2515         {
2516             SFX_REQUEST_ARG( rReq, pItem, SfxUInt16Item, SID_OBJECT, sal_False );
2517 
2518 	        SfxViewShell *pViewShell = GetViewShell();
2519 	        if ( pViewShell && pItem )
2520 	        {
2521 				pViewShell->DoVerb( pItem->GetValue() );
2522                 rReq.Done();
2523 				break;;
2524             }
2525         }
2526     }
2527 }
2528 
2529 //-------------------------------------------------------------------------
2530 /* TODO as96863:
2531         This method try to collect informations about the count of currently open documents.
2532         But the algorithm is implemented very simple ...
2533         E.g. hidden documents should be ignored here ... but they are counted.
2534         TODO: export special helper "framework::FrameListAnalyzer" within the framework module
2535         and use it here.
2536 */
2537 sal_Bool impl_maxOpenDocCountReached()
2538 {
2539     static ::rtl::OUString SERVICE_DESKTOP = ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop");
2540 
2541     try
2542     {
2543         css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory();
2544         css::uno::Any aVal = ::comphelper::ConfigurationHelper::readDirectKey(
2545                                 xSMGR,
2546                                 ::rtl::OUString::createFromAscii("org.openoffice.Office.Common/"),
2547                                 ::rtl::OUString::createFromAscii("Misc"),
2548                                 ::rtl::OUString::createFromAscii("MaxOpenDocuments"),
2549                                 ::comphelper::ConfigurationHelper::E_READONLY);
2550 
2551         // NIL means: count of allowed documents = infinite !
2552         if ( ! aVal.hasValue())
2553             return sal_False;
2554 
2555         sal_Int32 nOpenDocs = 0;
2556         sal_Int32 nMaxDocs  = 0;
2557         aVal >>= nMaxDocs;
2558 
2559         css::uno::Reference< css::frame::XFramesSupplier >  xDesktop(xSMGR->createInstance(SERVICE_DESKTOP), css::uno::UNO_QUERY_THROW);
2560         css::uno::Reference< css::container::XIndexAccess > xCont   (xDesktop->getFrames()                 , css::uno::UNO_QUERY_THROW);
2561 
2562         sal_Int32 c = xCont->getCount();
2563         sal_Int32 i = 0;
2564 
2565         for (i=0; i<c; ++i)
2566         {
2567             try
2568             {
2569                 css::uno::Reference< css::frame::XFrame > xFrame;
2570                 xCont->getByIndex(i) >>= xFrame;
2571                 if ( ! xFrame.is())
2572                     continue;
2573 
2574                 // a) do not count the help window
2575                 if (xFrame->getName().equalsAscii("OFFICE_HELP_TASK"))
2576                     continue;
2577 
2578                 // b) count all other frames
2579                 ++nOpenDocs;
2580             }
2581             catch(const css::uno::Exception&)
2582                 // A IndexOutOfBoundException can happen in multithreaded environments,
2583                 // where any other thread can change this container !
2584                 { continue; }
2585         }
2586 
2587         return (nOpenDocs >= nMaxDocs);
2588     }
2589     catch(const css::uno::Exception&)
2590         {}
2591 
2592     // Any internal error is no reason to stop opening documents !
2593     // Limitation of opening documents is a special "nice to  have" feature.
2594     // Otherwhise it can happen, that NO document will be opened ...
2595     return sal_False;
2596 }
2597 
2598 //-------------------------------------------------------------------------
2599 void SfxViewFrame::StateView_Impl
2600 (
2601     SfxItemSet&     rSet            /*  leeres <SfxItemSet> mit <Which-Ranges>,
2602                                         welche die Ids der zu erfragenden
2603                                         Slots beschreiben. */
2604 )
2605 
2606 /*  [Beschreibung]
2607 
2608     Diese interne Methode liefert in 'rSet' die Status der f"ur die
2609     <SfxShell> Subklasse SfxViewFrame in der <SVIDL> beschriebenen <Slots>.
2610 
2611     In 'rSet' sind dabei genau die vom SFx als ung"ultig erkannten
2612     Slot-Ids als Which-ranges enthalten. Falls der an dieser Shell gesetzte
2613     <SfxItemPool> f"ur einzelne Slot-Ids ein Mapping hat, werden die
2614     entsprechenden Which-Ids verwendet, so da\s Items ggf. direkt mit
2615     einer mit Which-Ids arbeitenden Core-::com::sun::star::script::Engine ausgetauscht werden
2616     k"onnen.
2617 */
2618 
2619 {
2620     DBG_CHKTHIS(SfxViewFrame, 0);
2621 
2622     SfxObjectShell *pDocSh = GetObjectShell();
2623 
2624     if ( !pDocSh )
2625 		// Ich bin gerade am Reloaden und Yielde so vor mich hin ...
2626         return;
2627 
2628     const sal_uInt16 *pRanges = rSet.GetRanges();
2629     DBG_ASSERT(pRanges, "Set ohne Bereich");
2630     while ( *pRanges )
2631     {
2632         for ( sal_uInt16 nWhich = *pRanges++; nWhich <= *pRanges; ++nWhich )
2633         {
2634             switch(nWhich)
2635             {
2636                 case SID_VIEWSHELL:
2637                 {
2638                     rSet.Put( SfxUInt16Item( nWhich, pImp->nCurViewId ) );
2639                     break;
2640                 }
2641 
2642                 case SID_VIEWSHELL0:
2643                 case SID_VIEWSHELL1:
2644                 case SID_VIEWSHELL2:
2645                 case SID_VIEWSHELL3:
2646                 case SID_VIEWSHELL4:
2647                 {
2648                     sal_uInt16 nViewNo = nWhich - SID_VIEWSHELL0;
2649                     if ( GetObjectShell()->GetFactory().GetViewFactoryCount() >
2650                          nViewNo && !GetObjectShell()->IsInPlaceActive() )
2651                     {
2652                         SfxViewFactory &rViewFactory =
2653                             GetObjectShell()->GetFactory().GetViewFactory(nViewNo);
2654                         rSet.Put( SfxBoolItem(
2655                             nWhich, pImp->nCurViewId == rViewFactory.GetOrdinal() ) );
2656                     }
2657                     else
2658                         rSet.DisableItem( nWhich );
2659                     break;
2660                 }
2661                 case SID_FRAMETITLE:
2662                 {
2663                     if( GetFrameType() & SFXFRAME_HASTITLE )
2664                         rSet.Put( SfxStringItem(
2665                             SID_FRAMETITLE, pImp->aFrameTitle) );
2666                     else
2667                         rSet.DisableItem( nWhich );
2668                     break;
2669                 }
2670 
2671 		        case SID_NEWWINDOW:
2672 		        {
2673                     if  (   !GetViewShell()->NewWindowAllowed()
2674                         ||  impl_maxOpenDocCountReached()
2675                         )
2676                         rSet.DisableItem( nWhich );
2677 					break;
2678 				}
2679             }
2680         }
2681     }
2682 }
2683 
2684 //-------------------------------------------------------------------------
2685 void SfxViewFrame::ToTop()
2686 {
2687     GetFrame().Appear();
2688 }
2689 
2690 //-------------------------------------------------------------------------
2691 SfxViewFrame* SfxViewFrame::GetParentViewFrame() const
2692 /*
2693     Beschreibung:
2694     Der ParentViewFrame ist der ViewFrame des ParentFrames
2695 */
2696 {
2697     SfxFrame *pFrame = GetFrame().GetParentFrame();
2698     return pFrame ? pFrame->GetCurrentViewFrame() : NULL;
2699 }
2700 
2701 //-------------------------------------------------------------------------
2702 SfxFrame& SfxViewFrame::GetFrame() const
2703 /*
2704     Beschreibung:
2705     GetFrame liefert den Frame, in dem sich der ViewFrame befindet
2706 */
2707 {
2708     return pImp->rFrame;
2709 }
2710 
2711 //-------------------------------------------------------------------------
2712 SfxViewFrame* SfxViewFrame::GetTopViewFrame() const
2713 {
2714     return GetFrame().GetTopFrame().GetCurrentViewFrame();
2715 }
2716 
2717 Window& SfxViewFrame::GetWindow() const
2718 {
2719 	return pImp->pWindow ? *pImp->pWindow : GetFrame().GetWindow();
2720 }
2721 
2722 sal_Bool SfxViewFrame::DoClose()
2723 {
2724 	return GetFrame().DoClose();
2725 }
2726 
2727 String SfxViewFrame::GetActualPresentationURL_Impl() const
2728 {
2729 	if ( xObjSh.Is() )
2730 		return xObjSh->GetMedium()->GetName();
2731 	return String();
2732 }
2733 
2734 void SfxViewFrame::SetModalMode( sal_Bool bModal )
2735 {
2736     pImp->bModal = bModal;
2737     if ( xObjSh.Is() )
2738     {
2739         for ( SfxViewFrame* pFrame = SfxViewFrame::GetFirst( xObjSh );
2740 			  !bModal && pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, xObjSh ) )
2741             bModal = pFrame->pImp->bModal;
2742         xObjSh->SetModalMode_Impl( bModal );
2743     }
2744 }
2745 
2746 sal_Bool SfxViewFrame::IsInModalMode() const
2747 {
2748     return pImp->bModal || GetFrame().GetWindow().IsInModalMode();
2749 }
2750 
2751 void SfxViewFrame::Resize( sal_Bool bForce )
2752 {
2753     Size aSize = GetWindow().GetOutputSizePixel();
2754     if ( bForce || aSize != pImp->aSize )
2755     {
2756         pImp->aSize = aSize;
2757         SfxViewShell *pShell = GetViewShell();
2758         if ( pShell )
2759         {
2760             if ( GetFrame().IsInPlace() )
2761             {
2762                 Point aPoint = GetWindow().GetPosPixel();
2763                 DoAdjustPosSizePixel( pShell, aPoint, aSize );
2764             }
2765             else
2766             {
2767                 DoAdjustPosSizePixel( pShell, Point(), aSize );
2768             }
2769         }
2770     }
2771 }
2772 
2773 #define LINE_SEP 0x0A
2774 
2775 void CutLines( ::rtl::OUString& rStr, sal_Int32 nStartLine, sal_Int32 nLines, sal_Bool bEraseTrailingEmptyLines )
2776 {
2777 	sal_Int32 nStartPos = 0;
2778 	sal_Int32 nEndPos = 0;
2779 	sal_Int32 nLine = 0;
2780 	while ( nLine < nStartLine )
2781 	{
2782         nStartPos = rStr.indexOf( LINE_SEP, nStartPos );
2783         if( nStartPos == -1 )
2784             break;
2785 		nStartPos++;	// nicht das \n.
2786 		nLine++;
2787 	}
2788 
2789 	DBG_ASSERTWARNING( nStartPos != STRING_NOTFOUND, "CutLines: Startzeile nicht gefunden!" );
2790 
2791 	if ( nStartPos != -1 )
2792 	{
2793 		nEndPos = nStartPos;
2794 		for ( sal_Int32 i = 0; i < nLines; i++ )
2795 			nEndPos = rStr.indexOf( LINE_SEP, nEndPos+1 );
2796 
2797 		if ( nEndPos == -1 ) // kann bei letzter Zeile passieren
2798 			nEndPos = rStr.getLength();
2799         else
2800 			nEndPos++;
2801 
2802         ::rtl::OUString aEndStr = rStr.copy( nEndPos );
2803         rStr = rStr.copy( 0, nStartPos );
2804         rStr += aEndStr;
2805 	}
2806 	if ( bEraseTrailingEmptyLines )
2807 	{
2808 		sal_Int32 n = nStartPos;
2809 		sal_Int32 nLen = rStr.getLength();
2810 		while ( ( n < nLen ) && ( rStr.getStr()[ n ] == LINE_SEP ) )
2811 			n++;
2812 
2813 		if ( n > nStartPos )
2814         {
2815             ::rtl::OUString aEndStr = rStr.copy( n );
2816             rStr = rStr.copy( 0, nStartPos );
2817             rStr += aEndStr;
2818         }
2819 	}
2820 }
2821 
2822 /*
2823     add new recorded dispatch macro script into the application global basic lib container
2824     It generates a new unique id for it and insert the macro by using this number as name for
2825     the modul
2826  */
2827 void SfxViewFrame::AddDispatchMacroToBasic_Impl( const ::rtl::OUString& sMacro )
2828 {
2829     /*
2830     // get lib and modul name from dialog
2831     SfxModule *pMod = GetObjectShell()->GetModule();
2832     SfxRequest aReq( SID_BASICCHOOSER, SFX_CALLMODE_SYNCHRON, pMod->GetPool() );
2833     const SfxPoolItem* pRet = pMod->ExecuteSlot( aReq );
2834     if ( pRet )
2835         ::rtl::OUString = ((SfxStringItem*)pRet)->GetValue();
2836     */
2837     if ( !sMacro.getLength() )
2838         return;
2839 
2840     SfxApplication* pSfxApp = SFX_APP();
2841     SfxRequest aReq( SID_BASICCHOOSER, SFX_CALLMODE_SYNCHRON, pSfxApp->GetPool() );
2842     aReq.AppendItem( SfxBoolItem(SID_RECORDMACRO,sal_True) );
2843     const SfxPoolItem* pRet = SFX_APP()->ExecuteSlot( aReq );
2844     String aScriptURL;
2845     if ( pRet )
2846         aScriptURL = ((SfxStringItem*)pRet)->GetValue();
2847     if ( aScriptURL.Len() )
2848     {
2849         // parse scriptURL
2850         String aLibName;
2851         String aModuleName;
2852         String aMacroName;
2853         String aLocation;
2854         Reference< XMultiServiceFactory > xSMgr = ::comphelper::getProcessServiceFactory();
2855         Reference< com::sun::star::uri::XUriReferenceFactory > xFactory( xSMgr->createInstance(
2856             ::rtl::OUString::createFromAscii( "com.sun.star.uri.UriReferenceFactory" ) ), UNO_QUERY );
2857         if ( xFactory.is() )
2858         {
2859             Reference< com::sun::star::uri::XVndSunStarScriptUrl > xUrl( xFactory->parse( aScriptURL ), UNO_QUERY );
2860             if ( xUrl.is() )
2861             {
2862                 // get name
2863                 ::rtl::OUString aName = xUrl->getName();
2864                 sal_Unicode cTok = '.';
2865                 sal_Int32 nIndex = 0;
2866                 aLibName = aName.getToken( 0, cTok, nIndex );
2867                 if ( nIndex != -1 )
2868                     aModuleName = aName.getToken( 0, cTok, nIndex );
2869                 if ( nIndex != -1 )
2870                     aMacroName = aName.getToken( 0, cTok, nIndex );
2871 
2872                 // get location
2873                 ::rtl::OUString aLocKey = ::rtl::OUString::createFromAscii( "location" );
2874                 if ( xUrl->hasParameter( aLocKey ) )
2875                     aLocation = xUrl->getParameter( aLocKey );
2876             }
2877         }
2878 
2879 		BasicManager* pBasMgr = 0;
2880         if ( aLocation.EqualsIgnoreCaseAscii( "application" ) )
2881         {
2882 			// application basic
2883 			pBasMgr = pSfxApp->GetBasicManager();
2884 		}
2885         else if ( aLocation.EqualsIgnoreCaseAscii( "document" ) )
2886         {
2887             pBasMgr = GetObjectShell()->GetBasicManager();
2888 		}
2889 
2890         ::rtl::OUString aOUSource;
2891         if ( pBasMgr)
2892 		{
2893 			StarBASIC* pBasic = pBasMgr->GetLib( aLibName );
2894 			if ( pBasic )
2895 			{
2896 				SbModule* pModule = pBasic->FindModule( aModuleName );
2897 				if ( pModule )
2898 				{
2899                     SbMethod* pMethod = (SbMethod*)pModule->GetMethods()->Find( aMacroName, SbxCLASS_METHOD );
2900                     aOUSource = pModule->GetSource32();
2901                     sal_uInt16 nStart, nEnd;
2902                     pMethod->GetLineRange( nStart, nEnd );
2903                     sal_uIntPtr nlStart = nStart;
2904                     sal_uIntPtr nlEnd = nEnd;
2905                     CutLines( aOUSource, nlStart-1, nlEnd-nlStart+1, sal_True );
2906 				}
2907 			}
2908 		}
2909 
2910         // open lib container and break operation if it couldn't be opened
2911         com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer > xLibCont;
2912         if ( aLocation.EqualsIgnoreCaseAscii( "application" ) )
2913         {
2914             xLibCont = SFX_APP()->GetBasicContainer();
2915 		}
2916         else if ( aLocation.EqualsIgnoreCaseAscii( "document" ) )
2917         {
2918             xLibCont = GetObjectShell()->GetBasicContainer();
2919 		}
2920 
2921         if(!xLibCont.is())
2922         {
2923             DBG_ERRORFILE("couldn't get access to the basic lib container. Adding of macro isn't possible.");
2924             return;
2925         }
2926 
2927         // get LibraryContainer
2928         com::sun::star::uno::Any aTemp;
2929         com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > xRoot(
2930                 xLibCont,
2931                 com::sun::star::uno::UNO_QUERY);
2932 
2933         ::rtl::OUString sLib( aLibName );
2934         com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > xLib;
2935         if(xRoot->hasByName(sLib))
2936         {
2937             // library must be loaded
2938             aTemp = xRoot->getByName(sLib);
2939             xLibCont->loadLibrary(sLib);
2940             aTemp >>= xLib;
2941         }
2942         else
2943         {
2944             xLib = com::sun::star::uno::Reference< com::sun::star::container::XNameAccess >(
2945                         xLibCont->createLibrary(sLib),
2946                         com::sun::star::uno::UNO_QUERY);
2947         }
2948 
2949         // pack the macro as direct usable "sub" routine
2950         ::rtl::OUString sCode;
2951         ::rtl::OUStringBuffer sRoutine(10000);
2952         ::rtl::OUString sMacroName( aMacroName );
2953         sal_Bool bReplace = sal_False;
2954 
2955         // get module
2956         ::rtl::OUString sModule( aModuleName );
2957         if(xLib->hasByName(sModule))
2958         {
2959             if ( aOUSource.getLength() )
2960             {
2961                 sRoutine.append( aOUSource );
2962             }
2963             else
2964             {
2965                 aTemp = xLib->getByName(sModule);
2966                 aTemp >>= sCode;
2967                 sRoutine.append( sCode );
2968             }
2969 
2970             bReplace = sal_True;
2971         }
2972 
2973         // append new method
2974         sRoutine.appendAscii("\nsub "     );
2975         sRoutine.append     (sMacroName   );
2976         sRoutine.appendAscii("\n"         );
2977         sRoutine.append     (sMacro       );
2978         sRoutine.appendAscii("\nend sub\n");
2979 
2980         // create the modul inside the library and insert the macro routine
2981         aTemp <<= sRoutine.makeStringAndClear();
2982         if ( bReplace )
2983         {
2984             com::sun::star::uno::Reference< com::sun::star::container::XNameContainer > xModulCont(
2985                 xLib,
2986                 com::sun::star::uno::UNO_QUERY);
2987             xModulCont->replaceByName(sModule,aTemp);
2988         }
2989         else
2990         {
2991             com::sun::star::uno::Reference< com::sun::star::container::XNameContainer > xModulCont(
2992                 xLib,
2993                 com::sun::star::uno::UNO_QUERY);
2994             xModulCont->insertByName(sModule,aTemp);
2995         }
2996 
2997         // #i17355# update the Basic IDE
2998         for ( SfxViewShell* pViewShell = SfxViewShell::GetFirst(); pViewShell; pViewShell = SfxViewShell::GetNext( *pViewShell ) )
2999         {
3000             if ( pViewShell->GetName().EqualsAscii( "BasicIDE" ) )
3001             {
3002                 SfxViewFrame* pViewFrame = pViewShell->GetViewFrame();
3003                 SfxDispatcher* pDispat = pViewFrame ? pViewFrame->GetDispatcher() : NULL;
3004                 if ( pDispat )
3005                 {
3006                     SfxMacroInfoItem aInfoItem( SID_BASICIDE_ARG_MACROINFO, pBasMgr, aLibName, aModuleName, String(), String() );
3007                     pDispat->Execute( SID_BASICIDE_UPDATEMODULESOURCE, SFX_CALLMODE_SYNCHRON, &aInfoItem, 0L );
3008                 }
3009             }
3010         }
3011     }
3012     else
3013     {
3014         // add code for "session only" macro
3015     }
3016 }
3017 
3018 void SfxViewFrame::MiscExec_Impl( SfxRequest& rReq )
3019 {
3020 	DBG_MEMTEST();
3021 	switch ( rReq.GetSlot() )
3022 	{
3023         case SID_STOP_RECORDING :
3024         case SID_RECORDMACRO :
3025         {
3026             // try to find any active recorder on this frame
3027             ::rtl::OUString sProperty = rtl::OUString::createFromAscii("DispatchRecorderSupplier");
3028             com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xFrame(
3029                     GetFrame().GetFrameInterface(),
3030                     com::sun::star::uno::UNO_QUERY);
3031 
3032             com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xSet(xFrame,com::sun::star::uno::UNO_QUERY);
3033             com::sun::star::uno::Any aProp = xSet->getPropertyValue(sProperty);
3034             com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier > xSupplier;
3035             aProp >>= xSupplier;
3036             com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > xRecorder;
3037             if (xSupplier.is())
3038                 xRecorder = xSupplier->getDispatchRecorder();
3039 
3040             sal_Bool bIsRecording = xRecorder.is();
3041             SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, SID_RECORDMACRO, sal_False);
3042             if ( pItem && pItem->GetValue() == bIsRecording )
3043                 return;
3044 
3045             if ( xRecorder.is() )
3046             {
3047                 // disable active recording
3048                 aProp <<= com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier >();
3049                 xSet->setPropertyValue(sProperty,aProp);
3050 
3051                 SFX_REQUEST_ARG( rReq, pRecordItem, SfxBoolItem, FN_PARAM_1, sal_False);
3052                 if ( !pRecordItem || !pRecordItem->GetValue() )
3053                     // insert script into basic library container of application
3054                     AddDispatchMacroToBasic_Impl(xRecorder->getRecordedMacro());
3055 
3056                 xRecorder->endRecording();
3057                 xRecorder = NULL;
3058 				GetBindings().SetRecorder_Impl( xRecorder );
3059 
3060                 SetChildWindow( SID_RECORDING_FLOATWINDOW, sal_False );
3061                 if ( rReq.GetSlot() != SID_RECORDMACRO )
3062                     GetBindings().Invalidate( SID_RECORDMACRO );
3063             }
3064             else if ( rReq.GetSlot() == SID_RECORDMACRO )
3065             {
3066                 // enable recording
3067                 com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > xFactory(
3068                         ::comphelper::getProcessServiceFactory(),
3069                         com::sun::star::uno::UNO_QUERY);
3070 
3071                 xRecorder = com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder >(
3072                         xFactory->createInstance(rtl::OUString::createFromAscii("com.sun.star.frame.DispatchRecorder")),
3073                         com::sun::star::uno::UNO_QUERY);
3074 
3075                 xSupplier = com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier >(
3076                         xFactory->createInstance(rtl::OUString::createFromAscii("com.sun.star.frame.DispatchRecorderSupplier")),
3077                         com::sun::star::uno::UNO_QUERY);
3078 
3079                 xSupplier->setDispatchRecorder(xRecorder);
3080                 xRecorder->startRecording(xFrame);
3081                 aProp <<= xSupplier;
3082                 xSet->setPropertyValue(sProperty,aProp);
3083 				GetBindings().SetRecorder_Impl( xRecorder );
3084                 SetChildWindow( SID_RECORDING_FLOATWINDOW, sal_True );
3085             }
3086 
3087             rReq.Done();
3088             break;
3089         }
3090 
3091 		case SID_TOGGLESTATUSBAR:
3092 		{
3093             com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xFrame(
3094                     GetFrame().GetFrameInterface(),
3095                     com::sun::star::uno::UNO_QUERY);
3096 
3097 	        Reference< com::sun::star::beans::XPropertySet > xPropSet( xFrame, UNO_QUERY );
3098             Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
3099 	        if ( xPropSet.is() )
3100 	        {
3101 		        try
3102 		        {
3103 			        Any aValue = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
3104 			        aValue >>= xLayoutManager;
3105                 }
3106                 catch ( Exception& )
3107                 {
3108                 }
3109             }
3110 
3111             if ( xLayoutManager.is() )
3112             {
3113                 rtl::OUString aStatusbarResString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/statusbar/statusbar" ));
3114                 // Parameter auswerten
3115 			    SFX_REQUEST_ARG(rReq, pShowItem, SfxBoolItem, rReq.GetSlot(), sal_False);
3116                 sal_Bool bShow( sal_True );
3117                 if ( !pShowItem )
3118                     bShow = xLayoutManager->isElementVisible( aStatusbarResString );
3119                 else
3120                     bShow = pShowItem->GetValue();
3121 
3122                 if ( bShow )
3123                 {
3124                     xLayoutManager->createElement( aStatusbarResString );
3125                     xLayoutManager->showElement( aStatusbarResString );
3126                 }
3127                 else
3128                     xLayoutManager->hideElement( aStatusbarResString );
3129 
3130                 if ( !pShowItem )
3131 				    rReq.AppendItem( SfxBoolItem( SID_TOGGLESTATUSBAR, bShow ) );
3132             }
3133 			rReq.Done();
3134 			break;
3135 		}
3136 
3137 		// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3138 		case SID_WIN_FULLSCREEN:
3139 		{
3140             SFX_REQUEST_ARG(rReq, pItem, SfxBoolItem, rReq.GetSlot(), sal_False);
3141             SfxViewFrame *pTop = GetTopViewFrame();
3142             if ( pTop )
3143             {
3144                 WorkWindow* pWork = (WorkWindow*) pTop->GetFrame().GetTopWindow_Impl();
3145                 if ( pWork )
3146                 {
3147                     com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xFrame(
3148                             GetFrame().GetFrameInterface(),
3149                             com::sun::star::uno::UNO_QUERY);
3150 
3151                     Reference< ::com::sun::star::beans::XPropertySet > xPropSet( xFrame, UNO_QUERY );
3152                     Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
3153 	                if ( xPropSet.is() )
3154 	                {
3155 		                try
3156 		                {
3157 			                Any aValue = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
3158 			                aValue >>= xLayoutManager;
3159                         }
3160                         catch ( Exception& )
3161                         {
3162                         }
3163                     }
3164 
3165                     sal_Bool bNewFullScreenMode = pItem ? pItem->GetValue() : !pWork->IsFullScreenMode();
3166 					if ( bNewFullScreenMode != pWork->IsFullScreenMode() )
3167 					{
3168                         Reference< ::com::sun::star::beans::XPropertySet > xLMPropSet( xLayoutManager, UNO_QUERY );
3169                         if ( xLMPropSet.is() )
3170                         {
3171                             try
3172                             {
3173                                 xLMPropSet->setPropertyValue(
3174                                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "HideCurrentUI" )),
3175                                     makeAny( bNewFullScreenMode ));
3176                             }
3177                             catch ( ::com::sun::star::beans::UnknownPropertyException& )
3178                             {
3179                             }
3180                         }
3181 	                    pWork->ShowFullScreenMode( bNewFullScreenMode );
3182 	                    pWork->SetMenuBarMode( bNewFullScreenMode ? MENUBAR_MODE_HIDE : MENUBAR_MODE_NORMAL );
3183 	                    GetFrame().GetWorkWindow_Impl()->SetFullScreen_Impl( bNewFullScreenMode );
3184 	                    if ( !pItem )
3185 	                        rReq.AppendItem( SfxBoolItem( SID_WIN_FULLSCREEN, bNewFullScreenMode ) );
3186 	                    rReq.Done();
3187 					}
3188 					else
3189 						rReq.Ignore();
3190                 }
3191             }
3192             else
3193                 rReq.Ignore();
3194 
3195             GetDispatcher()->Update_Impl( sal_True );
3196 			break;
3197 		}
3198 	}
3199 }
3200 
3201 void SfxViewFrame::MiscState_Impl(SfxItemSet &rSet)
3202 {
3203 	DBG_MEMTEST();
3204 
3205 	const sal_uInt16 *pRanges = rSet.GetRanges();
3206 	DBG_ASSERT(pRanges && *pRanges, "Set ohne Bereich");
3207 	while ( *pRanges )
3208 	{
3209 		for(sal_uInt16 nWhich = *pRanges++; nWhich <= *pRanges; ++nWhich)
3210 		{
3211 			switch(nWhich)
3212 			{
3213                 case SID_CURRENT_URL:
3214                 {
3215                     // Bei internem InPlace den ContainerFrame nehmen
3216                     SfxViewFrame *pFrame = this;
3217                     if ( pFrame->GetParentViewFrame_Impl() )
3218                         pFrame = pFrame->GetParentViewFrame_Impl();
3219                     rSet.Put( SfxStringItem( nWhich, pFrame->GetActualPresentationURL_Impl() ) );
3220 	                break;
3221                 }
3222 
3223                 case SID_RECORDMACRO :
3224                 {
3225 					const char* pName = GetObjectShell()->GetFactory().GetShortName();
3226 					if (  strcmp(pName,"swriter") && strcmp(pName,"scalc") )
3227 					{
3228                         rSet.DisableItem( nWhich );
3229 						break;
3230 					}
3231 
3232                     ::rtl::OUString sProperty = rtl::OUString::createFromAscii("DispatchRecorderSupplier");
3233                     com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xSet(
3234                             GetFrame().GetFrameInterface(),
3235                             com::sun::star::uno::UNO_QUERY);
3236 
3237                     com::sun::star::uno::Any aProp = xSet->getPropertyValue(sProperty);
3238                     com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier > xSupplier;
3239                     if ( aProp >>= xSupplier )
3240                         rSet.Put( SfxBoolItem( nWhich, xSupplier.is() ) );
3241                     else
3242                         rSet.DisableItem( nWhich );
3243                     break;
3244                 }
3245 
3246                 case SID_STOP_RECORDING :
3247                 {
3248 					const char* pName = GetObjectShell()->GetFactory().GetShortName();
3249 					if (  strcmp(pName,"swriter") && strcmp(pName,"scalc") )
3250 					{
3251                         rSet.DisableItem( nWhich );
3252 						break;
3253 					}
3254 
3255                     ::rtl::OUString sProperty = rtl::OUString::createFromAscii("DispatchRecorderSupplier");
3256                     com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xSet(
3257                             GetFrame().GetFrameInterface(),
3258                             com::sun::star::uno::UNO_QUERY);
3259 
3260                     com::sun::star::uno::Any aProp = xSet->getPropertyValue(sProperty);
3261                     com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier > xSupplier;
3262                     if ( !(aProp >>= xSupplier) || !xSupplier.is() )
3263                         rSet.DisableItem( nWhich );
3264                     break;
3265                 }
3266 
3267 				case SID_TOGGLESTATUSBAR:
3268 				{
3269                     com::sun::star::uno::Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
3270                     com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xSet(
3271                             GetFrame().GetFrameInterface(),
3272                             com::sun::star::uno::UNO_QUERY);
3273                     com::sun::star::uno::Any aProp = xSet->getPropertyValue(
3274                         rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )) );
3275 
3276 			        if ( !( aProp >>= xLayoutManager ))
3277                         rSet.Put( SfxBoolItem( nWhich, sal_False ));
3278                     else
3279                     {
3280                         rtl::OUString aStatusbarResString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/statusbar/statusbar" ));
3281                         sal_Bool bShow = xLayoutManager->isElementVisible( aStatusbarResString );
3282                         rSet.Put( SfxBoolItem( nWhich, bShow ));
3283                     }
3284 					break;
3285 				}
3286 
3287 				case SID_WIN_FULLSCREEN:
3288                 {
3289                     SfxViewFrame* pTop = GetTopViewFrame();
3290                     if ( pTop )
3291                     {
3292                         WorkWindow* pWork = (WorkWindow*) pTop->GetFrame().GetTopWindow_Impl();
3293                         if ( pWork )
3294                         {
3295                             rSet.Put( SfxBoolItem( nWhich, pWork->IsFullScreenMode() ) );
3296                             break;
3297                         }
3298                     }
3299 
3300                     rSet.DisableItem( nWhich );
3301 					break;
3302                 }
3303 
3304                 case SID_FORMATMENUSTATE :
3305                 {
3306                     DBG_ERROR("Outdated slot!");
3307                     rSet.DisableItem( nWhich );
3308                     break;
3309                 }
3310 
3311 				default:
3312 					//! DBG_ASSERT(FALSE, "Falscher Server fuer GetState");
3313 					break;
3314 			}
3315 		}
3316 
3317 		++pRanges;
3318 	}
3319 }
3320 
3321 void SfxViewFrame::ChildWindowExecute( SfxRequest &rReq )
3322 
3323 /* 	[Beschreibung]
3324 
3325 	Diese Methode kann in der Execute-Methode f"ur das ein- und ausschalten
3326 	von Child-Windows eingesetzt werden, um dieses inkl. API-Anbindung zu
3327 	implementieren.
3328 
3329 	Einfach in der IDL als 'ExecuteMethod' eintragen.
3330 */
3331 
3332 {
3333 	// Parameter auswerten
3334 	sal_uInt16 nSID = rReq.GetSlot();
3335 
3336 	SFX_REQUEST_ARG(rReq, pShowItem, SfxBoolItem, nSID, sal_False);
3337     if ( nSID == SID_VIEW_DATA_SOURCE_BROWSER )
3338     {
3339         if (!SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SDATABASE))
3340             return;
3341         Reference < XFrame > xFrame = GetFrame().GetTopFrame().GetFrameInterface();
3342         Reference < XFrame > xBeamer( xFrame->findFrame( DEFINE_CONST_UNICODE("_beamer"), FrameSearchFlag::CHILDREN ) );
3343         sal_Bool bShow = sal_False;
3344         sal_Bool bHasChild = xBeamer.is();
3345         bShow = pShowItem ? pShowItem->GetValue() : !bHasChild;
3346         if ( pShowItem )
3347         {
3348             if( bShow == bHasChild )
3349                 return;
3350         }
3351         else
3352             rReq.AppendItem( SfxBoolItem( nSID, bShow ) );
3353 
3354         if ( !bShow )
3355         {
3356             SetChildWindow( SID_BROWSER, sal_False );
3357         }
3358         else
3359         {
3360             ::com::sun::star::util::URL aTargetURL;
3361             aTargetURL.Complete = ::rtl::OUString::createFromAscii(".component:DB/DataSourceBrowser");
3362             Reference < ::com::sun::star::util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance( rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" )), UNO_QUERY );
3363             xTrans->parseStrict( aTargetURL );
3364 
3365             Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY );
3366             Reference < ::com::sun::star::frame::XDispatch > xDisp;
3367             if ( xProv.is() )
3368                 xDisp = xProv->queryDispatch( aTargetURL, ::rtl::OUString::createFromAscii("_beamer"), 31 );
3369             if ( xDisp.is() )
3370             {
3371                 Sequence < ::com::sun::star::beans::PropertyValue > aArgs(1);
3372                 ::com::sun::star::beans::PropertyValue* pArg = aArgs.getArray();
3373                 pArg[0].Name = rtl::OUString::createFromAscii("Referer");
3374                 pArg[0].Value <<= ::rtl::OUString::createFromAscii("private:user");
3375                 xDisp->dispatch( aTargetURL, aArgs );
3376             }
3377         }
3378 
3379         rReq.Done();
3380         return;
3381     }
3382 
3383 	sal_Bool bShow = sal_False;
3384 	sal_Bool bHasChild = HasChildWindow(nSID);
3385 	bShow = pShowItem ? pShowItem->GetValue() : !bHasChild;
3386 
3387 	// ausf"uhren
3388 	if ( !pShowItem || bShow != bHasChild )
3389 		ToggleChildWindow( nSID );
3390 
3391 	GetBindings().Invalidate( nSID );
3392     GetDispatcher()->Update_Impl( sal_True );
3393 
3394 	// ggf. recorden
3395     if ( nSID == SID_HYPERLINK_DIALOG || nSID == SID_SEARCH_DLG )
3396     {
3397         rReq.Ignore();
3398     }
3399     else
3400     {
3401         rReq.AppendItem( SfxBoolItem( nSID, bShow ) );
3402         rReq.Done();
3403     }
3404 }
3405 
3406 //--------------------------------------------------------------------
3407 
3408 void SfxViewFrame::ChildWindowState( SfxItemSet& rState )
3409 
3410 /* 	[Beschreibung]
3411 
3412 	Diese Methode kann in der Status-Methode f"ur das Ein- und Ausschalt-
3413 	Zustand von Child-Windows eingesetzt werden, um dieses zu implementieren.
3414 
3415 	Einfach in der IDL als 'StateMethod' eintragen.
3416 */
3417 
3418 {
3419 	SfxWhichIter aIter( rState );
3420 	for ( sal_uInt16 nSID = aIter.FirstWhich(); nSID; nSID = aIter.NextWhich() )
3421 	{
3422         if ( nSID == SID_VIEW_DATA_SOURCE_BROWSER )
3423         {
3424             rState.Put( SfxBoolItem( nSID, HasChildWindow( SID_BROWSER ) ) );
3425         }
3426         else if ( nSID == SID_HYPERLINK_DIALOG )
3427 		{
3428 			const SfxPoolItem* pDummy = NULL;
3429             SfxItemState eState = GetDispatcher()->QueryState( SID_HYPERLINK_SETLINK, pDummy );
3430 			if ( SFX_ITEM_DISABLED == eState )
3431 				rState.DisableItem(nSID);
3432 			else
3433 			{
3434 				if ( KnowsChildWindow(nSID) )
3435 					rState.Put( SfxBoolItem( nSID, HasChildWindow(nSID)) );
3436 				else
3437 					rState.DisableItem(nSID);
3438 			}
3439 		}
3440         else if ( nSID == SID_BROWSER )
3441 		{
3442 			Reference < XFrame > xFrame = GetFrame().GetTopFrame().GetFrameInterface()->
3443 							findFrame( DEFINE_CONST_UNICODE("_beamer"), FrameSearchFlag::CHILDREN );
3444 			if ( !xFrame.is() )
3445 				rState.DisableItem( nSID );
3446 			else if ( KnowsChildWindow(nSID) )
3447 				rState.Put( SfxBoolItem( nSID, HasChildWindow(nSID) ) );
3448 		}
3449         else if ( nSID == SID_TASKPANE )
3450         {
3451             if  ( !KnowsChildWindow( nSID ) )
3452             {
3453                 OSL_ENSURE( false, "SID_TASKPANE state requested, but no task pane child window exists for this ID!" );
3454 			    rState.DisableItem( nSID );
3455             }
3456             else if ( !moduleHasToolPanels( *pImp ) )
3457             {
3458                 rState.Put( SfxVisibilityItem( nSID, sal_False ) );
3459             }
3460             else
3461             {
3462 			    rState.Put( SfxBoolItem( nSID, HasChildWindow( nSID ) ) );
3463             }
3464         }
3465 		else if ( KnowsChildWindow(nSID) )
3466 			rState.Put( SfxBoolItem( nSID, HasChildWindow(nSID) ) );
3467 		else
3468 			rState.DisableItem(nSID);
3469 	}
3470 }
3471 
3472 //--------------------------------------------------------------------
3473 SfxWorkWindow* SfxViewFrame::GetWorkWindow_Impl( sal_uInt16 /*nId*/ )
3474 {
3475     SfxWorkWindow* pWork = 0;
3476     pWork = GetFrame().GetWorkWindow_Impl();
3477     return pWork;
3478 }
3479 
3480 /*
3481 void SfxViewFrame::SetChildWindow(sal_uInt16 nId, sal_Bool bOn)
3482 {
3483     SetChildWindow( nId, bOn, sal_True );
3484 }*/
3485 
3486 void SfxViewFrame::SetChildWindow(sal_uInt16 nId, sal_Bool bOn, sal_Bool bSetFocus )
3487 {
3488     SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3489     if ( pWork )
3490         pWork->SetChildWindow_Impl( nId, bOn, bSetFocus );
3491 }
3492 
3493 //--------------------------------------------------------------------
3494 
3495 void SfxViewFrame::ToggleChildWindow(sal_uInt16 nId)
3496 {
3497     SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3498     if ( pWork )
3499         pWork->ToggleChildWindow_Impl( nId, sal_True );
3500 }
3501 
3502 //--------------------------------------------------------------------
3503 
3504 sal_Bool SfxViewFrame::HasChildWindow( sal_uInt16 nId )
3505 {
3506 	SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3507 	return pWork ? pWork->HasChildWindow_Impl(nId) : sal_False;
3508 }
3509 
3510 //--------------------------------------------------------------------
3511 
3512 sal_Bool SfxViewFrame::KnowsChildWindow( sal_uInt16 nId )
3513 {
3514     SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3515 	return pWork ? pWork->KnowsChildWindow_Impl(nId) : sal_False;
3516 }
3517 
3518 //--------------------------------------------------------------------
3519 
3520 void SfxViewFrame::ShowChildWindow( sal_uInt16 nId, sal_Bool bVisible )
3521 {
3522     SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3523     if ( pWork )
3524     {
3525         GetDispatcher()->Update_Impl(sal_True);
3526         pWork->ShowChildWindow_Impl(nId, bVisible, sal_True );
3527     }
3528 }
3529 
3530 //--------------------------------------------------------------------
3531 
3532 SfxChildWindow* SfxViewFrame::GetChildWindow(sal_uInt16 nId)
3533 {
3534     SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3535 	return pWork ? pWork->GetChildWindow_Impl(nId) : NULL;
3536 }
3537 
3538 void SfxViewFrame::UpdateDocument_Impl()
3539 {
3540     SfxObjectShell* pDoc = GetObjectShell();
3541 	if ( pDoc->IsLoadingFinished() )
3542         pDoc->CheckSecurityOnLoading_Impl();
3543 
3544 	// check if document depends on a template
3545     pDoc->UpdateFromTemplate_Impl();
3546 }
3547 
3548 void SfxViewFrame::SetViewFrame( SfxViewFrame* pFrame )
3549 {
3550     SFX_APP()->SetViewFrame_Impl( pFrame );
3551 }
3552 
3553 // ---------------------------------------------------------------------------------------------------------------------
3554 void SfxViewFrame::ActivateToolPanel( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& i_rFrame, const ::rtl::OUString& i_rPanelURL )
3555 {
3556 	::vos::OGuard aGuard( Application::GetSolarMutex() );
3557 
3558     // look up the SfxFrame for the given XFrame
3559     SfxFrame* pFrame = NULL;
3560     for ( pFrame = SfxFrame::GetFirst(); pFrame; pFrame = SfxFrame::GetNext( *pFrame ) )
3561     {
3562         if ( pFrame->GetFrameInterface() == i_rFrame )
3563             break;
3564     }
3565     SfxViewFrame* pViewFrame = pFrame ? pFrame->GetCurrentViewFrame() : NULL;
3566     ENSURE_OR_RETURN_VOID( pViewFrame != NULL, "SfxViewFrame::ActivateToolPanel: did not find an SfxFrame for the given XFrame!" );
3567 
3568     pViewFrame->ActivateToolPanel_Impl( i_rPanelURL );
3569 }
3570 
3571 // ---------------------------------------------------------------------------------------------------------------------
3572 void SfxViewFrame::ActivateToolPanel_Impl( const ::rtl::OUString& i_rPanelURL )
3573 {
3574     // ensure the task pane is visible
3575     ENSURE_OR_RETURN_VOID( KnowsChildWindow( SID_TASKPANE ), "SfxViewFrame::ActivateToolPanel: this frame/module does not allow for a task pane!" );
3576     if ( !HasChildWindow( SID_TASKPANE ) )
3577         ToggleChildWindow( SID_TASKPANE );
3578 
3579     SfxChildWindow* pTaskPaneChildWindow = GetChildWindow( SID_TASKPANE );
3580     ENSURE_OR_RETURN_VOID( pTaskPaneChildWindow, "SfxViewFrame::ActivateToolPanel_Impl: just switched it on, but it is not there!" );
3581 
3582     ::sfx2::ITaskPaneToolPanelAccess* pPanelAccess = dynamic_cast< ::sfx2::ITaskPaneToolPanelAccess* >( pTaskPaneChildWindow );
3583     ENSURE_OR_RETURN_VOID( pPanelAccess, "SfxViewFrame::ActivateToolPanel_Impl: task pane child window does not implement a required interface!" );
3584     pPanelAccess->ActivateToolPanel( i_rPanelURL );
3585 }
3586