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 : #include <toolkit/awt/vclxmenu.hxx>
21 : #include <toolkit/helper/convert.hxx>
22 : #include <toolkit/helper/macros.hxx>
23 : #include <toolkit/helper/servicenames.hxx>
24 : #include <toolkit/helper/vclunohelper.hxx>
25 :
26 : #include <com/sun/star/uno/XComponentContext.hpp>
27 : #include <cppuhelper/supportsservice.hxx>
28 : #include <cppuhelper/queryinterface.hxx>
29 : #include <cppuhelper/typeprovider.hxx>
30 : #include <rtl/uuid.h>
31 : #include <osl/mutex.hxx>
32 :
33 : #include <vcl/menu.hxx>
34 : #include <vcl/keycod.hxx>
35 : #include <vcl/image.hxx>
36 : #include <vcl/mnemonic.hxx>
37 : #include <vcl/svapp.hxx>
38 :
39 : #include <com/sun/star/awt/KeyModifier.hpp>
40 :
41 5988 : VCLXMenu::VCLXMenu()
42 5988 : : maMenuListeners( *this )
43 : {
44 5988 : mpMenu = NULL;
45 5988 : }
46 :
47 3197 : VCLXMenu::VCLXMenu( Menu* pMenu )
48 3197 : : maMenuListeners( *this )
49 : {
50 3197 : mpMenu = pMenu;
51 3197 : }
52 :
53 18358 : VCLXMenu::~VCLXMenu()
54 : {
55 18358 : for ( size_t n = maPopupMenuRefs.size(); n; ) {
56 0 : delete maPopupMenuRefs[ --n ];
57 : }
58 9179 : if ( mpMenu )
59 : {
60 9179 : mpMenu->RemoveEventListener( LINK( this, VCLXMenu, MenuEventListener ) );
61 9179 : delete mpMenu;
62 : }
63 9179 : }
64 :
65 17195 : bool VCLXMenu::IsPopupMenu() const
66 : {
67 17195 : return (mpMenu && ! mpMenu->IsMenuBar());
68 : }
69 :
70 5988 : void VCLXMenu::ImplCreateMenu( bool bPopup )
71 : {
72 : DBG_ASSERT( !mpMenu, "CreateMenu: Menu exists!" );
73 :
74 5988 : if ( bPopup )
75 5987 : mpMenu = new PopupMenu;
76 : else
77 1 : mpMenu = new MenuBar;
78 :
79 5988 : mpMenu->AddEventListener( LINK( this, VCLXMenu, MenuEventListener ) );
80 5988 : }
81 :
82 18240 : IMPL_LINK( VCLXMenu, MenuEventListener, VclSimpleEvent*, pEvent )
83 : {
84 : DBG_ASSERT( pEvent && pEvent->ISA( VclMenuEvent ), "Unknown Event!" );
85 9120 : if ( pEvent && pEvent->ISA( VclMenuEvent ) )
86 : {
87 : DBG_ASSERT( static_cast<VclMenuEvent*>(pEvent)->GetMenu() && mpMenu, "Menu???" );
88 :
89 9120 : VclMenuEvent* pMenuEvent = static_cast<VclMenuEvent*>(pEvent);
90 9120 : if ( pMenuEvent->GetMenu() == mpMenu ) // Also called for the root menu
91 : {
92 9120 : switch ( pMenuEvent->GetId() )
93 : {
94 : case VCLEVENT_MENU_SELECT:
95 : {
96 0 : if ( maMenuListeners.getLength() )
97 : {
98 0 : css::awt::MenuEvent aEvent;
99 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
100 0 : aEvent.MenuId = mpMenu->GetCurItemId();
101 0 : maMenuListeners.itemSelected( aEvent );
102 : }
103 : }
104 0 : break;
105 : case VCLEVENT_OBJECT_DYING:
106 : {
107 0 : mpMenu = NULL;
108 : }
109 0 : break;
110 : case VCLEVENT_MENU_HIGHLIGHT:
111 : {
112 0 : if ( maMenuListeners.getLength() )
113 : {
114 0 : css::awt::MenuEvent aEvent;
115 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
116 0 : aEvent.MenuId = mpMenu->GetCurItemId();
117 0 : maMenuListeners.itemHighlighted( aEvent );
118 : }
119 : }
120 0 : break;
121 : case VCLEVENT_MENU_ACTIVATE:
122 : {
123 0 : if ( maMenuListeners.getLength() )
124 : {
125 0 : css::awt::MenuEvent aEvent;
126 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
127 0 : aEvent.MenuId = mpMenu->GetCurItemId();
128 0 : maMenuListeners.itemActivated( aEvent );
129 : }
130 : }
131 0 : break;
132 : case VCLEVENT_MENU_DEACTIVATE:
133 : {
134 0 : if ( maMenuListeners.getLength() )
135 : {
136 0 : css::awt::MenuEvent aEvent;
137 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
138 0 : aEvent.MenuId = mpMenu->GetCurItemId();
139 0 : maMenuListeners.itemDeactivated( aEvent );
140 : }
141 : }
142 0 : break;
143 :
144 : // ignore accessibility events
145 : case VCLEVENT_MENU_ENABLE:
146 : case VCLEVENT_MENU_INSERTITEM:
147 : case VCLEVENT_MENU_REMOVEITEM:
148 : case VCLEVENT_MENU_SUBMENUACTIVATE:
149 : case VCLEVENT_MENU_SUBMENUDEACTIVATE:
150 : case VCLEVENT_MENU_SUBMENUCHANGED:
151 : case VCLEVENT_MENU_DEHIGHLIGHT:
152 : case VCLEVENT_MENU_DISABLE:
153 : case VCLEVENT_MENU_ITEMTEXTCHANGED:
154 : case VCLEVENT_MENU_ITEMCHECKED:
155 : case VCLEVENT_MENU_ITEMUNCHECKED:
156 : case VCLEVENT_MENU_SHOW:
157 : case VCLEVENT_MENU_HIDE:
158 9120 : break;
159 :
160 : default: OSL_FAIL( "MenuEventListener - Unknown event!" );
161 : }
162 : }
163 : }
164 9120 : return 0;
165 : }
166 :
167 :
168 2 : OUString SAL_CALL VCLXMenu::getImplementationName( )
169 : throw (css::uno::RuntimeException, std::exception)
170 : {
171 2 : ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
172 2 : const bool bIsPopupMenu = IsPopupMenu();
173 2 : aGuard.clear();
174 :
175 2 : OUString implName( "stardiv.Toolkit." );
176 2 : if ( bIsPopupMenu )
177 1 : implName += "VCLXPopupMenu";
178 : else
179 1 : implName += "VCLXMenuBar";
180 :
181 2 : return implName;
182 : }
183 :
184 2 : css::uno::Sequence< OUString > SAL_CALL VCLXMenu::getSupportedServiceNames( )
185 : throw (css::uno::RuntimeException, std::exception)
186 : {
187 2 : ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
188 2 : const bool bIsPopupMenu = IsPopupMenu();
189 2 : aGuard.clear();
190 :
191 2 : if ( bIsPopupMenu )
192 : return css::uno::Sequence<OUString>{
193 : OUString::createFromAscii(szServiceName2_PopupMenu),
194 1 : "stardiv.vcl.PopupMenu"};
195 : else
196 : return css::uno::Sequence<OUString>{
197 : OUString::createFromAscii(szServiceName2_MenuBar),
198 1 : "stardiv.vcl.MenuBar"};
199 : }
200 :
201 0 : sal_Bool SAL_CALL VCLXMenu::supportsService(const OUString& rServiceName )
202 : throw (css::uno::RuntimeException, std::exception)
203 : {
204 0 : return cppu::supportsService(this, rServiceName);
205 : }
206 :
207 16208 : css::uno::Any VCLXMenu::queryInterface(
208 : const css::uno::Type & rType )
209 : throw(css::uno::RuntimeException, std::exception)
210 : {
211 16208 : ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
212 16208 : const bool bIsPopupMenu = IsPopupMenu();
213 16208 : aGuard.clear();
214 :
215 32416 : css::uno::Any aRet;
216 :
217 16208 : if ( bIsPopupMenu )
218 13242 : aRet = ::cppu::queryInterface( rType,
219 : (static_cast< css::awt::XMenu* >(static_cast<css::awt::XMenuBar*>(this)) ),
220 : (static_cast< css::awt::XPopupMenu* >(this)),
221 : (static_cast< css::lang::XTypeProvider* >(this)),
222 : (static_cast< css::lang::XServiceInfo* >(this)),
223 6621 : (static_cast< css::lang::XUnoTunnel* >(this)) );
224 : else
225 19174 : aRet = ::cppu::queryInterface( rType,
226 : (static_cast< css::awt::XMenu* >(static_cast<css::awt::XMenuBar*>(this)) ),
227 : (static_cast< css::awt::XMenuBar* >(this)),
228 : (static_cast< css::lang::XTypeProvider* >(this)),
229 : (static_cast< css::lang::XServiceInfo* >(this)),
230 9587 : (static_cast< css::lang::XUnoTunnel* >(this)) );
231 :
232 32416 : return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ));
233 : }
234 :
235 :
236 31444 : IMPL_XUNOTUNNEL( VCLXMenu )
237 :
238 0 : css::uno::Sequence< css::uno::Type > VCLXMenu::getTypes()
239 : throw(css::uno::RuntimeException, std::exception)
240 : {
241 0 : ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
242 0 : const bool bIsPopupMenu = IsPopupMenu();
243 0 : aGuard.clear();
244 :
245 : static ::cppu::OTypeCollection* pCollectionMenuBar = NULL;
246 : static ::cppu::OTypeCollection* pCollectionPopupMenu = NULL;
247 :
248 0 : if ( bIsPopupMenu )
249 : {
250 0 : if( !pCollectionPopupMenu )
251 : {
252 0 : ::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() );
253 0 : if( !pCollectionPopupMenu )
254 : {
255 : static ::cppu::OTypeCollection collectionPopupMenu(
256 0 : cppu::UnoType<css::lang::XTypeProvider>::get(),
257 0 : cppu::UnoType<css::awt::XMenu>::get(),
258 0 : cppu::UnoType<css::awt::XPopupMenu>::get(),
259 0 : cppu::UnoType<css::lang::XServiceInfo>::get());
260 0 : pCollectionPopupMenu = &collectionPopupMenu;
261 0 : }
262 : }
263 :
264 0 : return (*pCollectionPopupMenu).getTypes();
265 : }
266 : else
267 : {
268 0 : if( !pCollectionMenuBar )
269 : {
270 0 : ::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() );
271 0 : if( !pCollectionMenuBar )
272 : {
273 : static ::cppu::OTypeCollection collectionMenuBar(
274 0 : cppu::UnoType<css::lang::XTypeProvider>::get(),
275 0 : cppu::UnoType<css::awt::XMenu>::get(),
276 0 : cppu::UnoType<css::awt::XMenuBar>::get(),
277 0 : cppu::UnoType<css::lang::XServiceInfo>::get());
278 0 : pCollectionMenuBar = &collectionMenuBar;
279 0 : }
280 : }
281 0 : return (*pCollectionMenuBar).getTypes();
282 0 : }
283 : }
284 :
285 :
286 0 : css::uno::Sequence< sal_Int8 > VCLXMenu::getImplementationId()
287 : throw(css::uno::RuntimeException, std::exception)
288 : {
289 0 : return css::uno::Sequence<sal_Int8>();
290 : }
291 :
292 609 : void VCLXMenu::addMenuListener(
293 : const css::uno::Reference< css::awt::XMenuListener >& rxListener )
294 : throw(css::uno::RuntimeException, std::exception)
295 : {
296 609 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
297 :
298 609 : maMenuListeners.addInterface( rxListener );
299 609 : }
300 :
301 3 : void VCLXMenu::removeMenuListener(
302 : const css::uno::Reference< css::awt::XMenuListener >& rxListener )
303 : throw(css::uno::RuntimeException, std::exception)
304 : {
305 3 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
306 :
307 3 : maMenuListeners.removeInterface( rxListener );
308 3 : }
309 :
310 27 : void VCLXMenu::insertItem(
311 : sal_Int16 nItemId,
312 : const OUString& aText,
313 : sal_Int16 nItemStyle,
314 : sal_Int16 nPos )
315 : throw(css::uno::RuntimeException, std::exception)
316 : {
317 27 : SolarMutexGuard aSolarGuard;
318 54 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
319 :
320 27 : if ( mpMenu )
321 54 : mpMenu->InsertItem(nItemId, aText, (MenuItemBits)nItemStyle, OString(), nPos);
322 27 : }
323 :
324 0 : void VCLXMenu::removeItem(
325 : sal_Int16 nPos,
326 : sal_Int16 nCount )
327 : throw(css::uno::RuntimeException, std::exception)
328 : {
329 0 : SolarMutexGuard aSolarGuard;
330 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
331 :
332 0 : if (!mpMenu)
333 0 : return;
334 :
335 0 : sal_Int32 nItemCount = (sal_Int32)mpMenu->GetItemCount();
336 0 : if ( ( nCount > 0 ) && ( nPos >= 0 ) && ( nPos < nItemCount ) && ( nItemCount > 0 ))
337 : {
338 : sal_Int16 nP = sal::static_int_cast< sal_Int16 >(
339 0 : std::min( (int)(nPos+nCount), (int)nItemCount ));
340 0 : while( nP-nPos > 0 )
341 0 : mpMenu->RemoveItem( --nP );
342 0 : }
343 : }
344 :
345 1636 : sal_Int16 VCLXMenu::getItemCount( )
346 : throw(css::uno::RuntimeException, std::exception)
347 : {
348 1636 : SolarMutexGuard aSolarGuard;
349 3272 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
350 :
351 3272 : return mpMenu ? mpMenu->GetItemCount() : 0;
352 : }
353 :
354 1731 : sal_Int16 VCLXMenu::getItemId(
355 : sal_Int16 nPos )
356 : throw(css::uno::RuntimeException, std::exception)
357 : {
358 1731 : SolarMutexGuard aSolarGuard;
359 3462 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
360 :
361 3462 : return mpMenu ? mpMenu->GetItemId( nPos ) : 0;
362 : }
363 :
364 0 : sal_Int16 VCLXMenu::getItemPos(
365 : sal_Int16 nId )
366 : throw(css::uno::RuntimeException, std::exception)
367 : {
368 0 : SolarMutexGuard aSolarGuard;
369 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
370 :
371 0 : return mpMenu ? mpMenu->GetItemPos( nId ) : 0;
372 : }
373 :
374 0 : void VCLXMenu::enableItem(
375 : sal_Int16 nItemId,
376 : sal_Bool bEnable )
377 : throw(css::uno::RuntimeException, std::exception)
378 : {
379 0 : SolarMutexGuard aSolarGuard;
380 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
381 :
382 0 : if ( mpMenu )
383 0 : mpMenu->EnableItem( nItemId, bEnable );
384 0 : }
385 :
386 0 : sal_Bool VCLXMenu::isItemEnabled(
387 : sal_Int16 nItemId )
388 : throw(css::uno::RuntimeException, std::exception)
389 : {
390 0 : SolarMutexGuard aSolarGuard;
391 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
392 :
393 0 : return mpMenu ? mpMenu->IsItemEnabled( nItemId ) : sal_False;
394 : }
395 :
396 0 : void VCLXMenu::setItemText(
397 : sal_Int16 nItemId,
398 : const OUString& aText )
399 : throw(css::uno::RuntimeException, std::exception)
400 : {
401 0 : SolarMutexGuard aSolarGuard;
402 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
403 :
404 0 : if ( mpMenu )
405 0 : mpMenu->SetItemText( nItemId, aText );
406 0 : }
407 :
408 0 : OUString VCLXMenu::getItemText(
409 : sal_Int16 nItemId )
410 : throw(css::uno::RuntimeException, std::exception)
411 : {
412 0 : SolarMutexGuard aSolarGuard;
413 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
414 :
415 0 : OUString aItemText;
416 0 : if ( mpMenu )
417 0 : aItemText = mpMenu->GetItemText( nItemId );
418 0 : return aItemText;
419 : }
420 :
421 0 : void VCLXMenu::setPopupMenu(
422 : sal_Int16 nItemId,
423 : const css::uno::Reference< css::awt::XPopupMenu >& rxPopupMenu )
424 : throw(css::uno::RuntimeException, std::exception)
425 : {
426 0 : SolarMutexGuard aSolarGuard;
427 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
428 :
429 0 : VCLXMenu* pVCLMenu = VCLXMenu::GetImplementation( rxPopupMenu );
430 : DBG_ASSERT( pVCLMenu && pVCLMenu->GetMenu() && pVCLMenu->IsPopupMenu(), "setPopupMenu: Invalid Menu!" );
431 :
432 0 : if ( mpMenu && pVCLMenu && pVCLMenu->GetMenu() && pVCLMenu->IsPopupMenu() )
433 : {
434 : // Selbst eine Ref halten!
435 0 : css::uno::Reference< css::awt::XPopupMenu > * pNewRef = new css::uno::Reference< css::awt::XPopupMenu > ;
436 0 : *pNewRef = rxPopupMenu;
437 0 : maPopupMenuRefs.push_back( pNewRef );
438 :
439 0 : mpMenu->SetPopupMenu( nItemId, static_cast<PopupMenu*>( pVCLMenu->GetMenu() ) );
440 0 : }
441 0 : }
442 :
443 0 : css::uno::Reference< css::awt::XPopupMenu > VCLXMenu::getPopupMenu(
444 : sal_Int16 nItemId )
445 : throw(css::uno::RuntimeException, std::exception)
446 : {
447 0 : SolarMutexGuard aSolarGuard;
448 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
449 :
450 0 : css::uno::Reference< css::awt::XPopupMenu > aRef;
451 0 : Menu* pMenu = mpMenu ? mpMenu->GetPopupMenu( nItemId ) : NULL;
452 0 : if ( pMenu )
453 : {
454 0 : for ( size_t n = maPopupMenuRefs.size(); n; )
455 : {
456 0 : css::uno::Reference< css::awt::XPopupMenu > * pRef = maPopupMenuRefs[ --n ];
457 0 : Menu* pM = static_cast<VCLXMenu*>(pRef->get())->GetMenu();
458 0 : if ( pM == pMenu )
459 : {
460 0 : aRef = *pRef;
461 0 : break;
462 : }
463 : }
464 : // it seems the popup menu is not insert into maPopupMenuRefs
465 : // if the popup men is not created by stardiv.Toolkit.VCLXPopupMenu
466 0 : if( !aRef.is() )
467 : {
468 0 : aRef = new VCLXPopupMenu( static_cast<PopupMenu*>(pMenu) );
469 : }
470 : }
471 0 : return aRef;
472 : }
473 :
474 : // css::awt::XPopupMenu
475 1 : void VCLXMenu::insertSeparator(
476 : sal_Int16 nPos )
477 : throw(css::uno::RuntimeException, std::exception)
478 : {
479 1 : SolarMutexGuard aSolarGuard;
480 2 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
481 :
482 1 : if ( mpMenu )
483 2 : mpMenu->InsertSeparator(OString(), nPos);
484 1 : }
485 :
486 0 : void VCLXMenu::setDefaultItem(
487 : sal_Int16 nItemId )
488 : throw(css::uno::RuntimeException, std::exception)
489 : {
490 0 : SolarMutexGuard aSolarGuard;
491 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
492 :
493 0 : if ( mpMenu )
494 0 : mpMenu->SetDefaultItem( nItemId );
495 0 : }
496 :
497 0 : sal_Int16 VCLXMenu::getDefaultItem( )
498 : throw(css::uno::RuntimeException, std::exception)
499 : {
500 0 : SolarMutexGuard aSolarGuard;
501 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
502 :
503 0 : return mpMenu ? mpMenu->GetDefaultItem() : 0;
504 : }
505 :
506 2 : void VCLXMenu::checkItem(
507 : sal_Int16 nItemId,
508 : sal_Bool bCheck )
509 : throw(css::uno::RuntimeException, std::exception)
510 : {
511 2 : SolarMutexGuard aSolarGuard;
512 4 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
513 :
514 2 : if ( mpMenu )
515 4 : mpMenu->CheckItem( nItemId, bCheck );
516 2 : }
517 :
518 0 : sal_Bool VCLXMenu::isItemChecked(
519 : sal_Int16 nItemId )
520 : throw(css::uno::RuntimeException, std::exception)
521 : {
522 0 : SolarMutexGuard aSolarGuard;
523 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
524 :
525 0 : return mpMenu ? mpMenu->IsItemChecked( nItemId ) : sal_False;
526 : }
527 :
528 0 : sal_Int16 VCLXMenu::execute(
529 : const css::uno::Reference< css::awt::XWindowPeer >& rxWindowPeer,
530 : const css::awt::Rectangle& rPos,
531 : sal_Int16 nFlags )
532 : throw(css::uno::RuntimeException, std::exception)
533 : {
534 0 : SolarMutexGuard aSolarGuard;
535 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
536 :
537 0 : sal_Int16 nRet = 0;
538 0 : if ( mpMenu && IsPopupMenu() )
539 : {
540 : nRet = static_cast<PopupMenu*>(mpMenu)->Execute( VCLUnoHelper::GetWindow( rxWindowPeer ),
541 : VCLRectangle( rPos ),
542 0 : static_cast<PopupMenuFlags>(nFlags) | PopupMenuFlags::NoMouseUpClose );
543 : }
544 0 : return nRet;
545 : }
546 :
547 :
548 27 : void SAL_CALL VCLXMenu::setCommand(
549 : sal_Int16 nItemId,
550 : const OUString& aCommand )
551 : throw (css::uno::RuntimeException, std::exception)
552 : {
553 27 : SolarMutexGuard aSolarGuard;
554 54 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
555 :
556 27 : if ( mpMenu )
557 54 : mpMenu->SetItemCommand( nItemId, aCommand );
558 27 : }
559 :
560 1731 : OUString SAL_CALL VCLXMenu::getCommand(
561 : sal_Int16 nItemId )
562 : throw (css::uno::RuntimeException, std::exception)
563 : {
564 1731 : SolarMutexGuard aSolarGuard;
565 3462 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
566 :
567 1731 : OUString aItemCommand;
568 1731 : if ( mpMenu )
569 1731 : aItemCommand = mpMenu->GetItemCommand( nItemId );
570 3462 : return aItemCommand;
571 : }
572 :
573 0 : void SAL_CALL VCLXMenu::setHelpCommand(
574 : sal_Int16 nItemId,
575 : const OUString& aHelp )
576 : throw (css::uno::RuntimeException, std::exception)
577 : {
578 0 : SolarMutexGuard aSolarGuard;
579 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
580 :
581 0 : if ( mpMenu )
582 0 : mpMenu->SetHelpCommand( nItemId, aHelp );
583 0 : }
584 :
585 0 : OUString SAL_CALL VCLXMenu::getHelpCommand(
586 : sal_Int16 nItemId )
587 : throw (css::uno::RuntimeException, std::exception)
588 : {
589 0 : SolarMutexGuard aSolarGuard;
590 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
591 :
592 0 : OUString aHelpCommand;
593 0 : if ( mpMenu )
594 0 : aHelpCommand = mpMenu->GetHelpCommand( nItemId );
595 0 : return aHelpCommand;
596 : }
597 :
598 :
599 : namespace
600 : {
601 0 : static Image lcl_XGraphic2VCLImage(
602 : const css::uno::Reference< css::graphic::XGraphic >& xGraphic,
603 : bool bResize )
604 : {
605 0 : Image aImage;
606 0 : if ( !xGraphic.is() )
607 0 : return aImage;
608 :
609 0 : aImage = Image( xGraphic );
610 0 : const ::Size aCurSize = aImage.GetSizePixel();
611 0 : const sal_Int32 nCurWidth = aCurSize.Width();
612 0 : const sal_Int32 nCurHeight = aCurSize.Height();
613 0 : const sal_Int32 nIdeal( 16 );
614 :
615 0 : if ( nCurWidth > 0 && nCurHeight > 0 )
616 : {
617 0 : if ( bResize && ( nCurWidth > nIdeal || nCurHeight > nIdeal ) )
618 : {
619 0 : sal_Int32 nIdealWidth = nCurWidth > nIdeal ? nIdeal : nCurWidth;
620 0 : sal_Int32 nIdealHeight = nCurHeight > nIdeal ? nIdeal : nCurHeight;
621 :
622 0 : ::Size aNewSize( nIdealWidth, nIdealHeight );
623 :
624 0 : bool bModified( false );
625 0 : BitmapEx aBitmapEx = aImage.GetBitmapEx();
626 0 : bModified = aBitmapEx.Scale( aNewSize, BmpScaleFlag::BestQuality );
627 :
628 0 : if ( bModified )
629 0 : aImage = Image( aBitmapEx );
630 : }
631 : }
632 0 : return aImage;
633 : }
634 :
635 : /** Copied from svtools/inc/acceleratorexecute.hxx */
636 0 : static css::awt::KeyEvent lcl_VCLKey2AWTKey(
637 : const vcl::KeyCode& aVCLKey)
638 : {
639 0 : css::awt::KeyEvent aAWTKey;
640 0 : aAWTKey.Modifiers = 0;
641 0 : aAWTKey.KeyCode = (sal_Int16)aVCLKey.GetCode();
642 :
643 0 : if (aVCLKey.IsShift())
644 0 : aAWTKey.Modifiers |= css::awt::KeyModifier::SHIFT;
645 0 : if (aVCLKey.IsMod1())
646 0 : aAWTKey.Modifiers |= css::awt::KeyModifier::MOD1;
647 0 : if (aVCLKey.IsMod2())
648 0 : aAWTKey.Modifiers |= css::awt::KeyModifier::MOD2;
649 0 : if (aVCLKey.IsMod3())
650 0 : aAWTKey.Modifiers |= css::awt::KeyModifier::MOD3;
651 :
652 0 : return aAWTKey;
653 : }
654 :
655 0 : vcl::KeyCode lcl_AWTKey2VCLKey(const css::awt::KeyEvent& aAWTKey)
656 : {
657 0 : bool bShift = ((aAWTKey.Modifiers & css::awt::KeyModifier::SHIFT) == css::awt::KeyModifier::SHIFT );
658 0 : bool bMod1 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD1 ) == css::awt::KeyModifier::MOD1 );
659 0 : bool bMod2 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD2 ) == css::awt::KeyModifier::MOD2 );
660 0 : bool bMod3 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD3 ) == css::awt::KeyModifier::MOD3 );
661 0 : sal_uInt16 nKey = (sal_uInt16)aAWTKey.KeyCode;
662 :
663 0 : return vcl::KeyCode(nKey, bShift, bMod1, bMod2, bMod3);
664 : }
665 :
666 : }
667 :
668 :
669 0 : sal_Bool SAL_CALL VCLXMenu::isPopupMenu( )
670 : throw (css::uno::RuntimeException, std::exception)
671 : {
672 0 : SolarMutexGuard aSolarGuard;
673 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
674 0 : return IsPopupMenu();
675 : }
676 :
677 0 : void SAL_CALL VCLXMenu::clear( )
678 : throw (css::uno::RuntimeException, std::exception)
679 : {
680 0 : SolarMutexGuard aSolarGuard;
681 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
682 0 : if ( mpMenu )
683 0 : mpMenu->Clear();
684 0 : }
685 :
686 :
687 0 : css::awt::MenuItemType SAL_CALL VCLXMenu::getItemType(
688 : ::sal_Int16 nItemPos )
689 : throw (css::uno::RuntimeException, std::exception)
690 : {
691 0 : SolarMutexGuard aSolarGuard;
692 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
693 :
694 : css::awt::MenuItemType aMenuItemType =
695 0 : css::awt::MenuItemType_DONTKNOW;
696 0 : if ( mpMenu )
697 : {
698 0 : aMenuItemType = ( (css::awt::MenuItemType) mpMenu->GetItemType( nItemPos ) );
699 : }
700 :
701 0 : return aMenuItemType;
702 : }
703 :
704 0 : void SAL_CALL VCLXMenu::hideDisabledEntries(
705 : sal_Bool bHide )
706 : throw (css::uno::RuntimeException, std::exception)
707 : {
708 0 : SolarMutexGuard aSolarGuard;
709 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
710 0 : if ( mpMenu )
711 : {
712 0 : if ( bHide )
713 0 : mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() | MenuFlags::HideDisabledEntries );
714 : else
715 0 : mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() & ~MenuFlags::HideDisabledEntries );
716 0 : }
717 0 : }
718 :
719 :
720 0 : sal_Bool SAL_CALL VCLXMenu::isInExecute( )
721 : throw (css::uno::RuntimeException, std::exception)
722 : {
723 0 : SolarMutexGuard aSolarGuard;
724 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
725 :
726 0 : if ( mpMenu && IsPopupMenu() )
727 0 : return PopupMenu::IsInExecute();
728 : else
729 0 : return sal_False;
730 : }
731 :
732 :
733 0 : void SAL_CALL VCLXMenu::endExecute()
734 : throw (css::uno::RuntimeException, std::exception)
735 : {
736 0 : SolarMutexGuard aSolarGuard;
737 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
738 :
739 0 : if ( mpMenu && IsPopupMenu() )
740 0 : static_cast<PopupMenu*>( mpMenu )->EndExecute();
741 0 : }
742 :
743 :
744 0 : void SAL_CALL VCLXMenu::enableAutoMnemonics(
745 : sal_Bool bEnable )
746 : throw (css::uno::RuntimeException, std::exception)
747 : {
748 0 : SolarMutexGuard aSolarGuard;
749 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
750 0 : if ( mpMenu )
751 : {
752 0 : if ( !bEnable )
753 0 : mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() | MenuFlags::NoAutoMnemonics );
754 : else
755 0 : mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() & ~MenuFlags::NoAutoMnemonics );
756 0 : }
757 0 : }
758 :
759 :
760 0 : void SAL_CALL VCLXMenu::setAcceleratorKeyEvent(
761 : ::sal_Int16 nItemId,
762 : const css::awt::KeyEvent& aKeyEvent )
763 : throw (css::uno::RuntimeException, std::exception)
764 : {
765 0 : SolarMutexGuard aSolarGuard;
766 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
767 :
768 0 : if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
769 : {
770 0 : vcl::KeyCode aVCLKeyCode = lcl_AWTKey2VCLKey( aKeyEvent );
771 0 : mpMenu->SetAccelKey( nItemId, aVCLKeyCode );
772 0 : }
773 0 : }
774 :
775 :
776 0 : css::awt::KeyEvent SAL_CALL VCLXMenu::getAcceleratorKeyEvent(
777 : ::sal_Int16 nItemId )
778 : throw (css::uno::RuntimeException, std::exception)
779 : {
780 0 : SolarMutexGuard aSolarGuard;
781 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
782 :
783 0 : css::awt::KeyEvent aKeyEvent;
784 0 : if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
785 : {
786 0 : vcl::KeyCode nKeyCode = mpMenu->GetAccelKey( nItemId );
787 0 : aKeyEvent = lcl_VCLKey2AWTKey( nKeyCode );
788 : }
789 :
790 0 : return aKeyEvent;
791 : }
792 :
793 :
794 0 : void SAL_CALL VCLXMenu::setHelpText(
795 : ::sal_Int16 nItemId,
796 : const OUString& sHelpText )
797 : throw (css::uno::RuntimeException, std::exception)
798 : {
799 0 : SolarMutexGuard aSolarGuard;
800 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
801 :
802 0 : if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
803 : {
804 0 : mpMenu->SetHelpText( nItemId, sHelpText );
805 0 : }
806 0 : }
807 :
808 :
809 0 : OUString SAL_CALL VCLXMenu::getHelpText(
810 : ::sal_Int16 nItemId )
811 : throw (css::uno::RuntimeException, std::exception)
812 : {
813 0 : SolarMutexGuard aSolarGuard;
814 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
815 :
816 0 : OUString sHelpText;
817 0 : if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
818 : {
819 0 : sHelpText = mpMenu->GetHelpText( nItemId );
820 : }
821 :
822 0 : return sHelpText;
823 : }
824 :
825 :
826 0 : void SAL_CALL VCLXMenu::setTipHelpText(
827 : ::sal_Int16 nItemId,
828 : const OUString& sTipHelpText )
829 : throw (css::uno::RuntimeException, std::exception)
830 : {
831 0 : SolarMutexGuard aSolarGuard;
832 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
833 :
834 0 : if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
835 : {
836 0 : mpMenu->SetTipHelpText( nItemId, sTipHelpText );
837 0 : }
838 0 : }
839 :
840 :
841 0 : OUString SAL_CALL VCLXMenu::getTipHelpText(
842 : ::sal_Int16 nItemId )
843 : throw (css::uno::RuntimeException, std::exception)
844 : {
845 0 : SolarMutexGuard aSolarGuard;
846 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
847 :
848 0 : OUString sTipHelpText;
849 0 : if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
850 : {
851 0 : sTipHelpText = mpMenu->GetTipHelpText( nItemId );
852 : }
853 0 : return sTipHelpText;
854 : }
855 :
856 :
857 0 : void SAL_CALL VCLXMenu::setItemImage(
858 : ::sal_Int16 nItemId,
859 : const css::uno::Reference< css::graphic::XGraphic >& xGraphic,
860 : sal_Bool bScale )
861 : throw (css::uno::RuntimeException, std::exception)
862 : {
863 0 : SolarMutexGuard aSolarGuard;
864 0 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
865 :
866 0 : if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
867 : {
868 0 : Image aImage = lcl_XGraphic2VCLImage( xGraphic, bScale );
869 0 : mpMenu->SetItemImage( nItemId, aImage );
870 0 : }
871 0 : }
872 :
873 :
874 : css::uno::Reference< css::graphic::XGraphic > SAL_CALL
875 983 : VCLXMenu::getItemImage(
876 : ::sal_Int16 nItemId )
877 : throw (css::uno::RuntimeException, std::exception)
878 : {
879 983 : SolarMutexGuard aSolarGuard;
880 1966 : ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
881 :
882 983 : css::uno::Reference< css::graphic::XGraphic > rxGraphic;
883 :
884 983 : if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
885 : {
886 983 : Image aImage = mpMenu->GetItemImage( nItemId );
887 983 : if ( !!aImage )
888 983 : rxGraphic = aImage.GetXGraphic();
889 : }
890 1966 : return rxGraphic;
891 : }
892 :
893 1 : VCLXMenuBar::VCLXMenuBar()
894 : {
895 1 : ImplCreateMenu( false );
896 1 : }
897 :
898 3197 : VCLXMenuBar::VCLXMenuBar( MenuBar* pMenuBar ) : VCLXMenu( static_cast<Menu *>(pMenuBar) )
899 : {
900 3197 : }
901 :
902 : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
903 1 : stardiv_Toolkit_VCLXMenuBar_get_implementation(
904 : css::uno::XComponentContext *,
905 : css::uno::Sequence<css::uno::Any> const &)
906 : {
907 1 : return cppu::acquire(new VCLXMenuBar());
908 : }
909 :
910 5987 : VCLXPopupMenu::VCLXPopupMenu()
911 : {
912 5987 : ImplCreateMenu( true );
913 5987 : }
914 :
915 0 : VCLXPopupMenu::VCLXPopupMenu( PopupMenu* pPopMenu ) : VCLXMenu( static_cast<Menu *>(pPopMenu) )
916 : {
917 0 : }
918 :
919 : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
920 607 : stardiv_Toolkit_VCLXPopupMenu_get_implementation(
921 : css::uno::XComponentContext *,
922 : css::uno::Sequence<css::uno::Any> const &)
923 : {
924 607 : return cppu::acquire(new VCLXPopupMenu());
925 : }
926 :
927 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|