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