Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #ifdef SOLARIS
22 : #include <ctime>
23 : #endif
24 :
25 : #include <string>
26 : #include <com/sun/star/uno/Reference.h>
27 : #include <com/sun/star/frame/XFrame.hpp>
28 : #include <com/sun/star/awt/XPopupMenu.hpp>
29 : #include <com/sun/star/awt/XWindow.hpp>
30 : #include <com/sun/star/awt/XWindowPeer.hpp>
31 : #include <com/sun/star/util/URL.hpp>
32 : #include <com/sun/star/util/URLTransformer.hpp>
33 : #include <com/sun/star/util/XURLTransformer.hpp>
34 : #include <com/sun/star/frame/XController.hpp>
35 : #include <com/sun/star/lang/XUnoTunnel.hpp>
36 : #include <com/sun/star/document/MacroExecMode.hpp>
37 : #include <com/sun/star/document/UpdateDocMode.hpp>
38 : #include <com/sun/star/frame/Desktop.hpp>
39 : #include <com/sun/star/frame/XComponentLoader.hpp>
40 : #include <com/sun/star/beans/PropertyValue.hpp>
41 : #include <com/sun/star/beans/XPropertySet.hpp>
42 : #include <com/sun/star/frame/XLayoutManager.hpp>
43 : #include <com/sun/star/frame/XPopupMenuController.hpp>
44 : #include <com/sun/star/frame/status/ItemStatus.hpp>
45 : #include <com/sun/star/frame/status/ItemState.hpp>
46 : #include <com/sun/star/ui/XUIElementFactory.hpp>
47 : #include <com/sun/star/frame/XModuleManager.hpp>
48 : #include <com/sun/star/container/XNameAccess.hpp>
49 : #include <com/sun/star/ui/XUIFunctionListener.hpp>
50 : #include <com/sun/star/ui/theUIElementFactoryManager.hpp>
51 : #include <com/sun/star/frame/status/Visibility.hpp>
52 : #include <svl/eitem.hxx>
53 : #include <svl/stritem.hxx>
54 : #include <svl/intitem.hxx>
55 : #include <svl/imageitm.hxx>
56 : #include <svl/visitem.hxx>
57 : #include <svl/urlbmk.hxx>
58 : #include <vcl/toolbox.hxx>
59 : #include <unotools/moduleoptions.hxx>
60 :
61 : #include <svtools/imagemgr.hxx>
62 : #include <comphelper/processfactory.hxx>
63 : #include <framework/addonmenu.hxx>
64 : #include <framework/addonsoptions.hxx>
65 : #include <framework/menuconfiguration.hxx>
66 : #include <framework/sfxhelperfunctions.hxx>
67 : #include <vcl/taskpanelist.hxx>
68 : #include <toolkit/helper/vclunohelper.hxx>
69 : #include <svtools/menuoptions.hxx>
70 : #include <svtools/miscopt.hxx>
71 :
72 : #include <sfx2/tbxctrl.hxx>
73 : #include <sfx2/mnumgr.hxx>
74 : #include <sfx2/dispatch.hxx>
75 : #include <sfx2/msg.hxx>
76 : #include <sfx2/msgpool.hxx>
77 : #include "statcach.hxx"
78 : #include <sfx2/viewfrm.hxx>
79 : #include "sfxtypes.hxx"
80 : #include <sfx2/genlink.hxx>
81 : #include <sfx2/sfxresid.hxx>
82 : #include <sfx2/sfx.hrc>
83 : #include <sfx2/module.hxx>
84 : #include <sfx2/docfile.hxx>
85 : #include <sfx2/docfac.hxx>
86 : #include <sfx2/frmhtmlw.hxx>
87 : #include <sfx2/app.hxx>
88 : #include <sfx2/unoctitm.hxx>
89 : #include "helpid.hrc"
90 : #include "workwin.hxx"
91 : #include <sfx2/imgmgr.hxx>
92 : #include "virtmenu.hxx"
93 : #include <sfx2/imagemgr.hxx>
94 : #include <ctrlfactoryimpl.hxx>
95 :
96 : using namespace ::com::sun::star;
97 : using namespace ::com::sun::star::beans;
98 : using namespace ::com::sun::star::frame;
99 : using namespace ::com::sun::star::frame::status;
100 : using namespace ::com::sun::star::lang;
101 : using namespace ::com::sun::star::uno;
102 : using namespace ::com::sun::star::util;
103 : using namespace ::com::sun::star::container;
104 : using namespace ::com::sun::star::ui;
105 :
106 :
107 :
108 208 : SFX_IMPL_TOOLBOX_CONTROL_ARG(SfxToolBoxControl, SfxStringItem, true);
109 825 : SFX_IMPL_TOOLBOX_CONTROL(SfxRecentFilesToolBoxControl, SfxStringItem);
110 :
111 0 : static vcl::Window* GetTopMostParentSystemWindow( vcl::Window* pWindow )
112 : {
113 : OSL_ASSERT( pWindow );
114 0 : if ( pWindow )
115 : {
116 : // ->manually search topmost system window
117 : // required because their might be another system window between this and the top window
118 0 : pWindow = pWindow->GetParent();
119 0 : SystemWindow* pTopMostSysWin = NULL;
120 0 : while ( pWindow )
121 : {
122 0 : if ( pWindow->IsSystemWindow() )
123 0 : pTopMostSysWin = static_cast<SystemWindow*>(pWindow);
124 0 : pWindow = pWindow->GetParent();
125 : }
126 0 : pWindow = pTopMostSysWin;
127 : OSL_ASSERT( pWindow );
128 0 : return pWindow;
129 : }
130 :
131 0 : return NULL;
132 : }
133 :
134 67439 : svt::ToolboxController* SAL_CALL SfxToolBoxControllerFactory( const Reference< XFrame >& rFrame, ToolBox* pToolbox, unsigned short nID, const OUString& aCommandURL )
135 : {
136 67439 : SolarMutexGuard aGuard;
137 :
138 134878 : URL aTargetURL;
139 67439 : aTargetURL.Complete = aCommandURL;
140 134878 : Reference < XURLTransformer > xTrans( URLTransformer::create( ::comphelper::getProcessComponentContext() ) );
141 67439 : xTrans->parseStrict( aTargetURL );
142 67439 : if ( !aTargetURL.Arguments.isEmpty() )
143 0 : return NULL;
144 :
145 67439 : SfxObjectShell* pObjShell = NULL;
146 134878 : Reference < XController > xController;
147 134878 : Reference < XModel > xModel;
148 67439 : if ( rFrame.is() )
149 : {
150 67439 : xController = rFrame->getController();
151 67439 : if ( xController.is() )
152 67439 : xModel = xController->getModel();
153 : }
154 :
155 67439 : if ( xModel.is() )
156 : {
157 : // Get tunnel from model to retrieve the SfxObjectShell pointer from it
158 67419 : ::com::sun::star::uno::Reference < ::com::sun::star::lang::XUnoTunnel > xObj( xModel, UNO_QUERY );
159 67419 : if ( xObj.is() )
160 : {
161 67412 : ::com::sun::star::uno::Sequence < sal_Int8 > aSeq = SvGlobalName( SFX_GLOBAL_CLASSID ).GetByteSequence();
162 67412 : sal_Int64 nHandle = xObj->getSomething( aSeq );
163 67412 : if ( nHandle )
164 66783 : pObjShell = reinterpret_cast< SfxObjectShell* >( sal::static_int_cast< sal_IntPtr >( nHandle ));
165 67419 : }
166 : }
167 :
168 67439 : SfxModule* pModule = pObjShell ? pObjShell->GetModule() : NULL;
169 67439 : SfxSlotPool* pSlotPool = 0;
170 :
171 67439 : if ( pModule )
172 66783 : pSlotPool = pModule->GetSlotPool();
173 : else
174 656 : pSlotPool = &(SfxSlotPool::GetSlotPool( NULL ));
175 :
176 67439 : const SfxSlot* pSlot = pSlotPool->GetUnoSlot( aTargetURL.Path );
177 67439 : if ( pSlot )
178 : {
179 64381 : sal_uInt16 nSlotId = pSlot->GetSlotId();
180 64381 : if ( nSlotId > 0 )
181 64381 : return SfxToolBoxControl::CreateControl( nSlotId, nID, pToolbox, pModule );
182 : }
183 :
184 70497 : return NULL;
185 : }
186 :
187 28784 : struct SfxToolBoxControl_Impl
188 : {
189 : VclPtr<ToolBox> pBox;
190 : bool bShowString;
191 : SfxTbxCtrlFactory* pFact;
192 : sal_uInt16 nTbxId;
193 : sal_uInt16 nSlotId;
194 : VclPtr<SfxPopupWindow> mpFloatingWindow;
195 : VclPtr<SfxPopupWindow> mpPopupWindow;
196 : Reference< XUIElement > mxUIElement;
197 :
198 : DECL_LINK( WindowEventListener, VclSimpleEvent* );
199 : };
200 :
201 0 : IMPL_LINK( SfxToolBoxControl_Impl, WindowEventListener, VclSimpleEvent*, pEvent )
202 : {
203 0 : if ( pEvent &&
204 0 : pEvent->ISA( VclWindowEvent ) &&
205 0 : (( pEvent->GetId() == VCLEVENT_WINDOW_MOVE ) ||
206 0 : ( pEvent->GetId() == VCLEVENT_WINDOW_ACTIVATE )))
207 : {
208 0 : vcl::Window* pWindow( static_cast<VclWindowEvent*>(pEvent)->GetWindow() );
209 0 : if (( pWindow == mpFloatingWindow ) &&
210 0 : ( mpPopupWindow != nullptr ))
211 : {
212 0 : mpPopupWindow.disposeAndClear();
213 : }
214 : }
215 :
216 0 : return 1;
217 : }
218 :
219 :
220 :
221 14392 : SfxToolBoxControl::SfxToolBoxControl(
222 : sal_uInt16 nSlotID,
223 : sal_uInt16 nID,
224 : ToolBox& rBox,
225 14392 : bool bShowStringItems )
226 : {
227 14392 : pImpl = new SfxToolBoxControl_Impl;
228 :
229 14392 : pImpl->pBox = &rBox;
230 14392 : pImpl->bShowString = bShowStringItems;
231 14392 : pImpl->pFact = 0;
232 14392 : pImpl->nTbxId = nID;
233 14392 : pImpl->nSlotId = nSlotID;
234 14392 : pImpl->mpFloatingWindow = 0;
235 14392 : pImpl->mpPopupWindow = 0;
236 14392 : }
237 :
238 :
239 :
240 28784 : SfxToolBoxControl::~SfxToolBoxControl()
241 : {
242 14392 : if ( pImpl->mxUIElement.is() )
243 : {
244 0 : Reference< XComponent > xComponent( pImpl->mxUIElement, UNO_QUERY );
245 0 : xComponent->dispose();
246 : }
247 14392 : pImpl->mxUIElement = 0;
248 14392 : delete pImpl;
249 14392 : }
250 :
251 :
252 :
253 30713 : ToolBox& SfxToolBoxControl::GetToolBox() const
254 : {
255 30713 : return *pImpl->pBox;
256 : }
257 97361 : unsigned short SfxToolBoxControl::GetId() const
258 : {
259 97361 : return pImpl->nTbxId;
260 : }
261 50 : unsigned short SfxToolBoxControl::GetSlotId() const
262 : {
263 50 : return pImpl->nSlotId;
264 : }
265 :
266 :
267 :
268 14290 : void SAL_CALL SfxToolBoxControl::dispose() throw (::com::sun::star::uno::RuntimeException, std::exception)
269 : {
270 14290 : if ( m_bDisposed )
271 14290 : return;
272 :
273 14290 : svt::ToolboxController::dispose();
274 :
275 : // Remove and destroy our item window at our toolbox
276 14290 : SolarMutexGuard aGuard;
277 28580 : VclPtr< vcl::Window > pWindow = pImpl->pBox->GetItemWindow( pImpl->nTbxId );
278 14290 : pImpl->pBox->SetItemWindow( pImpl->nTbxId, 0 );
279 14290 : pWindow.disposeAndClear();
280 :
281 : // Dispose an open sub toolbar. It's possible that we have an open
282 : // sub toolbar while we get disposed. Therefore we have to dispose
283 : // it now! Not doing so would result in a crash. The sub toolbar
284 : // gets destroyed asynchronously and would access a non-existing
285 : // parent toolbar!
286 14290 : if ( pImpl->mxUIElement.is() )
287 : {
288 0 : Reference< XComponent > xComponent( pImpl->mxUIElement, UNO_QUERY );
289 0 : xComponent->dispose();
290 : }
291 14290 : pImpl->mxUIElement = 0;
292 :
293 : // Delete my popup windows
294 14290 : pImpl->mpFloatingWindow.disposeAndClear();
295 28580 : pImpl->mpPopupWindow.disposeAndClear();
296 : }
297 :
298 :
299 8760 : void SfxToolBoxControl::RegisterToolBoxControl( SfxModule* pMod, SfxTbxCtrlFactory* pFact)
300 : {
301 8760 : SfxGetpApp()->RegisterToolBoxControl_Impl( pMod, pFact );
302 8760 : }
303 :
304 64381 : SfxToolBoxControl* SfxToolBoxControl::CreateControl( sal_uInt16 nSlotId, sal_uInt16 nTbxId, ToolBox *pBox, SfxModule* pMod )
305 : {
306 64381 : SolarMutexGuard aGuard;
307 :
308 64381 : SfxApplication *pApp = SfxGetpApp();
309 :
310 : SfxSlotPool *pSlotPool;
311 64381 : if ( pMod )
312 64201 : pSlotPool = pMod->GetSlotPool();
313 : else
314 180 : pSlotPool = &SfxSlotPool::GetSlotPool();
315 64381 : TypeId aSlotType = pSlotPool->GetSlotType( nSlotId );
316 64381 : if ( aSlotType )
317 : {
318 : SfxToolBoxControl *pCtrl;
319 64381 : if ( pMod )
320 : {
321 64201 : SfxTbxCtrlFactArr_Impl *pFactories = pMod->GetTbxCtrlFactories_Impl();
322 64201 : if ( pFactories )
323 : {
324 64201 : SfxTbxCtrlFactArr_Impl &rFactories = *pFactories;
325 : sal_uInt16 nFactory;
326 64201 : const sal_uInt16 nCount = rFactories.size();
327 :
328 : // search for a factory with the given slot id
329 3215391 : for( nFactory = 0; nFactory < nCount; ++nFactory )
330 3165366 : if( (rFactories[nFactory].nTypeId == aSlotType) && (rFactories[nFactory].nSlotId == nSlotId) )
331 14176 : break;
332 :
333 64201 : if( nFactory == nCount )
334 : {
335 : // if no factory exists for the given slot id, see if we
336 : // have a generic factory with the correct slot type and slot id == 0
337 2824825 : for ( nFactory = 0; nFactory < nCount; ++nFactory )
338 2774851 : if( (rFactories[nFactory].nTypeId == aSlotType) && (rFactories[nFactory].nSlotId == 0) )
339 51 : break;
340 : }
341 :
342 64201 : if( nFactory < nCount )
343 : {
344 14227 : pCtrl = rFactories[nFactory].pCtor( nSlotId, nTbxId, *pBox );
345 14227 : pCtrl->pImpl->pFact = &rFactories[nFactory];
346 14227 : return pCtrl;
347 : }
348 : }
349 : }
350 :
351 50154 : SfxTbxCtrlFactArr_Impl &rFactories = pApp->GetTbxCtrlFactories_Impl();
352 : sal_uInt16 nFactory;
353 50154 : const sal_uInt16 nCount = rFactories.size();
354 :
355 548544 : for( nFactory = 0; nFactory < nCount; ++nFactory )
356 498453 : if( (rFactories[nFactory].nTypeId == aSlotType) && (rFactories[nFactory].nSlotId == nSlotId) )
357 63 : break;
358 :
359 50154 : if( nFactory == nCount )
360 : {
361 : // if no factory exists for the given slot id, see if we
362 : // have a generic factory with the correct slot type and slot id == 0
363 548292 : for( nFactory = 0; nFactory < nCount; ++nFactory )
364 498201 : if( (rFactories[nFactory].nTypeId == aSlotType) && (rFactories[nFactory].nSlotId == 0) )
365 0 : break;
366 : }
367 :
368 50154 : if( nFactory < nCount )
369 : {
370 63 : pCtrl = rFactories[nFactory].pCtor( nSlotId, nTbxId, *pBox );
371 63 : pCtrl->pImpl->pFact = &rFactories[nFactory];
372 63 : return pCtrl;
373 : }
374 : }
375 :
376 50091 : return NULL;
377 : }
378 :
379 4678 : SfxItemState SfxToolBoxControl::GetItemState(
380 : const SfxPoolItem* pState )
381 : /* [Description]
382 :
383 : Static method for determining the status of the SfxPoolItem-pointer,
384 : used in the method <SfxControllerItem::StateChanged(const SfxPoolItem*)>.
385 :
386 : [Return value]
387 :
388 : SfxItemState SfxItemState::UNKNOWN
389 : Enabled, however no further status information is available.
390 : Typical for <Slot>s, which are temporarily disabled a
391 : anyway but other than that do not change their appearance.
392 :
393 : SfxItemState::DISABLED
394 : Disabled, no further status information is available.
395 : All other displayed values should be reset to the default
396 : if possible.
397 :
398 : SfxItemState::DONTCARE
399 : Enabled but there were only ambiguous values available
400 : (i.e. none that could be queried).
401 :
402 : SfxItemState::DEFAULT
403 : Enabled and with available values which can be queried
404 : through'pState'. The type is thus by the Slot clearly
405 : defined in the entire Program.
406 : */
407 :
408 : {
409 : return !pState
410 : ? SfxItemState::DISABLED
411 1028 : : IsInvalidItem(pState)
412 : ? SfxItemState::DONTCARE
413 1028 : : pState->ISA(SfxVoidItem) && !pState->Which()
414 : ? SfxItemState::UNKNOWN
415 6734 : : SfxItemState::DEFAULT;
416 : }
417 :
418 0 : void SfxToolBoxControl::Dispatch(
419 : const Reference< XDispatchProvider >& rProvider,
420 : const OUString& rCommand,
421 : Sequence< ::PropertyValue >& aArgs )
422 : {
423 0 : if ( rProvider.is() )
424 : {
425 0 : ::com::sun::star::util::URL aTargetURL;
426 0 : aTargetURL.Complete = rCommand;
427 0 : Reference < XURLTransformer > xTrans( URLTransformer::create( ::comphelper::getProcessComponentContext() ) );
428 0 : xTrans->parseStrict( aTargetURL );
429 :
430 0 : Reference < XDispatch > xDispatch = rProvider->queryDispatch( aTargetURL, OUString(), 0 );
431 0 : if ( xDispatch.is() )
432 0 : xDispatch->dispatch( aTargetURL, aArgs );
433 : }
434 0 : }
435 :
436 0 : void SfxToolBoxControl::Dispatch( const OUString& aCommand, ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aArgs )
437 : {
438 0 : Reference < XController > xController;
439 :
440 0 : SolarMutexGuard aGuard;
441 0 : if ( getFrameInterface().is() )
442 0 : xController = getFrameInterface()->getController();
443 :
444 0 : Reference < XDispatchProvider > xProvider( xController, UNO_QUERY );
445 0 : if ( xProvider.is() )
446 : {
447 0 : ::com::sun::star::util::URL aTargetURL;
448 0 : aTargetURL.Complete = aCommand;
449 0 : getURLTransformer()->parseStrict( aTargetURL );
450 :
451 0 : Reference < XDispatch > xDispatch = xProvider->queryDispatch( aTargetURL, OUString(), 0 );
452 0 : if ( xDispatch.is() )
453 0 : xDispatch->dispatch( aTargetURL, aArgs );
454 0 : }
455 0 : }
456 :
457 0 : void SAL_CALL SfxToolBoxControl::disposing( const ::com::sun::star::lang::EventObject& aEvent )
458 : throw( ::com::sun::star::uno::RuntimeException, std::exception )
459 : {
460 0 : svt::ToolboxController::disposing( aEvent );
461 0 : }
462 :
463 : // XStatusListener
464 34990 : void SAL_CALL SfxToolBoxControl::statusChanged( const FeatureStateEvent& rEvent )
465 : throw ( ::com::sun::star::uno::RuntimeException, std::exception )
466 : {
467 34990 : SfxViewFrame* pViewFrame = NULL;
468 34990 : Reference < XController > xController;
469 :
470 69980 : SolarMutexGuard aGuard;
471 34990 : if ( getFrameInterface().is() )
472 34990 : xController = getFrameInterface()->getController();
473 :
474 69980 : Reference < XDispatchProvider > xProvider( xController, UNO_QUERY );
475 34990 : if ( xProvider.is() )
476 : {
477 34990 : Reference < XDispatch > xDisp = xProvider->queryDispatch( rEvent.FeatureURL, OUString(), 0 );
478 34990 : if ( xDisp.is() )
479 : {
480 34990 : Reference< XUnoTunnel > xTunnel( xDisp, UNO_QUERY );
481 34990 : SfxOfficeDispatch* pDisp = NULL;
482 34990 : if ( xTunnel.is() )
483 : {
484 34990 : sal_Int64 nImplementation = xTunnel->getSomething(SfxOfficeDispatch::impl_getStaticIdentifier());
485 34990 : pDisp = reinterpret_cast< SfxOfficeDispatch* >( sal::static_int_cast< sal_IntPtr >( nImplementation ));
486 : }
487 :
488 34990 : if ( pDisp )
489 34990 : pViewFrame = pDisp->GetDispatcher_Impl()->GetFrame();
490 34990 : }
491 : }
492 :
493 34990 : sal_uInt16 nSlotId = 0;
494 34990 : SfxSlotPool& rPool = SfxSlotPool::GetSlotPool( pViewFrame );
495 34990 : const SfxSlot* pSlot = rPool.GetUnoSlot( rEvent.FeatureURL.Path );
496 34990 : if ( pSlot )
497 34990 : nSlotId = pSlot->GetSlotId();
498 0 : else if ( m_aCommandURL == rEvent.FeatureURL.Path )
499 0 : nSlotId = GetSlotId();
500 :
501 34990 : if ( nSlotId > 0 )
502 : {
503 34990 : if ( rEvent.Requery )
504 0 : svt::ToolboxController::statusChanged( rEvent );
505 : else
506 : {
507 34990 : SfxItemState eState = SfxItemState::DISABLED;
508 34990 : SfxPoolItem* pItem = NULL;
509 34990 : if ( rEvent.IsEnabled )
510 : {
511 31707 : eState = SfxItemState::DEFAULT;
512 31707 : ::com::sun::star::uno::Type pType = rEvent.State.getValueType();
513 :
514 31707 : if ( pType == cppu::UnoType<void>::get() )
515 : {
516 7844 : pItem = new SfxVoidItem( nSlotId );
517 7844 : eState = SfxItemState::UNKNOWN;
518 : }
519 23863 : else if ( pType == cppu::UnoType<bool>::get() )
520 : {
521 9134 : bool bTemp = false;
522 9134 : rEvent.State >>= bTemp ;
523 9134 : pItem = new SfxBoolItem( nSlotId, bTemp );
524 : }
525 14729 : else if ( pType == ::cppu::UnoType< ::cppu::UnoUnsignedShortType >::get())
526 : {
527 0 : sal_uInt16 nTemp = 0;
528 0 : rEvent.State >>= nTemp ;
529 0 : pItem = new SfxUInt16Item( nSlotId, nTemp );
530 : }
531 14729 : else if ( pType == cppu::UnoType<sal_uInt32>::get() )
532 : {
533 0 : sal_uInt32 nTemp = 0;
534 0 : rEvent.State >>= nTemp ;
535 0 : pItem = new SfxUInt32Item( nSlotId, nTemp );
536 : }
537 14729 : else if ( pType == cppu::UnoType<OUString>::get() )
538 : {
539 1028 : OUString sTemp ;
540 1028 : rEvent.State >>= sTemp ;
541 1028 : pItem = new SfxStringItem( nSlotId, sTemp );
542 : }
543 13701 : else if ( pType == cppu::UnoType< ::com::sun::star::frame::status::ItemStatus>::get() )
544 : {
545 0 : ItemStatus aItemStatus;
546 0 : rEvent.State >>= aItemStatus;
547 0 : SfxItemState tmpState = (SfxItemState) aItemStatus.State;
548 : // make sure no-one tries to send us a combination of states
549 0 : if (tmpState != SfxItemState::UNKNOWN && tmpState != SfxItemState::DISABLED &&
550 0 : tmpState != SfxItemState::READONLY && tmpState != SfxItemState::DONTCARE &&
551 0 : tmpState != SfxItemState::DEFAULT && tmpState != SfxItemState::SET)
552 0 : throw ::com::sun::star::uno::RuntimeException("unknown status");
553 0 : eState = tmpState;
554 0 : pItem = new SfxVoidItem( nSlotId );
555 : }
556 13701 : else if ( pType == cppu::UnoType< ::com::sun::star::frame::status::Visibility>::get() )
557 : {
558 0 : Visibility aVisibilityStatus;
559 0 : rEvent.State >>= aVisibilityStatus;
560 0 : pItem = new SfxVisibilityItem( nSlotId, aVisibilityStatus.bVisible );
561 : }
562 : else
563 : {
564 13701 : if ( pSlot )
565 13701 : pItem = pSlot->GetType()->CreateItem();
566 13701 : if ( pItem )
567 : {
568 13701 : pItem->SetWhich( nSlotId );
569 13701 : pItem->PutValue( rEvent.State );
570 : }
571 : else
572 0 : pItem = new SfxVoidItem( nSlotId );
573 31707 : }
574 : }
575 :
576 34990 : StateChanged( nSlotId, eState, pItem );
577 34990 : delete pItem;
578 : }
579 34990 : }
580 34990 : }
581 :
582 : // XSubToolbarController
583 9758 : sal_Bool SAL_CALL SfxToolBoxControl::opensSubToolbar() throw (::com::sun::star::uno::RuntimeException, std::exception)
584 : {
585 9758 : return sal_False;
586 : }
587 :
588 0 : OUString SAL_CALL SfxToolBoxControl::getSubToolbarName() throw (::com::sun::star::uno::RuntimeException, std::exception)
589 : {
590 0 : return OUString();
591 : }
592 :
593 0 : void SAL_CALL SfxToolBoxControl::functionSelected( const OUString& /*aCommand*/ ) throw (::com::sun::star::uno::RuntimeException, std::exception)
594 : {
595 : // must be implemented by sub-class
596 0 : }
597 :
598 0 : void SAL_CALL SfxToolBoxControl::updateImage() throw (::com::sun::star::uno::RuntimeException, std::exception)
599 : {
600 : // must be implemented by sub-class
601 0 : }
602 :
603 : // XToolbarController
604 0 : void SAL_CALL SfxToolBoxControl::execute( sal_Int16 KeyModifier ) throw (::com::sun::star::uno::RuntimeException, std::exception)
605 : {
606 0 : SolarMutexGuard aGuard;
607 0 : Select( (sal_uInt16)KeyModifier );
608 0 : }
609 :
610 0 : void SAL_CALL SfxToolBoxControl::click() throw (::com::sun::star::uno::RuntimeException, std::exception)
611 : {
612 0 : SolarMutexGuard aGuard;
613 0 : Click();
614 0 : }
615 :
616 0 : void SAL_CALL SfxToolBoxControl::doubleClick() throw (::com::sun::star::uno::RuntimeException, std::exception)
617 : {
618 0 : SolarMutexGuard aGuard;
619 0 : DoubleClick();
620 0 : }
621 :
622 0 : Reference< ::com::sun::star::awt::XWindow > SAL_CALL SfxToolBoxControl::createPopupWindow() throw (::com::sun::star::uno::RuntimeException, std::exception)
623 : {
624 0 : SolarMutexGuard aGuard;
625 0 : VclPtr<vcl::Window> pWindow = CreatePopupWindow();
626 0 : if ( pWindow )
627 0 : return VCLUnoHelper::GetInterface( pWindow );
628 : else
629 0 : return Reference< ::com::sun::star::awt::XWindow >();
630 : }
631 :
632 14290 : Reference< ::com::sun::star::awt::XWindow > SAL_CALL SfxToolBoxControl::createItemWindow( const Reference< ::com::sun::star::awt::XWindow >& rParent ) throw (::com::sun::star::uno::RuntimeException, std::exception)
633 : {
634 14290 : SolarMutexGuard aGuard;
635 14290 : return VCLUnoHelper::GetInterface( CreateItemWindow( VCLUnoHelper::GetWindow( rParent )));
636 : }
637 :
638 : // XDockableWindowListener
639 0 : void SAL_CALL SfxToolBoxControl::startDocking( const ::com::sun::star::awt::DockingEvent& )
640 : throw (::com::sun::star::uno::RuntimeException, std::exception)
641 : {
642 0 : }
643 0 : ::com::sun::star::awt::DockingData SAL_CALL SfxToolBoxControl::docking( const ::com::sun::star::awt::DockingEvent& )
644 : throw (::com::sun::star::uno::RuntimeException, std::exception)
645 : {
646 0 : return ::com::sun::star::awt::DockingData();
647 : }
648 :
649 0 : void SAL_CALL SfxToolBoxControl::endDocking( const ::com::sun::star::awt::EndDockingEvent& )
650 : throw (::com::sun::star::uno::RuntimeException, std::exception)
651 : {
652 0 : }
653 :
654 0 : sal_Bool SAL_CALL SfxToolBoxControl::prepareToggleFloatingMode( const ::com::sun::star::lang::EventObject& )
655 : throw (::com::sun::star::uno::RuntimeException, std::exception)
656 : {
657 0 : return sal_False;
658 : }
659 :
660 0 : void SAL_CALL SfxToolBoxControl::toggleFloatingMode( const ::com::sun::star::lang::EventObject& )
661 : throw (::com::sun::star::uno::RuntimeException, std::exception)
662 : {
663 0 : }
664 :
665 0 : void SAL_CALL SfxToolBoxControl::closed( const ::com::sun::star::lang::EventObject& )
666 : throw (::com::sun::star::uno::RuntimeException, std::exception)
667 : {
668 0 : }
669 :
670 0 : void SAL_CALL SfxToolBoxControl::endPopupMode( const ::com::sun::star::awt::EndPopupModeEvent& aEvent )
671 : throw (::com::sun::star::uno::RuntimeException, std::exception)
672 : {
673 0 : SolarMutexGuard aGuard;
674 :
675 0 : OUString aSubToolBarResName;
676 0 : if ( pImpl->mxUIElement.is() )
677 : {
678 0 : Reference< XPropertySet > xPropSet( pImpl->mxUIElement, UNO_QUERY );
679 0 : if ( xPropSet.is() )
680 : {
681 : try
682 : {
683 0 : xPropSet->getPropertyValue("ResourceURL") >>= aSubToolBarResName;
684 : }
685 0 : catch ( com::sun::star::beans::UnknownPropertyException& )
686 : {
687 : }
688 0 : catch ( com::sun::star::lang::WrappedTargetException& )
689 : {
690 : }
691 : }
692 :
693 0 : Reference< XComponent > xComponent( pImpl->mxUIElement, UNO_QUERY );
694 0 : xComponent->dispose();
695 : }
696 0 : pImpl->mxUIElement = 0;
697 :
698 : // if the toolbar was teared-off recreate it and place it at the given position
699 0 : if( aEvent.bTearoff )
700 : {
701 0 : Reference< XUIElement > xUIElement;
702 0 : Reference< XLayoutManager > xLayoutManager = getLayoutManager();
703 :
704 0 : if ( !xLayoutManager.is() )
705 0 : return;
706 :
707 0 : xLayoutManager->createElement( aSubToolBarResName );
708 0 : xUIElement = xLayoutManager->getElement( aSubToolBarResName );
709 0 : if ( xUIElement.is() )
710 : {
711 0 : Reference< ::com::sun::star::awt::XWindow > xParent = getFrameInterface()->getContainerWindow();
712 :
713 0 : Reference< ::com::sun::star::awt::XWindow > xSubToolBar( xUIElement->getRealInterface(), UNO_QUERY );
714 0 : Reference< ::com::sun::star::beans::XPropertySet > xProp( xUIElement, UNO_QUERY );
715 0 : if ( xSubToolBar.is() && xProp.is() )
716 : {
717 0 : OUString aPersistentString( "Persistent" );
718 : try
719 : {
720 0 : vcl::Window* pTbxWindow = VCLUnoHelper::GetWindow( xSubToolBar );
721 0 : if ( pTbxWindow && pTbxWindow->GetType() == WINDOW_TOOLBOX )
722 : {
723 0 : Any a;
724 0 : a = xProp->getPropertyValue( aPersistentString );
725 0 : xProp->setPropertyValue( aPersistentString, makeAny( sal_False ));
726 :
727 0 : xLayoutManager->hideElement( aSubToolBarResName );
728 0 : xLayoutManager->floatWindow( aSubToolBarResName );
729 :
730 0 : xLayoutManager->setElementPos( aSubToolBarResName, aEvent.FloatingPosition );
731 0 : xLayoutManager->showElement( aSubToolBarResName );
732 :
733 0 : xProp->setPropertyValue("Persistent", a );
734 : }
735 : }
736 0 : catch ( ::com::sun::star::uno::RuntimeException& )
737 : {
738 0 : throw;
739 : }
740 0 : catch ( ::com::sun::star::uno::Exception& )
741 : {
742 0 : }
743 0 : }
744 0 : }
745 0 : }
746 : }
747 :
748 0 : ::Size SfxToolBoxControl::getPersistentFloatingSize( const Reference< XFrame >& /*xFrame*/, const OUString& /*rSubToolBarResName*/ )
749 : {
750 0 : ::Size aToolboxSize;
751 0 : return aToolboxSize;
752 : }
753 :
754 489 : bool SfxToolBoxControl::hasBigImages() const
755 : {
756 489 : return (GetToolBox().GetToolboxButtonSize() == TOOLBOX_BUTTONSIZE_LARGE);
757 : }
758 :
759 0 : void SfxToolBoxControl::createAndPositionSubToolBar( const OUString& rSubToolBarResName )
760 : {
761 0 : SolarMutexGuard aGuard;
762 :
763 0 : if ( pImpl->pBox )
764 : {
765 0 : static WeakReference< XUIElementFactoryManager > xWeakUIElementFactory;
766 :
767 0 : sal_uInt16 nItemId = pImpl->pBox->GetDownItemId();
768 :
769 0 : if ( !nItemId )
770 0 : return;
771 :
772 : // create element with factory
773 0 : Reference< XFrame > xFrame = getFrameInterface();
774 0 : Reference< XUIElement > xUIElement;
775 0 : Reference< XUIElementFactoryManager > xUIElementFactory;
776 :
777 0 : xUIElementFactory = xWeakUIElementFactory;
778 0 : if ( !xUIElementFactory.is() )
779 : {
780 0 : xUIElementFactory = theUIElementFactoryManager::get( m_xContext );
781 0 : xWeakUIElementFactory = xUIElementFactory;
782 : }
783 :
784 0 : Sequence< PropertyValue > aPropSeq( 3 );
785 0 : aPropSeq[0].Name = "Frame";
786 0 : aPropSeq[0].Value <<= xFrame;
787 0 : aPropSeq[1].Name = "Persistent";
788 0 : aPropSeq[1].Value <<= sal_False;
789 0 : aPropSeq[2].Name = "PopupMode";
790 0 : aPropSeq[2].Value <<= sal_True;
791 :
792 : try
793 : {
794 0 : xUIElement = xUIElementFactory->createUIElement( rSubToolBarResName, aPropSeq );
795 : }
796 0 : catch ( ::com::sun::star::container::NoSuchElementException& )
797 : {
798 : }
799 0 : catch ( IllegalArgumentException& )
800 : {
801 : }
802 :
803 0 : if ( xUIElement.is() )
804 : {
805 0 : Reference< ::com::sun::star::awt::XWindow > xParent = getFrameInterface()->getContainerWindow();
806 :
807 0 : Reference< ::com::sun::star::awt::XWindow > xSubToolBar( xUIElement->getRealInterface(), UNO_QUERY );
808 0 : if ( xSubToolBar.is() )
809 : {
810 0 : Reference< ::com::sun::star::awt::XDockableWindow > xDockWindow( xSubToolBar, UNO_QUERY );
811 0 : xDockWindow->addDockableWindowListener( Reference< ::com::sun::star::awt::XDockableWindowListener >(
812 0 : static_cast< OWeakObject * >( this ), UNO_QUERY ));
813 0 : xDockWindow->enableDocking( sal_True );
814 :
815 : // keep refererence to UIElement to avoid its destruction
816 0 : if ( pImpl->mxUIElement.is() )
817 : {
818 0 : Reference< XComponent > xComponent( pImpl->mxUIElement, UNO_QUERY );
819 0 : xComponent->dispose();
820 : }
821 0 : pImpl->mxUIElement = xUIElement;
822 :
823 0 : vcl::Window* pTbxWindow = VCLUnoHelper::GetWindow( xSubToolBar );
824 0 : ToolBox* pToolBar( 0 );
825 0 : if ( pTbxWindow && pTbxWindow->GetType() == WINDOW_TOOLBOX )
826 0 : pToolBar = static_cast<ToolBox *>(pTbxWindow);
827 :
828 0 : if ( pToolBar )
829 : {
830 0 : vcl::Window* pParentTbxWindow( pImpl->pBox );
831 0 : pToolBar->SetParent( pParentTbxWindow );
832 0 : ::Size aSize = getPersistentFloatingSize( xFrame, rSubToolBarResName );
833 0 : if ( aSize.Width() == 0 || aSize.Height() == 0 )
834 : {
835 : // calc and set size for popup mode
836 0 : aSize = pToolBar->CalcPopupWindowSizePixel();
837 : }
838 0 : pToolBar->SetSizePixel( aSize );
839 :
840 : // open subtoolbox in popup mode
841 0 : vcl::Window::GetDockingManager()->StartPopupMode( pImpl->pBox, pToolBar );
842 0 : }
843 0 : }
844 0 : }
845 0 : }
846 : }
847 :
848 :
849 :
850 0 : void SfxToolBoxControl::SetPopupWindow( SfxPopupWindow* pWindow )
851 : {
852 0 : pImpl->mpPopupWindow = pWindow;
853 0 : pImpl->mpPopupWindow->SetPopupModeEndHdl( LINK( this, SfxToolBoxControl, PopupModeEndHdl ));
854 0 : pImpl->mpPopupWindow->SetDeleteLink_Impl( LINK( this, SfxToolBoxControl, ClosePopupWindow ));
855 0 : }
856 :
857 :
858 :
859 0 : IMPL_LINK_NOARG(SfxToolBoxControl, PopupModeEndHdl)
860 : {
861 0 : if ( pImpl->mpPopupWindow->IsVisible() )
862 : {
863 : // Replace floating window with popup window and destroy
864 : // floating window instance.
865 0 : pImpl->mpFloatingWindow.disposeAndClear();
866 0 : pImpl->mpFloatingWindow = pImpl->mpPopupWindow;
867 0 : pImpl->mpPopupWindow.clear();
868 : // We also need to know when the user tries to use the
869 : // floating window.
870 0 : pImpl->mpFloatingWindow->AddEventListener( LINK( pImpl, SfxToolBoxControl_Impl, WindowEventListener ));
871 : }
872 : else
873 : {
874 : // Popup window has been closed by the user. No replacement, instance
875 : // will destroy itself.
876 0 : pImpl->mpPopupWindow.clear();
877 : }
878 :
879 0 : return 1;
880 : }
881 :
882 :
883 0 : IMPL_LINK( SfxToolBoxControl, ClosePopupWindow, SfxPopupWindow *, pWindow )
884 : {
885 0 : if ( pWindow == pImpl->mpFloatingWindow )
886 0 : pImpl->mpFloatingWindow = 0;
887 : else
888 0 : pImpl->mpPopupWindow = 0;
889 :
890 0 : return 1;
891 : }
892 :
893 :
894 :
895 13748 : void SfxToolBoxControl::StateChanged
896 : (
897 : sal_uInt16 nId,
898 : SfxItemState eState,
899 : const SfxPoolItem* pState
900 : )
901 : {
902 : DBG_ASSERT( pImpl->pBox != nullptr, "setting state to dangling ToolBox" );
903 :
904 13748 : if ( GetId() >= SID_OBJECTMENU0 && GetId() <= SID_OBJECTMENU_LAST )
905 13748 : return;
906 :
907 : // enabled/disabled-Flag correcting the lump sum
908 13748 : pImpl->pBox->EnableItem( GetId(), eState != SfxItemState::DISABLED );
909 :
910 13748 : ToolBoxItemBits nItemBits = pImpl->pBox->GetItemBits( GetId() );
911 13748 : nItemBits &= ~ToolBoxItemBits::CHECKABLE;
912 13748 : ::TriState eTri = TRISTATE_FALSE;
913 13748 : switch ( eState )
914 : {
915 : case SfxItemState::DEFAULT:
916 12163 : if ( pState )
917 : {
918 12163 : if ( pState->ISA(SfxBoolItem) )
919 : {
920 : // BoolItem for checking
921 8538 : if ( static_cast<const SfxBoolItem*>(pState)->GetValue() )
922 2235 : eTri = TRISTATE_TRUE;
923 8538 : nItemBits |= ToolBoxItemBits::CHECKABLE;
924 : }
925 4406 : else if ( pState->ISA(SfxEnumItemInterface) &&
926 781 : static_cast<const SfxEnumItemInterface *>(pState)->HasBoolValue())
927 : {
928 : // EnumItem is handled as Bool
929 0 : if ( static_cast<const SfxEnumItemInterface *>(pState)->GetBoolValue() )
930 0 : eTri = TRISTATE_TRUE;
931 0 : nItemBits |= ToolBoxItemBits::CHECKABLE;
932 : }
933 3625 : else if ( pImpl->bShowString && pState->ISA(SfxStringItem) )
934 0 : pImpl->pBox->SetItemText(nId, static_cast<const SfxStringItem*>(pState)->GetValue() );
935 : }
936 12163 : break;
937 :
938 : case SfxItemState::DONTCARE:
939 : {
940 0 : eTri = TRISTATE_INDET;
941 0 : nItemBits |= ToolBoxItemBits::CHECKABLE;
942 : }
943 0 : break;
944 :
945 1585 : default: break; // do nothing
946 : }
947 :
948 13748 : pImpl->pBox->SetItemState( GetId(), eTri );
949 13748 : pImpl->pBox->SetItemBits( GetId(), nItemBits );
950 : }
951 :
952 :
953 :
954 0 : void SfxToolBoxControl::Select( sal_uInt16 nSelectModifier )
955 : {
956 0 : svt::ToolboxController::execute( nSelectModifier );
957 0 : }
958 :
959 :
960 :
961 0 : void SfxToolBoxControl::DoubleClick()
962 : {
963 0 : }
964 :
965 :
966 :
967 0 : void SfxToolBoxControl::Click()
968 : {
969 0 : }
970 :
971 :
972 :
973 0 : SfxPopupWindowType SfxToolBoxControl::GetPopupWindowType() const
974 : {
975 0 : return SfxPopupWindowType::NONE;
976 : }
977 :
978 :
979 :
980 0 : VclPtr<SfxPopupWindow> SfxToolBoxControl::CreatePopupWindow()
981 : {
982 0 : return 0;
983 : }
984 :
985 12749 : VclPtr<vcl::Window> SfxToolBoxControl::CreateItemWindow( vcl::Window * )
986 : {
987 12749 : return VclPtr<vcl::Window>();
988 : }
989 :
990 0 : SfxFrameStatusListener::SfxFrameStatusListener(
991 : const Reference< XComponentContext >& rxContext,
992 : const Reference< XFrame >& xFrame,
993 : SfxStatusListenerInterface* pCallee ) :
994 : svt::FrameStatusListener( rxContext, xFrame ),
995 0 : m_pCallee( pCallee )
996 : {
997 0 : }
998 :
999 :
1000 :
1001 0 : SfxFrameStatusListener::~SfxFrameStatusListener()
1002 : {
1003 0 : }
1004 :
1005 :
1006 :
1007 : // XStatusListener
1008 0 : void SAL_CALL SfxFrameStatusListener::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& rEvent )
1009 : throw ( ::com::sun::star::uno::RuntimeException, std::exception )
1010 : {
1011 0 : SfxViewFrame* pViewFrame = NULL;
1012 0 : Reference < XController > xController;
1013 :
1014 0 : SolarMutexGuard aGuard;
1015 0 : if ( m_xFrame.is() )
1016 0 : xController = m_xFrame->getController();
1017 :
1018 0 : Reference < XDispatchProvider > xProvider( xController, UNO_QUERY );
1019 0 : if ( xProvider.is() )
1020 : {
1021 0 : Reference < XDispatch > xDisp = xProvider->queryDispatch( rEvent.FeatureURL, OUString(), 0 );
1022 0 : if ( xDisp.is() )
1023 : {
1024 0 : Reference< XUnoTunnel > xTunnel( xDisp, UNO_QUERY );
1025 0 : SfxOfficeDispatch* pDisp = NULL;
1026 0 : if ( xTunnel.is() )
1027 : {
1028 0 : sal_Int64 nImplementation = xTunnel->getSomething(SfxOfficeDispatch::impl_getStaticIdentifier());
1029 0 : pDisp = reinterpret_cast< SfxOfficeDispatch* >( sal::static_int_cast< sal_IntPtr >( nImplementation ));
1030 : }
1031 :
1032 0 : if ( pDisp )
1033 0 : pViewFrame = pDisp->GetDispatcher_Impl()->GetFrame();
1034 0 : }
1035 : }
1036 :
1037 0 : sal_uInt16 nSlotId = 0;
1038 0 : SfxSlotPool& rPool = SfxSlotPool::GetSlotPool( pViewFrame );
1039 0 : const SfxSlot* pSlot = rPool.GetUnoSlot( rEvent.FeatureURL.Path );
1040 0 : if ( pSlot )
1041 0 : nSlotId = pSlot->GetSlotId();
1042 :
1043 0 : if ( nSlotId > 0 )
1044 : {
1045 0 : if ( rEvent.Requery )
1046 : {
1047 : // requery for the notified state
1048 0 : addStatusListener( rEvent.FeatureURL.Complete );
1049 : }
1050 : else
1051 : {
1052 0 : SfxItemState eState = SfxItemState::DISABLED;
1053 0 : SfxPoolItem* pItem = NULL;
1054 0 : if ( rEvent.IsEnabled )
1055 : {
1056 0 : eState = SfxItemState::DEFAULT;
1057 0 : ::com::sun::star::uno::Type pType = rEvent.State.getValueType();
1058 :
1059 0 : if ( pType == cppu::UnoType<void>::get() )
1060 : {
1061 0 : pItem = new SfxVoidItem( nSlotId );
1062 0 : eState = SfxItemState::UNKNOWN;
1063 : }
1064 0 : else if ( pType == cppu::UnoType<bool>::get() )
1065 : {
1066 0 : bool bTemp = false;
1067 0 : rEvent.State >>= bTemp ;
1068 0 : pItem = new SfxBoolItem( nSlotId, bTemp );
1069 : }
1070 0 : else if ( pType == ::cppu::UnoType< ::cppu::UnoUnsignedShortType >::get())
1071 : {
1072 0 : sal_uInt16 nTemp = 0;
1073 0 : rEvent.State >>= nTemp ;
1074 0 : pItem = new SfxUInt16Item( nSlotId, nTemp );
1075 : }
1076 0 : else if ( pType == cppu::UnoType<sal_uInt32>::get() )
1077 : {
1078 0 : sal_uInt32 nTemp = 0;
1079 0 : rEvent.State >>= nTemp ;
1080 0 : pItem = new SfxUInt32Item( nSlotId, nTemp );
1081 : }
1082 0 : else if ( pType == cppu::UnoType<OUString>::get() )
1083 : {
1084 0 : OUString sTemp ;
1085 0 : rEvent.State >>= sTemp ;
1086 0 : pItem = new SfxStringItem( nSlotId, sTemp );
1087 : }
1088 0 : else if ( pType == cppu::UnoType< ::com::sun::star::frame::status::ItemStatus>::get() )
1089 : {
1090 0 : ItemStatus aItemStatus;
1091 0 : rEvent.State >>= aItemStatus;
1092 0 : SfxItemState tmpState = (SfxItemState) aItemStatus.State;
1093 : // make sure no-one tries to send us a combination of states
1094 0 : if (tmpState != SfxItemState::UNKNOWN && tmpState != SfxItemState::DISABLED &&
1095 0 : tmpState != SfxItemState::READONLY && tmpState != SfxItemState::DONTCARE &&
1096 0 : tmpState != SfxItemState::DEFAULT && tmpState != SfxItemState::SET)
1097 0 : throw ::com::sun::star::uno::RuntimeException("unknown status");
1098 0 : eState = tmpState;
1099 0 : pItem = new SfxVoidItem( nSlotId );
1100 : }
1101 0 : else if ( pType == cppu::UnoType< ::com::sun::star::frame::status::Visibility>::get() )
1102 : {
1103 0 : Visibility aVisibilityStatus;
1104 0 : rEvent.State >>= aVisibilityStatus;
1105 0 : pItem = new SfxVisibilityItem( nSlotId, aVisibilityStatus.bVisible );
1106 : }
1107 : else
1108 : {
1109 0 : if ( pSlot )
1110 0 : pItem = pSlot->GetType()->CreateItem();
1111 0 : if ( pItem )
1112 : {
1113 0 : pItem->SetWhich( nSlotId );
1114 0 : pItem->PutValue( rEvent.State );
1115 : }
1116 : else
1117 0 : pItem = new SfxVoidItem( nSlotId );
1118 0 : }
1119 : }
1120 :
1121 0 : if ( m_pCallee )
1122 0 : m_pCallee->StateChanged( nSlotId, eState, pItem );
1123 0 : delete pItem;
1124 : }
1125 0 : }
1126 0 : }
1127 :
1128 0 : SfxPopupWindow::SfxPopupWindow(
1129 : sal_uInt16 nId,
1130 : const Reference< XFrame >& rFrame,
1131 : WinBits nBits ) :
1132 : FloatingWindow( SfxGetpApp()->GetTopWindow(), nBits )
1133 : , m_bFloating( false )
1134 : , m_bCascading( false )
1135 : , m_nId( nId )
1136 : , m_xFrame( rFrame )
1137 0 : , m_pStatusListener( 0 )
1138 : {
1139 0 : vcl::Window* pWindow = GetTopMostParentSystemWindow( this );
1140 0 : if ( pWindow )
1141 0 : static_cast<SystemWindow *>(pWindow)->GetTaskPaneList()->AddWindow( this );
1142 0 : }
1143 :
1144 0 : SfxPopupWindow::SfxPopupWindow(sal_uInt16 nId, const OString& rID, const OUString& rUIXMLDescription,
1145 : const css::uno::Reference<css::frame::XFrame> &rFrame)
1146 : : FloatingWindow(SfxGetpApp()->GetTopWindow(), rID, rUIXMLDescription, rFrame)
1147 : , m_bFloating( false )
1148 : , m_bCascading( false )
1149 : , m_nId( nId )
1150 : , m_xFrame( rFrame )
1151 0 : , m_pStatusListener( 0 )
1152 : {
1153 0 : vcl::Window* pWindow = GetTopMostParentSystemWindow( this );
1154 0 : if ( pWindow )
1155 0 : static_cast<SystemWindow *>(pWindow)->GetTaskPaneList()->AddWindow( this );
1156 0 : }
1157 :
1158 0 : SfxPopupWindow::SfxPopupWindow(
1159 : sal_uInt16 nId,
1160 : const Reference< XFrame >& rFrame,
1161 : vcl::Window* pParentWindow,
1162 : WinBits nBits ) :
1163 : FloatingWindow( pParentWindow, nBits )
1164 : , m_bFloating( false )
1165 : , m_bCascading( false )
1166 : , m_nId( nId )
1167 : , m_xFrame( rFrame )
1168 0 : , m_pStatusListener( 0 )
1169 : {
1170 0 : vcl::Window* pWindow = GetTopMostParentSystemWindow( this );
1171 0 : if ( pWindow )
1172 0 : static_cast<SystemWindow *>(pWindow)->GetTaskPaneList()->AddWindow( this );
1173 0 : }
1174 :
1175 0 : SfxPopupWindow::SfxPopupWindow(
1176 : sal_uInt16 nId,
1177 : vcl::Window* pParentWindow,
1178 : const OString& rID, const OUString& rUIXMLDescription,
1179 : const Reference< XFrame >& rFrame ) :
1180 : FloatingWindow( pParentWindow, rID, rUIXMLDescription, rFrame)
1181 : , m_bFloating( false )
1182 : , m_bCascading( false )
1183 : , m_nId( nId )
1184 : , m_xFrame( rFrame )
1185 0 : , m_pStatusListener( 0 )
1186 : {
1187 0 : vcl::Window* pWindow = GetTopMostParentSystemWindow( this );
1188 0 : if ( pWindow )
1189 0 : static_cast<SystemWindow *>(pWindow)->GetTaskPaneList()->AddWindow( this );
1190 0 : }
1191 :
1192 0 : SfxPopupWindow::~SfxPopupWindow()
1193 : {
1194 0 : disposeOnce();
1195 0 : }
1196 :
1197 0 : void SfxPopupWindow::dispose()
1198 : {
1199 0 : if ( m_xStatusListener.is() )
1200 : {
1201 0 : m_xStatusListener->dispose();
1202 0 : m_xStatusListener.clear();
1203 : }
1204 :
1205 0 : vcl::Window* pWindow = GetTopMostParentSystemWindow( this );
1206 0 : if ( pWindow )
1207 0 : static_cast<SystemWindow *>(pWindow)->GetTaskPaneList()->RemoveWindow( this );
1208 0 : FloatingWindow::dispose();
1209 0 : }
1210 :
1211 :
1212 :
1213 0 : SfxFrameStatusListener* SfxPopupWindow::GetOrCreateStatusListener()
1214 : {
1215 0 : if ( !m_xStatusListener.is() )
1216 : {
1217 : m_pStatusListener = new SfxFrameStatusListener(
1218 : ::comphelper::getProcessComponentContext(),
1219 : m_xFrame,
1220 0 : this );
1221 0 : m_xStatusListener = Reference< XComponent >( static_cast< cppu::OWeakObject* >(
1222 0 : m_pStatusListener ), UNO_QUERY );
1223 : }
1224 :
1225 0 : return m_pStatusListener;
1226 : }
1227 :
1228 :
1229 :
1230 0 : void SfxPopupWindow::BindListener()
1231 : {
1232 0 : GetOrCreateStatusListener();
1233 0 : if ( m_xStatusListener.is() )
1234 0 : m_pStatusListener->bindListener();
1235 0 : }
1236 :
1237 :
1238 :
1239 0 : void SfxPopupWindow::UnbindListener()
1240 : {
1241 0 : GetOrCreateStatusListener();
1242 0 : if ( m_xStatusListener.is() )
1243 0 : m_pStatusListener->unbindListener();
1244 0 : }
1245 :
1246 :
1247 :
1248 0 : void SfxPopupWindow::AddStatusListener( const OUString& rCommandURL )
1249 : {
1250 0 : GetOrCreateStatusListener();
1251 0 : if ( m_xStatusListener.is() )
1252 0 : m_pStatusListener->addStatusListener( rCommandURL );
1253 0 : }
1254 :
1255 :
1256 :
1257 0 : bool SfxPopupWindow::Close()
1258 : {
1259 0 : m_bFloating = false;
1260 0 : FloatingWindow::Close();
1261 :
1262 0 : Delete();
1263 0 : return true;
1264 : }
1265 :
1266 :
1267 :
1268 0 : void SfxPopupWindow::PopupModeEnd()
1269 : {
1270 : //! to allow PopupModeEndHdl to be called
1271 0 : FloatingWindow::PopupModeEnd();
1272 :
1273 0 : if ( IsVisible() )
1274 : {
1275 : // was teared-off
1276 0 : DeleteFloatingWindow();
1277 0 : m_bFloating = true;
1278 : }
1279 : else
1280 0 : Close();
1281 0 : }
1282 :
1283 :
1284 :
1285 0 : void SfxPopupWindow::DeleteFloatingWindow()
1286 : {
1287 0 : if ( m_bFloating )
1288 : {
1289 0 : Hide();
1290 0 : Delete();
1291 : }
1292 0 : }
1293 :
1294 :
1295 :
1296 0 : void SfxPopupWindow::MouseMove( const ::MouseEvent& rMEvt )
1297 : {
1298 0 : if ( !m_bCascading )
1299 0 : FloatingWindow::MouseMove( rMEvt );
1300 : else
1301 : {
1302 : // Forward MouseMove-Event to Children
1303 0 : ::Point aPos = rMEvt.GetPosPixel();
1304 0 : ::Point aScrPos = OutputToScreenPixel( aPos );
1305 0 : sal_uInt16 i = 0;
1306 0 : vcl::Window* pWindow = GetChild( i );
1307 0 : while ( pWindow )
1308 : {
1309 : ::MouseEvent aMEvt( pWindow->ScreenToOutputPixel( aScrPos ),
1310 0 : rMEvt.GetClicks(), rMEvt.GetMode(),
1311 0 : rMEvt.GetButtons(), rMEvt.GetModifier() );
1312 0 : pWindow->MouseMove( rMEvt );
1313 0 : pWindow->Update();
1314 0 : i++;
1315 0 : pWindow = GetChild( i );
1316 : }
1317 : }
1318 0 : }
1319 :
1320 :
1321 :
1322 0 : void SfxPopupWindow::StartCascading()
1323 : {
1324 0 : m_bCascading = true;
1325 0 : }
1326 :
1327 :
1328 :
1329 0 : VclPtr<SfxPopupWindow> SfxPopupWindow::Clone() const
1330 :
1331 : /* [Description]
1332 :
1333 : This method must be overridden to show this Popup also in the
1334 : Presentation-mode. It is called when a Show() would be meaningless
1335 : since the parent is no presentation window.
1336 : When create a new window the bew Top-Window will be used automatically,
1337 : so that the Parent becomes the presentation window and that the new
1338 : Popup therefore becomes visible.
1339 : */
1340 :
1341 : {
1342 0 : return 0;
1343 : }
1344 :
1345 :
1346 :
1347 0 : void SfxPopupWindow::StateChanged(
1348 : sal_uInt16 /*nSID*/,
1349 : SfxItemState eState,
1350 : const SfxPoolItem* /*pState*/ )
1351 : /* [Description]
1352 :
1353 : See also <SfxControllerItem::StateChanged()>. In addition the Popup
1354 : will become hidden when eState==SfxItemState::DISABLED and in all other
1355 : cases it will be shown again if it is floating. In general this requires
1356 : to call the Base class.
1357 :
1358 : Due to the parent the presentation mode is handled in a special way.
1359 : */
1360 :
1361 : {
1362 0 : if ( SfxItemState::DISABLED == eState )
1363 : {
1364 0 : Hide();
1365 : }
1366 0 : else if ( m_bFloating )
1367 : {
1368 0 : Show( true, ShowFlags::NoFocusChange | ShowFlags::NoActivate );
1369 : }
1370 0 : }
1371 :
1372 :
1373 :
1374 0 : void SfxPopupWindow::Delete()
1375 : {
1376 0 : if ( m_aDeleteLink.IsSet() )
1377 0 : m_aDeleteLink.Call( this );
1378 0 : disposeOnce();
1379 0 : }
1380 :
1381 :
1382 :
1383 506 : SfxRecentFilesToolBoxControl::SfxRecentFilesToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rBox )
1384 506 : : SfxToolBoxControl( nSlotId, nId, rBox )
1385 : {
1386 506 : rBox.SetItemBits( nId, rBox.GetItemBits( nId ) | ToolBoxItemBits::DROPDOWN);
1387 506 : }
1388 :
1389 1012 : SfxRecentFilesToolBoxControl::~SfxRecentFilesToolBoxControl()
1390 : {
1391 1012 : }
1392 :
1393 0 : VclPtr<SfxPopupWindow> SfxRecentFilesToolBoxControl::CreatePopupWindow()
1394 : {
1395 0 : ToolBox& rBox = GetToolBox();
1396 0 : sal_uInt16 nItemId = GetId();
1397 0 : ::Rectangle aRect( rBox.GetItemRect( nItemId ) );
1398 :
1399 0 : Sequence< Any > aArgs( 2 );
1400 0 : PropertyValue aPropValue;
1401 :
1402 0 : aPropValue.Name = "CommandURL";
1403 0 : aPropValue.Value <<= OUString( ".uno:RecentFileList" );
1404 0 : aArgs[0] <<= aPropValue;
1405 :
1406 0 : aPropValue.Name = "Frame";
1407 0 : aPropValue.Value <<= m_xFrame;
1408 0 : aArgs[1] <<= aPropValue;
1409 :
1410 0 : uno::Reference< frame::XPopupMenuController > xPopupController( m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
1411 0 : "com.sun.star.comp.framework.RecentFilesMenuController", aArgs, m_xContext ), UNO_QUERY );
1412 :
1413 0 : uno::Reference< awt::XPopupMenu > xPopupMenu( m_xContext->getServiceManager()->createInstanceWithContext(
1414 0 : "com.sun.star.awt.PopupMenu", m_xContext ), uno::UNO_QUERY );
1415 :
1416 0 : if ( xPopupController.is() && xPopupMenu.is() )
1417 : {
1418 0 : xPopupController->setPopupMenu( xPopupMenu );
1419 :
1420 0 : rBox.SetItemDown( nItemId, true );
1421 0 : Reference< awt::XWindowPeer > xPeer( getParent(), uno::UNO_QUERY );
1422 :
1423 0 : if ( xPeer.is() )
1424 0 : xPopupMenu->execute( xPeer, VCLUnoHelper::ConvertToAWTRect( aRect ), 0 );
1425 :
1426 0 : rBox.SetItemDown( nItemId, false );
1427 : }
1428 :
1429 0 : return 0;
1430 648 : }
1431 :
1432 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|