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