diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-01-27 10:48:13 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-01-28 10:01:53 +0100 |
commit | e3016262403aaf397286cfc16591612d78c9b3de (patch) | |
tree | 4d860081568e3dc2800270b18ed3f3a397edebf0 /svtools | |
parent | 473e9720077e5753e6e81de365053d2a964f6349 (diff) |
ToolbarMenu is now unused
Change-Id: Id48bb98045886ee79149f27c58e54488a80af41f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87554
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'svtools')
-rw-r--r-- | svtools/Library_svt.mk | 1 | ||||
-rw-r--r-- | svtools/inc/pch/precompiled_svt.hxx | 7 | ||||
-rw-r--r-- | svtools/source/control/toolbarmenu.cxx | 1341 | ||||
-rw-r--r-- | svtools/source/control/toolbarmenuacc.cxx | 833 | ||||
-rw-r--r-- | svtools/source/control/toolbarmenuimp.hxx | 292 |
5 files changed, 3 insertions, 2471 deletions
diff --git a/svtools/Library_svt.mk b/svtools/Library_svt.mk index f5f155faefef..ab191699615b 100644 --- a/svtools/Library_svt.mk +++ b/svtools/Library_svt.mk @@ -105,7 +105,6 @@ $(eval $(call gb_Library_add_exception_objects,svt,\ svtools/source/control/scrwin \ svtools/source/control/tabbar \ svtools/source/control/toolbarmenu \ - svtools/source/control/toolbarmenuacc \ svtools/source/control/valueacc \ svtools/source/control/valueset \ svtools/source/dialogs/addresstemplate \ diff --git a/svtools/inc/pch/precompiled_svt.hxx b/svtools/inc/pch/precompiled_svt.hxx index 3638394cadc8..a56169b0b141 100644 --- a/svtools/inc/pch/precompiled_svt.hxx +++ b/svtools/inc/pch/precompiled_svt.hxx @@ -13,7 +13,7 @@ manual changes will be rewritten by the next run of update_pch.sh (which presumably also fixes all possible problems, so it's usually better to use it). - Generated on 2019-12-03 09:22:16 using: + Generated on 2020-01-27 20:08:05 using: ./bin/update_pch svtools svt --cutoff=4 --exclude:system --include:module --exclude:local If after updating build fails, use the following command to locate conflicting headers: @@ -106,7 +106,6 @@ #include <vcl/combobox.hxx> #include <vcl/commandevent.hxx> #include <vcl/ctrl.hxx> -#include <vcl/decoview.hxx> #include <vcl/dllapi.h> #include <vcl/dndhelp.hxx> #include <vcl/dockwin.hxx> @@ -173,7 +172,6 @@ #include <basegfx/vector/b2enums.hxx> #include <basegfx/vector/b2ivector.hxx> #include <com/sun/star/accessibility/AccessibleEventId.hpp> -#include <com/sun/star/accessibility/AccessibleRole.hpp> #include <com/sun/star/accessibility/AccessibleStateType.hpp> #include <com/sun/star/awt/Key.hpp> #include <com/sun/star/awt/KeyGroup.hpp> @@ -218,7 +216,6 @@ #include <com/sun/star/i18n/reservedWords.hpp> #include <com/sun/star/lang/DisposedException.hpp> #include <com/sun/star/lang/EventObject.hpp> -#include <com/sun/star/lang/IndexOutOfBoundsException.hpp> #include <com/sun/star/lang/Locale.hpp> #include <com/sun/star/lang/XComponent.hpp> #include <com/sun/star/lang/XInitialization.hpp> @@ -250,6 +247,7 @@ #include <com/sun/star/view/PrintableState.hpp> #include <comphelper/broadcasthelper.hxx> #include <comphelper/comphelperdllapi.h> +#include <comphelper/interfacecontainer2.hxx> #include <comphelper/processfactory.hxx> #include <comphelper/propagg.hxx> #include <comphelper/proparrhlp.hxx> @@ -347,7 +345,6 @@ #include <svtools/colorcfg.hxx> #include <svtools/htmlkywd.hxx> #include <svtools/htmltokn.h> -#include <svtools/svmedit.hxx> #include <svtools/svtdllapi.h> #include <svtools/svtresid.hxx> #include <svtools/table/tabletypes.hxx> diff --git a/svtools/source/control/toolbarmenu.cxx b/svtools/source/control/toolbarmenu.cxx index 90bd3f3b53aa..b64c52f3155d 100644 --- a/svtools/source/control/toolbarmenu.cxx +++ b/svtools/source/control/toolbarmenu.cxx @@ -18,14 +18,9 @@ */ #include <memory> -#include <com/sun/star/accessibility/AccessibleEventId.hpp> -#include <com/sun/star/accessibility/AccessibleStateType.hpp> -#include <com/sun/star/lang/IndexOutOfBoundsException.hpp> #include <comphelper/processfactory.hxx> +#include <osl/diagnose.h> -#include <vcl/dockwin.hxx> -#include <vcl/decoview.hxx> -#include <vcl/image.hxx> #include <vcl/taskpanelist.hxx> #include <vcl/settings.hxx> #include <vcl/commandevent.hxx> @@ -35,7 +30,6 @@ #include <svtools/framestatuslistener.hxx> #include <svtools/valueset.hxx> #include <svtools/toolbarmenu.hxx> -#include "toolbarmenuimp.hxx" using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; @@ -67,1328 +61,6 @@ static vcl::Window* GetTopMostParentSystemWindow( vcl::Window* pWindow ) return nullptr; } - -void ToolbarMenuEntry::init( int nEntryId, MenuItemBits nBits ) -{ - mnEntryId = nEntryId; - mnBits = nBits; - - mbHasText = false; - mbHasImage = false; - mbChecked = false; - mbEnabled = true; - - mpControl = nullptr; -} - - -ToolbarMenuEntry::ToolbarMenuEntry( ToolbarMenu& rMenu, int nEntryId, const OUString& rText, MenuItemBits nBits ) -: mrMenu( rMenu ) -{ - init( nEntryId, nBits ); - - maText = rText; - mbHasText = true; -} - - -ToolbarMenuEntry::ToolbarMenuEntry( ToolbarMenu& rMenu, int nEntryId, const Image& rImage, const OUString& rText, MenuItemBits nBits ) -: mrMenu( rMenu ) -{ - init( nEntryId, nBits ); - - maText = rText; - mbHasText = true; - - maImage = rImage; - mbHasImage = true; -} - - -ToolbarMenuEntry::ToolbarMenuEntry( ToolbarMenu& rMenu, int nEntryId, Control* pControl, MenuItemBits nBits ) -: mrMenu( rMenu ) -{ - init( nEntryId, nBits ); - - if( pControl ) - { - mpControl = pControl; - mpControl->Show(); - } -} - - -ToolbarMenuEntry::~ToolbarMenuEntry() -{ - if( mxAccContext.is() ) - { - Reference< XComponent > xComponent( mxAccContext, UNO_QUERY ); - if( xComponent.is() ) - xComponent->dispose(); - mxAccContext.clear(); - } - mpControl.disposeAndClear(); -} - - -const Reference< XAccessibleContext >& ToolbarMenuEntry::GetAccessible() -{ - if( !mxAccContext.is() ) - { - if( mpControl ) - { - mxAccContext.set( mpControl->GetAccessible(), UNO_QUERY ); - } - else - { - mxAccContext.set( new ToolbarMenuEntryAcc( this ) ); - } - } - - return mxAccContext; -} - - -sal_Int32 ToolbarMenuEntry::getAccessibleChildCount() -{ - if( mpControl ) - { - const Reference< XAccessibleContext >& xContext = GetAccessible(); - if( xContext.is() ) - { - return xContext->getAccessibleChildCount(); - } - } - return 1; -} - - -Reference< XAccessible > ToolbarMenuEntry::getAccessibleChild( sal_Int32 index ) -{ - const Reference< XAccessibleContext >& xContext = GetAccessible(); - if( mpControl ) - { - if( xContext.is() ) - { - return xContext->getAccessibleChild(index); - } - } - else if( index == 0 ) - { - Reference< XAccessible > xRet( xContext, UNO_QUERY ); - if( xRet.is() ) - return xRet; - } - - throw IndexOutOfBoundsException(); -} - - -ToolbarMenu_Impl::ToolbarMenu_Impl( ToolbarMenu& rMenu ) -: mrMenu( rMenu ) -, mnCheckPos(0) -, mnImagePos(0) -, mnTextPos(0) -, mnHighlightedEntry(-1) -, mnSelectedEntry(-1) -, mnLastColumn(0) -{ -} - - -ToolbarMenu_Impl::~ToolbarMenu_Impl() -{ - setAccessible( nullptr ); -} - - -void ToolbarMenu_Impl::setAccessible( ToolbarMenuAcc* pAccessible ) -{ - if( mxAccessible.get() != pAccessible ) - { - if( mxAccessible.is() ) - mxAccessible->dispose(); - - mxAccessible.set( pAccessible ); - } -} - - -void ToolbarMenu_Impl::fireAccessibleEvent( short nEventId, const css::uno::Any& rOldValue, const css::uno::Any& rNewValue ) -{ - if( mxAccessible.is() ) - mxAccessible->FireAccessibleEvent( nEventId, rOldValue, rNewValue ); -} - - -sal_Int32 ToolbarMenu_Impl::getAccessibleChildCount() -{ - sal_Int32 nCount = 0; - for( const auto& pEntry : maEntryVector ) - { - if( pEntry ) - { - if( pEntry->mpControl ) - { - nCount += pEntry->getAccessibleChildCount(); - } - else - { - nCount += 1; - } - } - } - - return nCount; -} - - -Reference< XAccessible > ToolbarMenu_Impl::getAccessibleChild( sal_Int32 index ) -{ - for( const auto& pEntry : maEntryVector ) - { - if( pEntry ) - { - const sal_Int32 nCount = pEntry->getAccessibleChildCount(); - if( index < nCount ) - { - return pEntry->getAccessibleChild( index ); - } - index -= nCount; - } - } - - throw IndexOutOfBoundsException(); -} - - -Reference< XAccessible > ToolbarMenu_Impl::getAccessibleChild( Control const * pControl, sal_Int32 childIndex ) -{ - for( const auto& pEntry : maEntryVector ) - { - if( pEntry && (pEntry->mpControl.get() == pControl) ) - { - return pEntry->getAccessibleChild( childIndex ); - } - } - - throw IndexOutOfBoundsException(); -} - - -void ToolbarMenu_Impl::selectAccessibleChild( sal_Int32 nChildIndex ) -{ - const int nEntryCount = maEntryVector.size(); - for( int nEntry = 0; nEntry < nEntryCount; nEntry++ ) - { - ToolbarMenuEntry* const pEntry = maEntryVector[nEntry].get(); - if( pEntry ) - { - const sal_Int32 nCount = pEntry->getAccessibleChildCount(); - if( nChildIndex < nCount ) - { - if( pEntry->mpControl ) - { - Reference< XAccessibleSelection > xSel( pEntry->GetAccessible(), UNO_QUERY_THROW ); - xSel->selectAccessibleChild(nChildIndex); - } - else if( pEntry->mnEntryId != TITLE_ID ) - { - mrMenu.implSelectEntry( nEntry ); - } - return; - } - nChildIndex -= nCount; - } - } - - throw IndexOutOfBoundsException(); -} - - -bool ToolbarMenu_Impl::isAccessibleChildSelected( sal_Int32 nChildIndex ) -{ - const int nEntryCount = maEntryVector.size(); - for( int nEntry = 0; nEntry < nEntryCount; nEntry++ ) - { - ToolbarMenuEntry* const pEntry = maEntryVector[nEntry].get(); - if( pEntry ) - { - const sal_Int32 nCount = pEntry->getAccessibleChildCount(); - if( nChildIndex < nCount ) - { - if( mnHighlightedEntry == nEntry ) - { - if( pEntry->mpControl ) - { - Reference< XAccessibleSelection > xSel( pEntry->GetAccessible(), UNO_QUERY_THROW ); - xSel->isAccessibleChildSelected(nChildIndex); - } - return true; - } - else - { - return false; - } - } - nChildIndex -= nCount; - } - } - - throw IndexOutOfBoundsException(); -} - - -void ToolbarMenu_Impl::clearAccessibleSelection() -{ - if( mnHighlightedEntry != -1 ) - { - mrMenu.Invalidate(); - mnHighlightedEntry = -1; - } -} - - -void ToolbarMenu_Impl::notifyHighlightedEntry() -{ - if( !(mxAccessible.is() && mxAccessible->HasAccessibleListeners()) ) - return; - - ToolbarMenuEntry* pEntry = implGetEntry( mnHighlightedEntry ); - if( !(pEntry && pEntry->mbEnabled && (pEntry->mnEntryId != TITLE_ID)) ) - return; - - Any aNew; - Any aOld( mxOldSelection ); - if( pEntry->mpControl ) - { - sal_Int32 nChildIndex = 0; - // todo: if other controls than ValueSet are allowed, adapt this code - ValueSet* pValueSet = dynamic_cast< ValueSet* >( pEntry->mpControl.get() ); - if( pValueSet ) - nChildIndex = static_cast< sal_Int32 >( pValueSet->GetItemPos( pValueSet->GetSelectedItemId() ) ); - - if( (nChildIndex >= pEntry->getAccessibleChildCount()) || (nChildIndex < 0) ) - return; - - aNew <<= getAccessibleChild( pEntry->mpControl, nChildIndex ); - } - else - { - aNew <<= pEntry->GetAccessible(); - } - - fireAccessibleEvent( AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, aOld, aNew ); - fireAccessibleEvent( AccessibleEventId::SELECTION_CHANGED, aOld, aNew ); - fireAccessibleEvent( AccessibleEventId::STATE_CHANGED, Any(), Any( AccessibleStateType::FOCUSED ) ); - aNew >>= mxOldSelection; -} - - -ToolbarMenuEntry* ToolbarMenu_Impl::implGetEntry( int nEntry ) const -{ - if( (nEntry < 0) || (nEntry >= static_cast<int>(maEntryVector.size()) ) ) - return nullptr; - - return maEntryVector[nEntry].get(); -} - - -IMPL_LINK_NOARG( ToolbarMenu, HighlightHdl, ValueSet*, void ) -{ - mpImpl->notifyHighlightedEntry(); -} - -ToolbarMenu::ToolbarMenu( const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParentWindow, WinBits nBits ) - : ToolbarPopup(rFrame, pParentWindow, nBits) -{ - mpImpl.reset( new ToolbarMenu_Impl( *this ) ); - - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - SetControlBackground( rStyleSettings.GetMenuColor() ); - - initWindow(); -} - - -ToolbarMenu::~ToolbarMenu() -{ - disposeOnce(); -} - -void ToolbarMenu::dispose() -{ - mpImpl->mxAccessible.clear(); - - std::unique_ptr<ToolbarMenu_Impl> pImpl = std::move(mpImpl); - mpImpl.reset(); - - pImpl->maEntryVector.clear(); - - ToolbarPopup::dispose(); -} - - -int ToolbarMenu::getSelectedEntryId() const -{ - ToolbarMenuEntry* pEntry = implGetEntry( mpImpl->mnSelectedEntry ); - return pEntry ? pEntry->mnEntryId : -1; -} - - -int ToolbarMenu::getHighlightedEntryId() const -{ - ToolbarMenuEntry* pEntry = implGetEntry( mpImpl->mnHighlightedEntry ); - return pEntry ? pEntry->mnEntryId : -1; -} - - -void ToolbarMenu::checkEntry( int nEntryId, bool bChecked ) -{ - ToolbarMenuEntry* pEntry = implSearchEntry( nEntryId ); - if( pEntry && pEntry->mbChecked != bChecked ) - { - pEntry->mbChecked = bChecked; - Invalidate(); - } -} - - -void ToolbarMenu::enableEntry( int nEntryId, bool bEnable ) -{ - ToolbarMenuEntry* pEntry = implSearchEntry( nEntryId ); - if( pEntry && pEntry->mbEnabled != bEnable ) - { - pEntry->mbEnabled = bEnable; - if( pEntry->mpControl ) - { - pEntry->mpControl->Enable( bEnable ); - - // hack for the valueset to make it paint itself anew - pEntry->mpControl->Resize(); - } - Invalidate(); - } -} - - -void ToolbarMenu::setEntryText( int nEntryId, const OUString& rStr ) -{ - ToolbarMenuEntry* pEntry = implSearchEntry( nEntryId ); - if( pEntry && pEntry->maText != rStr ) - { - pEntry->maText = rStr; - mpImpl->maSize = implCalcSize(); - if( IsVisible() ) - Invalidate(); - } -} - - -void ToolbarMenu::setEntryImage( int nEntryId, const Image& rImage ) -{ - ToolbarMenuEntry* pEntry = implSearchEntry( nEntryId ); - if( pEntry && pEntry->maImage != rImage ) - { - pEntry->maImage = rImage; - mpImpl->maSize = implCalcSize(); - if( IsVisible() ) - Invalidate(); - } -} - - -void ToolbarMenu::initWindow() -{ - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - - // FIXME RenderContext - SetPointFont(*this, rStyleSettings.GetMenuFont()); - SetBackground(Wallpaper(GetControlBackground())); - SetTextColor(rStyleSettings.GetMenuTextColor()); - SetTextFillColor(); - SetLineColor(); - - mpImpl->maSize = implCalcSize(); -} - - -static long ImplGetNativeCheckAndRadioSize(vcl::RenderContext const & rRenderContext, long& rCheckHeight, long& rRadioHeight, long &rMaxWidth ) -{ - rMaxWidth = rCheckHeight = rRadioHeight = 0; - - ImplControlValue aVal; - tools::Rectangle aNativeBounds; - tools::Rectangle aNativeContent; - Point tmp( 0, 0 ); - tools::Rectangle aCtrlRegion( tmp, Size( 100, 15 ) ); - if (rRenderContext.IsNativeControlSupported(ControlType::MenuPopup, ControlPart::MenuItemCheckMark)) - { - if (rRenderContext.GetNativeControlRegion(ControlType::MenuPopup, ControlPart::MenuItemCheckMark, - aCtrlRegion, ControlState::ENABLED, aVal, - aNativeBounds, aNativeContent) - ) - { - rCheckHeight = aNativeBounds.GetHeight(); - rMaxWidth = aNativeContent.GetWidth(); - } - } - if (rRenderContext.IsNativeControlSupported(ControlType::MenuPopup, ControlPart::MenuItemRadioMark)) - { - if (rRenderContext.GetNativeControlRegion(ControlType::MenuPopup, ControlPart::MenuItemRadioMark, - aCtrlRegion, ControlState::ENABLED, aVal, - aNativeBounds, aNativeContent) - ) - { - rRadioHeight = aNativeBounds.GetHeight(); - rMaxWidth = std::max (rMaxWidth, aNativeContent.GetWidth()); - } - } - return std::max(rCheckHeight, rRadioHeight); -} - -#define gfxExtra 7 - -Size ToolbarMenu::implCalcSize() -{ - const long nFontHeight = GetTextHeight(); - long nExtra = nFontHeight/4; - - Size aSz; - Size aMaxImgSz; - long nMaxTextWidth = 0; - long nMinMenuItemHeight = nFontHeight+2; - - const StyleSettings& rSettings = GetSettings().GetStyleSettings(); - const bool bUseImages = rSettings.GetUseImagesInMenus(); - - // get maximum image size - if( bUseImages ) - { - for( const auto& pEntry : mpImpl->maEntryVector ) - { - if( pEntry && pEntry->mbHasImage ) - { - Size aImgSz( pEntry->maImage.GetSizePixel() ); - nMinMenuItemHeight = std::max( nMinMenuItemHeight, aImgSz.Height() + 6 ); - aMaxImgSz.setWidth( std::max( aMaxImgSz.Width(), aImgSz.Width() ) ); - } - } - } - - mpImpl->mnCheckPos = nExtra; - mpImpl->mnImagePos = nExtra; - mpImpl->mnTextPos = mpImpl->mnImagePos + aMaxImgSz.Width(); - - if ( aMaxImgSz.Width() ) - mpImpl->mnTextPos += std::max( nExtra, 7L ); - - // set heights, calc maximum width - for( const auto& pEntry : mpImpl->maEntryVector ) - { - if( pEntry ) - { - // Text: - if( pEntry->mbHasText || pEntry->mbHasImage ) - { - pEntry->maSize.setHeight( nMinMenuItemHeight ); - - if( pEntry->mbHasText ) - { - long nTextWidth = GetCtrlTextWidth( pEntry->maText ) + mpImpl->mnTextPos + nExtra; - nMaxTextWidth = std::max( nTextWidth, nMaxTextWidth ); - } - } - // Control: - else if( pEntry->mpControl ) - { - Size aControlSize( pEntry->mpControl->GetOutputSizePixel() ); - - nMaxTextWidth = std::max( aControlSize.Width(), nMaxTextWidth ); - pEntry->maSize.setHeight( aControlSize.Height() + 1 ); - } - - if( pEntry->HasCheck() && !pEntry->mbHasImage ) - { - if (IsNativeControlSupported(ControlType::MenuPopup, (pEntry->mnBits & MenuItemBits::RADIOCHECK) - ? ControlPart::MenuItemCheckMark - : ControlPart::MenuItemRadioMark ) ) - { - long nCheckHeight = 0, nRadioHeight = 0, nMaxCheckWidth = 0; - ImplGetNativeCheckAndRadioSize(*this, nCheckHeight, nRadioHeight, nMaxCheckWidth); - - long nCtrlHeight = (pEntry->mnBits & MenuItemBits::RADIOCHECK) ? nCheckHeight : nRadioHeight; - nMaxTextWidth += nCtrlHeight + gfxExtra; - } - else if( pEntry->mbChecked ) - { - long nSymbolWidth = (nFontHeight*25)/40; - if ( pEntry->mnBits & MenuItemBits::RADIOCHECK ) - nSymbolWidth = nFontHeight/2; - - nMaxTextWidth += nSymbolWidth; - } - } - } - } - - aSz.setWidth( nMaxTextWidth + (BORDER_X<<1) ); - - // positionate controls - int nY = BORDER_Y; - for( const auto& pEntry : mpImpl->maEntryVector ) - { - if (pEntry) - { - pEntry->maSize.setWidth( nMaxTextWidth ); - - if( pEntry->mpControl ) - { - Size aControlSize( pEntry->mpControl->GetOutputSizePixel() ); - Point aControlPos( (aSz.Width() - aControlSize.Width())>>1, nY); - - pEntry->mpControl->SetPosPixel( aControlPos ); - - pEntry->maRect = tools::Rectangle( aControlPos, aControlSize ); - } - else - { - pEntry->maRect = tools::Rectangle( Point( 0, nY ), pEntry->maSize ); - } - - nY += pEntry->maSize.Height(); - } - else - { - nY += SEPARATOR_HEIGHT; - } - } - - aSz.AdjustHeight(nY + BORDER_Y ); - - return aSz; -} - - -void ToolbarMenu::GetFocus() -{ - if( mpImpl && mpImpl->mnHighlightedEntry == -1 ) - implChangeHighlightEntry( 0 ); - - ToolbarPopup::GetFocus(); -} - - -void ToolbarMenu::LoseFocus() -{ - if( mpImpl && mpImpl->mnHighlightedEntry != -1 ) - implChangeHighlightEntry( -1 ); - - ToolbarPopup::LoseFocus(); -} - - -void ToolbarMenu::appendEntry( int nEntryId, const OUString& rStr, MenuItemBits nItemBits ) -{ - appendEntry( std::make_unique<ToolbarMenuEntry>( *this, nEntryId, rStr, nItemBits ) ); -} - - -void ToolbarMenu::appendEntry( int nEntryId, const OUString& rStr, const Image& rImage ) -{ - appendEntry( std::make_unique<ToolbarMenuEntry>( *this, nEntryId, rImage, rStr, MenuItemBits::NONE ) ); -} - - -void ToolbarMenu::appendEntry( int nEntryId, Control* pControl ) -{ - appendEntry( std::make_unique<ToolbarMenuEntry>( *this, nEntryId, pControl, MenuItemBits::NONE ) ); -} - - -void ToolbarMenu::appendEntry( std::unique_ptr<ToolbarMenuEntry> pEntry ) -{ - mpImpl->maEntryVector.push_back(std::move(pEntry)); - mpImpl->maSize = implCalcSize(); - if (IsVisible()) - Invalidate(); -} - - -void ToolbarMenu::appendSeparator() -{ - appendEntry( nullptr ); -} - - -/** creates an empty ValueSet that is initialized and can be inserted with appendEntry. */ -VclPtr<ValueSet> ToolbarMenu::createEmptyValueSetControl() -{ - VclPtr<ValueSet> pSet = VclPtr<ValueSet>::Create( this, WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT ); - pSet->EnableFullItemMode( false ); - pSet->SetColor( GetControlBackground() ); - pSet->SetHighlightHdl( LINK( this, ToolbarMenu, HighlightHdl ) ); - return pSet; -} - - -ToolbarMenuEntry* ToolbarMenu::implGetEntry( int nEntry ) const -{ - return mpImpl->implGetEntry( nEntry ); -} - - -ToolbarMenuEntry* ToolbarMenu::implSearchEntry( int nEntryId ) const -{ - for( const auto& p : mpImpl->maEntryVector ) - { - if( p && p->mnEntryId == nEntryId ) - { - return p.get(); - } - } - - return nullptr; -} - - -void ToolbarMenu::implHighlightEntry(vcl::RenderContext& rRenderContext, int nHighlightEntry) -{ - Size aSz(GetOutputSizePixel()); - long nX = 0; - long nY = 0; - - const int nEntryCount = mpImpl->maEntryVector.size(); - - for (int nEntry = 0; nEntry < nEntryCount; nEntry++) - { - ToolbarMenuEntry* const pEntry = mpImpl->maEntryVector[nEntry].get(); - if (pEntry && (nEntry == nHighlightEntry)) - { - // no highlights for controls only items - if (pEntry->mpControl) - { - break; - } - - bool bRestoreLineColor = false; - Color oldLineColor; - bool bDrawItemRect = true; - - tools::Rectangle aItemRect(Point(nX, nY), Size(aSz.Width(), pEntry->maSize.Height())); - if (pEntry->mnBits & MenuItemBits::POPUPSELECT) - { - long nFontHeight = GetTextHeight(); - aItemRect.AdjustRight( -(nFontHeight + nFontHeight / 4) ); - } - - if (rRenderContext.IsNativeControlSupported(ControlType::MenuPopup, ControlPart::Entire)) - { - Size aPxSize(GetOutputSizePixel()); - rRenderContext.Push(PushFlags::CLIPREGION); - rRenderContext.IntersectClipRegion(tools::Rectangle(Point(nX, nY), Size(aSz.Width(), pEntry->maSize.Height()))); - tools::Rectangle aCtrlRect(Point(nX, 0), Size(aPxSize.Width() - nX, aPxSize.Height())); - rRenderContext.DrawNativeControl(ControlType::MenuPopup, ControlPart::Entire, aCtrlRect, - ControlState::ENABLED, ImplControlValue(), OUString()); - if (rRenderContext.IsNativeControlSupported(ControlType::MenuPopup, ControlPart::MenuItem)) - { - bDrawItemRect = false; - ControlState eState = ControlState::SELECTED | (pEntry->mbEnabled ? ControlState::ENABLED : ControlState::NONE); - if (!rRenderContext.DrawNativeControl(ControlType::MenuPopup, ControlPart::MenuItem, aItemRect, - eState, ImplControlValue(), OUString())) - { - bDrawItemRect = true; - } - } - else - { - bDrawItemRect = true; - } - rRenderContext.Pop(); - } - if (bDrawItemRect) - { - if (pEntry->mbEnabled) - { - rRenderContext.SetFillColor(rRenderContext.GetSettings().GetStyleSettings().GetMenuHighlightColor()); - } - else - { - rRenderContext.SetFillColor(); - oldLineColor = rRenderContext.GetLineColor(); - rRenderContext.SetLineColor(rRenderContext.GetSettings().GetStyleSettings().GetMenuHighlightColor()); - bRestoreLineColor = true; - } - rRenderContext.DrawRect(aItemRect); - } - implPaint(rRenderContext, pEntry, true/*bHighlight*/); - if (bRestoreLineColor) - rRenderContext.SetLineColor(oldLineColor); - break; - } - - nY += pEntry ? pEntry->maSize.Height() : SEPARATOR_HEIGHT; - } -} - - -void ToolbarMenu::implSelectEntry( int nSelectedEntry ) -{ - mpImpl->mnSelectedEntry = nSelectedEntry; - - ToolbarMenuEntry* pEntry = nullptr; - if( nSelectedEntry != -1 ) - pEntry = mpImpl->maEntryVector[ nSelectedEntry ].get(); - - if( pEntry ) - mpImpl->maSelectHdl.Call( this ); -} - - -void ToolbarMenu::MouseButtonDown( const MouseEvent& rMEvt ) -{ - implHighlightAtPosition(rMEvt); - implSelectEntry(mpImpl->mnHighlightedEntry); -} - - -void ToolbarMenu::MouseButtonUp( const MouseEvent& ) -{ -} - - -void ToolbarMenu::MouseMove( const MouseEvent& rMEvt ) -{ - if (!IsVisible()) - return; - - implHighlightAtPosition(rMEvt); -} - - -void ToolbarMenu::implHighlightAtPosition(const MouseEvent& rMEvt) -{ - long nMouseY = rMEvt.GetPosPixel().Y(); - Size aOutSz = GetOutputSizePixel(); - if ( ( nMouseY >= 0 ) && ( nMouseY < aOutSz.Height() ) ) - { - long nY = 0; - bool bHighlighted = false; - - const int nEntryCount = mpImpl->maEntryVector.size(); - for( int nEntry = 0; nEntry < nEntryCount; nEntry++ ) - { - ToolbarMenuEntry* pEntry = mpImpl->maEntryVector[nEntry].get(); - if( pEntry ) - { - long nOldY = nY; - nY += pEntry->maSize.Height(); - - if( pEntry->mnEntryId != TITLE_ID ) - { - if ( ( nOldY <= nMouseY ) && ( nY > nMouseY ) ) - { - if( nEntry != mpImpl->mnHighlightedEntry ) - { - implChangeHighlightEntry( nEntry ); - } - bHighlighted = true; - } - } - } - else - { - nY += SEPARATOR_HEIGHT; - } - } - if ( !bHighlighted ) - implChangeHighlightEntry( -1 ); - } - else - { - implChangeHighlightEntry( -1 ); - } -} - - -void ToolbarMenu::implChangeHighlightEntry(int nEntry) -{ - mpImpl->mnHighlightedEntry = nEntry; - Invalidate(); - - mpImpl->notifyHighlightedEntry(); -} - - -static bool implCheckSubControlCursorMove( Control* pControl, bool bUp, int& nLastColumn ) -{ - ValueSet* pValueSet = dynamic_cast< ValueSet* >( pControl ); - if( pValueSet ) - { - size_t nItemPos = pValueSet->GetItemPos( pValueSet->GetSelectedItemId() ); - if( nItemPos != VALUESET_ITEM_NOTFOUND ) - { - const sal_uInt16 nColCount = pValueSet->GetColCount(); - const size_t nLine = nItemPos / nColCount; - - nLastColumn = nItemPos - (nLine * nColCount); - - if( bUp ) - { - return nLine > 0; - } - else - { - const size_t nLineCount = (pValueSet->GetItemCount() + nColCount - 1) / nColCount; - return (nLine+1) < nLineCount; - } - } - } - - return false; -} - - -ToolbarMenuEntry* ToolbarMenu::implCursorUpDown( bool bUp, bool bHomeEnd ) -{ - int n = 0, nLoop = 0; - if( !bHomeEnd ) - { - n = mpImpl->mnHighlightedEntry; - if( n == -1 ) - { - if( bUp ) - n = 0; - else - n = mpImpl->maEntryVector.size()-1; - } - else - { - // if we have a currently selected entry and - // cursor keys are used then check if this entry - // has a control that can use those cursor keys - ToolbarMenuEntry* pData = mpImpl->maEntryVector[n].get(); - if( pData && pData->mpControl && !pData->mbHasText ) - { - if( implCheckSubControlCursorMove( pData->mpControl, bUp, mpImpl->mnLastColumn ) ) - return pData; - } - } - nLoop = n; - } - else - { - // absolute positioning - if( bUp ) - { - n = mpImpl->maEntryVector.size(); - nLoop = n-1; - } - else - { - n = -1; - nLoop = mpImpl->maEntryVector.size()-1; - } - } - - do - { - if( bUp ) - { - if ( n ) - n--; - else - if( mpImpl->mnHighlightedEntry == -1 ) - n = mpImpl->maEntryVector.size()-1; - else - break; - } - else - { - if( n < (static_cast<int>(mpImpl->maEntryVector.size())-1) ) - n++; - else - if( mpImpl->mnHighlightedEntry == -1 ) - n = 0; - else - break; - } - - ToolbarMenuEntry* pData = mpImpl->maEntryVector[n].get(); - if( pData && (pData->mnEntryId != TITLE_ID) ) - { - implChangeHighlightEntry( n ); - return pData; - } - } while ( n != nLoop ); - - return nullptr; -} - - -void ToolbarMenu_Impl::implHighlightControl( sal_uInt16 nCode, Control* pControl ) -{ - ValueSet* pValueSet = dynamic_cast< ValueSet* >( pControl ); - if( !pValueSet ) - return; - - const size_t nItemCount = pValueSet->GetItemCount(); - size_t nItemPos = VALUESET_ITEM_NOTFOUND; - switch( nCode ) - { - case KEY_UP: - { - const sal_uInt16 nColCount = pValueSet->GetColCount(); - const sal_uInt16 nLastLine = nItemCount / nColCount; - nItemPos = std::min( static_cast<size_t>(((nLastLine-1) * nColCount) + mnLastColumn), nItemCount-1 ); - break; - } - case KEY_DOWN: - nItemPos = std::min( static_cast<size_t>(mnLastColumn), nItemCount-1 ); - break; - case KEY_END: - nItemPos = nItemCount -1; - break; - case KEY_HOME: - nItemPos = 0; - break; - } - pValueSet->SelectItem( pValueSet->GetItemId( nItemPos ) ); - notifyHighlightedEntry(); -} - - -void ToolbarMenu::KeyInput( const KeyEvent& rKEvent ) -{ - Control* pForwardControl = nullptr; - sal_uInt16 nCode = rKEvent.GetKeyCode().GetCode(); - switch ( nCode ) - { - case KEY_UP: - case KEY_DOWN: - { - int nOldEntry = mpImpl->mnHighlightedEntry; - ToolbarMenuEntry*p = implCursorUpDown( nCode == KEY_UP, false ); - if( p && p->mpControl ) - { - if( nOldEntry != mpImpl->mnHighlightedEntry ) - { - mpImpl->implHighlightControl( nCode, p->mpControl ); - } - else - { - // in case we are in a system floating window, GrabFocus does not work :-/ - pForwardControl = p->mpControl; - } - } - } - break; - case KEY_END: - case KEY_HOME: - { - ToolbarMenuEntry* p = implCursorUpDown( nCode == KEY_END, true ); - if( p && p->mpControl ) - { - mpImpl->implHighlightControl( nCode, p->mpControl ); - } - } - break; - case KEY_F6: - case KEY_ESCAPE: - { - // Ctrl-F6 acts like ESC here, the menu bar however will then put the focus in the document - if( nCode == KEY_F6 && !rKEvent.GetKeyCode().IsMod1() ) - break; - - implSelectEntry( -1 ); - } - break; - - case KEY_RETURN: - { - ToolbarMenuEntry* pEntry = implGetEntry( mpImpl->mnHighlightedEntry ); - if ( pEntry && pEntry->mbEnabled && (pEntry->mnEntryId != TITLE_ID) ) - { - if( pEntry->mpControl ) - { - pForwardControl = pEntry->mpControl; - } - else - { - implSelectEntry( mpImpl->mnHighlightedEntry ); - } - } - } - break; - default: - { - ToolbarMenuEntry* pEntry = implGetEntry( mpImpl->mnHighlightedEntry ); - if ( pEntry && pEntry->mbEnabled && pEntry->mpControl && !pEntry->mbHasText ) - { - pForwardControl = pEntry->mpControl; - } - } - - } - if( pForwardControl ) - pForwardControl->KeyInput( rKEvent ); - -} - - -static void ImplPaintCheckBackground(vcl::RenderContext& rRenderContext, vcl::Window const & rWindow, const tools::Rectangle& i_rRect, bool i_bHighlight ) -{ - bool bNativeOk = false; - if (rRenderContext.IsNativeControlSupported(ControlType::Toolbar, ControlPart::Button)) - { - ImplControlValue aControlValue; - aControlValue.setTristateVal(ButtonValue::On); - - bNativeOk = rRenderContext.DrawNativeControl(ControlType::Toolbar, ControlPart::Button, - i_rRect, - ControlState::PRESSED | ControlState::ENABLED, - aControlValue, OUString()); - } - - if (!bNativeOk) - { - const StyleSettings& rSettings = rRenderContext.GetSettings().GetStyleSettings(); - Color aColor(i_bHighlight ? rSettings.GetMenuHighlightTextColor() : rSettings.GetHighlightColor()); - vcl::RenderTools::DrawSelectionBackground(rRenderContext, rWindow, i_rRect, 0, i_bHighlight, true, false, nullptr, 2, &aColor); - } -} - -void ToolbarMenu::implPaint(vcl::RenderContext& rRenderContext, ToolbarMenuEntry const * pThisOnly, bool bHighlighted) -{ - long nFontHeight = GetTextHeight(); - - long nCheckHeight = 0, nRadioHeight = 0, nMaxCheckWidth = 0; - ImplGetNativeCheckAndRadioSize(rRenderContext, nCheckHeight, nRadioHeight, nMaxCheckWidth); - - DecorationView aDecoView(&rRenderContext); - const StyleSettings& rSettings = rRenderContext.GetSettings().GetStyleSettings(); - const bool bUseImages = rSettings.GetUseImagesInMenus(); - - int nOuterSpace = 0; // ImplGetSVData()->maNWFData.mnMenuFormatExtraBorder; - Point aTopLeft(nOuterSpace, nOuterSpace), aTmpPos; - - Size aOutSz(GetOutputSizePixel()); - for (const auto& pEntry : mpImpl->maEntryVector) - { - Point aPos(aTopLeft); - - if ((pEntry == nullptr) && !pThisOnly) - { - // Separator - aTmpPos.setY( aPos.Y() + ((SEPARATOR_HEIGHT - 2) / 2) ); - aTmpPos.setX( aPos.X() + 2 + nOuterSpace ); - rRenderContext.SetLineColor(rSettings.GetShadowColor()); - rRenderContext.DrawLine(aTmpPos, Point(aOutSz.Width() - 3 - 2 * nOuterSpace, aTmpPos.Y())); - aTmpPos.AdjustY( 1 ); - rRenderContext.SetLineColor(rSettings.GetLightColor()); - rRenderContext.DrawLine(aTmpPos, Point( aOutSz.Width() - 3 - 2 * nOuterSpace, aTmpPos.Y())); - rRenderContext.SetLineColor(); - } - else if (!pThisOnly || (pEntry.get() == pThisOnly)) - { - const bool bTitle = pEntry->mnEntryId == TITLE_ID; - - if (pThisOnly && bHighlighted) - rRenderContext.SetTextColor(rSettings.GetMenuHighlightTextColor()); - - if( aPos.Y() >= 0 ) - { - long nTextOffsetY = (pEntry->maSize.Height() - nFontHeight) / 2; - - DrawTextFlags nTextStyle = DrawTextFlags::NONE; - DrawSymbolFlags nSymbolStyle = DrawSymbolFlags::NONE; - DrawImageFlags nImageStyle = DrawImageFlags::NONE; - - if (!pEntry->mbEnabled) - { - nTextStyle |= DrawTextFlags::Disable; - nSymbolStyle |= DrawSymbolFlags::Disable; - nImageStyle |= DrawImageFlags::Disable; - } - - tools::Rectangle aOuterCheckRect(Point(aPos.X() + mpImpl->mnCheckPos, aPos.Y()), - Size(pEntry->maSize.Height(), pEntry->maSize.Height())); - aOuterCheckRect.AdjustLeft(1 ); - aOuterCheckRect.AdjustRight( -1 ); - aOuterCheckRect.AdjustTop(1 ); - aOuterCheckRect.AdjustBottom( -1 ); - - if (bTitle) - { - // fill the background - tools::Rectangle aRect(aTopLeft, Size(aOutSz.Width(), pEntry->maSize.Height())); - rRenderContext.SetFillColor(rSettings.GetDialogColor()); - rRenderContext.SetLineColor(); - rRenderContext.DrawRect(aRect); - rRenderContext.SetLineColor(rSettings.GetLightColor()); - rRenderContext.DrawLine(aRect.TopLeft(), aRect.TopRight()); - rRenderContext.SetLineColor(rSettings.GetShadowColor()); - rRenderContext.DrawLine(aRect.BottomLeft(), aRect.BottomRight()); - } - - // CheckMark - if (pEntry->HasCheck()) - { - // draw selection transparent marker if checked - // onto that either a checkmark or the item image - // will be painted - // however do not do this if native checks will be painted since - // the selection color too often does not fit the theme's check and/or radio - - if (!pEntry->mbHasImage) - { - if (rRenderContext.IsNativeControlSupported(ControlType::MenuPopup, - (pEntry->mnBits & MenuItemBits::RADIOCHECK) - ? ControlPart::MenuItemCheckMark - : ControlPart::MenuItemRadioMark)) - { - ControlPart nPart = ((pEntry->mnBits & MenuItemBits::RADIOCHECK) - ? ControlPart::MenuItemRadioMark - : ControlPart::MenuItemCheckMark); - - ControlState nState = ControlState::NONE; - - if (pEntry->mbChecked) - nState |= ControlState::PRESSED; - - if (pEntry->mbEnabled) - nState |= ControlState::ENABLED; - - if ( bHighlighted ) - nState |= ControlState::SELECTED; - - long nCtrlHeight = (pEntry->mnBits & MenuItemBits::RADIOCHECK) ? nCheckHeight : nRadioHeight; - aTmpPos.setX( aOuterCheckRect.Left() + (aOuterCheckRect.GetWidth() - nCtrlHeight) / 2 ); - aTmpPos.setY( aOuterCheckRect.Top() + (aOuterCheckRect.GetHeight() - nCtrlHeight) / 2 ); - - tools::Rectangle aCheckRect(aTmpPos, Size(nCtrlHeight, nCtrlHeight)); - rRenderContext.DrawNativeControl(ControlType::MenuPopup, nPart, aCheckRect, - nState, ImplControlValue(), OUString()); - aPos.setX(aPos.getX() + nCtrlHeight + gfxExtra); - } - else if (pEntry->mbChecked) // by default do nothing for unchecked items - { - ImplPaintCheckBackground(rRenderContext, *this, aOuterCheckRect, pThisOnly && bHighlighted); - - SymbolType eSymbol; - Size aSymbolSize; - if (pEntry->mnBits & MenuItemBits::RADIOCHECK) - { - eSymbol = SymbolType::RADIOCHECKMARK; - aSymbolSize = Size(nFontHeight / 2, nFontHeight / 2); - } - else - { - eSymbol = SymbolType::CHECKMARK; - aSymbolSize = Size((nFontHeight * 25) / 40, nFontHeight / 2); - } - aTmpPos.setX( aOuterCheckRect.Left() + (aOuterCheckRect.GetWidth() - aSymbolSize.Width())/2 ); - aTmpPos.setY( aOuterCheckRect.Top() + (aOuterCheckRect.GetHeight() - aSymbolSize.Height())/2 ); - tools::Rectangle aRect( aTmpPos, aSymbolSize ); - aDecoView.DrawSymbol(aRect, eSymbol, GetTextColor(), nSymbolStyle); - aPos.setX(aPos.getX() + aSymbolSize.getWidth( ) + gfxExtra); - } - } - } - - // Image: - if (pEntry->mbHasImage && bUseImages) - { - if (pEntry->mbChecked) - ImplPaintCheckBackground(rRenderContext, *this, aOuterCheckRect, pThisOnly && bHighlighted); - aTmpPos = aOuterCheckRect.TopLeft(); - aTmpPos.AdjustX((aOuterCheckRect.GetWidth()-pEntry->maImage.GetSizePixel().Width())/2 ); - aTmpPos.AdjustY((aOuterCheckRect.GetHeight()-pEntry->maImage.GetSizePixel().Height())/2 ); - rRenderContext.DrawImage( aTmpPos, pEntry->maImage, nImageStyle ); - } - - // Text: - if (pEntry->mbHasText) - { - aTmpPos.setX( aPos.X() + (bTitle ? 4 : mpImpl->mnTextPos) ); - aTmpPos.setY( aPos.Y() ); - aTmpPos.AdjustY(nTextOffsetY ); - DrawTextFlags nStyle = nTextStyle|DrawTextFlags::Mnemonic; - - rRenderContext.DrawCtrlText(aTmpPos, pEntry->maText, 0, pEntry->maText.getLength(), nStyle); - } - - if (pThisOnly && bHighlighted) - { - // This restores the normal menu or menu bar text - // color for when it is no longer highlighted. - rRenderContext.SetTextColor(rSettings.GetMenuTextColor()); - } - } - } - - aTopLeft.AdjustY(pEntry ? pEntry->maSize.Height() : SEPARATOR_HEIGHT ); - } -} - -void ToolbarMenu::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) -{ - rRenderContext.SetFillColor(rRenderContext.GetSettings().GetStyleSettings().GetMenuColor()); - - implPaint(rRenderContext); - - if (mpImpl->mnHighlightedEntry != -1) - implHighlightEntry(rRenderContext, mpImpl->mnHighlightedEntry); -} - - -void ToolbarMenu::StateChanged( StateChangedType nType ) -{ - ToolbarPopup::StateChanged( nType ); - - if ( ( nType == StateChangedType::ControlForeground ) || ( nType == StateChangedType::ControlBackground ) ) - { - initWindow(); - Invalidate(); - } -} - - -void ToolbarMenu::DataChanged( const DataChangedEvent& rDCEvt ) -{ - ToolbarPopup::DataChanged( rDCEvt ); - - if ( (rDCEvt.GetType() == DataChangedEventType::FONTS) || - (rDCEvt.GetType() == DataChangedEventType::FONTSUBSTITUTION) || - ((rDCEvt.GetType() == DataChangedEventType::SETTINGS) && - (rDCEvt.GetFlags() & AllSettingsFlags::STYLE)) ) - { - initWindow(); - Invalidate(); - } -} - - -void ToolbarMenu::Command( const CommandEvent& rCEvt ) -{ - if ( rCEvt.GetCommand() == CommandEventId::Wheel ) - { - const CommandWheelData* pData = rCEvt.GetWheelData(); - if( !pData->GetModifier() && ( pData->GetMode() == CommandWheelMode::SCROLL ) ) - { - implCursorUpDown( pData->GetDelta() > 0, false ); - } - } -} - - -Reference< css::accessibility::XAccessible > ToolbarMenu::CreateAccessible() -{ - mpImpl->setAccessible( new ToolbarMenuAcc( *mpImpl ) ); - return Reference< XAccessible >( mpImpl->mxAccessible.get() ); -} - - class ToolbarPopupStatusListener : public svt::FrameStatusListener { public: @@ -1504,17 +176,6 @@ void ToolbarPopup::EndPopupMode() } -const Size& ToolbarMenu::getMenuSize() const -{ - return mpImpl->maSize; -} - - -void ToolbarMenu::SetSelectHdl( const Link<ToolbarMenu*,void>& rLink ) -{ - mpImpl->maSelectHdl = rLink; -} - } WeldToolbarPopup::WeldToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame, diff --git a/svtools/source/control/toolbarmenuacc.cxx b/svtools/source/control/toolbarmenuacc.cxx deleted file mode 100644 index b3d97a9ecbb4..000000000000 --- a/svtools/source/control/toolbarmenuacc.cxx +++ /dev/null @@ -1,833 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * 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 . - */ - - -#include <com/sun/star/accessibility/AccessibleEventId.hpp> -#include <com/sun/star/accessibility/AccessibleRole.hpp> -#include <com/sun/star/accessibility/AccessibleStateType.hpp> -#include <com/sun/star/lang/IndexOutOfBoundsException.hpp> - -#include <unotools/accessiblestatesethelper.hxx> - -#include <vcl/svapp.hxx> -#include <vcl/settings.hxx> -#include <tools/debug.hxx> - -#include <svtools/toolbarmenu.hxx> -#include <svtools/framestatuslistener.hxx> - -#include "toolbarmenuimp.hxx" - - -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::accessibility; - -namespace svtools { - - -ToolbarMenuAcc::ToolbarMenuAcc( ToolbarMenu_Impl& rParent ) -: ToolbarMenuAccComponentBase(m_aMutex) -, mpParent( &rParent ) -, mbIsFocused(false) -{ - mpParent->mrMenu.AddEventListener( LINK( this, ToolbarMenuAcc, WindowEventListener ) ); -} - - -ToolbarMenuAcc::~ToolbarMenuAcc() -{ - if( mpParent ) - mpParent->mrMenu.RemoveEventListener( LINK( this, ToolbarMenuAcc, WindowEventListener ) ); -} - - -IMPL_LINK( ToolbarMenuAcc, WindowEventListener, VclWindowEvent&, rEvent, void ) -{ - /* Ignore VclEventId::WindowEndPopupMode, because the UNO accessibility wrapper - * might have been destroyed by the previous VCLEventListener (if no AT tool - * is running), e.g. sub-toolbars in impress. - */ - if ( !mpParent || (rEvent.GetId() == VclEventId::WindowEndPopupMode) ) - return; - DBG_ASSERT( rEvent.GetWindow(), "Window???" ); - if( rEvent.GetWindow()->IsAccessibilityEventsSuppressed() && ( rEvent.GetId() != VclEventId::ObjectDying ) ) - return; - - switch ( rEvent.GetId() ) - { - case VclEventId::ObjectDying: - { - mpParent->mrMenu.RemoveEventListener( LINK( this, ToolbarMenuAcc, WindowEventListener ) ); - mpParent = nullptr; - } - break; - - case VclEventId::WindowGetFocus: - { - if( !mbIsFocused ) - { - mpParent->notifyHighlightedEntry(); - mbIsFocused = true; - } - } - break; - case VclEventId::WindowLoseFocus: - { - if( mbIsFocused ) - { - mbIsFocused = false; - } - } - break; - default: - { - } - break; - } -} - - -void ToolbarMenuAcc::FireAccessibleEvent( short nEventId, const Any& rOldValue, const Any& rNewValue ) -{ - if( !nEventId ) - return; - - EventListenerVector aTmpListeners( mxEventListeners ); - AccessibleEventObject aEvtObject; - - aEvtObject.EventId = nEventId; - aEvtObject.Source = static_cast<XWeak*>(this); - aEvtObject.NewValue = rNewValue; - aEvtObject.OldValue = rOldValue; - - for (auto const& tmpListener : aTmpListeners) - { - try - { - tmpListener->notifyEvent( aEvtObject ); - } - catch( Exception& ) - { - } - } -} - - -Reference< XAccessibleContext > SAL_CALL ToolbarMenuAcc::getAccessibleContext() -{ - ThrowIfDisposed(); - return this; -} - - -sal_Int32 SAL_CALL ToolbarMenuAcc::getAccessibleChildCount() -{ - const SolarMutexGuard aSolarGuard; - ThrowIfDisposed(); - - return mpParent->getAccessibleChildCount(); -} - - -Reference< XAccessible > SAL_CALL ToolbarMenuAcc::getAccessibleChild( sal_Int32 i ) -{ - const SolarMutexGuard aSolarGuard; - ThrowIfDisposed(); - - return mpParent->getAccessibleChild(i); -} - - -Reference< XAccessible > SAL_CALL ToolbarMenuAcc::getAccessibleParent() -{ - ThrowIfDisposed(); - const SolarMutexGuard aSolarGuard; - - Reference< XAccessible > xRet; - - vcl::Window* pParent = mpParent->mrMenu.GetParent(); - if( pParent ) - xRet = pParent->GetAccessible(); - - return xRet; -} - - -sal_Int32 SAL_CALL ToolbarMenuAcc::getAccessibleIndexInParent() -{ - const SolarMutexGuard aSolarGuard; - ThrowIfDisposed(); - - vcl::Window* pParent = mpParent->mrMenu.GetParent(); - if( pParent ) - { - for( sal_uInt16 i = 0, nCount = pParent->GetChildCount(); i < nCount ; i++ ) - { - if( pParent->GetChild( i ) == &mpParent->mrMenu ) - return i; - } - } - - return 0; -} - - -sal_Int16 SAL_CALL ToolbarMenuAcc::getAccessibleRole() -{ - ThrowIfDisposed(); - return AccessibleRole::LIST; -} - - -OUString SAL_CALL ToolbarMenuAcc::getAccessibleDescription() -{ - ThrowIfDisposed(); - return "ToolbarMenu"; -} - - -OUString SAL_CALL ToolbarMenuAcc::getAccessibleName() -{ - ThrowIfDisposed(); - const SolarMutexGuard aSolarGuard; - OUString aRet; - - if( mpParent ) - aRet = mpParent->mrMenu.GetAccessibleName(); - - if( aRet.isEmpty() ) - { - vcl::Window* pLabel = mpParent->mrMenu.GetAccessibleRelationLabeledBy(); - if( pLabel && pLabel != &mpParent->mrMenu ) - aRet = OutputDevice::GetNonMnemonicString( pLabel->GetText() ); - } - - return aRet; -} - - -Reference< XAccessibleRelationSet > SAL_CALL ToolbarMenuAcc::getAccessibleRelationSet() -{ - ThrowIfDisposed(); - return Reference< XAccessibleRelationSet >(); -} - - -Reference< XAccessibleStateSet > SAL_CALL ToolbarMenuAcc::getAccessibleStateSet() -{ - ThrowIfDisposed(); - ::utl::AccessibleStateSetHelper* pStateSet = new ::utl::AccessibleStateSetHelper(); - - // Set some states. - pStateSet->AddState (AccessibleStateType::ENABLED); - pStateSet->AddState (AccessibleStateType::SENSITIVE); - pStateSet->AddState (AccessibleStateType::SHOWING); - pStateSet->AddState (AccessibleStateType::VISIBLE); - pStateSet->AddState (AccessibleStateType::MANAGES_DESCENDANTS); - pStateSet->AddState (AccessibleStateType::FOCUSABLE); - if (mbIsFocused) - pStateSet->AddState (AccessibleStateType::FOCUSED); - - return pStateSet; -} - - -Locale SAL_CALL ToolbarMenuAcc::getLocale() -{ - ThrowIfDisposed(); - const SolarMutexGuard aSolarGuard; - Reference< XAccessible > xParent( getAccessibleParent() ); - Locale aRet( "", "", "" ); - - if( xParent.is() ) - { - Reference< XAccessibleContext > xParentContext( xParent->getAccessibleContext() ); - - if( xParentContext.is() ) - aRet = xParentContext->getLocale (); - } - - return aRet; -} - - -void SAL_CALL ToolbarMenuAcc::addAccessibleEventListener( const Reference< XAccessibleEventListener >& rxListener ) -{ - ThrowIfDisposed(); - ::osl::MutexGuard aGuard(m_aMutex); - - if( !rxListener.is() ) - return; - - for (auto const& eventListener : mxEventListeners) - { - if( eventListener == rxListener ) - return; - } - - mxEventListeners.push_back( rxListener ); -} - - -void SAL_CALL ToolbarMenuAcc::removeAccessibleEventListener( const Reference< XAccessibleEventListener >& rxListener ) -{ - ThrowIfDisposed(); - ::osl::MutexGuard aGuard(m_aMutex); - - if( rxListener.is() ) - { - EventListenerVector::iterator aIter = std::find(mxEventListeners.begin(), mxEventListeners.end(), rxListener); - if (aIter != mxEventListeners.end()) - mxEventListeners.erase(aIter); - } -} - - -sal_Bool SAL_CALL ToolbarMenuAcc::containsPoint( const awt::Point& aPoint ) -{ - ThrowIfDisposed(); - const awt::Rectangle aRect( getBounds() ); - const Point aSize( aRect.Width, aRect.Height ); - const Point aNullPoint, aTestPoint( aPoint.X, aPoint.Y ); - - return tools::Rectangle( aNullPoint, aSize ).IsInside( aTestPoint ); -} - - -Reference< XAccessible > SAL_CALL ToolbarMenuAcc::getAccessibleAtPoint( const awt::Point& aPoint ) -{ - const SolarMutexGuard aSolarGuard; - ThrowIfDisposed(); - - Reference< XAccessible > xRet; - - const Point aVclPoint( aPoint.X, aPoint.Y ); - - const int nEntryCount = mpParent->maEntryVector.size(); - for( int nEntry = 0; (nEntry < nEntryCount) && !xRet.is(); nEntry++ ) - { - ToolbarMenuEntry* pEntry = mpParent->maEntryVector[nEntry].get(); - if( pEntry && pEntry->maRect.IsInside( aVclPoint ) ) - { - if( pEntry->mpControl ) - { - awt::Point aChildPoint( aPoint.X - pEntry->maRect.Left(), aPoint.Y - pEntry->maRect.Top() ); - Reference< XAccessibleComponent > xComp( pEntry->GetAccessible(), UNO_QUERY_THROW ); - xRet = xComp->getAccessibleAtPoint(aChildPoint); - } - else - { - xRet.set( pEntry->GetAccessible(), UNO_QUERY ); - } - } - } - return xRet; -} - - -awt::Rectangle SAL_CALL ToolbarMenuAcc::getBounds() -{ - ThrowIfDisposed(); - const SolarMutexGuard aSolarGuard; - const Point aOutPos( mpParent->mrMenu.GetPosPixel() ); - const Size aOutSize( mpParent->mrMenu.GetOutputSizePixel() ); - awt::Rectangle aRet; - - aRet.X = aOutPos.X(); - aRet.Y = aOutPos.Y(); - aRet.Width = aOutSize.Width(); - aRet.Height = aOutSize.Height(); - - return aRet; -} - - -awt::Point SAL_CALL ToolbarMenuAcc::getLocation() -{ - ThrowIfDisposed(); - const SolarMutexGuard aSolarGuard; - const Point aOutPos( mpParent->mrMenu.GetPosPixel() ); - return awt::Point( aOutPos.X(), aOutPos.Y() ); -} - - -awt::Point SAL_CALL ToolbarMenuAcc::getLocationOnScreen() -{ - ThrowIfDisposed(); - const SolarMutexGuard aSolarGuard; - const Point aScreenPos( mpParent->mrMenu.OutputToAbsoluteScreenPixel( Point() ) ); - return awt::Point( aScreenPos.X(), aScreenPos.Y() ); -} - - -awt::Size SAL_CALL ToolbarMenuAcc::getSize() -{ - ThrowIfDisposed(); - const SolarMutexGuard aSolarGuard; - const Size aOutSize( mpParent->mrMenu.GetOutputSizePixel() ); - return awt::Size( aOutSize.Width(), aOutSize.Height() ); -} - -void SAL_CALL ToolbarMenuAcc::grabFocus() -{ - ThrowIfDisposed(); - const SolarMutexGuard aSolarGuard; - mpParent->mrMenu.GrabFocus(); -} - -sal_Int32 SAL_CALL ToolbarMenuAcc::getForeground() -{ - ThrowIfDisposed(); - Color nColor = Application::GetSettings().GetStyleSettings().GetMenuTextColor(); - return static_cast<sal_Int32>(nColor); -} - -sal_Int32 SAL_CALL ToolbarMenuAcc::getBackground() -{ - ThrowIfDisposed(); - Color nColor = Application::GetSettings().GetStyleSettings().GetMenuColor(); - return static_cast<sal_Int32>(nColor); -} - -void SAL_CALL ToolbarMenuAcc::selectAccessibleChild( sal_Int32 nChildIndex ) -{ - const SolarMutexGuard aSolarGuard; - ThrowIfDisposed(); - - mpParent->selectAccessibleChild( nChildIndex ); -} - -sal_Bool SAL_CALL ToolbarMenuAcc::isAccessibleChildSelected( sal_Int32 nChildIndex ) -{ - const SolarMutexGuard aSolarGuard; - ThrowIfDisposed(); - return mpParent->isAccessibleChildSelected( nChildIndex ); -} - - -void SAL_CALL ToolbarMenuAcc::clearAccessibleSelection() -{ - const SolarMutexGuard aSolarGuard; - ThrowIfDisposed(); - mpParent->clearAccessibleSelection(); -} - - -void SAL_CALL ToolbarMenuAcc::selectAllAccessibleChildren() -{ - ThrowIfDisposed(); - // unsupported due to single selection only -} - - -sal_Int32 SAL_CALL ToolbarMenuAcc::getSelectedAccessibleChildCount() -{ - const SolarMutexGuard aSolarGuard; - ThrowIfDisposed(); - - return mpParent->mnHighlightedEntry != -1 ? 1 : 0; -} - - -Reference< XAccessible > SAL_CALL ToolbarMenuAcc::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) -{ - ThrowIfDisposed(); - const SolarMutexGuard aSolarGuard; - - if( (mpParent->mnHighlightedEntry != -1) && (nSelectedChildIndex == 0) ) - { - ToolbarMenuEntry* pEntry = mpParent->maEntryVector[ mpParent->mnHighlightedEntry ].get(); - if( pEntry ) - { - if( pEntry->mpControl ) - { - Reference< XAccessibleSelection > xSel( pEntry->GetAccessible(), UNO_QUERY_THROW ); - return xSel->getSelectedAccessibleChild(0); - } - else - return Reference< XAccessible >( pEntry->GetAccessible(), UNO_QUERY ); - } - } - - throw IndexOutOfBoundsException(); -} - - -void SAL_CALL ToolbarMenuAcc::deselectAccessibleChild( sal_Int32 nChildIndex ) -{ - ThrowIfDisposed(); - const SolarMutexGuard aSolarGuard; - // Because of the single selection we can reset the whole selection when - // the specified child is currently selected. - if (isAccessibleChildSelected(nChildIndex)) - mpParent->clearAccessibleSelection(); -} - - -void SAL_CALL ToolbarMenuAcc::disposing() -{ - EventListenerVector aListenerListCopy; - - { - // Make a copy of the list and clear the original. - const SolarMutexGuard aSolarGuard; - ::osl::MutexGuard aGuard (m_aMutex); - aListenerListCopy = mxEventListeners; - mxEventListeners.clear(); - - // Reset the pointer to the parent. It has to be the one who has - // disposed us because he is dying. - mpParent = nullptr; - } - - // Inform all listeners that this objects is disposing. - EventObject aEvent (static_cast<XAccessible*>(this)); - for (auto const& listenerCopy : aListenerListCopy) - { - try - { - listenerCopy->disposing (aEvent); - } - catch( Exception& ) - { - // Ignore exceptions. - } - - } -} - -void ToolbarMenuAcc::ThrowIfDisposed() -{ - if(rBHelper.bDisposed || rBHelper.bInDispose || !mpParent) - { - throw DisposedException ("object has been already disposed", static_cast<XWeak*>(this)); - } -} - - -ToolbarMenuEntryAcc::ToolbarMenuEntryAcc( ToolbarMenuEntry* pParent ) -: ToolbarMenuEntryAccBase( m_aMutex ) -, mpParent( pParent ) -{ -} - - -ToolbarMenuEntryAcc::~ToolbarMenuEntryAcc() -{ -} - - -void SAL_CALL ToolbarMenuEntryAcc::disposing() -{ - EventListenerVector aListenerListCopy; - - { - // Make a copy of the list and clear the original. - const SolarMutexGuard aSolarGuard; - ::osl::MutexGuard aGuard (m_aMutex); - aListenerListCopy = mxEventListeners; - mxEventListeners.clear(); - - // Reset the pointer to the parent. It has to be the one who has - // disposed us because he is dying. - mpParent = nullptr; - } - - // Inform all listeners that this objects is disposing. - EventObject aEvent (static_cast<XAccessible*>(this)); - for (auto const& listenerCopy : aListenerListCopy) - { - try - { - listenerCopy->disposing (aEvent); - } - catch( Exception& ) - { - // Ignore exceptions. - } - } -} - - -Reference< XAccessibleContext > SAL_CALL ToolbarMenuEntryAcc::getAccessibleContext() -{ - return this; -} - - -sal_Int32 SAL_CALL ToolbarMenuEntryAcc::getAccessibleChildCount() -{ - return 0; -} - - -Reference< XAccessible > SAL_CALL ToolbarMenuEntryAcc::getAccessibleChild( sal_Int32 ) -{ - throw IndexOutOfBoundsException(); -} - - -Reference< XAccessible > SAL_CALL ToolbarMenuEntryAcc::getAccessibleParent() -{ - const SolarMutexGuard aSolarGuard; - Reference< XAccessible > xRet; - - if( mpParent ) - xRet = mpParent->mrMenu.GetAccessible(); - - return xRet; -} - - -sal_Int32 SAL_CALL ToolbarMenuEntryAcc::getAccessibleIndexInParent() -{ - const SolarMutexGuard aSolarGuard; - // The index defaults to -1 to indicate the child does not belong to its - // parent. - sal_Int32 nIndexInParent = -1; - - if( mpParent ) - { - Reference< XAccessibleContext > xParent( mpParent->mrMenu.GetAccessible(), UNO_QUERY ); - - if( xParent.is() ) - { - Reference< XAccessible > xThis( this ); - - const sal_Int32 nCount = xParent->getAccessibleChildCount(); - for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ ) - { - if( xParent->getAccessibleChild(nIndex) == xThis ) - { - nIndexInParent = nIndex; - break; - } - } - } - } - - return nIndexInParent; -} - - -sal_Int16 SAL_CALL ToolbarMenuEntryAcc::getAccessibleRole() -{ - return AccessibleRole::LIST_ITEM; -} - - -OUString SAL_CALL ToolbarMenuEntryAcc::getAccessibleDescription() -{ - return OUString(); -} - - -OUString SAL_CALL ToolbarMenuEntryAcc::getAccessibleName() -{ - const SolarMutexGuard aSolarGuard; - OUString aRet; - - if( mpParent ) - { - aRet = mpParent->maText; - - if( aRet.isEmpty() ) - { - aRet = "Item " + - OUString::number( mpParent->mnEntryId ); - } - } - - return aRet; -} - - -Reference< XAccessibleRelationSet > SAL_CALL ToolbarMenuEntryAcc::getAccessibleRelationSet() -{ - return Reference< XAccessibleRelationSet >(); -} - - -Reference< XAccessibleStateSet > SAL_CALL ToolbarMenuEntryAcc::getAccessibleStateSet() -{ - const SolarMutexGuard aSolarGuard; - ::utl::AccessibleStateSetHelper* pStateSet = new ::utl::AccessibleStateSetHelper; - - if( mpParent ) - { - pStateSet->AddState (AccessibleStateType::ENABLED); - pStateSet->AddState (AccessibleStateType::SENSITIVE); - pStateSet->AddState (AccessibleStateType::SHOWING); - pStateSet->AddState (AccessibleStateType::VISIBLE); - pStateSet->AddState (AccessibleStateType::TRANSIENT); - if( mpParent->mnEntryId != TITLE_ID ) - { - pStateSet->AddState( AccessibleStateType::SELECTABLE ); - - // SELECTED - if( mpParent->mrMenu.getHighlightedEntryId() == mpParent->mnEntryId ) - pStateSet->AddState( AccessibleStateType::SELECTED ); - } - } - - return pStateSet; -} - - -Locale SAL_CALL ToolbarMenuEntryAcc::getLocale() -{ - Locale aRet( "", "", "" ); - - Reference< XAccessible > xParent( getAccessibleParent() ); - if( xParent.is() ) - { - Reference< XAccessibleContext > xParentContext( xParent->getAccessibleContext() ); - - if( xParentContext.is() ) - aRet = xParentContext->getLocale(); - } - - return aRet; -} - - -void SAL_CALL ToolbarMenuEntryAcc::addAccessibleEventListener( const Reference< XAccessibleEventListener >& rxListener ) -{ - const ::osl::MutexGuard aGuard( maMutex ); - - if( rxListener.is() ) - { - for (auto const& eventListener : mxEventListeners) - { - if (eventListener == rxListener) - return; - } - // listener not found so add it - mxEventListeners.push_back( rxListener ); - } -} - - -void SAL_CALL ToolbarMenuEntryAcc::removeAccessibleEventListener( const Reference< XAccessibleEventListener >& rxListener ) -{ - const ::osl::MutexGuard aGuard( maMutex ); - - if( rxListener.is() ) - { - EventListenerVector::iterator aIter = std::find(mxEventListeners.begin(), mxEventListeners.end(), rxListener); - if (aIter != mxEventListeners.end()) - mxEventListeners.erase(aIter); - } -} - - -sal_Bool SAL_CALL ToolbarMenuEntryAcc::containsPoint( const awt::Point& aPoint ) -{ - const awt::Rectangle aRect( getBounds() ); - const Point aSize( aRect.Width, aRect.Height ); - const Point aNullPoint, aTestPoint( aPoint.X, aPoint.Y ); - - return tools::Rectangle( aNullPoint, aSize ).IsInside( aTestPoint ); -} - - -Reference< XAccessible > SAL_CALL ToolbarMenuEntryAcc::getAccessibleAtPoint( const awt::Point& ) -{ - Reference< XAccessible > xRet; - return xRet; -} - - -awt::Rectangle SAL_CALL ToolbarMenuEntryAcc::getBounds() -{ - const SolarMutexGuard aSolarGuard; - awt::Rectangle aRet; - - if( mpParent ) - { - tools::Rectangle aRect( mpParent->maRect ); - tools::Rectangle aParentRect( Point(), mpParent->mrMenu.GetOutputSizePixel() ); - - aRect.Intersection( aParentRect ); - - aRet.X = aRect.Left(); - aRet.Y = aRect.Top(); - aRet.Width = aRect.GetWidth(); - aRet.Height = aRect.GetHeight(); - } - - return aRet; -} - - -awt::Point SAL_CALL ToolbarMenuEntryAcc::getLocation() -{ - const awt::Rectangle aRect( getBounds() ); - return awt::Point( aRect.X, aRect.Y ); -} - - -awt::Point SAL_CALL ToolbarMenuEntryAcc::getLocationOnScreen() -{ - const SolarMutexGuard aSolarGuard; - awt::Point aRet; - - if( mpParent ) - { - const Point aScreenPos( mpParent->mrMenu.OutputToAbsoluteScreenPixel( mpParent->maRect.TopLeft() ) ); - - aRet.X = aScreenPos.X(); - aRet.Y = aScreenPos.Y(); - } - - return aRet; -} - - -awt::Size SAL_CALL ToolbarMenuEntryAcc::getSize() -{ - const awt::Rectangle aRect( getBounds() ); - awt::Size aRet; - - aRet.Width = aRect.Width; - aRet.Height = aRect.Height; - - return aRet; -} - -void SAL_CALL ToolbarMenuEntryAcc::grabFocus() -{ - // nothing to do -} - -sal_Int32 SAL_CALL ToolbarMenuEntryAcc::getForeground( ) -{ - return static_cast<sal_Int32>(Application::GetSettings().GetStyleSettings().GetMenuTextColor()); -} - -sal_Int32 SAL_CALL ToolbarMenuEntryAcc::getBackground( ) -{ - return static_cast<sal_Int32>(Application::GetSettings().GetStyleSettings().GetMenuColor()); -} - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/control/toolbarmenuimp.hxx b/svtools/source/control/toolbarmenuimp.hxx deleted file mode 100644 index 7e3d4d0fddc5..000000000000 --- a/svtools/source/control/toolbarmenuimp.hxx +++ /dev/null @@ -1,292 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * 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 . - */ - -#pragma once - -#include <osl/mutex.hxx> -#include <vcl/ctrl.hxx> -#include <vcl/image.hxx> - -#include <cppuhelper/compbase.hxx> -#include <cppuhelper/basemutex.hxx> - -#include <com/sun/star/accessibility/XAccessible.hpp> -#include <com/sun/star/accessibility/XAccessibleContext.hpp> -#include <com/sun/star/accessibility/XAccessibleComponent.hpp> -#include <com/sun/star/accessibility/XAccessibleSelection.hpp> -#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp> - -#include <rtl/ref.hxx> - -#include <memory> -#include <vector> - -namespace svtools { - -struct ToolbarMenu_Impl; -class ToolbarMenu; -class ToolbarMenuEntry; - -typedef ::std::vector< css::uno::Reference< css::accessibility::XAccessibleEventListener > > EventListenerVector; -typedef std::vector< std::unique_ptr< ToolbarMenuEntry > > ToolbarMenuEntryVector; - -const int SEPARATOR_HEIGHT = 4; -const int TITLE_ID = -1; -const int BORDER_X = 0; -const int BORDER_Y = 0; - - -class ToolbarMenuEntry -{ -public: - ToolbarMenu& mrMenu; - - int mnEntryId; - MenuItemBits mnBits; - Size maSize; - - bool mbHasText; - bool mbHasImage; - bool mbChecked; - bool mbEnabled; - - OUString maText; - Image maImage; - VclPtr<Control> mpControl; - tools::Rectangle maRect; - - css::uno::Reference< css::accessibility::XAccessibleContext > mxAccContext; - -public: - ToolbarMenuEntry( ToolbarMenu& rMenu, int nEntryId, const OUString& rText, MenuItemBits nBits ); - ToolbarMenuEntry( ToolbarMenu& rMenu, int nEntryId, const Image& rImage, const OUString& rText, MenuItemBits nBits ); - ToolbarMenuEntry( ToolbarMenu& rMenu, int nEntryId, Control* pControl, MenuItemBits nBits ); - ~ToolbarMenuEntry(); - - void init( int nEntryId, MenuItemBits nBits ); - - const css::uno::Reference< css::accessibility::XAccessibleContext >& GetAccessible(); - - /// @throws css::uno::RuntimeException - sal_Int32 getAccessibleChildCount(); - /// @throws css::lang::IndexOutOfBoundsException - /// @throws css::uno::RuntimeException - css::uno::Reference< css::accessibility::XAccessible > getAccessibleChild( sal_Int32 index ); - - bool HasCheck() const - { - return mbChecked || ( mnBits & ( MenuItemBits::RADIOCHECK | MenuItemBits::CHECKABLE | MenuItemBits::AUTOCHECK ) ); - } -}; - - -typedef ::cppu::WeakComponentImplHelper< - css::accessibility::XAccessible, - css::accessibility::XAccessibleEventBroadcaster, - css::accessibility::XAccessibleContext, - css::accessibility::XAccessibleComponent, - css::accessibility::XAccessibleSelection > - ToolbarMenuAccComponentBase; - -class ToolbarMenuAcc : - public ::cppu::BaseMutex, - public ToolbarMenuAccComponentBase -{ -public: - - explicit ToolbarMenuAcc( ToolbarMenu_Impl& rParent ); - virtual ~ToolbarMenuAcc() override; - - void FireAccessibleEvent( short nEventId, const css::uno::Any& rOldValue, const css::uno::Any& rNewValue ); - bool HasAccessibleListeners() const { return( mxEventListeners.size() > 0 ); } - -public: - - // XAccessible - virtual css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext( ) override; - - // XAccessibleEventBroadcaster - virtual void SAL_CALL addAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override; - virtual void SAL_CALL removeAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override; - - // XAccessibleContext - virtual sal_Int32 SAL_CALL getAccessibleChildCount( ) override; - virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 i ) override; - virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) override; - virtual sal_Int32 SAL_CALL getAccessibleIndexInParent( ) override; - virtual sal_Int16 SAL_CALL getAccessibleRole( ) override; - virtual OUString SAL_CALL getAccessibleDescription( ) override; - virtual OUString SAL_CALL getAccessibleName( ) override; - virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) override; - virtual css::uno::Reference< css::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet( ) override; - virtual css::lang::Locale SAL_CALL getLocale( ) override; - - // XAccessibleComponent - virtual sal_Bool SAL_CALL containsPoint( const css::awt::Point& aPoint ) override; - virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const css::awt::Point& aPoint ) override; - virtual css::awt::Rectangle SAL_CALL getBounds( ) override; - virtual css::awt::Point SAL_CALL getLocation( ) override; - virtual css::awt::Point SAL_CALL getLocationOnScreen( ) override; - virtual css::awt::Size SAL_CALL getSize( ) override; - virtual void SAL_CALL grabFocus( ) override; - virtual sal_Int32 SAL_CALL getForeground( ) override; - virtual sal_Int32 SAL_CALL getBackground( ) override; - - // XAccessibleSelection - virtual void SAL_CALL selectAccessibleChild( sal_Int32 nChildIndex ) override; - virtual sal_Bool SAL_CALL isAccessibleChildSelected( sal_Int32 nChildIndex ) override; - virtual void SAL_CALL clearAccessibleSelection( ) override; - virtual void SAL_CALL selectAllAccessibleChildren( ) override; - virtual sal_Int32 SAL_CALL getSelectedAccessibleChildCount( ) override; - virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) override; - virtual void SAL_CALL deselectAccessibleChild( sal_Int32 nSelectedChildIndex ) override; - - DECL_LINK( WindowEventListener, VclWindowEvent&, void ); - -private: - EventListenerVector mxEventListeners; - ToolbarMenu_Impl* mpParent; - /// The current FOCUSED state. - bool mbIsFocused; - - /** Tell all listeners that the object is dying. This callback is - usually called from the WeakComponentImplHelper class. - */ - virtual void SAL_CALL disposing() override; - - /** Check whether or not the object has been disposed (or is in the - state of being disposed). If that is the case then - DisposedException is thrown to inform the (indirect) caller of the - foul deed. - - @throws css::lang::DisposedException - */ - void ThrowIfDisposed(); -}; - - -typedef ::cppu::WeakComponentImplHelper< css::accessibility::XAccessible, - css::accessibility::XAccessibleEventBroadcaster, - css::accessibility::XAccessibleContext, - css::accessibility::XAccessibleComponent > ToolbarMenuEntryAccBase; - -class ToolbarMenuEntryAcc : public ::cppu::BaseMutex, - public ToolbarMenuEntryAccBase -{ -public: - explicit ToolbarMenuEntryAcc( ToolbarMenuEntry* pParent ); - virtual ~ToolbarMenuEntryAcc() override; - - // XAccessible - virtual css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext( ) override; - - // XAccessibleEventBroadcaster - virtual void SAL_CALL addAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override; - virtual void SAL_CALL removeAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override; - - // XAccessibleContext - virtual sal_Int32 SAL_CALL getAccessibleChildCount( ) override; - virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 i ) override; - virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) override; - virtual sal_Int32 SAL_CALL getAccessibleIndexInParent( ) override; - virtual sal_Int16 SAL_CALL getAccessibleRole( ) override; - virtual OUString SAL_CALL getAccessibleDescription( ) override; - virtual OUString SAL_CALL getAccessibleName( ) override; - virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) override; - virtual css::uno::Reference< css::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet( ) override; - virtual css::lang::Locale SAL_CALL getLocale( ) override; - - // XAccessibleComponent - virtual sal_Bool SAL_CALL containsPoint( const css::awt::Point& aPoint ) override; - virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const css::awt::Point& aPoint ) override; - virtual css::awt::Rectangle SAL_CALL getBounds( ) override; - virtual css::awt::Point SAL_CALL getLocation( ) override; - virtual css::awt::Point SAL_CALL getLocationOnScreen( ) override; - virtual css::awt::Size SAL_CALL getSize( ) override; - virtual void SAL_CALL grabFocus( ) override; - virtual sal_Int32 SAL_CALL getForeground( ) override; - virtual sal_Int32 SAL_CALL getBackground( ) override; - -private: - EventListenerVector mxEventListeners; - ::osl::Mutex maMutex; - ToolbarMenuEntry* mpParent; - - /** Tell all listeners that the object is dying. This callback is - usually called from the WeakComponentImplHelper class. - */ - virtual void SAL_CALL disposing() override; -}; - - -struct ToolbarMenu_Impl -{ - ToolbarMenu& mrMenu; - - rtl::Reference< ToolbarMenuAcc > mxAccessible; - css::uno::Reference< css::accessibility::XAccessible > mxOldSelection; - - ToolbarMenuEntryVector maEntryVector; - - int mnCheckPos; - int mnImagePos; - int mnTextPos; - - int mnHighlightedEntry; - int mnSelectedEntry; - int mnLastColumn; - - Size maSize; - - Link<ToolbarMenu*,void> maSelectHdl; - - explicit ToolbarMenu_Impl( ToolbarMenu& rMenu ); - ~ToolbarMenu_Impl(); - - void setAccessible( ToolbarMenuAcc* pAccessible ); - - void fireAccessibleEvent( short nEventId, const css::uno::Any& rOldValue, const css::uno::Any& rNewValue ); - - /// @throws css::uno::RuntimeException - sal_Int32 getAccessibleChildCount(); - /// @throws css::lang::IndexOutOfBoundsException - /// @throws css::uno::RuntimeException - css::uno::Reference< css::accessibility::XAccessible > getAccessibleChild( sal_Int32 index ); - /// @throws css::lang::IndexOutOfBoundsException - /// @throws css::uno::RuntimeException - css::uno::Reference< css::accessibility::XAccessible > getAccessibleChild( Control const * pControl, sal_Int32 childIndex ); - - /// @throws css::lang::IndexOutOfBoundsException - /// @throws css::uno::RuntimeException - void selectAccessibleChild( sal_Int32 nChildIndex ); - /// @throws css::lang::IndexOutOfBoundsException - /// @throws css::uno::RuntimeException - bool isAccessibleChildSelected( sal_Int32 nChildIndex ); - void clearAccessibleSelection(); - - ToolbarMenuEntry* implGetEntry( int nEntry ) const; - void notifyHighlightedEntry(); - - void implHighlightControl( sal_uInt16 nCode, Control* pControl ); -}; - -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |