24#include <com/sun/star/uno/XComponentContext.hpp>
37#include <com/sun/star/awt/KeyModifier.hpp>
40 : maMenuListeners( *this )
47 : maMenuListeners( *this )
89 DBG_ASSERT( rMenuEvent.GetMenu() && mpMenu,
"Menu???" );
91 if ( rMenuEvent.GetMenu() != mpMenu )
94 switch ( rMenuEvent.GetId() )
96 case VclEventId::MenuSelect:
98 if ( maMenuListeners.getLength() )
100 css::awt::MenuEvent
aEvent;
102 aEvent.MenuId = mpMenu->GetCurItemId();
103 maMenuListeners.itemSelected(
aEvent );
107 case VclEventId::ObjectDying:
112 case VclEventId::MenuHighlight:
114 if ( maMenuListeners.getLength() )
116 css::awt::MenuEvent
aEvent;
118 aEvent.MenuId = mpMenu->GetCurItemId();
119 maMenuListeners.itemHighlighted(
aEvent );
123 case VclEventId::MenuActivate:
125 if ( maMenuListeners.getLength() )
127 css::awt::MenuEvent
aEvent;
129 aEvent.MenuId = mpMenu->GetCurItemId();
130 maMenuListeners.itemActivated(
aEvent );
134 case VclEventId::MenuDeactivate:
136 if ( maMenuListeners.getLength() )
138 css::awt::MenuEvent
aEvent;
140 aEvent.MenuId = mpMenu->GetCurItemId();
141 maMenuListeners.itemDeactivated(
aEvent );
147 case VclEventId::MenuEnable:
148 case VclEventId::MenuInsertItem:
149 case VclEventId::MenuRemoveItem:
150 case VclEventId::MenuSubmenuActivate:
151 case VclEventId::MenuSubmenuDeactivate:
152 case VclEventId::MenuSubmenuChanged:
153 case VclEventId::MenuDehighlight:
154 case VclEventId::MenuDisable:
155 case VclEventId::MenuItemRoleChanged:
156 case VclEventId::MenuItemTextChanged:
157 case VclEventId::MenuItemChecked:
158 case VclEventId::MenuItemUnchecked:
159 case VclEventId::MenuShow:
160 case VclEventId::MenuHide:
163 default: OSL_FAIL(
"MenuEventListener - Unknown event!" );
170 std::unique_lock aGuard(
maMutex );
174 OUString
implName(
"stardiv.Toolkit." );
185 std::unique_lock aGuard(
maMutex );
190 return css::uno::Sequence<OUString>{
191 "com.sun.star.awt.PopupMenu",
192 "stardiv.vcl.PopupMenu"};
194 return css::uno::Sequence<OUString>{
195 "com.sun.star.awt.MenuBar",
196 "stardiv.vcl.MenuBar"};
205 const css::uno::Type & rType )
207 std::unique_lock aGuard(
maMutex );
214 aRet = ::cppu::queryInterface( rType,
215 static_cast< css::awt::XMenu*
>(
static_cast<css::awt::XMenuBar*
>(
this)),
216 static_cast< css::awt::XPopupMenu*
>(
this),
217 static_cast< css::lang::XTypeProvider*
>(
this),
218 static_cast< css::lang::XServiceInfo*
>(
this) );
220 aRet = ::cppu::queryInterface( rType,
221 static_cast< css::awt::XMenu*
>(
static_cast<css::awt::XMenuBar*
>(
this)),
222 static_cast< css::awt::XMenuBar*
>(
this),
223 static_cast< css::lang::XTypeProvider*
>(
this),
224 static_cast< css::lang::XServiceInfo*
>(
this) );
226 return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ));
232 std::unique_lock aGuard(
maMutex );
242 return collectionPopupMenu.
getTypes();
250 return collectionMenuBar.
getTypes();
257 return css::uno::Sequence<sal_Int8>();
261 const css::uno::Reference< css::awt::XMenuListener >& rxListener )
263 std::unique_lock aGuard(
maMutex );
269 const css::uno::Reference< css::awt::XMenuListener >& rxListener )
271 std::unique_lock aGuard(
maMutex );
278 const OUString& aText,
279 sal_Int16 nItemStyle,
283 std::unique_lock aGuard(
maMutex );
294 std::unique_lock aGuard(
maMutex );
299 sal_Int32 nItemCount =
static_cast<sal_Int32
>(
mpMenu->GetItemCount());
302 sal_Int16 nP = sal::static_int_cast< sal_Int16 >(
303 std::min(
static_cast<int>(
nPos+
nCount),
static_cast<int>(nItemCount) ));
305 mpMenu->RemoveItem( --nP );
312 std::unique_lock aGuard(
maMutex );
321 std::unique_lock aGuard(
maMutex );
330 std::unique_lock aGuard(
maMutex );
340 std::unique_lock aGuard(
maMutex );
343 mpMenu->EnableItem( nItemId, bEnable );
350 std::unique_lock aGuard(
maMutex );
357 const OUString& aText )
360 std::unique_lock aGuard(
maMutex );
363 mpMenu->SetItemText( nItemId, aText );
370 std::unique_lock aGuard(
maMutex );
374 aItemText =
mpMenu->GetItemText( nItemId );
380 const css::uno::Reference< css::awt::XPopupMenu >& rxPopupMenu )
383 std::unique_lock aGuard(
maMutex );
400 std::unique_lock aGuard(
maMutex );
402 css::uno::Reference< css::awt::XPopupMenu > aRef;
431 std::unique_lock aGuard(
maMutex );
440 std::unique_lock aGuard(
maMutex );
447 std::unique_lock aGuard(
maMutex );
457 std::unique_lock aGuard(
maMutex );
460 mpMenu->CheckItem( nItemId, bCheck );
467 std::unique_lock aGuard(
maMutex );
473 const css::uno::Reference< css::awt::XWindowPeer >& rxWindowPeer,
474 const css::awt::Rectangle& rPos,
480 std::unique_lock aGuard(
maMutex );
488 static_cast<PopupMenuFlags>(nFlags) | PopupMenuFlags::NoMouseUpClose );
494 const OUString& aCommand )
497 std::unique_lock aGuard(
maMutex );
507 std::unique_lock aGuard(
maMutex );
509 OUString aItemCommand;
511 aItemCommand =
mpMenu->GetItemCommand( nItemId );
517 const OUString& aHelp )
520 std::unique_lock aGuard(
maMutex );
523 mpMenu->SetHelpCommand( nItemId, aHelp );
530 std::unique_lock aGuard(
maMutex );
532 OUString aHelpCommand;
534 aHelpCommand =
mpMenu->GetHelpCommand( nItemId );
541 Image lcl_XGraphic2VCLImage(
542 const css::uno::Reference< css::graphic::XGraphic >& xGraphic,
546 if ( !xGraphic.is() )
549 aImage =
Image( xGraphic );
551 const sal_Int32 nCurWidth = aCurSize.
Width();
552 const sal_Int32 nCurHeight = aCurSize.Height();
553 constexpr sal_Int32 nIdeal( 16 );
555 if ( nCurWidth > 0 && nCurHeight > 0 )
557 if ( bResize && ( nCurWidth > nIdeal || nCurHeight > nIdeal ) )
559 sal_Int32 nIdealWidth = std::min(nCurWidth, nIdeal);
560 sal_Int32 nIdealHeight = std::min(nCurHeight, nIdeal);
562 ::Size aNewSize( nIdealWidth, nIdealHeight );
564 bool bModified(
false );
566 bModified = aBitmapEx.
Scale( aNewSize, BmpScaleFlag::BestQuality );
569 aImage =
Image( aBitmapEx );
576 css::awt::KeyEvent lcl_VCLKey2AWTKey(
579 css::awt::KeyEvent aAWTKey;
580 aAWTKey.Modifiers = 0;
581 aAWTKey.KeyCode =
static_cast<sal_Int16
>(aVCLKey.
GetCode());
584 aAWTKey.Modifiers |= css::awt::KeyModifier::SHIFT;
586 aAWTKey.Modifiers |= css::awt::KeyModifier::MOD1;
588 aAWTKey.Modifiers |= css::awt::KeyModifier::MOD2;
590 aAWTKey.Modifiers |= css::awt::KeyModifier::MOD3;
595 vcl::KeyCode lcl_AWTKey2VCLKey(
const css::awt::KeyEvent& aAWTKey)
597 bool bShift = ((aAWTKey.Modifiers & css::awt::KeyModifier::SHIFT) == css::awt::KeyModifier::SHIFT );
598 bool bMod1 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD1 ) == css::awt::KeyModifier::MOD1 );
599 bool bMod2 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD2 ) == css::awt::KeyModifier::MOD2 );
600 bool bMod3 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD3 ) == css::awt::KeyModifier::MOD3 );
601 sal_uInt16 nKey =
static_cast<sal_uInt16
>(aAWTKey.KeyCode);
612 std::unique_lock aGuard(
maMutex );
619 std::unique_lock aGuard(
maMutex );
626 ::sal_Int16 nItemPos )
629 std::unique_lock aGuard(
maMutex );
631 css::awt::MenuItemType aMenuItemType =
632 css::awt::MenuItemType_DONTKNOW;
635 aMenuItemType =
static_cast<css::awt::MenuItemType
>(
mpMenu->GetItemType( nItemPos ));
638 return aMenuItemType;
645 std::unique_lock aGuard(
maMutex );
649 mpMenu->SetMenuFlags(
mpMenu->GetMenuFlags() | MenuFlags::HideDisabledEntries );
651 mpMenu->SetMenuFlags(
mpMenu->GetMenuFlags() & ~MenuFlags::HideDisabledEntries );
659 std::unique_lock aGuard(
maMutex );
671 std::unique_lock aGuard(
maMutex );
682 std::unique_lock aGuard(
maMutex );
686 mpMenu->SetMenuFlags(
mpMenu->GetMenuFlags() | MenuFlags::NoAutoMnemonics );
688 mpMenu->SetMenuFlags(
mpMenu->GetMenuFlags() & ~MenuFlags::NoAutoMnemonics );
695 const css::awt::KeyEvent& aKeyEvent )
698 std::unique_lock aGuard(
maMutex );
702 vcl::KeyCode aVCLKeyCode = lcl_AWTKey2VCLKey( aKeyEvent );
703 mpMenu->SetAccelKey( nItemId, aVCLKeyCode );
709 ::sal_Int16 nItemId )
712 std::unique_lock aGuard(
maMutex );
714 css::awt::KeyEvent aKeyEvent;
718 aKeyEvent = lcl_VCLKey2AWTKey( nKeyCode );
727 const OUString& sHelpText )
730 std::unique_lock aGuard(
maMutex );
734 mpMenu->SetHelpText( nItemId, sHelpText );
740 ::sal_Int16 nItemId )
743 std::unique_lock aGuard(
maMutex );
748 sHelpText =
mpMenu->GetHelpText( nItemId );
757 const OUString& sTipHelpText )
760 std::unique_lock aGuard(
maMutex );
764 mpMenu->SetTipHelpText( nItemId, sTipHelpText );
770 ::sal_Int16 nItemId )
773 std::unique_lock aGuard(
maMutex );
775 OUString sTipHelpText;
778 sTipHelpText =
mpMenu->GetTipHelpText( nItemId );
786 const css::uno::Reference< css::graphic::XGraphic >& xGraphic,
790 std::unique_lock aGuard(
maMutex );
794 Image aImage = lcl_XGraphic2VCLImage( xGraphic, bScale );
795 mpMenu->SetItemImage( nItemId, aImage );
800css::uno::Reference< css::graphic::XGraphic > SAL_CALL
802 ::sal_Int16 nItemId )
805 std::unique_lock aGuard(
maMutex );
807 css::uno::Reference< css::graphic::XGraphic > rxGraphic;
821 std::unique_lock aGuard(
maMutex);
823 mpMenu->SetUserValue(nItemId, nUserValue, aFunc);
829 std::unique_lock aGuard(
maMutex);
831 return mpMenu->GetUserValue(nItemId);
834VCLXMenuBar::VCLXMenuBar()
836 ImplCreateMenu(
false );
843extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
845 css::uno::XComponentContext *,
846 css::uno::Sequence<css::uno::Any>
const &)
848 return cppu::acquire(
new VCLXMenuBar());
861extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
863 css::uno::XComponentContext *,
864 css::uno::Sequence<css::uno::Any>
const &)
bool Scale(const Size &rNewSize, BmpScaleFlag nScaleFlag=BmpScaleFlag::Default)
css::uno::Reference< css::graphic::XGraphic > GetXGraphic() const
BitmapEx GetBitmapEx() const
Size GetSizePixel() const
constexpr tools::Long Width() const
static vcl::Window * GetWindow(const css::uno::Reference< css::awt::XWindow > &rxWindow)
reference_type * get() const
static VclPtr< reference_type > Create(Arg &&... arg)
css::uno::Sequence< css::uno::Type > SAL_CALL getTypes()
sal_uInt16 GetCode() const
inline ::tools::Rectangle VCLRectangle(const css::awt::Rectangle &rAWTRect)
#define DBG_ASSERT(sCon, aError)
#define LINK(Instance, Class, Member)
if(aStr !=aBuf) UpdateName_Impl(m_xFollowLb.get()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
bool IsInPopupMenuExecute()