xref: /aoo4110/main/sfx2/source/view/frame2.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 "impframe.hxx"
28*b1cdbd2cSJim Jagielski #include "objshimp.hxx"
29*b1cdbd2cSJim Jagielski #include "sfx2/sfxhelp.hxx"
30*b1cdbd2cSJim Jagielski #include "workwin.hxx"
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include "sfx2/app.hxx"
33*b1cdbd2cSJim Jagielski #include "sfx2/bindings.hxx"
34*b1cdbd2cSJim Jagielski #include "sfx2/dispatch.hxx"
35*b1cdbd2cSJim Jagielski #include "sfx2/docfac.hxx"
36*b1cdbd2cSJim Jagielski #include "sfx2/docfile.hxx"
37*b1cdbd2cSJim Jagielski #include "sfx2/event.hxx"
38*b1cdbd2cSJim Jagielski #include "sfx2/objface.hxx"
39*b1cdbd2cSJim Jagielski #include "sfx2/request.hxx"
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindow2.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XComponentLoader.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFrame.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFramesSupplier.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XLayoutManager.hpp>
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include <comphelper/componentcontext.hxx>
49*b1cdbd2cSJim Jagielski #include <comphelper/namedvaluecollection.hxx>
50*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
51*b1cdbd2cSJim Jagielski #include <svl/eitem.hxx>
52*b1cdbd2cSJim Jagielski #include <svl/intitem.hxx>
53*b1cdbd2cSJim Jagielski #include <svl/itemset.hxx>
54*b1cdbd2cSJim Jagielski #include <svl/rectitem.hxx>
55*b1cdbd2cSJim Jagielski #include <svl/stritem.hxx>
56*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx>
57*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
60*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
61*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::frame;
62*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util;
63*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
64*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
65*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::XMultiServiceFactory;
66*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::XComponent;
67*b1cdbd2cSJim Jagielski using ::com::sun::star::frame::XComponentLoader;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski class SfxFrameWindow_Impl : public Window
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski public:
74*b1cdbd2cSJim Jagielski 	SfxFrame*           pFrame;
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski     SfxFrameWindow_Impl( SfxFrame* pF, Window& i_rContainerWindow );
77*b1cdbd2cSJim Jagielski     ~SfxFrameWindow_Impl( );
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski     virtual void        DataChanged( const DataChangedEvent& rDCEvt );
80*b1cdbd2cSJim Jagielski 	virtual void		StateChanged( StateChangedType nStateChange );
81*b1cdbd2cSJim Jagielski 	virtual long 		PreNotify( NotifyEvent& rNEvt );
82*b1cdbd2cSJim Jagielski 	virtual long		Notify( NotifyEvent& rEvt );
83*b1cdbd2cSJim Jagielski 	virtual void        Resize();
84*b1cdbd2cSJim Jagielski     virtual void        GetFocus();
85*b1cdbd2cSJim Jagielski 	void				DoResize();
86*b1cdbd2cSJim Jagielski 	DECL_LINK(			CloserHdl, void* );
87*b1cdbd2cSJim Jagielski };
88*b1cdbd2cSJim Jagielski 
SfxFrameWindow_Impl(SfxFrame * pF,Window & i_rContainerWindow)89*b1cdbd2cSJim Jagielski SfxFrameWindow_Impl::SfxFrameWindow_Impl( SfxFrame* pF, Window& i_rContainerWindow )
90*b1cdbd2cSJim Jagielski         : Window( &i_rContainerWindow, WB_BORDER | WB_CLIPCHILDREN | WB_NODIALOGCONTROL | WB_3DLOOK )
91*b1cdbd2cSJim Jagielski         , pFrame( pF )
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski }
94*b1cdbd2cSJim Jagielski 
~SfxFrameWindow_Impl()95*b1cdbd2cSJim Jagielski SfxFrameWindow_Impl::~SfxFrameWindow_Impl( )
96*b1cdbd2cSJim Jagielski {
97*b1cdbd2cSJim Jagielski }
98*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)99*b1cdbd2cSJim Jagielski void SfxFrameWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt )
100*b1cdbd2cSJim Jagielski {
101*b1cdbd2cSJim Jagielski     Window::DataChanged( rDCEvt );
102*b1cdbd2cSJim Jagielski     SfxWorkWindow *pWorkWin = pFrame->GetWorkWindow_Impl();
103*b1cdbd2cSJim Jagielski     if ( pWorkWin )
104*b1cdbd2cSJim Jagielski         pWorkWin->DataChanged_Impl( rDCEvt );
105*b1cdbd2cSJim Jagielski }
106*b1cdbd2cSJim Jagielski 
Notify(NotifyEvent & rNEvt)107*b1cdbd2cSJim Jagielski long SfxFrameWindow_Impl::Notify( NotifyEvent& rNEvt )
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski 	if ( pFrame->IsClosing_Impl() || !pFrame->GetFrameInterface().is() )
110*b1cdbd2cSJim Jagielski 		return sal_False;
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski     SfxViewFrame* pView = pFrame->GetCurrentViewFrame();
113*b1cdbd2cSJim Jagielski     if ( !pView || !pView->GetObjectShell() )
114*b1cdbd2cSJim Jagielski         return Window::Notify( rNEvt );
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski     if ( rNEvt.GetType() == EVENT_GETFOCUS )
117*b1cdbd2cSJim Jagielski     {
118*b1cdbd2cSJim Jagielski         if ( pView->GetViewShell() && !pView->GetViewShell()->GetUIActiveIPClient_Impl() && !pFrame->IsInPlace() )
119*b1cdbd2cSJim Jagielski         {
120*b1cdbd2cSJim Jagielski             DBG_TRACE("SfxFrame: GotFocus");
121*b1cdbd2cSJim Jagielski             pView->MakeActive_Impl( sal_False );
122*b1cdbd2cSJim Jagielski         }
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski         // TODO/LATER: do we still need this code?
125*b1cdbd2cSJim Jagielski         Window* pWindow = rNEvt.GetWindow();
126*b1cdbd2cSJim Jagielski         rtl::OString sHelpId;
127*b1cdbd2cSJim Jagielski         while ( !sHelpId.getLength() && pWindow )
128*b1cdbd2cSJim Jagielski         {
129*b1cdbd2cSJim Jagielski             sHelpId = pWindow->GetHelpId();
130*b1cdbd2cSJim Jagielski             pWindow = pWindow->GetParent();
131*b1cdbd2cSJim Jagielski         }
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski         if ( sHelpId.getLength() )
134*b1cdbd2cSJim Jagielski             SfxHelp::OpenHelpAgent( pFrame, sHelpId );
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 		// if focus was on an external window, the clipboard content might have been changed
137*b1cdbd2cSJim Jagielski 		pView->GetBindings().Invalidate( SID_PASTE );
138*b1cdbd2cSJim Jagielski 		pView->GetBindings().Invalidate( SID_PASTE_SPECIAL );
139*b1cdbd2cSJim Jagielski 		return sal_True;
140*b1cdbd2cSJim Jagielski 	}
141*b1cdbd2cSJim Jagielski     else if( rNEvt.GetType() == EVENT_KEYINPUT )
142*b1cdbd2cSJim Jagielski 	{
143*b1cdbd2cSJim Jagielski         if ( pView->GetViewShell()->KeyInput( *rNEvt.GetKeyEvent() ) )
144*b1cdbd2cSJim Jagielski             return sal_True;
145*b1cdbd2cSJim Jagielski 	}
146*b1cdbd2cSJim Jagielski     else if ( rNEvt.GetType() == EVENT_EXECUTEDIALOG /*|| rNEvt.GetType() == EVENT_INPUTDISABLE*/ )
147*b1cdbd2cSJim Jagielski 	{
148*b1cdbd2cSJim Jagielski         pView->SetModalMode( sal_True );
149*b1cdbd2cSJim Jagielski 		return sal_True;
150*b1cdbd2cSJim Jagielski 	}
151*b1cdbd2cSJim Jagielski 	else if ( rNEvt.GetType() == EVENT_ENDEXECUTEDIALOG /*|| rNEvt.GetType() == EVENT_INPUTENABLE*/ )
152*b1cdbd2cSJim Jagielski 	{
153*b1cdbd2cSJim Jagielski 		//EnableInput( sal_True, sal_True );
154*b1cdbd2cSJim Jagielski         pView->SetModalMode( sal_False );
155*b1cdbd2cSJim Jagielski 		return sal_True;
156*b1cdbd2cSJim Jagielski 	}
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski     return Window::Notify( rNEvt );
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski 
PreNotify(NotifyEvent & rNEvt)161*b1cdbd2cSJim Jagielski long SfxFrameWindow_Impl::PreNotify( NotifyEvent& rNEvt )
162*b1cdbd2cSJim Jagielski {
163*b1cdbd2cSJim Jagielski 	sal_uInt16 nType = rNEvt.GetType();
164*b1cdbd2cSJim Jagielski 	if ( nType == EVENT_KEYINPUT || nType == EVENT_KEYUP )
165*b1cdbd2cSJim Jagielski     {
166*b1cdbd2cSJim Jagielski 		SfxViewFrame* pView = pFrame->GetCurrentViewFrame();
167*b1cdbd2cSJim Jagielski 		SfxViewShell* pShell = pView ? pView->GetViewShell() : NULL;
168*b1cdbd2cSJim Jagielski 		if ( pShell && pShell->HasKeyListeners_Impl() && pShell->HandleNotifyEvent_Impl( rNEvt ) )
169*b1cdbd2cSJim Jagielski 			return sal_True;
170*b1cdbd2cSJim Jagielski 	}
171*b1cdbd2cSJim Jagielski 	else if ( nType == EVENT_MOUSEBUTTONUP || nType == EVENT_MOUSEBUTTONDOWN )
172*b1cdbd2cSJim Jagielski     {
173*b1cdbd2cSJim Jagielski 		Window* pWindow = rNEvt.GetWindow();
174*b1cdbd2cSJim Jagielski 		SfxViewFrame* pView = pFrame->GetCurrentViewFrame();
175*b1cdbd2cSJim Jagielski 		SfxViewShell* pShell = pView ? pView->GetViewShell() : NULL;
176*b1cdbd2cSJim Jagielski 		if ( pShell )
177*b1cdbd2cSJim Jagielski 			if ( pWindow == pShell->GetWindow() || pShell->GetWindow()->IsChild( pWindow ) )
178*b1cdbd2cSJim Jagielski 				if ( pShell->HasMouseClickListeners_Impl() && pShell->HandleNotifyEvent_Impl( rNEvt ) )
179*b1cdbd2cSJim Jagielski 					return sal_True;
180*b1cdbd2cSJim Jagielski 	}
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 	if ( nType == EVENT_MOUSEBUTTONDOWN )
183*b1cdbd2cSJim Jagielski     {
184*b1cdbd2cSJim Jagielski         Window* pWindow = rNEvt.GetWindow();
185*b1cdbd2cSJim Jagielski         const MouseEvent* pMEvent = rNEvt.GetMouseEvent();
186*b1cdbd2cSJim Jagielski         Point aPos = pWindow->OutputToScreenPixel( pMEvent->GetPosPixel() );
187*b1cdbd2cSJim Jagielski         SfxWorkWindow *pWorkWin = pFrame->GetWorkWindow_Impl();
188*b1cdbd2cSJim Jagielski         if ( pWorkWin )
189*b1cdbd2cSJim Jagielski             pWorkWin->EndAutoShow_Impl( aPos );
190*b1cdbd2cSJim Jagielski     }
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 	return Window::PreNotify( rNEvt );
193*b1cdbd2cSJim Jagielski }
194*b1cdbd2cSJim Jagielski 
GetFocus()195*b1cdbd2cSJim Jagielski void SfxFrameWindow_Impl::GetFocus()
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski     if ( pFrame && !pFrame->IsClosing_Impl() && pFrame->GetCurrentViewFrame() && pFrame->GetFrameInterface().is() )
198*b1cdbd2cSJim Jagielski         pFrame->GetCurrentViewFrame()->MakeActive_Impl( sal_True );
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski 
Resize()201*b1cdbd2cSJim Jagielski void SfxFrameWindow_Impl::Resize()
202*b1cdbd2cSJim Jagielski {
203*b1cdbd2cSJim Jagielski     if ( IsReallyVisible() || IsReallyShown() || GetOutputSizePixel().Width() )
204*b1cdbd2cSJim Jagielski 		DoResize();
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski 
StateChanged(StateChangedType nStateChange)207*b1cdbd2cSJim Jagielski void SfxFrameWindow_Impl::StateChanged( StateChangedType nStateChange )
208*b1cdbd2cSJim Jagielski {
209*b1cdbd2cSJim Jagielski 	if ( nStateChange == STATE_CHANGE_INITSHOW )
210*b1cdbd2cSJim Jagielski 	{
211*b1cdbd2cSJim Jagielski         pFrame->pImp->bHidden = sal_False;
212*b1cdbd2cSJim Jagielski         if ( pFrame->IsInPlace() )
213*b1cdbd2cSJim Jagielski             // TODO/MBA: workaround for bug in LayoutManager: the final resize does not get through because the
214*b1cdbd2cSJim Jagielski             // LayoutManager works asynchronously and between resize and time execution the DockingAcceptor was exchanged so that
215*b1cdbd2cSJim Jagielski             // the resize event never is sent to the component
216*b1cdbd2cSJim Jagielski             SetSizePixel( GetParent()->GetOutputSizePixel() );
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski 		DoResize();
219*b1cdbd2cSJim Jagielski         SfxViewFrame* pView = pFrame->GetCurrentViewFrame();
220*b1cdbd2cSJim Jagielski         if ( pView )
221*b1cdbd2cSJim Jagielski             pView->GetBindings().GetWorkWindow_Impl()->ShowChilds_Impl();
222*b1cdbd2cSJim Jagielski 	}
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski     Window::StateChanged( nStateChange );
225*b1cdbd2cSJim Jagielski }
226*b1cdbd2cSJim Jagielski 
DoResize()227*b1cdbd2cSJim Jagielski void SfxFrameWindow_Impl::DoResize()
228*b1cdbd2cSJim Jagielski {
229*b1cdbd2cSJim Jagielski     if ( !pFrame->pImp->bLockResize )
230*b1cdbd2cSJim Jagielski         pFrame->Resize();
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski 
CreateBlankFrame()233*b1cdbd2cSJim Jagielski Reference < XFrame > SfxFrame::CreateBlankFrame()
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski     Reference < XFrame > xFrame;
236*b1cdbd2cSJim Jagielski     try
237*b1cdbd2cSJim Jagielski     {
238*b1cdbd2cSJim Jagielski         ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
239*b1cdbd2cSJim Jagielski         Reference < XFrame > xDesktop( aContext.createComponent( "com.sun.star.frame.Desktop" ), UNO_QUERY_THROW );
240*b1cdbd2cSJim Jagielski         xFrame.set( xDesktop->findFrame( DEFINE_CONST_UNICODE("_blank"), 0 ), UNO_SET_THROW );
241*b1cdbd2cSJim Jagielski     }
242*b1cdbd2cSJim Jagielski     catch( const Exception& )
243*b1cdbd2cSJim Jagielski     {
244*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
245*b1cdbd2cSJim Jagielski     }
246*b1cdbd2cSJim Jagielski     return xFrame;
247*b1cdbd2cSJim Jagielski }
248*b1cdbd2cSJim Jagielski 
Create(SfxObjectShell & rDoc,Window & rWindow,sal_uInt16 nViewId,bool bHidden)249*b1cdbd2cSJim Jagielski SfxFrame* SfxFrame::Create( SfxObjectShell& rDoc, Window& rWindow, sal_uInt16 nViewId, bool bHidden )
250*b1cdbd2cSJim Jagielski {
251*b1cdbd2cSJim Jagielski     SfxFrame* pFrame = NULL;
252*b1cdbd2cSJim Jagielski     try
253*b1cdbd2cSJim Jagielski     {
254*b1cdbd2cSJim Jagielski         // create and initialize new top level frame for this window
255*b1cdbd2cSJim Jagielski         ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
256*b1cdbd2cSJim Jagielski         Reference < XFramesSupplier > xDesktop( aContext.createComponent( "com.sun.star.frame.Desktop" ), UNO_QUERY_THROW );
257*b1cdbd2cSJim Jagielski         Reference < XFrame > xFrame( aContext.createComponent( "com.sun.star.frame.Frame"), UNO_QUERY_THROW );
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski         Reference< awt::XWindow2 > xWin( VCLUnoHelper::GetInterface ( &rWindow ), uno::UNO_QUERY_THROW );
260*b1cdbd2cSJim Jagielski         xFrame->initialize( xWin.get() );
261*b1cdbd2cSJim Jagielski         xDesktop->getFrames()->append( xFrame );
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski 	    if ( xWin->isActive() )
264*b1cdbd2cSJim Jagielski             xFrame->activate();
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski         // create load arguments
267*b1cdbd2cSJim Jagielski         Sequence< PropertyValue > aLoadArgs;
268*b1cdbd2cSJim Jagielski         TransformItems( SID_OPENDOC, *rDoc.GetMedium()->GetItemSet(), aLoadArgs );
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski         ::comphelper::NamedValueCollection aArgs( aLoadArgs );
271*b1cdbd2cSJim Jagielski         aArgs.put( "Model", rDoc.GetModel() );
272*b1cdbd2cSJim Jagielski         aArgs.put( "Hidden", bHidden );
273*b1cdbd2cSJim Jagielski         if ( nViewId )
274*b1cdbd2cSJim Jagielski             aArgs.put( "ViewId", nViewId );
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski         aLoadArgs = aArgs.getPropertyValues();
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski         // load the doc into that frame
279*b1cdbd2cSJim Jagielski         ::rtl::OUString sLoaderURL( RTL_CONSTASCII_USTRINGPARAM( "private:object" ) );
280*b1cdbd2cSJim Jagielski         Reference< XComponentLoader > xLoader( xFrame, UNO_QUERY_THROW );
281*b1cdbd2cSJim Jagielski         xLoader->loadComponentFromURL(
282*b1cdbd2cSJim Jagielski             sLoaderURL,
283*b1cdbd2cSJim Jagielski             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_self" ) ),
284*b1cdbd2cSJim Jagielski             0,
285*b1cdbd2cSJim Jagielski             aLoadArgs
286*b1cdbd2cSJim Jagielski         );
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski         for (   pFrame = SfxFrame::GetFirst();
289*b1cdbd2cSJim Jagielski                 pFrame;
290*b1cdbd2cSJim Jagielski                 pFrame = SfxFrame::GetNext( *pFrame )
291*b1cdbd2cSJim Jagielski             )
292*b1cdbd2cSJim Jagielski         {
293*b1cdbd2cSJim Jagielski             if ( pFrame->GetFrameInterface() == xFrame )
294*b1cdbd2cSJim Jagielski                 break;
295*b1cdbd2cSJim Jagielski         }
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski         OSL_ENSURE( pFrame, "SfxFrame::Create: load succeeded, but no SfxFrame was created during this!" );
298*b1cdbd2cSJim Jagielski     }
299*b1cdbd2cSJim Jagielski     catch( const Exception& )
300*b1cdbd2cSJim Jagielski     {
301*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
302*b1cdbd2cSJim Jagielski     }
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski     return pFrame;
305*b1cdbd2cSJim Jagielski }
306*b1cdbd2cSJim Jagielski 
Create(const Reference<XFrame> & i_rFrame)307*b1cdbd2cSJim Jagielski SfxFrame* SfxFrame::Create( const Reference < XFrame >& i_rFrame )
308*b1cdbd2cSJim Jagielski {
309*b1cdbd2cSJim Jagielski     // create a new TopFrame to an external XFrame object ( wrap controller )
310*b1cdbd2cSJim Jagielski     ENSURE_OR_THROW( i_rFrame.is(), "NULL frame not allowed" );
311*b1cdbd2cSJim Jagielski     Window* pWindow = VCLUnoHelper::GetWindow( i_rFrame->getContainerWindow() );
312*b1cdbd2cSJim Jagielski     ENSURE_OR_THROW( pWindow, "frame without container window not allowed" );
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski     SfxFrame* pFrame = new SfxFrame( *pWindow, false );
315*b1cdbd2cSJim Jagielski     pFrame->SetFrameInterface_Impl( i_rFrame );
316*b1cdbd2cSJim Jagielski     return pFrame;
317*b1cdbd2cSJim Jagielski }
318*b1cdbd2cSJim Jagielski 
SfxFrame(Window & i_rContainerWindow,bool i_bHidden)319*b1cdbd2cSJim Jagielski SfxFrame::SfxFrame( Window& i_rContainerWindow, bool i_bHidden )
320*b1cdbd2cSJim Jagielski     :pParentFrame( NULL )
321*b1cdbd2cSJim Jagielski     ,pChildArr( NULL )
322*b1cdbd2cSJim Jagielski     ,pImp( NULL )
323*b1cdbd2cSJim Jagielski 	,pWindow( NULL )
324*b1cdbd2cSJim Jagielski {
325*b1cdbd2cSJim Jagielski     Construct_Impl();
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski     pImp->bHidden = i_bHidden;
328*b1cdbd2cSJim Jagielski 	InsertTopFrame_Impl( this );
329*b1cdbd2cSJim Jagielski     pImp->pExternalContainerWindow = &i_rContainerWindow;
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski     pWindow = new SfxFrameWindow_Impl( this, i_rContainerWindow );
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski     // always show pWindow, which is the ComponentWindow of the XFrame we live in
334*b1cdbd2cSJim Jagielski     // nowadays, since SfxFrames can be created with an XFrame only, hiding or showing the complete XFrame
335*b1cdbd2cSJim Jagielski     // is not done at level of the container window, not at SFX level. Thus, the component window can
336*b1cdbd2cSJim Jagielski     // always be visible.
337*b1cdbd2cSJim Jagielski     pWindow->Show();
338*b1cdbd2cSJim Jagielski }
339*b1cdbd2cSJim Jagielski 
SetPresentationMode(sal_Bool bSet)340*b1cdbd2cSJim Jagielski void SfxFrame::SetPresentationMode( sal_Bool bSet )
341*b1cdbd2cSJim Jagielski {
342*b1cdbd2cSJim Jagielski     if ( GetCurrentViewFrame() )
343*b1cdbd2cSJim Jagielski         GetCurrentViewFrame()->GetWindow().SetBorderStyle( bSet ? WINDOW_BORDER_NOBORDER : WINDOW_BORDER_NORMAL );
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski     Reference< com::sun::star::beans::XPropertySet > xPropSet( GetFrameInterface(), UNO_QUERY );
346*b1cdbd2cSJim Jagielski     Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski 	if ( xPropSet.is() )
349*b1cdbd2cSJim Jagielski 	{
350*b1cdbd2cSJim Jagielski 		Any aValue = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
351*b1cdbd2cSJim Jagielski 		aValue >>= xLayoutManager;
352*b1cdbd2cSJim Jagielski     }
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski     if ( xLayoutManager.is() )
355*b1cdbd2cSJim Jagielski         xLayoutManager->setVisible( !bSet ); // we don't want to have ui in presentation mode
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski     SetMenuBarOn_Impl( !bSet );
358*b1cdbd2cSJim Jagielski     if ( GetWorkWindow_Impl() )
359*b1cdbd2cSJim Jagielski         GetWorkWindow_Impl()->SetDockingAllowed( !bSet );
360*b1cdbd2cSJim Jagielski     if ( GetCurrentViewFrame() )
361*b1cdbd2cSJim Jagielski         GetCurrentViewFrame()->GetDispatcher()->Update_Impl( sal_True );
362*b1cdbd2cSJim Jagielski }
363*b1cdbd2cSJim Jagielski 
GetSystemWindow() const364*b1cdbd2cSJim Jagielski SystemWindow* SfxFrame::GetSystemWindow() const
365*b1cdbd2cSJim Jagielski {
366*b1cdbd2cSJim Jagielski 	return GetTopWindow_Impl();
367*b1cdbd2cSJim Jagielski }
368*b1cdbd2cSJim Jagielski 
GetTopWindow_Impl() const369*b1cdbd2cSJim Jagielski SystemWindow* SfxFrame::GetTopWindow_Impl() const
370*b1cdbd2cSJim Jagielski {
371*b1cdbd2cSJim Jagielski     if ( pImp->pExternalContainerWindow->IsSystemWindow() )
372*b1cdbd2cSJim Jagielski         return (SystemWindow*) pImp->pExternalContainerWindow;
373*b1cdbd2cSJim Jagielski     else
374*b1cdbd2cSJim Jagielski         return NULL;
375*b1cdbd2cSJim Jagielski }
376*b1cdbd2cSJim Jagielski 
GetWindow() const377*b1cdbd2cSJim Jagielski Window& SfxFrame::GetWindow() const
378*b1cdbd2cSJim Jagielski {
379*b1cdbd2cSJim Jagielski     return *pWindow;
380*b1cdbd2cSJim Jagielski }
381*b1cdbd2cSJim Jagielski 
Close()382*b1cdbd2cSJim Jagielski sal_Bool SfxFrame::Close()
383*b1cdbd2cSJim Jagielski {
384*b1cdbd2cSJim Jagielski 	delete this;
385*b1cdbd2cSJim Jagielski 	return sal_True;
386*b1cdbd2cSJim Jagielski }
387*b1cdbd2cSJim Jagielski 
LockResize_Impl(sal_Bool bLock)388*b1cdbd2cSJim Jagielski void SfxFrame::LockResize_Impl( sal_Bool bLock )
389*b1cdbd2cSJim Jagielski {
390*b1cdbd2cSJim Jagielski     pImp->bLockResize = bLock;
391*b1cdbd2cSJim Jagielski }
392*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxFrameWindow_Impl,CloserHdl,void *,EMPTYARG)393*b1cdbd2cSJim Jagielski IMPL_LINK( SfxFrameWindow_Impl, CloserHdl, void*, EMPTYARG )
394*b1cdbd2cSJim Jagielski {
395*b1cdbd2cSJim Jagielski 	if ( pFrame && !pFrame->PrepareClose_Impl( sal_True ) )
396*b1cdbd2cSJim Jagielski 		return 0L;
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 	if ( pFrame )
399*b1cdbd2cSJim Jagielski 		pFrame->GetCurrentViewFrame()->GetBindings().Execute( SID_CLOSEWIN, 0, 0, SFX_CALLMODE_ASYNCHRON );
400*b1cdbd2cSJim Jagielski 	return 0L;
401*b1cdbd2cSJim Jagielski }
402*b1cdbd2cSJim Jagielski 
SetMenuBarOn_Impl(sal_Bool bOn)403*b1cdbd2cSJim Jagielski void SfxFrame::SetMenuBarOn_Impl( sal_Bool bOn )
404*b1cdbd2cSJim Jagielski {
405*b1cdbd2cSJim Jagielski     pImp->bMenuBarOn = bOn;
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski     Reference< com::sun::star::beans::XPropertySet > xPropSet( GetFrameInterface(), UNO_QUERY );
408*b1cdbd2cSJim Jagielski     Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski 	if ( xPropSet.is() )
411*b1cdbd2cSJim Jagielski 	{
412*b1cdbd2cSJim Jagielski 		Any aValue = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
413*b1cdbd2cSJim Jagielski 		aValue >>= xLayoutManager;
414*b1cdbd2cSJim Jagielski     }
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski     if ( xLayoutManager.is() )
417*b1cdbd2cSJim Jagielski     {
418*b1cdbd2cSJim Jagielski         rtl::OUString aMenuBarURL( RTL_CONSTASCII_USTRINGPARAM( "private:resource/menubar/menubar" ));
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski         if ( bOn )
421*b1cdbd2cSJim Jagielski             xLayoutManager->showElement( aMenuBarURL );
422*b1cdbd2cSJim Jagielski         else
423*b1cdbd2cSJim Jagielski             xLayoutManager->hideElement( aMenuBarURL );
424*b1cdbd2cSJim Jagielski     }
425*b1cdbd2cSJim Jagielski }
426*b1cdbd2cSJim Jagielski 
IsMenuBarOn_Impl() const427*b1cdbd2cSJim Jagielski sal_Bool SfxFrame::IsMenuBarOn_Impl() const
428*b1cdbd2cSJim Jagielski {
429*b1cdbd2cSJim Jagielski     return pImp->bMenuBarOn;
430*b1cdbd2cSJim Jagielski }
431*b1cdbd2cSJim Jagielski 
PositionWindow_Impl(const Rectangle & rWinArea) const432*b1cdbd2cSJim Jagielski void SfxFrame::PositionWindow_Impl( const Rectangle& rWinArea ) const
433*b1cdbd2cSJim Jagielski {
434*b1cdbd2cSJim Jagielski     Window *pWin = pImp->pExternalContainerWindow;
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski 	// Groesse setzen
437*b1cdbd2cSJim Jagielski     const Size aAppWindow( pImp->pExternalContainerWindow->GetDesktopRectPixel().GetSize() );
438*b1cdbd2cSJim Jagielski 	Point aPos( rWinArea.TopLeft() );
439*b1cdbd2cSJim Jagielski 	Size aSz( rWinArea.GetSize() );
440*b1cdbd2cSJim Jagielski 	if ( aSz.Width() && aSz.Height() )
441*b1cdbd2cSJim Jagielski 	{
442*b1cdbd2cSJim Jagielski 		aPos.X() = Min(aPos.X(),
443*b1cdbd2cSJim Jagielski 						long(aAppWindow.Width() - aSz.Width() + aSz.Width() / 2) );
444*b1cdbd2cSJim Jagielski 		aPos.Y() = Min(aPos.Y(),
445*b1cdbd2cSJim Jagielski 						long( aAppWindow.Height() - aSz.Height() + aSz.Height() / 2) );
446*b1cdbd2cSJim Jagielski 		if ( aPos.X() + aSz.Width() <
447*b1cdbd2cSJim Jagielski 				aAppWindow.Width() + aSz.Width() / 2 &&
448*b1cdbd2cSJim Jagielski 				aPos.Y() + aSz.Height() <
449*b1cdbd2cSJim Jagielski 				aAppWindow.Height() + aSz.Height() / 2 )
450*b1cdbd2cSJim Jagielski 		{
451*b1cdbd2cSJim Jagielski 			pWin->SetPosPixel( aPos );
452*b1cdbd2cSJim Jagielski 			pWin->SetOutputSizePixel( aSz );
453*b1cdbd2cSJim Jagielski 		}
454*b1cdbd2cSJim Jagielski 	}
455*b1cdbd2cSJim Jagielski }
456*b1cdbd2cSJim Jagielski 
PrepareForDoc_Impl(SfxObjectShell & i_rDoc)457*b1cdbd2cSJim Jagielski void SfxFrame::PrepareForDoc_Impl( SfxObjectShell& i_rDoc )
458*b1cdbd2cSJim Jagielski {
459*b1cdbd2cSJim Jagielski     const ::comphelper::NamedValueCollection aDocumentArgs( i_rDoc.GetModel()->getArgs() );
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski     // hidden?
462*b1cdbd2cSJim Jagielski     OSL_ENSURE( !pImp->bHidden, "when does this happen?" );
463*b1cdbd2cSJim Jagielski     pImp->bHidden = aDocumentArgs.getOrDefault( "Hidden", pImp->bHidden );
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski     // update our descriptor
466*b1cdbd2cSJim Jagielski     UpdateDescriptor( &i_rDoc );
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski     // plugin mode
469*b1cdbd2cSJim Jagielski     sal_Int16 nPluginMode = aDocumentArgs.getOrDefault( "PluginMode", sal_Int16( 0 ) );
470*b1cdbd2cSJim Jagielski     if ( nPluginMode && ( nPluginMode != 2 ) )
471*b1cdbd2cSJim Jagielski         SetInPlace_Impl( sal_True );
472*b1cdbd2cSJim Jagielski }
473*b1cdbd2cSJim Jagielski 
IsMarkedHidden_Impl() const474*b1cdbd2cSJim Jagielski bool SfxFrame::IsMarkedHidden_Impl() const
475*b1cdbd2cSJim Jagielski {
476*b1cdbd2cSJim Jagielski     return pImp->bHidden;
477*b1cdbd2cSJim Jagielski }
478