blob: 30f1973021e93ab343f8a104ac4e538c900411c7 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_toolkit.hxx"
#include <toolkit/awt/vclxmenu.hxx>
#include <toolkit/helper/convert.hxx>
#include <toolkit/helper/macros.hxx>
#include <toolkit/helper/servicenames.hxx>
#include <toolkit/helper/vclunohelper.hxx>
#include <cppuhelper/typeprovider.hxx>
#include <rtl/memory.h>
#include <rtl/ustrbuf.hxx>
#include <rtl/uuid.h>
#include <vcl/image.hxx>
#include <vcl/keycod.hxx>
#include <vcl/menu.hxx>
#include <vcl/mnemonic.hxx>
#include <vcl/svapp.hxx>
#include <vos/mutex.hxx>
#include <com/sun/star/awt/KeyModifier.hpp>
using rtl::OUString;
using rtl::OUStringBuffer;
DBG_NAME(VCLXMenu)
VCLXMenu::VCLXMenu()
: maMenuListeners( *this )
{
DBG_CTOR( VCLXMenu, 0 );
mpMenu = NULL;
}
VCLXMenu::VCLXMenu( Menu* pMenu )
: maMenuListeners( *this )
{
DBG_CTOR( VCLXMenu, 0 );
mpMenu = pMenu;
}
VCLXMenu::~VCLXMenu()
{
DBG_DTOR( VCLXMenu, 0 );
for ( sal_uInt32 n = maPopupMenueRefs.Count(); n; )
{
css::uno::Reference< css::awt::XPopupMenu > * pRef = maPopupMenueRefs.GetObject( --n );
delete pRef;
}
if ( mpMenu )
{
mpMenu->RemoveEventListener( LINK( this, VCLXMenu, MenuEventListener ) );
delete mpMenu;
}
}
sal_Bool VCLXMenu::IsPopupMenu() const
{
return (mpMenu && ! mpMenu->IsMenuBar());
}
void VCLXMenu::ImplCreateMenu( sal_Bool bPopup )
{
DBG_ASSERT( !mpMenu, "CreateMenu: Menu exists!" );
if ( bPopup )
mpMenu = new PopupMenu;
else
mpMenu = new MenuBar;
mpMenu->AddEventListener( LINK( this, VCLXMenu, MenuEventListener ) );
}
IMPL_LINK( VCLXMenu, MenuEventListener, VclSimpleEvent*, pEvent )
{
DBG_ASSERT( pEvent && pEvent->ISA( VclMenuEvent ), "Unknown Event!" );
if ( pEvent && pEvent->ISA( VclMenuEvent ) )
{
DBG_ASSERT( ((VclMenuEvent*)pEvent)->GetMenu() && mpMenu, "Menu???" );
VclMenuEvent* pMenuEvent = (VclMenuEvent*)pEvent;
if ( pMenuEvent->GetMenu() == mpMenu ) // Also called for the root menu
{
switch ( pMenuEvent->GetId() )
{
case VCLEVENT_MENU_SELECT:
{
if ( maMenuListeners.getLength() )
{
css::awt::MenuEvent aEvent;
aEvent.Source = (::cppu::OWeakObject*)this;
aEvent.MenuId = mpMenu->GetCurItemId();
maMenuListeners.itemSelected( aEvent );
}
}
break;
case VCLEVENT_OBJECT_DYING:
{
mpMenu = NULL;
}
break;
case VCLEVENT_MENU_HIGHLIGHT:
{
if ( maMenuListeners.getLength() )
{
css::awt::MenuEvent aEvent;
aEvent.Source = (::cppu::OWeakObject*)this;
aEvent.MenuId = mpMenu->GetCurItemId();
maMenuListeners.itemHighlighted( aEvent );
}
}
break;
case VCLEVENT_MENU_ACTIVATE:
{
if ( maMenuListeners.getLength() )
{
css::awt::MenuEvent aEvent;
aEvent.Source = (::cppu::OWeakObject*)this;
aEvent.MenuId = mpMenu->GetCurItemId();
maMenuListeners.itemActivated( aEvent );
}
}
break;
case VCLEVENT_MENU_DEACTIVATE:
{
if ( maMenuListeners.getLength() )
{
css::awt::MenuEvent aEvent;
aEvent.Source = (::cppu::OWeakObject*)this;
aEvent.MenuId = mpMenu->GetCurItemId();
maMenuListeners.itemDeactivated( aEvent );
}
}
break;
// ignore accessibility events
case VCLEVENT_MENU_ENABLE:
case VCLEVENT_MENU_INSERTITEM:
case VCLEVENT_MENU_REMOVEITEM:
case VCLEVENT_MENU_SUBMENUACTIVATE:
case VCLEVENT_MENU_SUBMENUDEACTIVATE:
case VCLEVENT_MENU_SUBMENUCHANGED:
case VCLEVENT_MENU_DEHIGHLIGHT:
case VCLEVENT_MENU_DISABLE:
case VCLEVENT_MENU_ITEMTEXTCHANGED:
case VCLEVENT_MENU_ITEMCHECKED:
case VCLEVENT_MENU_ITEMUNCHECKED:
case VCLEVENT_MENU_SHOW:
case VCLEVENT_MENU_HIDE:
break;
default: DBG_ERROR( "MenuEventListener - Unknown event!" );
}
}
}
return 0;
}
OUString SAL_CALL VCLXMenu::getImplementationName( )
throw (css::uno::RuntimeException)
{
::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
const sal_Bool bIsPopupMenu = IsPopupMenu();
aGuard.clear();
OUStringBuffer implName;
implName.appendAscii( RTL_CONSTASCII_STRINGPARAM( "stardiv.Toolkit." ) );
if ( bIsPopupMenu )
implName.appendAscii( RTL_CONSTASCII_STRINGPARAM( "VCLXPopupMenu" ) );
else
implName.appendAscii( RTL_CONSTASCII_STRINGPARAM( "VCLXMenuBar" ) );
return implName.makeStringAndClear();
}
css::uno::Sequence< OUString > SAL_CALL VCLXMenu::getSupportedServiceNames( )
throw (css::uno::RuntimeException)
{
::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
const sal_Bool bIsPopupMenu = IsPopupMenu();
aGuard.clear();
css::uno::Sequence< OUString > aNames( 1 );
if ( bIsPopupMenu )
aNames[ 0 ] = OUString::createFromAscii( szServiceName2_PopupMenu );
else
aNames[ 0 ] = OUString::createFromAscii( szServiceName2_MenuBar );
return aNames;
}
::sal_Bool SAL_CALL VCLXMenu::supportsService(
const OUString& rServiceName )
throw (css::uno::RuntimeException)
{
css::uno::Sequence< OUString > aServiceNames( getSupportedServiceNames() );
if ( aServiceNames[ 0 ] == rServiceName )
return sal_True;
return sal_False;
}
css::uno::Any VCLXMenu::queryInterface(
const css::uno::Type & rType )
throw(css::uno::RuntimeException)
{
::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
const sal_Bool bIsPopupMenu = IsPopupMenu();
aGuard.clear();
css::uno::Any aRet;
if ( bIsPopupMenu )
aRet = ::cppu::queryInterface( rType,
SAL_STATIC_CAST( css::awt::XMenu*, (css::awt::XPopupMenu*) this ),
SAL_STATIC_CAST( css::awt::XPopupMenu*, this ),
SAL_STATIC_CAST( css::lang::XTypeProvider*, this ),
SAL_STATIC_CAST( css::lang::XServiceInfo*, this ),
SAL_STATIC_CAST( css::lang::XUnoTunnel*, this ) );
else
aRet = ::cppu::queryInterface( rType,
SAL_STATIC_CAST( css::awt::XMenu*, (css::awt::XMenuBar*) this ),
SAL_STATIC_CAST( css::awt::XMenuBar*, this ),
SAL_STATIC_CAST( css::lang::XTypeProvider*, this ),
SAL_STATIC_CAST( css::lang::XServiceInfo*, this ),
SAL_STATIC_CAST( css::lang::XUnoTunnel*, this ) );
return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ));
}
IMPL_XUNOTUNNEL( VCLXMenu )
css::uno::Sequence< css::uno::Type > VCLXMenu::getTypes()
throw(css::uno::RuntimeException)
{
::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
const sal_Bool bIsPopupMenu = IsPopupMenu();
aGuard.clear();
static ::cppu::OTypeCollection* pCollectionMenuBar = NULL;
static ::cppu::OTypeCollection* pCollectionPopupMenu = NULL;
if ( bIsPopupMenu )
{
if( !pCollectionPopupMenu )
{
::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() );
if( !pCollectionPopupMenu )
{
static ::cppu::OTypeCollection collectionPopupMenu(
getCppuType( ( css::uno::Reference< css::lang::XTypeProvider>* ) NULL ),
getCppuType( ( css::uno::Reference< css::awt::XMenu>* ) NULL ),
getCppuType( ( css::uno::Reference< css::awt::XPopupMenu>* ) NULL ),
getCppuType( ( css::uno::Reference< css::lang::XServiceInfo>* ) NULL ) );
pCollectionPopupMenu = &collectionPopupMenu;
}
}
return (*pCollectionPopupMenu).getTypes();
}
else
{
if( !pCollectionMenuBar )
{
::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() );
if( !pCollectionMenuBar )
{
static ::cppu::OTypeCollection collectionMenuBar(
getCppuType( ( css::uno::Reference< css::lang::XTypeProvider>* ) NULL ),
getCppuType( ( css::uno::Reference< css::awt::XMenu>* ) NULL ),
getCppuType( ( css::uno::Reference< css::awt::XMenuBar>* ) NULL ),
getCppuType( ( css::uno::Reference< css::lang::XServiceInfo>* ) NULL ) );
pCollectionMenuBar = &collectionMenuBar;
}
}
return (*pCollectionMenuBar).getTypes();
}
}
css::uno::Sequence< sal_Int8 > VCLXMenu::getImplementationId()
throw(css::uno::RuntimeException)
{
::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
const sal_Bool bIsPopupMenu = IsPopupMenu();
aGuard.clear();
static ::cppu::OImplementationId* pIdMenuBar = NULL;
static ::cppu::OImplementationId* pIdPopupMenu = NULL;
if ( bIsPopupMenu )
{
if( !pIdPopupMenu )
{
::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() );
if( !pIdPopupMenu )
{
static ::cppu::OImplementationId idPopupMenu( sal_False );
pIdPopupMenu = &idPopupMenu;
}
}
return (*pIdPopupMenu).getImplementationId();
}
else
{
if( !pIdMenuBar )
{
::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() );
if( !pIdMenuBar )
{
static ::cppu::OImplementationId idMenuBar( sal_False );
pIdMenuBar = &idMenuBar;
}
}
return (*pIdMenuBar).getImplementationId();
}
}
void VCLXMenu::addMenuListener(
const css::uno::Reference< css::awt::XMenuListener >& rxListener )
throw(css::uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
maMenuListeners.addInterface( rxListener );
}
void VCLXMenu::removeMenuListener(
const css::uno::Reference< css::awt::XMenuListener >& rxListener )
throw(css::uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
maMenuListeners.removeInterface( rxListener );
}
void VCLXMenu::insertItem(
sal_Int16 nItemId,
const OUString& aText,
sal_Int16 nItemStyle,
sal_Int16 nPos )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu )
mpMenu->InsertItem( nItemId, aText, (MenuItemBits)nItemStyle, nPos );
}
void VCLXMenu::removeItem(
sal_Int16 nPos,
sal_Int16 nCount )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
sal_Int32 nItemCount = (sal_Int32)mpMenu->GetItemCount();
if ( mpMenu && ( nCount > 0 ) && ( nPos >= 0 ) && ( nPos < nItemCount ) && ( nItemCount > 0 ))
{
sal_Int16 nP = sal::static_int_cast< sal_Int16 >(
Min( (int)(nPos+nCount), (int)nItemCount ));
while( nP-nPos > 0 )
mpMenu->RemoveItem( --nP );
}
}
sal_Int16 VCLXMenu::getItemCount( )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
return mpMenu ? mpMenu->GetItemCount() : 0;
}
sal_Int16 VCLXMenu::getItemId(
sal_Int16 nPos )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
return mpMenu ? mpMenu->GetItemId( nPos ) : 0;
}
sal_Int16 VCLXMenu::getItemPos(
sal_Int16 nId )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
return mpMenu ? mpMenu->GetItemPos( nId ) : 0;
}
void VCLXMenu::enableItem(
sal_Int16 nItemId,
sal_Bool bEnable )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu )
mpMenu->EnableItem( nItemId, bEnable );
}
sal_Bool VCLXMenu::isItemEnabled(
sal_Int16 nItemId )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
return mpMenu ? mpMenu->IsItemEnabled( nItemId ) : sal_False;
}
void VCLXMenu::setItemText(
sal_Int16 nItemId,
const OUString& aText )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu )
mpMenu->SetItemText( nItemId, aText );
}
OUString VCLXMenu::getItemText(
sal_Int16 nItemId )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
OUString aItemText;
if ( mpMenu )
aItemText = mpMenu->GetItemText( nItemId );
return aItemText;
}
void VCLXMenu::setPopupMenu(
sal_Int16 nItemId,
const css::uno::Reference< css::awt::XPopupMenu >& rxPopupMenu )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
VCLXMenu* pVCLMenu = VCLXMenu::GetImplementation( rxPopupMenu );
DBG_ASSERT( pVCLMenu && pVCLMenu->GetMenu() && pVCLMenu->IsPopupMenu(), "setPopupMenu: Invalid Menu!" );
if ( mpMenu && pVCLMenu && pVCLMenu->GetMenu() && pVCLMenu->IsPopupMenu() )
{
// Selbst eine Ref halten!
css::uno::Reference< css::awt::XPopupMenu > * pNewRef = new css::uno::Reference< css::awt::XPopupMenu > ;
*pNewRef = rxPopupMenu;
maPopupMenueRefs.Insert( pNewRef, LIST_APPEND );
mpMenu->SetPopupMenu( nItemId, (PopupMenu*) pVCLMenu->GetMenu() );
}
}
css::uno::Reference< css::awt::XPopupMenu > VCLXMenu::getPopupMenu(
sal_Int16 nItemId )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
css::uno::Reference< css::awt::XPopupMenu > aRef;
Menu* pMenu = mpMenu ? mpMenu->GetPopupMenu( nItemId ) : NULL;
if ( pMenu )
{
for ( sal_uInt32 n = maPopupMenueRefs.Count(); n; )
{
css::uno::Reference< css::awt::XPopupMenu > * pRef = maPopupMenueRefs.GetObject( --n );
Menu* pM = ((VCLXMenu*)pRef->get())->GetMenu();
if ( pM == pMenu )
{
aRef = *pRef;
break;
}
}
}
return aRef;
}
// css::awt::XPopupMenu
void VCLXMenu::insertSeparator(
sal_Int16 nPos )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu )
mpMenu->InsertSeparator( nPos );
}
void VCLXMenu::setDefaultItem(
sal_Int16 nItemId )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu )
mpMenu->SetDefaultItem( nItemId );
}
sal_Int16 VCLXMenu::getDefaultItem( )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
return mpMenu ? mpMenu->GetDefaultItem() : 0;
}
void VCLXMenu::checkItem(
sal_Int16 nItemId,
sal_Bool bCheck )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu )
mpMenu->CheckItem( nItemId, bCheck );
}
sal_Bool VCLXMenu::isItemChecked(
sal_Int16 nItemId )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
return mpMenu ? mpMenu->IsItemChecked( nItemId ) : sal_False;
}
sal_Int16 VCLXMenu::execute(
const css::uno::Reference< css::awt::XWindowPeer >& rxWindowPeer,
const css::awt::Rectangle& rPos,
sal_Int16 nFlags )
throw(css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
sal_Int16 nRet = 0;
if ( mpMenu && IsPopupMenu() )
{
nRet = ((PopupMenu*)mpMenu)->Execute( VCLUnoHelper::GetWindow( rxWindowPeer ),
VCLRectangle( rPos ),
nFlags | POPUPMENU_NOMOUSEUPCLOSE );
}
return nRet;
}
void SAL_CALL VCLXMenu::setCommand(
sal_Int16 nItemId,
const OUString& aCommand )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu )
mpMenu->SetItemCommand( nItemId, aCommand );
}
OUString SAL_CALL VCLXMenu::getCommand(
sal_Int16 nItemId )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
OUString aItemCommand;
if ( mpMenu )
aItemCommand = mpMenu->GetItemCommand( nItemId );
return aItemCommand;
}
void SAL_CALL VCLXMenu::setHelpCommand(
sal_Int16 nItemId,
const OUString& aHelp )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu )
mpMenu->SetHelpCommand( nItemId, aHelp );
}
OUString SAL_CALL VCLXMenu::getHelpCommand(
sal_Int16 nItemId )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
OUString aHelpCommand;
if ( mpMenu )
aHelpCommand = mpMenu->GetHelpCommand( nItemId );
return aHelpCommand;
}
namespace
{
static Image lcl_XGraphic2VCLImage(
const css::uno::Reference< css::graphic::XGraphic >& xGraphic,
sal_Bool bResize )
{
Image aImage;
if ( !xGraphic.is() )
return aImage;
aImage = Image( xGraphic );
const ::Size aCurSize = aImage.GetSizePixel();
const sal_Int32 nCurWidth = aCurSize.Width();
const sal_Int32 nCurHeight = aCurSize.Height();
const sal_Int32 nIdeal( 16 );
if ( nCurWidth > 0 && nCurHeight > 0 )
{
if ( bResize && ( nCurWidth > nIdeal || nCurHeight > nIdeal ) )
{
sal_Int32 nIdealWidth = nCurWidth > nIdeal ? nIdeal : nCurWidth;
sal_Int32 nIdealHeight = nCurHeight > nIdeal ? nIdeal : nCurHeight;
::Size aNewSize( nIdealWidth, nIdealHeight );
sal_Bool bModified( sal_False );
BitmapEx aBitmapEx = aImage.GetBitmapEx();
bModified = aBitmapEx.Scale( aNewSize, BMP_SCALE_INTERPOLATE );
if ( bModified )
aImage = Image( aBitmapEx );
}
}
return aImage;
}
/** Copied from svtools/inc/acceleratorexecute.hxx */
static css::awt::KeyEvent lcl_VCLKey2AWTKey(
const KeyCode& aVCLKey)
{
css::awt::KeyEvent aAWTKey;
aAWTKey.Modifiers = 0;
aAWTKey.KeyCode = (sal_Int16)aVCLKey.GetCode();
if (aVCLKey.IsShift())
aAWTKey.Modifiers |= css::awt::KeyModifier::SHIFT;
if (aVCLKey.IsMod1())
aAWTKey.Modifiers |= css::awt::KeyModifier::MOD1;
if (aVCLKey.IsMod2())
aAWTKey.Modifiers |= css::awt::KeyModifier::MOD2;
if (aVCLKey.IsMod3())
aAWTKey.Modifiers |= css::awt::KeyModifier::MOD3;
return aAWTKey;
}
KeyCode lcl_AWTKey2VCLKey(const css::awt::KeyEvent& aAWTKey)
{
sal_Bool bShift = ((aAWTKey.Modifiers & css::awt::KeyModifier::SHIFT) == css::awt::KeyModifier::SHIFT );
sal_Bool bMod1 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD1 ) == css::awt::KeyModifier::MOD1 );
sal_Bool bMod2 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD2 ) == css::awt::KeyModifier::MOD2 );
sal_Bool bMod3 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD3 ) == css::awt::KeyModifier::MOD3 );
sal_uInt16 nKey = (sal_uInt16)aAWTKey.KeyCode;
return KeyCode(nKey, bShift, bMod1, bMod2, bMod3);
}
}
::sal_Bool SAL_CALL VCLXMenu::isPopupMenu( )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
return IsPopupMenu();
}
void SAL_CALL VCLXMenu::clear( )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu )
mpMenu->Clear();
}
css::awt::MenuItemType SAL_CALL VCLXMenu::getItemType(
::sal_Int16 nItemPos )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
css::awt::MenuItemType aMenuItemType =
css::awt::MenuItemType_DONTKNOW;
if ( mpMenu )
{
aMenuItemType = ( (css::awt::MenuItemType) mpMenu->GetItemType( nItemPos ) );
}
return aMenuItemType;
}
void SAL_CALL VCLXMenu::hideDisabledEntries(
::sal_Bool bHide )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu )
{
if ( bHide )
mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() | MENU_FLAG_HIDEDISABLEDENTRIES );
else
mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() & ~MENU_FLAG_HIDEDISABLEDENTRIES );
}
}
::sal_Bool SAL_CALL VCLXMenu::isInExecute( )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu && IsPopupMenu() )
return ( (PopupMenu*) mpMenu )->IsInExecute();
else
return sal_False;
}
void SAL_CALL VCLXMenu::endExecute()
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu && IsPopupMenu() )
( (PopupMenu*) mpMenu )->EndExecute();
}
void SAL_CALL VCLXMenu::enableAutoMnemonics(
::sal_Bool bEnable )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu )
{
if ( !bEnable )
mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS );
else
mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() & ~MENU_FLAG_NOAUTOMNEMONICS );
}
}
void SAL_CALL VCLXMenu::setAcceleratorKeyEvent(
::sal_Int16 nItemId,
const css::awt::KeyEvent& aKeyEvent )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
{
KeyCode aVCLKeyCode = lcl_AWTKey2VCLKey( aKeyEvent );
mpMenu->SetAccelKey( nItemId, aVCLKeyCode );
}
}
css::awt::KeyEvent SAL_CALL VCLXMenu::getAcceleratorKeyEvent(
::sal_Int16 nItemId )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
css::awt::KeyEvent aKeyEvent;
if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
{
KeyCode nKeyCode = mpMenu->GetAccelKey( nItemId );
aKeyEvent = lcl_VCLKey2AWTKey( nKeyCode );
}
return aKeyEvent;
}
void SAL_CALL VCLXMenu::setHelpText(
::sal_Int16 nItemId,
const OUString& sHelpText )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
{
mpMenu->SetHelpText( nItemId, sHelpText );
}
}
OUString SAL_CALL VCLXMenu::getHelpText(
::sal_Int16 nItemId )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
rtl::OUString sHelpText;
if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
{
sHelpText = mpMenu->GetHelpText( nItemId );
}
return sHelpText;
}
void SAL_CALL VCLXMenu::setTipHelpText(
::sal_Int16 nItemId,
const OUString& sTipHelpText )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
{
mpMenu->SetTipHelpText( nItemId, sTipHelpText );
}
}
OUString SAL_CALL VCLXMenu::getTipHelpText(
::sal_Int16 nItemId )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
rtl::OUString sTipHelpText;
if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
{
sTipHelpText = mpMenu->GetTipHelpText( nItemId );
}
return sTipHelpText;
}
void SAL_CALL VCLXMenu::setItemImage(
::sal_Int16 nItemId,
const css::uno::Reference< css::graphic::XGraphic >& xGraphic,
::sal_Bool bScale )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
{
Image aImage = lcl_XGraphic2VCLImage( xGraphic, bScale );
mpMenu->SetItemImage( nItemId, aImage );
}
}
css::uno::Reference< css::graphic::XGraphic > SAL_CALL
VCLXMenu::getItemImage(
::sal_Int16 nItemId )
throw (css::uno::RuntimeException)
{
::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
css::uno::Reference< css::graphic::XGraphic > rxGraphic;
if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
{
Image aImage = mpMenu->GetItemImage( nItemId );
if ( !!aImage )
rxGraphic = aImage.GetXGraphic();
}
return rxGraphic;
}
DBG_NAME(VCLXMenuBar);
VCLXMenuBar::VCLXMenuBar()
{
DBG_CTOR( VCLXMenuBar, 0 );
ImplCreateMenu( sal_False );
}
VCLXMenuBar::VCLXMenuBar( MenuBar* pMenuBar ) : VCLXMenu( (Menu *)pMenuBar )
{
DBG_CTOR( VCLXMenuBar, 0 );
}
DBG_NAME(VCLXPopupMenu);
VCLXPopupMenu::VCLXPopupMenu()
{
DBG_CTOR( VCLXPopupMenu, 0 );
ImplCreateMenu( sal_True );
}