1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: topfrm.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sfx2.hxx"
36 #include <sfx2/topfrm.hxx>
37 #include <sfx2/signaturestate.hxx>
38 #include <com/sun/star/frame/XModuleManager.hpp>
39 #include <com/sun/star/util/XURLTransformer.hpp>
40 #include <com/sun/star/uno/Reference.h>
41 #include <com/sun/star/frame/XFrame.hpp>
42 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
43 #include <comphelper/processfactory.hxx>
45 #include <com/sun/star/frame/XFramesSupplier.hpp>
46 #include <com/sun/star/util/XCloseable.hpp>
47 #include <com/sun/star/util/CloseVetoException.hpp>
48 #ifndef _TOOLKIT_UNOHLP_HXX
49 #include <toolkit/helper/vclunohelper.hxx>
51 #ifndef _UNO_COM_SUN_STAR_AWT_POSSIZE_HPP_
52 #include <com/sun/star/awt/PosSize.hpp>
54 #include <com/sun/star/container/XIndexAccess.hpp>
55 #ifndef _COM_SUN_STAR_CONTAINER_XPROPERTYSET_HPP_
56 #include <com/sun/star/beans/XPropertySet.hpp>
58 #include <com/sun/star/frame/XLayoutManager.hpp>
59 #include <com/sun/star/beans/NamedValue.hpp>
60 #include <com/sun/star/beans/XMaterialHolder.hpp>
61 #include <com/sun/star/awt/XWindow2.hpp>
62 #include <vcl/menu.hxx>
63 #include <svtools/rectitem.hxx>
64 #include <svtools/intitem.hxx>
65 #include <svtools/eitem.hxx>
66 #include <svtools/stritem.hxx>
67 #include <svtools/asynclink.hxx>
68 #include <svtools/sfxecode.hxx>
69 #include <vcl/dialog.hxx>
70 #include <svtools/urihelper.hxx>
71 #include <svtools/moduleoptions.hxx>
72 #include <unotools/configmgr.hxx>
73 #include <unotools/bootstrap.hxx>
75 #include <sfxresid.hxx>
78 #include "appdata.hxx"
79 #include <sfx2/app.hxx>
80 #include <sfx2/sfx.hrc>
81 #include <sfx2/objsh.hxx>
82 #include <sfx2/docfile.hxx>
83 #include <sfx2/viewsh.hxx>
84 #include <sfx2/bindings.hxx>
85 #include <sfx2/dispatch.hxx>
86 #include <sfx2/request.hxx>
87 #include <sfx2/objitem.hxx>
88 #include <sfx2/objface.hxx>
89 #include <sfx2/msg.hxx>
90 #include "objshimp.hxx"
91 #include "workwin.hxx"
92 #include "sfxtypes.hxx"
93 #include "splitwin.hxx"
94 #include "arrdecl.hxx"
95 #include "sfxhelp.hxx"
96 #include <sfx2/fcontnr.hxx>
97 #include <sfx2/docfac.hxx>
98 #include "statcach.hxx"
99 #include <sfx2/event.hxx>
101 using namespace ::com::sun::star
;
102 using namespace ::com::sun::star::uno
;
103 using namespace ::com::sun::star::frame
;
104 using namespace ::com::sun::star::util
;
105 using namespace ::com::sun::star::container
;
106 using namespace ::com::sun::star::beans
;
108 //------------------------------------------------------------------------
110 #define SfxTopViewFrame
111 #include "sfxslots.hxx"
113 DBG_NAME(SfxTopViewFrame
)
115 #include <comphelper/sequenceashashmap.hxx>
116 static ::rtl::OUString
GetModuleName_Impl( const ::rtl::OUString
& sDocService
)
118 uno::Reference
< container::XNameAccess
> xMM( ::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.frame.ModuleManager")), uno::UNO_QUERY
);
119 ::rtl::OUString sVar
;
125 ::comphelper::SequenceAsHashMap
aAnalyzer( xMM
->getByName(sDocService
) );
126 sVar
= aAnalyzer
.getUnpackedValueOrDefault( ::rtl::OUString::createFromAscii("ooSetupFactoryUIName"), ::rtl::OUString() );
128 catch( uno::Exception
& )
130 sVar
= ::rtl::OUString();
136 class SfxTopFrame_Impl
139 Window
* pWindow
; // maybe external
145 class SfxTopWindow_Impl
: public Window
150 SfxTopWindow_Impl( SfxTopFrame
* pF
);
151 // : Window( pF->pImp->pWindow, WB_CLIPCHILDREN | WB_NODIALOGCONTROL | WB_3DLOOK )
153 // { SetBackground(); }
154 ~SfxTopWindow_Impl( );
156 virtual void DataChanged( const DataChangedEvent
& rDCEvt
);
157 virtual void StateChanged( StateChangedType nStateChange
);
158 virtual long PreNotify( NotifyEvent
& rNEvt
);
159 virtual long Notify( NotifyEvent
& rEvt
);
160 virtual void Resize();
161 virtual void GetFocus();
163 DECL_LINK( CloserHdl
, void* );
166 SfxTopWindow_Impl::SfxTopWindow_Impl( SfxTopFrame
* pF
)
167 : Window( pF
->pImp
->pWindow
, WB_BORDER
| WB_CLIPCHILDREN
| WB_NODIALOGCONTROL
| WB_3DLOOK
)
172 SfxTopWindow_Impl::~SfxTopWindow_Impl( )
176 void SfxTopWindow_Impl::DataChanged( const DataChangedEvent
& rDCEvt
)
178 Window::DataChanged( rDCEvt
);
179 SfxWorkWindow
*pWorkWin
= pFrame
->GetWorkWindow_Impl();
181 pWorkWin
->DataChanged_Impl( rDCEvt
);
184 long SfxTopWindow_Impl::Notify( NotifyEvent
& rNEvt
)
186 if ( pFrame
->IsClosing_Impl() || !pFrame
->GetFrameInterface().is() )
189 SfxViewFrame
* pView
= pFrame
->GetCurrentViewFrame();
190 if ( !pView
|| !pView
->GetObjectShell() )
191 return Window::Notify( rNEvt
);
193 if ( rNEvt
.GetType() == EVENT_GETFOCUS
)
195 if ( pView
->GetViewShell() && !pView
->GetViewShell()->GetUIActiveIPClient_Impl() && !pFrame
->IsInPlace() )
197 DBG_TRACE("SfxTopFrame: GotFocus");
198 pView
->MakeActive_Impl( FALSE
);
201 // TODO/LATER: do we still need this code?
202 Window
* pWindow
= rNEvt
.GetWindow();
204 while ( !nHelpId
&& pWindow
)
206 nHelpId
= pWindow
->GetHelpId();
207 pWindow
= pWindow
->GetParent();
211 SfxHelp::OpenHelpAgent( pFrame
, nHelpId
);
213 // if focus was on an external window, the clipboard content might have been changed
214 pView
->GetBindings().Invalidate( SID_PASTE
);
215 pView
->GetBindings().Invalidate( SID_PASTE_SPECIAL
);
218 else if( rNEvt
.GetType() == EVENT_KEYINPUT
)
220 if ( pView
->GetViewShell()->KeyInput( *rNEvt
.GetKeyEvent() ) )
223 else if ( rNEvt
.GetType() == EVENT_EXECUTEDIALOG
/*|| rNEvt.GetType() == EVENT_INPUTDISABLE*/ )
225 pView
->SetModalMode( sal_True
);
228 else if ( rNEvt
.GetType() == EVENT_ENDEXECUTEDIALOG
/*|| rNEvt.GetType() == EVENT_INPUTENABLE*/ )
230 //EnableInput( sal_True, sal_True );
231 pView
->SetModalMode( sal_False
);
235 return Window::Notify( rNEvt
);
238 long SfxTopWindow_Impl::PreNotify( NotifyEvent
& rNEvt
)
240 USHORT nType
= rNEvt
.GetType();
241 if ( nType
== EVENT_KEYINPUT
|| nType
== EVENT_KEYUP
)
243 SfxViewFrame
* pView
= pFrame
->GetCurrentViewFrame();
244 SfxViewShell
* pShell
= pView
? pView
->GetViewShell() : NULL
;
245 if ( pShell
&& pShell
->HasKeyListeners_Impl() && pShell
->HandleNotifyEvent_Impl( rNEvt
) )
248 else if ( nType
== EVENT_MOUSEBUTTONUP
|| nType
== EVENT_MOUSEBUTTONDOWN
)
250 Window
* pWindow
= rNEvt
.GetWindow();
251 SfxViewFrame
* pView
= pFrame
->GetCurrentViewFrame();
252 SfxViewShell
* pShell
= pView
? pView
->GetViewShell() : NULL
;
254 if ( pWindow
== pShell
->GetWindow() || pShell
->GetWindow()->IsChild( pWindow
) )
255 if ( pShell
->HasMouseClickListeners_Impl() && pShell
->HandleNotifyEvent_Impl( rNEvt
) )
259 if ( nType
== EVENT_MOUSEBUTTONDOWN
)
261 Window
* pWindow
= rNEvt
.GetWindow();
262 const MouseEvent
* pMEvent
= rNEvt
.GetMouseEvent();
263 Point aPos
= pWindow
->OutputToScreenPixel( pMEvent
->GetPosPixel() );
264 SfxWorkWindow
*pWorkWin
= pFrame
->GetWorkWindow_Impl();
266 pWorkWin
->EndAutoShow_Impl( aPos
);
269 return Window::PreNotify( rNEvt
);
272 void SfxTopWindow_Impl::GetFocus()
274 if ( pFrame
&& !pFrame
->IsClosing_Impl() && pFrame
->GetCurrentViewFrame() && pFrame
->GetFrameInterface().is() )
275 pFrame
->GetCurrentViewFrame()->MakeActive_Impl( TRUE
);
278 void SfxTopWindow_Impl::Resize()
280 if ( IsReallyVisible() || IsReallyShown() || GetOutputSizePixel().Width() )
284 void SfxTopWindow_Impl::StateChanged( StateChangedType nStateChange
)
286 if ( nStateChange
== STATE_CHANGE_INITSHOW
)
288 pFrame
->pImp
->bHidden
= FALSE
;
289 if ( pFrame
->IsInPlace() )
290 // TODO/MBA: workaround for bug in LayoutManager: the final resize does not get through because the
291 // LayoutManager works asynchronously and between resize and time execution the DockingAcceptor was exchanged so that
292 // the resize event never is sent to the component
293 SetSizePixel( GetParent()->GetOutputSizePixel() );
296 SfxViewFrame
* pView
= pFrame
->GetCurrentViewFrame();
298 pView
->GetBindings().GetWorkWindow_Impl()->ShowChilds_Impl();
301 Window::StateChanged( nStateChange
);
304 void SfxTopWindow_Impl::DoResize()
306 if ( !pFrame
->pImp
->bLockResize
)
310 class StopButtonTimer_Impl
: public Timer
313 SfxViewFrame
* pFrame
;
315 virtual void Timeout();
317 StopButtonTimer_Impl( SfxViewFrame
*);
318 void SetButtonState( BOOL bStateP
);
319 BOOL
GetButtonState() const { return bState
; }
322 StopButtonTimer_Impl::StopButtonTimer_Impl( SfxViewFrame
*p
)
329 void StopButtonTimer_Impl::SetButtonState( BOOL bStateP
)
340 void StopButtonTimer_Impl::Timeout()
343 pFrame
->GetBindings().Invalidate( SID_BROWSE_STOP
);
346 class SfxTopViewWin_Impl
: public Window
348 friend class SfxInternalFrame
;
351 SfxTopViewFrame
* pFrame
;
354 SfxTopViewWin_Impl( SfxTopViewFrame
* p
,
355 Window
*pParent
, WinBits nBits
=0 ) :
356 Window( pParent
, nBits
| WB_BORDER
| WB_CLIPCHILDREN
),
360 p
->GetFrame()->GetWindow().SetBorderStyle( WINDOW_BORDER_NOBORDER
);
363 virtual void Resize();
364 virtual void StateChanged( StateChangedType nStateChange
);
367 //--------------------------------------------------------------------
368 void SfxTopViewWin_Impl::StateChanged( StateChangedType nStateChange
)
370 if ( nStateChange
== STATE_CHANGE_INITSHOW
)
372 SfxObjectShell
* pDoc
= pFrame
->GetObjectShell();
373 if ( pDoc
&& !pFrame
->IsVisible_Impl() )
379 Window::StateChanged( nStateChange
);
382 void SfxTopViewWin_Impl::Resize()
384 if ( IsReallyVisible() || IsReallyShown() || GetOutputSizePixel().Width() )
388 class SfxTopViewFrame_Impl
394 StopButtonTimer_Impl
* pStopButtonTimer
;
396 SfxTopViewFrame_Impl()
397 : bActive( sal_False
)
399 , pStopButtonTimer( 0 )
403 static svtools::AsynchronLink
* pPendingCloser
= 0;
405 static String
_getTabString()
409 Reference
< XMaterialHolder
> xHolder(
410 ::comphelper::getProcessServiceFactory()->createInstance(
411 DEFINE_CONST_UNICODE("com.sun.star.tab.tabreg") ), UNO_QUERY
);
414 rtl::OUString aTabString
;
415 Sequence
< NamedValue
> sMaterial
;
416 if (xHolder
->getMaterial() >>= sMaterial
) {
417 for (int i
=0; i
< sMaterial
.getLength(); i
++) {
418 if ((sMaterial
[i
].Name
.equalsAscii("title")) &&
419 (sMaterial
[i
].Value
>>= aTabString
))
422 result
+= String(aTabString
);
430 SfxTopFrame
* SfxTopFrame::Create( SfxObjectShell
* pDoc
, USHORT nViewId
, BOOL bHidden
, const SfxItemSet
* pSet
)
432 Reference
< XFrame
> xDesktop ( ::comphelper::getProcessServiceFactory()->createInstance( DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY
);
433 SfxTopFrame
*pFrame
= NULL
;
434 BOOL bNewView
= FALSE
;
437 SFX_ITEMSET_ARG( pSet
, pItem
, SfxBoolItem
, SID_OPEN_NEW_VIEW
, sal_False
);
438 bNewView
= pItem
&& pItem
->GetValue();
441 if ( pDoc
&& !bHidden
&& !bNewView
)
444 aTargetURL
.Complete
= pDoc
->GetMedium()->GetURLObject().GetMainURL( INetURLObject::NO_DECODE
);
446 BOOL bIsBasic
= FALSE
;
447 if ( !aTargetURL
.Complete
.getLength() )
449 String sFactory
= String::CreateFromAscii(pDoc
->GetFactory().GetShortName());
450 bIsBasic
= (sFactory
.CompareIgnoreCaseToAscii("sbasic")==COMPARE_EQUAL
);
454 String aURL
= String::CreateFromAscii("private:factory/");
456 aTargetURL
.Complete
= aURL
;
462 Reference
< XFramesSupplier
> xSupplier( xDesktop
, UNO_QUERY
);
465 Reference
< XIndexAccess
> xContainer(xSupplier
->getFrames(), UNO_QUERY
);
468 Reference
< ::com::sun::star::frame::XModuleManager
> xCheck(::comphelper::getProcessServiceFactory()->createInstance( rtl::OUString::createFromAscii("com.sun.star.frame.ModuleManager" )), UNO_QUERY
);
469 sal_Int32 nCount
= xContainer
->getCount();
470 for (sal_Int32 i
=0; i
<nCount
; ++i
)
474 Reference
< XFrame
> xFrame
;
475 if (!(xContainer
->getByIndex(i
) >>= xFrame
) || !xFrame
.is())
477 ::rtl::OUString sModule
= xCheck
->identify(xFrame
);
478 if (sModule
.equalsAscii("com.sun.star.frame.StartModule"))
480 pFrame
= Create(xFrame
);
484 catch(const Exception
&) {}
491 Reference
< XURLTransformer
> xTrans( ::comphelper::getProcessServiceFactory()->createInstance( rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" )), UNO_QUERY
);
492 xTrans
->parseStrict( aTargetURL
);
494 Reference
< ::com::sun::star::frame::XDispatchProvider
> xProv( xDesktop
, UNO_QUERY
);
495 Reference
< ::com::sun::star::frame::XDispatch
> xDisp
;
498 Sequence
< ::com::sun::star::beans::PropertyValue
> aSeq(1);
499 aSeq
[0].Name
= ::rtl::OUString::createFromAscii("Model");
500 aSeq
[0].Value
<<= pDoc
->GetModel();
501 ::rtl::OUString
aTargetFrame( ::rtl::OUString::createFromAscii("_default") );
502 xDisp
= xProv
->queryDispatch( aTargetURL
, aTargetFrame
, 0 );
504 xDisp
->dispatch( aTargetURL
, aSeq
);
507 SfxFrameArr_Impl
& rArr
= *SFX_APP()->Get_Impl()->pTopFrames
;
508 for( USHORT nPos
= rArr
.Count(); nPos
--; )
510 SfxTopFrame
*pF
= (SfxTopFrame
*) rArr
[ nPos
];
511 if ( pF
->GetCurrentDocument() == pDoc
)
522 Reference
< XFrame
> xFrame
= xDesktop
->findFrame( DEFINE_CONST_UNICODE("_blank"), 0 );
523 pFrame
= Create( xFrame
);
526 pFrame
->pImp
->bHidden
= bHidden
;
527 Window
* pWindow
= pFrame
->GetTopWindow_Impl();
528 if ( pWindow
&& pDoc
)
530 ::rtl::OUString
aDocServiceName( pDoc
->GetFactory().GetDocumentServiceName() );
531 ::rtl::OUString aProductName
;
532 ::utl::ConfigManager::GetDirectConfigProperty(::utl::ConfigManager::PRODUCTNAME
) >>= aProductName
;
533 String aTitle
= pDoc
->GetTitle( SFX_TITLE_DETECT
);
534 aTitle
+= String::CreateFromAscii( " - " );
535 aTitle
+= String(aProductName
);
537 aTitle
+= String( GetModuleName_Impl( aDocServiceName
) );
539 ::rtl::OUString aDefault
;
540 aTitle
+= DEFINE_CONST_UNICODE(" [");
541 String
aVerId( utl::Bootstrap::getBuildIdData( aDefault
));
546 // append TAB string if available
547 aTitle
+= _getTabString();
550 pWindow->SetText( aTitle );
554 if( pWindow->GetType() == WINDOW_WORKWINDOW )
556 SvtModuleOptions::EFactory eFactory;
557 if( SvtModuleOptions::ClassifyFactoryByName( aDocServiceName, eFactory ) )
559 WorkWindow* pWorkWindow = (WorkWindow*)pWindow;
560 pWorkWindow->SetIcon( (sal_uInt16) SvtModuleOptions().GetFactoryIcon( eFactory ) );
566 pFrame
->SetItemSet_Impl( pSet
);
567 if ( pDoc
&& pDoc
!= pFrame
->GetCurrentDocument() )
570 pDoc
->GetMedium()->GetItemSet()->Put( SfxUInt16Item( SID_VIEW_ID
, nViewId
) );
571 pFrame
->InsertDocument( pDoc
);
572 if ( pWindow
&& !bHidden
)
579 SfxTopFrame
* SfxTopFrame::Create( SfxObjectShell
* pDoc
, Window
* pWindow
, USHORT nViewId
, BOOL bHidden
, const SfxItemSet
* pSet
)
581 Reference
< ::com::sun::star::lang::XMultiServiceFactory
> xFact( ::comphelper::getProcessServiceFactory() );
582 Reference
< XFramesSupplier
> xDesktop ( xFact
->createInstance( DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY
);
583 Reference
< XFrame
> xFrame( xFact
->createInstance( DEFINE_CONST_UNICODE("com.sun.star.frame.Frame") ), UNO_QUERY
);
585 xFrame
->initialize( VCLUnoHelper::GetInterface ( pWindow
) );
587 xDesktop
->getFrames()->append( xFrame
);
589 uno::Reference
< awt::XWindow2
> xWin( VCLUnoHelper::GetInterface ( pWindow
), uno::UNO_QUERY
);
590 if ( xWin
.is() && xWin
->isActive() )
593 SfxTopFrame
* pFrame
= new SfxTopFrame( pWindow
);
594 pFrame
->SetFrameInterface_Impl( xFrame
);
595 pFrame
->pImp
->bHidden
= bHidden
;
597 pFrame
->SetItemSet_Impl( pSet
);
601 pDoc
->GetMedium()->GetItemSet()->Put( SfxUInt16Item( SID_VIEW_ID
, nViewId
) );
602 pFrame
->InsertDocument( pDoc
);
608 SfxTopFrame
* SfxTopFrame::Create( Reference
< XFrame
> xFrame
)
610 // create a new TopFrame to an external XFrame object ( wrap controller )
611 DBG_ASSERT( xFrame
.is(), "Wrong parameter!" );
613 Window
* pWindow
= VCLUnoHelper::GetWindow( xFrame
->getContainerWindow() );
614 SfxTopFrame
* pFrame
= new SfxTopFrame( pWindow
);
615 pFrame
->SetFrameInterface_Impl( xFrame
);
619 SfxTopFrame::SfxTopFrame( Window
* pExternal
, sal_Bool bHidden
)
623 pImp
= new SfxTopFrame_Impl
;
624 pImp
->bHidden
= bHidden
;
625 pImp
->bLockResize
= FALSE
;
626 pImp
->bMenuBarOn
= TRUE
;
627 InsertTopFrame_Impl( this );
630 pImp
->pWindow
= pExternal
;
634 DBG_ERROR( "TopFrame without window created!" );
636 pImp->pWindow = new SfxTopFrameWindow_Impl( this );
637 pImp->pWindow->SetActivateMode( ACTIVATE_MODE_GRABFOCUS );
638 pImp->pWindow->SetPosSizePixel( Point( 20,20 ), Size( 800,600 ) );
639 if ( GetFrameInterface().is() )
640 GetFrameInterface()->initialize( VCLUnoHelper::GetInterface( pImp->pWindow ) );
641 pImp->pWindow->Show();
645 pWindow
= new SfxTopWindow_Impl( this );
647 Hide this window till the component was realy loaded. Otherwhise it overpaint e.g. the old component hardly
648 and produce repaint errors.
653 SfxTopFrame::~SfxTopFrame()
655 RemoveTopFrame_Impl( this );
660 void SfxTopFrame::SetPresentationMode( BOOL bSet
)
662 if ( GetCurrentViewFrame() )
663 GetCurrentViewFrame()->GetWindow().SetBorderStyle( bSet
? WINDOW_BORDER_NOBORDER
: WINDOW_BORDER_NORMAL
);
665 Reference
< com::sun::star::beans::XPropertySet
> xPropSet( GetFrameInterface(), UNO_QUERY
);
666 Reference
< ::com::sun::star::frame::XLayoutManager
> xLayoutManager
;
670 Any aValue
= xPropSet
->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
671 aValue
>>= xLayoutManager
;
674 if ( xLayoutManager
.is() )
675 xLayoutManager
->setVisible( !bSet
); // we don't want to have ui in presentation mode
677 SetMenuBarOn_Impl( !bSet
);
678 if ( GetWorkWindow_Impl() )
679 GetWorkWindow_Impl()->SetDockingAllowed( !bSet
);
680 if ( GetCurrentViewFrame() )
681 GetCurrentViewFrame()->GetDispatcher()->Update_Impl( TRUE
);
685 SfxTopFrame::GetSystemWindow() const
687 return GetTopWindow_Impl();
690 SystemWindow
* SfxTopFrame::GetTopWindow_Impl() const
692 if ( pImp
->pWindow
->IsSystemWindow() )
693 return (SystemWindow
*) pImp
->pWindow
;
698 Window
& SfxTopFrame::GetWindow() const
703 sal_Bool
SfxTopFrame::Close()
709 void SfxTopFrame::LockResize_Impl( BOOL bLock
)
711 pImp
->bLockResize
= bLock
;
714 IMPL_LINK( SfxTopWindow_Impl
, CloserHdl
, void*, EMPTYARG
)
716 if ( pFrame
&& !pFrame
->PrepareClose_Impl( TRUE
) )
720 pFrame
->GetCurrentViewFrame()->GetBindings().Execute( SID_CLOSEWIN
, 0, 0, SFX_CALLMODE_ASYNCHRON
);
724 void SfxTopFrame::SetMenuBarOn_Impl( BOOL bOn
)
726 pImp
->bMenuBarOn
= bOn
;
728 Reference
< com::sun::star::beans::XPropertySet
> xPropSet( GetFrameInterface(), UNO_QUERY
);
729 Reference
< ::com::sun::star::frame::XLayoutManager
> xLayoutManager
;
733 Any aValue
= xPropSet
->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
734 aValue
>>= xLayoutManager
;
737 if ( xLayoutManager
.is() )
739 rtl::OUString
aMenuBarURL( RTL_CONSTASCII_USTRINGPARAM( "private:resource/menubar/menubar" ));
742 xLayoutManager
->showElement( aMenuBarURL
);
744 xLayoutManager
->hideElement( aMenuBarURL
);
748 BOOL
SfxTopFrame::IsMenuBarOn_Impl() const
750 return pImp
->bMenuBarOn
;
753 String
SfxTopFrame::GetWindowData()
758 SfxViewFrame
*pActFrame
= SfxViewFrame::Current();
759 SfxViewFrame
*pFrame
= GetCurrentViewFrame();
760 const sal_Bool bActWin
= ( pActFrame
->GetTopViewFrame() == pFrame
);
762 // ::com::sun::star::sdbcx::User-Daten der ViewShell
764 pFrame
->GetViewShell()->WriteUserData(aUserData
);
768 aWinData
+= String::CreateFromInt32( pFrame
->GetCurViewId() );
771 aWinData
+= '1'; // former attribute "isfloating"
774 // aktives kennzeichnen
776 aWinData
+= bActWin
? '1' : '0';
779 aWinData
+= aUserData
;
784 sal_Bool
SfxTopFrame::InsertDocument( SfxObjectShell
* pDoc
)
788 // Spezielle Bedingungen testen: nicht im ModalMode!
789 if ( !SfxFrame::InsertDocument( pDoc
) )
792 SfxObjectShell
*pOld
= GetCurrentDocument();
794 // Position und Groesse testen
795 // Wenn diese schon gesetzt sind, soll offensichtlich nicht noch
796 // LoadWindows_Impl aufgerufen werden ( z.B. weil dieses ein CreateFrame()
797 // an einer Task aufgerufen hat! )
798 const SfxItemSet
* pSet
= GetItemSet_Impl();
800 pSet
= pDoc
->GetMedium()->GetItemSet();
803 // Position und Gr"o\se
805 pSet
, pAreaItem
, SfxRectangleItem
, SID_VIEW_POS_SIZE
, sal_False
);
808 pSet
, pViewIdItem
, SfxUInt16Item
, SID_VIEW_ID
, sal_False
);
811 pSet
, pModeItem
, SfxUInt16Item
, SID_VIEW_ZOOM_MODE
, sal_False
);
814 pSet
, pHidItem
, SfxBoolItem
, SID_HIDDEN
, sal_False
);
817 pSet
, pViewDataItem
, SfxStringItem
, SID_USER_DATA
, sal_False
);
820 pSet
, pEditItem
, SfxBoolItem
, SID_VIEWONLY
, sal_False
);
823 pSet
, pPluginItem
, SfxUInt16Item
, SID_PLUGIN_MODE
, sal_False
);
825 // Plugin (external InPlace)
827 pSet
, pPluginMode
, SfxUInt16Item
, SID_PLUGIN_MODE
, sal_False
);
828 // Jump (GotoBookmark)
830 pSet
, pJumpItem
, SfxStringItem
, SID_JUMPMARK
, sal_False
);
832 if ( pEditItem
&& pEditItem
->GetValue() )
833 SetMenuBarOn_Impl( FALSE
);
836 pImp
->bHidden
= pHidItem
->GetValue();
839 pDoc
->OwnerLock( sal_True
);
841 // Wenn z.B. eine Fenstergr"o\se gesetzt wurde, soll keine Fensterinformation
842 // aus den Dokument geladen werden, z.B. weil InsertDocument seinerseits
843 // aus LoadWindows_Impl aufgerufen wurde!
844 if ( !pJumpItem
&& !pPluginMode
&& pDoc
&& !pAreaItem
&& !pViewIdItem
&& !pModeItem
&&
845 pDoc
->LoadWindows_Impl( this ) )
847 if ( GetCurrentDocument() != pDoc
)
848 // something went wrong during insertion
850 pDoc
->OwnerLock( sal_False
);
856 UpdateHistory( pDoc
);
857 UpdateDescriptor( pDoc
);
860 SetFrameType_Impl( GetFrameType() & ~SFXFRAME_FRAMESET
);
861 sal_Bool bBrowsing
= sal_True
;
862 SfxViewFrame
*pFrame
= GetCurrentViewFrame();
865 sal_Bool bChildActivated
= sal_False
;
866 if ( pFrame
->GetActiveChildFrame_Impl() && pFrame
->GetActiveChildFrame_Impl() == SfxViewFrame::Current() )
868 // ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFramesSupplier > xFrames( GetFrameInterface(), ::com::sun::star::uno::UNO_QUERY );
869 // if ( xFrames.is() )
870 // xFrames->setActiveFrame( ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > () );
871 pFrame
->SetActiveChildFrame_Impl(0);
872 SfxViewFrame::SetViewFrame( pFrame
);
873 bChildActivated
= sal_True
;
876 if ( pFrame
->GetObjectShell() )
878 pFrame
->ReleaseObjectShell_Impl( sal_False
);
882 pFrame
->SetViewData_Impl( pViewIdItem
->GetValue(), String() );
884 pFrame
->SetObjectShell_Impl( *pDoc
);
888 // 1: internal embedded object
889 // 2: external embedded object
891 if ( pPluginItem
&& pPluginItem
->GetValue() != 2 )
892 SetInPlace_Impl( TRUE
);
894 bBrowsing
= sal_False
;
895 pFrame
= new SfxTopViewFrame( this, pDoc
, pViewIdItem
? pViewIdItem
->GetValue() : 0 );
896 if ( !pFrame
->GetViewShell() )
899 if ( pPluginItem
&& pPluginItem
->GetValue() == 1 )
901 pFrame
->ForceOuterResize_Impl( FALSE
);
902 pFrame
->GetBindings().HidePopups(TRUE
);
904 // MBA: layoutmanager of inplace frame starts locked and invisible
905 GetWorkWindow_Impl()->MakeVisible_Impl( FALSE
);
906 GetWorkWindow_Impl()->Lock_Impl( TRUE
);
908 GetWindow().SetBorderStyle( WINDOW_BORDER_NOBORDER
);
909 if ( GetCurrentViewFrame() )
910 GetCurrentViewFrame()->GetWindow().SetBorderStyle( WINDOW_BORDER_NOBORDER
);
915 SFX_ITEMSET_ARG( pSet
, pMarkItem
, SfxStringItem
, SID_JUMPMARK
, FALSE
);
917 aMark
= pMarkItem
->GetValue();
919 // Position und Groesse setzen
920 //sal_uInt16 nWinMode = pModeItem ? pModeItem->GetValue() : 1;
921 if ( pAreaItem
&& !pOld
)
923 Window
*pWin
= pImp
->pWindow
;
926 const Rectangle
aWinRect( pAreaItem
->GetValue() );
927 const Size
aAppWindow( pImp
->pWindow
->GetDesktopRectPixel().GetSize() );
928 Point
aPos( aWinRect
.TopLeft() );
929 Size
aSz(aWinRect
.GetSize());
930 if ( aSz
.Width() && aSz
.Height() )
932 aPos
.X() = Min(aPos
.X(),
933 long(aAppWindow
.Width() - aSz
.Width() + aSz
.Width() / 2) );
934 aPos
.Y() = Min(aPos
.Y(),
935 long( aAppWindow
.Height() - aSz
.Height() + aSz
.Height() / 2) );
936 if ( aPos
.X() + aSz
.Width() <
937 aAppWindow
.Width() + aSz
.Width() / 2 &&
938 aPos
.Y() + aSz
.Height() <
939 aAppWindow
.Height() + aSz
.Height() / 2 )
941 pWin
->SetPosPixel( aPos
);
942 pWin
->SetOutputSizePixel( aSz
);
947 if ( !pImp
->bHidden
)
949 if ( pDoc
->IsHelpDocument() )
950 pFrame
->GetDispatcher()->HideUI( TRUE
);
952 pFrame
->GetDispatcher()->HideUI( FALSE
);
955 pFrame
->LockAdjustPosSizePixel();
957 if ( pPluginMode
&& pPluginMode
->GetValue() == 3)
958 GetWorkWindow_Impl()->SetInternalDockingAllowed(FALSE
);
961 pFrame
->GetDispatcher()->Update_Impl();
964 if ( !IsInPlace() || (pPluginItem
&& pPluginItem
->GetValue() == 3) )
965 pFrame
->MakeActive_Impl( GetFrameInterface()->isActive() );
966 pDoc
->OwnerLock( sal_False
);
968 // Dont show container window! Its done by framework or directly
969 // by SfxTopFrame::Create() or SfxViewFrame::ExecView_Impl() ...
973 pFrame
->UnlockAdjustPosSizePixel();
974 // force resize for OLE server to fix layout problems of writer and math
976 if ( pPluginItem
&& pPluginItem
->GetValue() == 3 )
977 pFrame
->Resize(TRUE
);
982 DBG_ASSERT( !IsInPlace() && !pPluginMode
&& !pPluginItem
, "Special modes not compatible with hidden mode!" );
986 if ( pDoc
->Get_Impl()->nLoadedFlags
& SFX_LOADED_MAINDOCUMENT
)
989 pFrame
->GetViewShell()->ReadUserData( pViewDataItem
->GetValue(), sal_True
);
990 else if( aMark
.Len() )
991 GetCurrentViewFrame()->GetViewShell()->JumpToMark( aMark
);
995 // Daten setzen, die in FinishedLoading ausgewertet werden
996 MarkData_Impl
*& rpMark
= pDoc
->Get_Impl()->pMarkData
;
998 rpMark
= new MarkData_Impl
;
999 rpMark
->pFrame
= GetCurrentViewFrame();
1000 if ( pViewDataItem
)
1001 rpMark
->aUserData
= pViewDataItem
->GetValue();
1003 rpMark
->aMark
= aMark
;
1006 // Jetzt UpdateTitle, hidden TopFrames haben sonst keinen Namen!
1007 pFrame
->UpdateTitle();
1011 if ( pFrame
->GetViewShell()->UseObjectSize() )
1013 GetCurrentViewFrame()->UnlockAdjustPosSizePixel();
1014 GetCurrentViewFrame()->Resize(TRUE
);
1015 GetCurrentViewFrame()->ForceInnerResize_Impl( FALSE
);
1016 GetCurrentViewFrame()->Resize(TRUE
);
1019 GetCurrentViewFrame()->Resize(TRUE
);
1022 SFX_APP()->NotifyEvent( SfxEventHint(SFX_EVENT_VIEWCREATED
, GlobalEventConfig::GetEventName( STR_EVENT_VIEWCREATED
), pDoc
) );
1027 //========================================================================
1029 long SfxViewFrameClose_Impl( void* /*pObj*/, void* pArg
)
1031 ((SfxViewFrame
*)pArg
)->GetFrame()->DoClose();
1035 TYPEINIT1(SfxTopFrame
, SfxFrame
);
1036 TYPEINIT1(SfxTopViewFrame
, SfxViewFrame
);
1038 //--------------------------------------------------------------------
1039 SFX_IMPL_INTERFACE(SfxTopViewFrame
,SfxViewFrame
,SfxResId(0))
1043 //--------------------------------------------------------------------
1044 String
SfxTopViewFrame::UpdateTitle()
1048 Mit dieser Methode kann der SfxTopViewFrame gezwungen werden, sich sofort
1049 den neuen Titel vom der <SfxObjectShell> zu besorgen.
1053 Dies ist z.B. dann notwendig, wenn man der SfxObjectShell als SfxListener
1054 zuh"ort und dort auf den <SfxSimpleHint> SFX_HINT_TITLECHANGED reagieren
1055 m"ochte, um dann die Titel seiner Views abzufragen. Diese Views (SfxTopViewFrames)
1056 jedoch sind ebenfalls SfxListener und da die Reihenfolge der Benachrichtigung
1057 nicht feststeht, mu\s deren Titel-Update vorab erzwungen werden.
1062 void SwDocShell::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
1064 if ( rHint.IsA(TYPE(SfxSimpleHint)) )
1066 switch( ( (SfxSimpleHint&) rHint ).GetId() )
1068 case SFX_HINT_TITLECHANGED:
1069 for ( SfxTopViewFrame *pTop = (SfxTopViewFrame*)
1070 SfxViewFrame::GetFirst(this, TYPE(SfxTopViewFrame));
1072 pTop = (SfxTopViewFrame*)
1073 SfxViewFrame::GetNext(this, TYPE(SfxTopViewFrame));
1075 pTop->UpdateTitle();
1076 ... pTop->GetName() ...
1086 DBG_CHKTHIS(SfxTopViewFrame
, 0);
1088 const SfxObjectFactory
&rFact
= GetObjectShell()->GetFactory();
1089 pImp
->aFactoryName
= String::CreateFromAscii( rFact
.GetShortName() );
1091 String aTitle
= SfxViewFrame::UpdateTitle();
1093 ::rtl::OUString aProductName
;
1094 ::utl::ConfigManager::GetDirectConfigProperty(::utl::ConfigManager::PRODUCTNAME
) >>= aProductName
;
1096 aTitle
+= String::CreateFromAscii( " - " );
1097 aTitle
+= String(aProductName
);
1099 ::rtl::OUString
aDocServiceName( GetObjectShell()->GetFactory().GetDocumentServiceName() );
1100 aTitle
+= String( GetModuleName_Impl( aDocServiceName
) );
1102 ::rtl::OUString aDefault
;
1103 aTitle
+= DEFINE_CONST_UNICODE(" [");
1104 String
aVerId( utl::Bootstrap::getBuildIdData( aDefault
));
1109 // append TAB string if available
1110 aTitle
+= _getTabString();
1112 GetBindings().Invalidate( SID_NEWDOCDIRECT
);
1115 Window* pWindow = GetTopFrame_Impl()->GetTopWindow_Impl();
1116 if ( pWindow && pWindow->GetText() != aTitle )
1117 pWindow->SetText( aTitle );
1122 //--------------------------------------------------------------------
1123 void SfxTopViewFrame::Notify( SfxBroadcaster
& rBC
, const SfxHint
& rHint
)
1125 {DBG_CHKTHIS(SfxTopViewFrame
, 0);}
1127 if( IsDowning_Impl())
1130 // we know only SimpleHints
1131 if ( rHint
.IsA(TYPE(SfxSimpleHint
)) )
1133 switch( ( (SfxSimpleHint
&) rHint
).GetId() )
1135 case SFX_HINT_MODECHANGED
:
1136 case SFX_HINT_TITLECHANGED
:
1137 // when the document changes its title, change views too
1141 case SFX_HINT_DEINITIALIZING
:
1142 // on all other changes force repaint
1143 GetFrame()->DoClose();
1148 SfxViewFrame::Notify( rBC
, rHint
);
1151 //--------------------------------------------------------------------
1152 sal_Bool
SfxTopViewFrame::Close()
1154 {DBG_CHKTHIS(SfxTopViewFrame
, 0);}
1156 // Modaler Dialog oben ??
1157 // if ( pImp->GetModalDialog() )
1158 // return sal_False;
1160 // eigentliches Schlie\sen
1161 if ( SfxViewFrame::Close() )
1163 if (SfxViewFrame::Current() == this)
1164 SfxViewFrame::SetViewFrame(0);
1166 // Da der Dispatcher leer ger"aumt wird, kann man ihn auch nicht mehr
1167 // vern"unftig verwenden - also besser still legen
1168 GetDispatcher()->Lock(sal_True
);
1177 SfxTopViewFrame::SfxTopViewFrame
1180 SfxObjectShell
* pObjShell
,
1186 Ctor des SfxTopViewFrame f"ur eine <SfxObjectShell> aus der Ressource.
1187 Die 'nViewId' der zu erzeugenden <SfxViewShell> kann angegeben werden
1188 (default ist die zuerst registrierte SfxViewShell-Subklasse).
1191 : SfxViewFrame( *(new SfxBindings
), pFrame
, pObjShell
, SFXFRAME_HASTITLE
)
1193 DBG_CTOR(SfxTopViewFrame
, 0);
1196 pImp
= new SfxTopViewFrame_Impl
;
1197 pImp
->pStopButtonTimer
= new StopButtonTimer_Impl(this);
1199 //(mba)/task if ( !pFrame->GetTask() )
1201 pImp
->pWindow
= new SfxTopViewWin_Impl( this, &pFrame
->GetWindow() );
1202 pImp
->pWindow
->SetSizePixel( pFrame
->GetWindow().GetOutputSizePixel() );
1203 SetWindow_Impl( pImp
->pWindow
);
1204 pFrame
->SetOwnsBindings_Impl( sal_True
);
1205 pFrame
->CreateWorkWindow_Impl();
1208 sal_uInt32 nType
= SFXFRAME_OWNSDOCUMENT
| SFXFRAME_HASTITLE
;
1209 if ( pObjShell
&& pObjShell
->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED
)
1210 nType
|= SFXFRAME_EXTERNAL
;
1211 GetFrame()->SetFrameType_Impl( GetFrame()->GetFrameType() | nType
);
1213 if ( GetFrame()->IsInPlace() )
1215 LockAdjustPosSizePixel();
1221 SwitchToViewShell_Impl( nViewId
);
1223 catch (com::sun::star::uno::Exception
& )
1225 // make sure that the ctor is left regularly
1226 ReleaseObjectShell_Impl();
1230 if ( GetFrame()->IsInPlace() )
1232 UnlockAdjustPosSizePixel();
1234 else if ( GetViewShell() && GetViewShell()->UseObjectSize() )
1236 // initiale Gr"o\se festlegen
1237 // Zuerst die logischen Koordinaten von IP-Objekt und EditWindow
1239 LockAdjustPosSizePixel();
1240 ForceInnerResize_Impl( TRUE
);
1242 Window
*pWindow
= GetViewShell()->GetWindow();
1244 // Da in den Applikationen bei der R"ucktransformation immer die
1245 // Eckpunkte tranformiert werden und nicht die Size (um die Ecken
1246 // alignen zu k"onnen), transformieren wir hier auch die Punkte, um
1247 // m"oglichst wenig Rundungsfehler zu erhalten.
1249 Rectangle aRect = pWindow->LogicToLogic( GetObjectShell()->GetVisArea(),
1250 GetObjectShell()->GetMapUnit(),
1251 pWindow->GetMapMode() );
1253 Rectangle aRect
= pWindow
->LogicToPixel( GetObjectShell()->GetVisArea() );
1254 Size aSize
= aRect
.GetSize();
1255 GetViewShell()->GetWindow()->SetSizePixel( aSize
);
1256 DoAdjustPosSizePixel(GetViewShell(), Point(), aSize
);
1260 //------------------------------------------------------------------------
1261 SfxTopViewFrame::~SfxTopViewFrame()
1263 DBG_DTOR(SfxTopViewFrame
, 0);
1267 if ( SfxViewFrame::Current() == this )
1268 SfxViewFrame::SetViewFrame(NULL
);
1270 ReleaseObjectShell_Impl();
1271 if ( pPendingCloser
== pCloser
)
1274 if ( GetFrame()->OwnsBindings_Impl() )
1275 // Die Bindings l"oscht der Frame!
1276 KillDispatcher_Impl();
1278 delete pImp
->pWindow
;
1279 delete pImp
->pStopButtonTimer
;
1283 //------------------------------------------------------------------------
1284 sal_Bool
SfxTopViewFrame::SetBorderPixelImpl( const SfxViewShell
*pVSh
, const SvBorder
&rBorder
)
1286 if( SfxViewFrame::SetBorderPixelImpl( GetViewShell(), rBorder
) )
1288 if ( IsResizeInToOut_Impl() && !GetFrame()->IsInPlace() )
1290 Size aSize
= pVSh
->GetWindow()->GetOutputSizePixel();
1291 if ( aSize
.Width() && aSize
.Height() )
1293 aSize
.Width() += rBorder
.Left() + rBorder
.Right();
1294 aSize
.Height() += rBorder
.Top() + rBorder
.Bottom();
1296 Size aOldSize
= GetWindow().GetOutputSizePixel();
1297 GetWindow().SetOutputSizePixel( aSize
);
1298 Window
* pParent
= &GetWindow();
1299 while ( pParent
->GetParent() )
1300 pParent
= pParent
->GetParent();
1301 Size aOuterSize
= pParent
->GetOutputSizePixel();
1302 aOuterSize
.Width() += ( aSize
.Width() - aOldSize
.Width() );
1303 aOuterSize
.Height() += ( aSize
.Height() - aOldSize
.Height() );
1304 pParent
->SetOutputSizePixel( aOuterSize
);
1310 Rectangle
aEditArea( aPoint
, GetWindow().GetOutputSizePixel() );
1311 aEditArea
.Left() += rBorder
.Left();
1312 aEditArea
.Right() -= rBorder
.Right();
1313 aEditArea
.Top() += rBorder
.Top();
1314 aEditArea
.Bottom() -= rBorder
.Bottom();
1315 pVSh
->GetWindow()->SetPosSizePixel( aEditArea
.TopLeft(), aEditArea
.GetSize() );
1323 void SfxTopViewFrame::Exec_Impl(SfxRequest
&rReq
)
1325 // Wenn gerade die Shells ausgetauscht werden...
1326 if ( !GetObjectShell() || !GetViewShell() )
1329 switch ( rReq
.GetSlot() )
1331 case SID_SHOWPOPUPS
:
1333 SFX_REQUEST_ARG(rReq
, pShowItem
, SfxBoolItem
, SID_SHOWPOPUPS
, FALSE
);
1334 BOOL bShow
= pShowItem
? pShowItem
->GetValue() : TRUE
;
1335 SFX_REQUEST_ARG(rReq
, pIdItem
, SfxUInt16Item
, SID_CONFIGITEMID
, FALSE
);
1336 USHORT nId
= pIdItem
? pIdItem
->GetValue() : 0;
1339 SfxWorkWindow
*pWorkWin
= GetFrame()->GetWorkWindow_Impl();
1342 // Zuerst die Floats auch anzeigbar machen
1343 pWorkWin
->MakeChildsVisible_Impl( bShow
);
1344 GetDispatcher()->Update_Impl( TRUE
);
1347 GetBindings().HidePopups( !bShow
);
1352 SfxBindings
*pBind
= &GetBindings();
1355 pBind
->HidePopupCtrls_Impl( !bShow
);
1356 pBind
= pBind
->GetSubBindings_Impl();
1359 pWorkWin
->HidePopups_Impl( !bShow
, TRUE
, nId
);
1360 pWorkWin
->MakeChildsVisible_Impl( bShow
);
1363 Invalidate( rReq
.GetSlot() );
1370 MakeActive_Impl( TRUE
);
1371 rReq
.SetReturnValue( SfxObjectItem( 0, this ) );
1375 case SID_WIN_POSSIZE
:
1378 case SID_NEWDOCDIRECT
:
1380 SFX_REQUEST_ARG( rReq
, pFactoryItem
, SfxStringItem
, SID_NEWDOCDIRECT
, FALSE
);
1383 aFactName
= pFactoryItem
->GetValue();
1384 else if ( pImp
->aFactoryName
.Len() )
1385 aFactName
= pImp
->aFactoryName
;
1388 DBG_ERROR("Missing argument!");
1392 SfxRequest
aReq( SID_OPENDOC
, SFX_CALLMODE_SYNCHRON
, GetPool() );
1393 String aFact
= String::CreateFromAscii("private:factory/");
1395 aReq
.AppendItem( SfxStringItem( SID_FILE_NAME
, aFact
) );
1396 aReq
.AppendItem( SfxFrameItem( SID_DOCFRAME
, GetFrame() ) );
1397 aReq
.AppendItem( SfxStringItem( SID_TARGETNAME
, String::CreateFromAscii( "_blank" ) ) );
1398 SFX_APP()->ExecuteSlot( aReq
);
1399 const SfxViewFrameItem
* pItem
= PTR_CAST( SfxViewFrameItem
, aReq
.GetReturnValue() );
1401 rReq
.SetReturnValue( SfxFrameItem( 0, pItem
->GetFrame() ) );
1407 // disable CloseWin, if frame is not a task
1408 Reference
< XCloseable
> xTask( GetFrame()->GetFrameInterface(), UNO_QUERY
);
1412 if ( GetViewShell()->PrepareClose() )
1414 // weitere Views auf dasselbe Doc?
1415 SfxObjectShell
*pDocSh
= GetObjectShell();
1416 int bOther
= sal_False
;
1417 for ( const SfxTopViewFrame
*pFrame
=
1418 (SfxTopViewFrame
*)SfxViewFrame::GetFirst( pDocSh
, TYPE(SfxTopViewFrame
) );
1420 pFrame
= (SfxTopViewFrame
*)SfxViewFrame::GetNext( *pFrame
, pDocSh
, TYPE(SfxTopViewFrame
) ) )
1421 bOther
= (pFrame
!= this);
1423 // Doc braucht nur gefragt zu werden, wenn keine weitere View
1424 sal_Bool bClosed
= sal_False
;
1425 sal_Bool bUI
= TRUE
;
1426 if ( ( bOther
|| pDocSh
->PrepareClose( bUI
) ) )
1429 pDocSh
->SetModified( FALSE
);
1430 rReq
.Done(); // unbedingt vor Close() rufen!
1431 bClosed
= sal_False
;
1434 xTask
->close(sal_True
);
1437 catch( CloseVetoException
& )
1439 bClosed
= sal_False
;
1443 rReq
.SetReturnValue( SfxBoolItem( rReq
.GetSlot(), bClosed
));
1452 void SfxTopViewFrame::GetState_Impl( SfxItemSet
&rSet
)
1454 SfxObjectShell
*pDocSh
= GetObjectShell();
1459 const sal_uInt16
*pRanges
= rSet
.GetRanges();
1460 DBG_ASSERT(pRanges
, "Set ohne Bereich");
1463 for ( sal_uInt16 nWhich
= *pRanges
++; nWhich
<= *pRanges
; ++nWhich
)
1467 case SID_NEWDOCDIRECT
:
1469 if ( pImp
->aFactoryName
.Len() )
1471 String aFact
= String::CreateFromAscii("private:factory/");
1472 aFact
+= pImp
->aFactoryName
;
1473 rSet
.Put( SfxStringItem( nWhich
, aFact
) );
1479 rSet
.DisableItem(nWhich
);
1484 // disable CloseWin, if frame is not a task
1485 Reference
< XCloseable
> xTask( GetFrame()->GetFrameInterface(), UNO_QUERY
);
1487 rSet
.DisableItem(nWhich
);
1491 case SID_SHOWPOPUPS
:
1494 case SID_WIN_POSSIZE
:
1496 rSet
.Put( SfxRectangleItem( nWhich
, Rectangle(
1497 GetWindow().GetPosPixel(), GetWindow().GetSizePixel() ) ) );
1502 DBG_ERROR( "invalid message-id" );
1509 void SfxTopViewFrame::INetExecute_Impl( SfxRequest
&rRequest
)
1511 sal_uInt16 nSlotId
= rRequest
.GetSlot();
1514 case SID_BROWSE_FORWARD
:
1515 case SID_BROWSE_BACKWARD
:
1517 // Anzeige der n"achsten oder vorherigen Seite aus der History
1518 SFX_REQUEST_ARG( rRequest
, pSteps
, SfxUInt16Item
, nSlotId
, sal_False
);
1519 GetFrame()->Browse( nSlotId
== SID_BROWSE_FORWARD
, pSteps
? pSteps
->GetValue() : 1,
1520 (rRequest
.GetModifier() & KEY_MOD1
) != 0 );
1523 case SID_CREATELINK
:
1525 /*! (pb) we need new implementation to create a link
1529 case SID_BROWSE_STOP
:
1531 if ( GetCancelManager() )
1532 GetCancelManager()->Cancel( TRUE
);
1534 // cancel jobs in hidden tasks
1535 SfxFrameArr_Impl
& rArr
= *SFX_APP()->Get_Impl()->pTopFrames
;
1536 for( USHORT nPos
= rArr
.Count(); nPos
--; )
1538 SfxFrame
*pFrame
= rArr
[ nPos
];
1539 if ( !pFrame
->GetCurrentViewFrame() )
1540 pFrame
->GetCancelManager()->Cancel( TRUE
);
1545 case SID_FOCUSURLBOX
:
1547 SfxStateCache
*pCache
= GetBindings().GetAnyStateCache_Impl( SID_OPENURL
);
1550 SfxControllerItem
* pCtrl
= pCache
->GetItemLink();
1553 pCtrl
->StateChanged( SID_FOCUSURLBOX
, SFX_ITEM_UNKNOWN
, 0 );
1554 pCtrl
= pCtrl
->GetItemLink();
1564 void SfxTopViewFrame::INetState_Impl( SfxItemSet
&rItemSet
)
1566 if ( !GetFrame()->CanBrowseForward() )
1567 rItemSet
.DisableItem( SID_BROWSE_FORWARD
);
1569 if ( !GetFrame()->CanBrowseBackward() )
1570 rItemSet
.DisableItem( SID_BROWSE_BACKWARD
);
1572 // Add/SaveToBookmark bei BASIC-IDE, QUERY-EDITOR etc. disablen
1573 SfxObjectShell
*pDocSh
= GetObjectShell();
1574 sal_Bool bPseudo
= pDocSh
&& !( pDocSh
->GetFactory().GetFlags() & SFXOBJECTSHELL_HASOPENDOC
);
1575 sal_Bool bEmbedded
= pDocSh
&& pDocSh
->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED
;
1576 if ( !pDocSh
|| bPseudo
|| bEmbedded
|| !pDocSh
->HasName() )
1577 rItemSet
.DisableItem( SID_CREATELINK
);
1579 pImp
->pStopButtonTimer
->SetButtonState( GetCancelManager()->CanCancel() );
1580 if ( !pImp
->pStopButtonTimer
->GetButtonState() )
1581 rItemSet
.DisableItem( SID_BROWSE_STOP
);
1584 void SfxTopViewFrame::SetZoomFactor( const Fraction
&rZoomX
, const Fraction
&rZoomY
)
1586 GetViewShell()->SetZoomFactor( rZoomX
, rZoomY
);
1589 void SfxTopViewFrame::Activate( sal_Bool bMDI
)
1591 DBG_ASSERT(GetViewShell(), "Keine Shell");
1593 pImp
->bActive
= sal_True
;
1594 //(mba): hier evtl. wie in Beanframe NotifyEvent ?!
1597 void SfxTopViewFrame::Deactivate( sal_Bool bMDI
)
1599 DBG_ASSERT(GetViewShell(), "Keine Shell");
1601 pImp
->bActive
= sal_False
;
1602 //(mba): hier evtl. wie in Beanframe NotifyEvent ?!
1605 void SfxTopFrame::CheckMenuCloser_Impl( MenuBar
* pMenuBar
)
1607 Reference
< ::com::sun::star::frame::XFrame
> xFrame
= GetFrameInterface();
1609 // checks if there is more than one "real" (not help) task window
1610 // in this case a close button is inserted into the menubar
1612 DBG_ASSERT( xFrame
.is(), "Attention: this bug is very hard to reproduce. Please try to remember how you triggered it!");
1613 if ( !xFrame
.is() || !xFrame
->getController().is() )
1617 Reference
< ::com::sun::star::frame::XFramesSupplier
> xDesktop( xFrame
->getCreator(), UNO_QUERY
);
1618 if ( !xDesktop
.is() )
1619 // test only for task windows
1622 sal_Bool bLastTask
= sal_False
;
1623 Reference
< ::com::sun::star::container::XIndexAccess
>
1624 xList ( xDesktop
->getFrames(), ::com::sun::star::uno::UNO_QUERY
);
1625 sal_Int32 nCount
= xList
->getCount();
1628 bLastTask
= sal_True
;
1629 else if ( nCount
==2 )
1631 // if we have to tasks, one can be the help task, that should be ignored
1632 for( sal_Int32 i
=0; i
<nCount
; ++i
)
1634 Reference
< ::com::sun::star::frame::XFrame
> xTask
;
1635 ::com::sun::star::uno::Any aVal
= xList
->getByIndex(i
);
1636 if ( (aVal
>>=xTask
) && xTask
.is() && xTask
->getName().compareToAscii("OFFICE_HELP_TASK") == COMPARE_EQUAL
)
1638 // one of the two open tasks was the help task -> ignored
1639 bLastTask
= sal_True
;
1645 pMenuBar
->ShowCloser(bLastTask
);