Files
libreoffice/accessibility/source/standard/vclxaccessiblebutton.cxx

315 lines
8.0 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2012-09-27 13:52:10 +01:00
/*
* 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 <standard/vclxaccessiblebutton.hxx>
#include <helper/accresmgr.hxx>
migrate to boost::gettext * all .ui files go from <interface> to <interface domain="MODULE"> e.g. vcl * all .src files go away and the english source strings folded into the .hrc as NC_("context", "source string") * ResMgr is dropped in favour of std::locale imbued by boost::locale::generator pointed at matching MODULE .mo files * UIConfig translations are folded into the module .mo, so e.g. UIConfig_cui goes from l10n target to normal one, so the res/lang.zips of UI files go away * translation via Translation::get(hrc-define-key, imbued-std::locale) * python can now be translated with its inbuilt gettext support (we keep the name strings.hrc there to keep finding the .hrc file uniform) so magic numbers can go away there * java and starbasic components can be translated via the pre-existing css.resource.StringResourceWithLocation mechanism * en-US res files go away, their strings are now the .hrc keys in the source code * remaining .res files are replaced by .mo files * in .res/.ui-lang-zip files, the old scheme missing translations of strings results in inserting the english original so something can be found, now the standard fallback of using the english original from the source key is used, so partial translations shrink dramatically in size * extract .hrc strings with hrcex which backs onto xgettext -C --add-comments --keyword=NC_:1c,2 --from-code=UTF-8 --no-wrap * extract .ui strings with uiex which backs onto xgettext --add-comments --no-wrap * qtz for gettext translations is generated at runtime as ascii-ified crc32 of content + "|" + msgid * [API CHANGE] remove deprecated binary .res resouce loader related uno apis com::sun::star::resource::OfficeResourceLoader com::sun::star::resource::XResourceBundleLoader com::sun::star::resource::XResourceBundle when translating strings via uno apis com.sun.star.resource.StringResourceWithLocation can continue to be used Change-Id: Ia2594a2672b7301d9c3421fdf31b6cfe7f3f8d0a
2017-06-11 20:56:30 +01:00
#include <strings.hrc>
#include <unotools/accessiblestatesethelper.hxx>
#include <comphelper/accessiblekeybindinghelper.hxx>
#include <com/sun/star/awt/KeyModifier.hpp>
#include <com/sun/star/accessibility/AccessibleStateType.hpp>
#include <com/sun/star/accessibility/AccessibleEventId.hpp>
#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
#include <cppuhelper/typeprovider.hxx>
#include <comphelper/sequence.hxx>
#include <strings.hxx>
#include <vcl/button.hxx>
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::accessibility;
using namespace ::comphelper;
// VCLXAccessibleButton
VCLXAccessibleButton::VCLXAccessibleButton( VCLXWindow* pVCLWindow )
:VCLXAccessibleTextComponent( pVCLWindow )
{
}
VCLXAccessibleButton::~VCLXAccessibleButton()
{
}
void VCLXAccessibleButton::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
{
switch ( rVclWindowEvent.GetId() )
{
case VclEventId::PushbuttonToggle:
{
Any aOldValue;
Any aNewValue;
VclPtr< PushButton > pButton = GetAs< PushButton >();
if ( pButton && pButton->GetState() == TRISTATE_TRUE )
aNewValue <<= AccessibleStateType::CHECKED;
else
aOldValue <<= AccessibleStateType::CHECKED;
NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
}
break;
default:
VCLXAccessibleTextComponent::ProcessWindowEvent( rVclWindowEvent );
}
}
void VCLXAccessibleButton::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet )
{
VCLXAccessibleTextComponent::FillAccessibleStateSet( rStateSet );
VclPtr< PushButton > pButton = GetAs< PushButton >();
if ( pButton )
{
rStateSet.AddState( AccessibleStateType::FOCUSABLE );
if ( pButton->GetState() == TRISTATE_TRUE )
rStateSet.AddState( AccessibleStateType::CHECKED );
if ( pButton->IsPressed() )
rStateSet.AddState( AccessibleStateType::PRESSED );
// IA2 CWS: if the button has a popup menu, it should has the state EXPANDABLE
if( pButton->GetType() == WindowType::MENUBUTTON )
{
rStateSet.AddState( AccessibleStateType::EXPANDABLE );
}
if( pButton->GetStyle() & WB_DEFBUTTON )
{
rStateSet.AddState( AccessibleStateType::DEFAULT );
}
}
}
// XInterface
IMPLEMENT_FORWARD_XINTERFACE2( VCLXAccessibleButton, VCLXAccessibleTextComponent, VCLXAccessibleButton_BASE )
// XTypeProvider
IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXAccessibleButton, VCLXAccessibleTextComponent, VCLXAccessibleButton_BASE )
// XServiceInfo
OUString VCLXAccessibleButton::getImplementationName()
{
return OUString( "com.sun.star.comp.toolkit.AccessibleButton" );
}
Sequence< OUString > VCLXAccessibleButton::getSupportedServiceNames()
{
return { "com.sun.star.awt.AccessibleButton" };
}
// XAccessibleContext
OUString VCLXAccessibleButton::getAccessibleName( )
{
OExternalLockGuard aGuard( this );
OUString aName( VCLXAccessibleTextComponent::getAccessibleName() );
sal_Int32 nLength = aName.getLength();
if ( nLength >= 3 && aName.match( "...", nLength - 3 ) )
{
if ( nLength == 3 )
{
// it's a browse button
aName = AccResId( RID_STR_ACC_NAME_BROWSEBUTTON );
}
else
{
// remove the three trailing dots
aName = aName.copy( 0, nLength - 3 );
}
}
else if ( nLength >= 3 && aName.match( "<< ", 0 ) )
{
// remove the leading symbols
aName = aName.copy( 3, nLength - 3 );
}
else if ( nLength >= 3 && aName.match( " >>", nLength - 3 ) )
{
// remove the trailing symbols
aName = aName.copy( 0, nLength - 3 );
}
return aName;
}
// XAccessibleAction
sal_Int32 VCLXAccessibleButton::getAccessibleActionCount( )
{
OExternalLockGuard aGuard( this );
return 1;
}
sal_Bool VCLXAccessibleButton::doAccessibleAction ( sal_Int32 nIndex )
{
OExternalLockGuard aGuard( this );
if ( nIndex != 0 )
throw IndexOutOfBoundsException();
VclPtr< PushButton > pButton = GetAs< PushButton >();
if ( pButton )
pButton->Click();
return true;
}
OUString VCLXAccessibleButton::getAccessibleActionDescription ( sal_Int32 nIndex )
{
OExternalLockGuard aGuard( this );
if ( nIndex != 0 )
throw IndexOutOfBoundsException();
return OUString(RID_STR_ACC_ACTION_CLICK);
}
Reference< XAccessibleKeyBinding > VCLXAccessibleButton::getAccessibleActionKeyBinding( sal_Int32 nIndex )
{
OExternalLockGuard aGuard( this );
if ( nIndex != 0 )
throw IndexOutOfBoundsException();
OAccessibleKeyBindingHelper* pKeyBindingHelper = new OAccessibleKeyBindingHelper();
Reference< XAccessibleKeyBinding > xKeyBinding = pKeyBindingHelper;
VclPtr<vcl::Window> pWindow = GetWindow();
if ( pWindow )
{
KeyEvent aKeyEvent = pWindow->GetActivationKey();
vcl::KeyCode aKeyCode = aKeyEvent.GetKeyCode();
if ( aKeyCode.GetCode() != 0 )
{
awt::KeyStroke aKeyStroke;
aKeyStroke.Modifiers = 0;
if ( aKeyCode.IsShift() )
aKeyStroke.Modifiers |= awt::KeyModifier::SHIFT;
if ( aKeyCode.IsMod1() )
aKeyStroke.Modifiers |= awt::KeyModifier::MOD1;
if ( aKeyCode.IsMod2() )
aKeyStroke.Modifiers |= awt::KeyModifier::MOD2;
CWS-TOOLING: integrate CWS macshortcuts01 2009-04-02 18:13:38 +0200 pl r270430 : CWS-TOOLING: rebase CWS macshortcuts01 to trunk@270033 (milestone: DEV300:m45) 2009-03-04 13:02:01 +0100 pl r268816 : make compile with oldish gtk headers 2009-03-04 11:23:41 +0100 rvojta r268799 : Remove #ifndef MACOSX as Mac OS X X11 port is obsolote, no need to check for non Mac OS X 2009-03-03 16:33:34 +0100 rvojta r268764 : Meta/Super to MOD3 on all Unix platforms except Mac OS X 2009-03-03 16:08:46 +0100 rvojta r268744 : Map GDK_Meta_L/R and GDK_Super_L/R keys to KEY_MOD3 on Unix systems except Mac OS X 2009-03-03 16:04:23 +0100 rvojta r268742 : IsMod3(), IsLeftMod3(), IsRightMod3() added 2009-03-03 16:03:48 +0100 rvojta r268741 : MODKEY_LMOD3, MODKEY_RMOD3, MODKEY_MOD3 support 2009-02-28 00:09:26 +0100 rvojta r268620 : New KeyCode constructors support, by default MOD3 is not used here (probably temporary solution) 2009-02-25 22:53:02 +0100 rvojta r268469 : MOD3 support (META_DOWN_MASK) 2009-02-25 13:22:13 +0100 rvojta r268435 : Cmd-M to minimize window, Cmd-Option-M to minimize all windows 2009-02-25 11:09:20 +0100 rvojta r268417 : Add back F11 for non Mac OS X platforms (removed by accident in r268405) 2009-02-24 18:32:31 +0100 rvojta r268405 : F11 replaced by Cmd-T on Mac OS X 2009-02-23 15:21:53 +0100 sb r268358 : #i99296# support values with both xml:lang and install:module (which are moved into the spool tree, not the res tree) 2009-02-16 22:45:34 +0100 rvojta r267839 : Multiplatform shortcuts support 2009-02-16 22:41:03 +0100 rvojta r267838 : Use install:module instead of separate xcu file 2009-02-16 18:35:36 +0100 rvojta r267833 : Removed accelerators target 2009-02-16 09:27:42 +0100 rvojta r267776 : MOD3 added 2009-02-16 09:18:32 +0100 rvojta r267775 : MOD3 support 2009-02-16 09:17:11 +0100 rvojta r267774 : MOD3 support 2009-02-15 22:11:37 +0100 rvojta r267773 : Check for MOD3 too 2009-02-15 22:11:15 +0100 rvojta r267772 : Check for MOD3 too 2009-02-15 22:10:37 +0100 rvojta r267771 : Check for MOD3 too 2009-02-15 22:10:15 +0100 rvojta r267770 : Check for MOD3 during mouse event too 2009-02-15 22:09:54 +0100 rvojta r267769 : IsMod3() added 2009-02-15 19:34:59 +0100 rvojta r267768 : MOD3 added (Ctrl on Mac OS X) 2009-02-15 19:33:43 +0100 rvojta r267767 : Cmd-M -> Ctrl-M for default format 2009-02-15 19:32:19 +0100 rvojta r267766 : MOD3 added (Ctrl on Mac OS X) 2009-02-15 19:31:30 +0100 rvojta r267765 : MOD3 added (Ctrl on Mac OS X) 2009-02-15 19:31:04 +0100 rvojta r267764 : MOD3 added (Ctrl on Mac OS X) 2009-02-15 19:30:33 +0100 rvojta r267763 : MOD3 added (Ctrl on Mac OS X) 2009-02-15 19:30:09 +0100 rvojta r267762 : MOD3 added (Ctrl on Mac OS X) 2009-02-13 22:11:22 +0100 rvojta r267751 : Cmd-Shift-Z for .uno:Redo 2009-02-13 22:04:19 +0100 rvojta r267748 : F11 -> Cmd-T for .uno:DesignerDialog 2009-02-13 21:09:11 +0100 rvojta r267743 : F11 -> Cmd-T (all occurences) 2009-02-13 19:47:21 +0100 rvojta r267741 : accelerators target added for Mac OS X shortcuts 2009-02-13 19:46:58 +0100 rvojta r267740 : Spreadsheet - replace F11 with Cmd-T 2009-02-13 19:24:19 +0100 rvojta r267739 : Remove Accelerators-Mac.xcs 2009-02-13 18:50:01 +0100 rvojta r267738 : Accelerators-Mac.xcs test 2009-02-13 18:48:10 +0100 rvojta r267737 : Accelerators-Mac.xcu added 2009-02-13 18:46:48 +0100 rvojta r267736 : F11 -> Cmd-T for stylist in Spreadsheet
2009-04-12 04:24:43 +00:00
if ( aKeyCode.IsMod3() )
aKeyStroke.Modifiers |= awt::KeyModifier::MOD3;
aKeyStroke.KeyCode = aKeyCode.GetCode();
aKeyStroke.KeyChar = aKeyEvent.GetCharCode();
aKeyStroke.KeyFunc = static_cast< sal_Int16 >( aKeyCode.GetFunction() );
pKeyBindingHelper->AddKeyBinding( aKeyStroke );
}
}
return xKeyBinding;
}
// XAccessibleValue
Any VCLXAccessibleButton::getCurrentValue( )
{
OExternalLockGuard aGuard( this );
Any aValue;
VclPtr< PushButton > pButton = GetAs< PushButton >();
if ( pButton )
aValue <<= (sal_Int32) pButton->IsPressed();
return aValue;
}
sal_Bool VCLXAccessibleButton::setCurrentValue( const Any& aNumber )
{
OExternalLockGuard aGuard( this );
bool bReturn = false;
VclPtr< PushButton > pButton = GetAs< PushButton >();
if ( pButton )
{
sal_Int32 nValue = 0;
OSL_VERIFY( aNumber >>= nValue );
if ( nValue < 0 )
nValue = 0;
else if ( nValue > 1 )
nValue = 1;
pButton->SetPressed( nValue == 1 );
bReturn = true;
}
return bReturn;
}
Any VCLXAccessibleButton::getMaximumValue( )
{
OExternalLockGuard aGuard( this );
Any aValue;
aValue <<= (sal_Int32) 1;
return aValue;
}
Any VCLXAccessibleButton::getMinimumValue( )
{
OExternalLockGuard aGuard( this );
Any aValue;
aValue <<= (sal_Int32) 0;
return aValue;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */