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