LCOV - code coverage report
Current view: top level - toolkit/source/awt - vclxmenu.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 125 421 29.7 %
Date: 2015-06-13 12:38:46 Functions: 28 64 43.8 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11