diff options
Diffstat (limited to 'accessibility/source/extended/accessiblelistboxentry.cxx')
-rw-r--r-- | accessibility/source/extended/accessiblelistboxentry.cxx | 347 |
1 files changed, 320 insertions, 27 deletions
diff --git a/accessibility/source/extended/accessiblelistboxentry.cxx b/accessibility/source/extended/accessiblelistboxentry.cxx index 6bc4baa00848..851158f5193a 100644 --- a/accessibility/source/extended/accessiblelistboxentry.cxx +++ b/accessibility/source/extended/accessiblelistboxentry.cxx @@ -20,6 +20,7 @@ #include "accessibility/extended/accessiblelistboxentry.hxx" #include <svtools/treelistbox.hxx> #include <svtools/stringtransfer.hxx> +#include <svtools/svlbitm.hxx> #include <com/sun/star/awt/Point.hpp> #include <com/sun/star/awt/Rectangle.hpp> #include <com/sun/star/awt/Size.hpp> @@ -38,7 +39,9 @@ #include <comphelper/sequence.hxx> #include <comphelper/accessibleeventnotifier.hxx> #include <toolkit/helper/vclunohelper.hxx> - +#include <accessibility/helper/accresmgr.hxx> +#include <accessibility/helper/accessiblestrings.hrc> +#include <com/sun/star/accessibility/XAccessibleValue.hpp> #define ACCESSIBLE_ACTION_COUNT 1 namespace @@ -60,6 +63,7 @@ namespace accessibility using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; using namespace ::com::sun::star; + using namespace ::comphelper; // ----------------------------------------------------------------------------- // Ctor() and Dtor() @@ -71,6 +75,7 @@ namespace accessibility AccessibleListBoxEntry_BASE ( m_aMutex ), ListBoxAccessibleBase( _rListBox ), + m_pSvLBoxEntry ( _pEntry ), m_nClientId ( 0 ), m_aParent ( _xParent ) @@ -88,6 +93,19 @@ namespace accessibility } } + // IA2 CWS + void AccessibleListBoxEntry::NotifyAccessibleEvent( sal_Int16 _nEventId, + const ::com::sun::star::uno::Any& _aOldValue, + const ::com::sun::star::uno::Any& _aNewValue ) + { + Reference< uno::XInterface > xSource( *this ); + AccessibleEventObject aEventObj( xSource, _nEventId, _aNewValue, _aOldValue ); + + if (m_nClientId) + comphelper::AccessibleEventNotifier::addEvent( m_nClientId, aEventObj ); + } + + // ----------------------------------------------------------------------------- Rectangle AccessibleListBoxEntry::GetBoundingBox_Impl() const { @@ -175,7 +193,7 @@ namespace accessibility OUString sRet; SvTreeListEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath ); if ( pEntry ) - sRet = getListBox()->SearchEntryText( pEntry ); + sRet = getListBox()->SearchEntryTextWithHeadTitle( pEntry ); return sRet; } // ----------------------------------------------------------------------------- @@ -309,8 +327,7 @@ namespace accessibility ::osl::MutexGuard aGuard( m_aMutex ); EnsureIsAlive(); - SvTreeListEntry* pParent = getListBox()->GetEntryFromPath( m_aEntryPath ); - SvTreeListEntry* pEntry = pParent ? getListBox()->GetEntry( pParent, i ) : NULL; + SvTreeListEntry* pEntry = GetRealChild(i); if ( !pEntry ) throw IndexOutOfBoundsException(); @@ -342,6 +359,8 @@ namespace accessibility OSL_ENSURE( pParentEntry, "AccessibleListBoxEntry::implGetParentAccessible: could not obtain a parent entry!" ); if ( pParentEntry ) + pParentEntry = getListBox()->GetParent(pParentEntry); + if ( pParentEntry ) xParent = new AccessibleListBoxEntry( *getListBox(), pParentEntry, NULL ); // note that we pass NULL here as parent-accessible: // this is allowed, as the AccessibleListBoxEntry class will create it's parent @@ -370,15 +389,103 @@ namespace accessibility return m_aEntryPath.empty() ? -1 : m_aEntryPath.back(); } // ----------------------------------------------------------------------------- + sal_Int32 SAL_CALL AccessibleListBoxEntry::getRoleType() + { + sal_Int32 nCase = 0; + SvTreeListEntry* pEntry = getListBox()->GetEntry(0); + if ( pEntry ) + { + if( pEntry->HasChildrenOnDemand() || getListBox()->GetChildCount(pEntry) > 0 ) + { + nCase = 1; + return nCase; + } + } + + sal_Bool bHasButtons = (getListBox()->GetStyle() & WB_HASBUTTONS)!=0; + if( !(getListBox()->GetTreeFlags() & TREEFLAG_CHKBTN) ) + { + if( bHasButtons ) + nCase = 1; + } + else + { + if( bHasButtons ) + nCase = 2; + else + nCase = 3; + } + return nCase; + } + // ----------------------------------------------------------------------------- sal_Int16 SAL_CALL AccessibleListBoxEntry::getAccessibleRole( ) throw (RuntimeException) { - return AccessibleRole::LABEL; + SvTreeListBox* pBox = getListBox(); + if(pBox) + { + short nType = pBox->GetAllEntriesAccessibleRoleType(); + if( nType == TREEBOX_ALLITEM_ACCROLE_TYPE_TREE) + return AccessibleRole::TREE_ITEM; + else if( nType == TREEBOX_ALLITEM_ACCROLE_TYPE_LIST) + return AccessibleRole::LIST_ITEM; + } + + sal_uInt16 treeFlag = pBox->GetTreeFlags(); + if(treeFlag & TREEFLAG_CHKBTN ) + { + SvTreeListEntry* pEntry = pBox->GetEntryFromPath( m_aEntryPath ); + SvButtonState eState = pBox->GetCheckButtonState( pEntry ); + switch( eState ) + { + case SV_BUTTON_CHECKED: + case SV_BUTTON_UNCHECKED: + return AccessibleRole::CHECK_BOX; + case SV_BUTTON_TRISTATE: + default: + return AccessibleRole::LABEL; + } + } + else + { + + if(getRoleType() == 0) + return AccessibleRole::LIST_ITEM; + else + //o is: return AccessibleRole::LABEL; + return AccessibleRole::TREE_ITEM; + } } // ----------------------------------------------------------------------------- OUString SAL_CALL AccessibleListBoxEntry::getAccessibleDescription( ) throw (RuntimeException) { - // no description for every item - return OUString(); + SvTreeListEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath ); + if( getAccessibleRole() == AccessibleRole::TREE_ITEM ) + { + return getListBox()->GetEntryLongDescription( pEntry ); + } + //want to cout the real column nubmer in the list box. + sal_uInt16 iRealItemCount = 0; + sal_uInt16 iCount = 0; + sal_uInt16 iTotleItemCount = pEntry->ItemCount(); + SvLBoxItem* pItem; + while( iCount < iTotleItemCount ) + { + pItem = pEntry->GetItem( iCount ); + if ( pItem->GetType() == SV_ITEM_ID_LBOXSTRING && + !static_cast<SvLBoxString*>( pItem )->GetText().isEmpty() ) + { + iRealItemCount++; + } + iCount++; + } + if(iRealItemCount<=1 ) + { + return OUString(); + } + else + { + return getListBox()->SearchEntryTextWithHeadTitle( pEntry ); + } } // ----------------------------------------------------------------------------- OUString SAL_CALL AccessibleListBoxEntry::getAccessibleName( ) throw (RuntimeException) @@ -386,7 +493,19 @@ namespace accessibility ::osl::MutexGuard aGuard( m_aMutex ); EnsureIsAlive(); - return implGetText(); + + OUString sRet(implGetText()); + + SvTreeListEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath ); + + OUString altText = getListBox()->GetEntryAltText( pEntry ); + if (!altText.isEmpty()) + { + sRet += " "; + sRet += altText; + } + + return sRet; } // ----------------------------------------------------------------------------- Reference< XAccessibleRelationSet > SAL_CALL AccessibleListBoxEntry::getAccessibleRelationSet( ) throw (RuntimeException) @@ -416,14 +535,25 @@ namespace accessibility if ( IsAlive_Impl() ) { - pStateSetHelper->AddState( AccessibleStateType::TRANSIENT ); - pStateSetHelper->AddState( AccessibleStateType::SELECTABLE ); - pStateSetHelper->AddState( AccessibleStateType::ENABLED ); - pStateSetHelper->AddState( AccessibleStateType::SENSITIVE ); - if ( getListBox()->IsInplaceEditingEnabled() ) - pStateSetHelper->AddState( AccessibleStateType::EDITABLE ); - if ( IsShowing_Impl() ) - pStateSetHelper->AddState( AccessibleStateType::SHOWING ); + switch(getAccessibleRole()) + { + case AccessibleRole::LABEL: + pStateSetHelper->AddState( AccessibleStateType::TRANSIENT ); + pStateSetHelper->AddState( AccessibleStateType::SELECTABLE ); + pStateSetHelper->AddState( AccessibleStateType::ENABLED ); + if ( getListBox()->IsInplaceEditingEnabled() ) + pStateSetHelper->AddState( AccessibleStateType::EDITABLE ); + if ( IsShowing_Impl() ) + pStateSetHelper->AddState( AccessibleStateType::SHOWING ); + break; + case AccessibleRole::CHECK_BOX: + pStateSetHelper->AddState( AccessibleStateType::TRANSIENT ); + pStateSetHelper->AddState( AccessibleStateType::SELECTABLE ); + pStateSetHelper->AddState( AccessibleStateType::ENABLED ); + if ( IsShowing_Impl() ) + pStateSetHelper->AddState( AccessibleStateType::SHOWING ); + break; + } getListBox()->FillAccessibleEntryStateSet( getListBox()->GetEntryFromPath( m_aEntryPath ), *pStateSetHelper ); } @@ -558,6 +688,7 @@ namespace accessibility SolarMutexGuard aSolarGuard; ::osl::MutexGuard aGuard( m_aMutex ); EnsureIsAlive(); + if(aPoint.X==0 && aPoint.Y==0) return 0; sal_Int32 nIndex = -1; SvTreeListEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath ); @@ -632,7 +763,20 @@ namespace accessibility ::osl::MutexGuard aGuard( m_aMutex ); // three actions supported - return ACCESSIBLE_ACTION_COUNT; + SvTreeListBox* pBox = getListBox(); + sal_uInt16 treeFlag = pBox->GetTreeFlags(); + sal_Bool bHasButtons = (getListBox()->GetStyle() & WB_HASBUTTONS)!=0; + if( (treeFlag & TREEFLAG_CHKBTN) && !bHasButtons) + { + sal_Int16 role = getAccessibleRole(); + if ( role == AccessibleRole::CHECK_BOX ) + return 2; + else if ( role == AccessibleRole::LABEL ) + return 0; + } + else + return ACCESSIBLE_ACTION_COUNT; + return 0; } // ----------------------------------------------------------------------------- sal_Bool SAL_CALL AccessibleListBoxEntry::doAccessibleAction( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) @@ -644,14 +788,30 @@ namespace accessibility checkActionIndex_Impl( nIndex ); EnsureIsAlive(); - SvTreeListEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath ); - if ( pEntry ) + sal_uInt16 treeFlag = getListBox()->GetTreeFlags(); + if( nIndex == 0 && (treeFlag & TREEFLAG_CHKBTN) ) { - if ( getListBox()->IsExpanded( pEntry ) ) - getListBox()->Collapse( pEntry ); - else - getListBox()->Expand( pEntry ); - bRet = sal_True; + if(getAccessibleRole() == AccessibleRole::CHECK_BOX) + { + SvTreeListEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath ); + SvButtonState state = getListBox()->GetCheckButtonState( pEntry ); + if ( state == SV_BUTTON_CHECKED ) + getListBox()->SetCheckButtonState(pEntry, (SvButtonState)SV_BMP_UNCHECKED); + else if (state == SV_BMP_UNCHECKED) + getListBox()->SetCheckButtonState(pEntry, (SvButtonState)SV_BUTTON_CHECKED); + } + } + else if( (nIndex == 1 && (treeFlag & TREEFLAG_CHKBTN) ) || (nIndex == 0) ) + { + SvTreeListEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath ); + if ( pEntry ) + { + if ( getListBox()->IsExpanded( pEntry ) ) + getListBox()->Collapse( pEntry ); + else + getListBox()->Expand( pEntry ); + bRet = sal_True; + } } return bRet; @@ -666,7 +826,36 @@ namespace accessibility EnsureIsAlive(); static const OUString sActionDesc( "toggleExpand" ); - return sActionDesc; + static const OUString sActionDesc1( "Check" ); + static const OUString sActionDesc2( "UnCheck" ); + // sal_Bool bHasButtons = (getListBox()->GetStyle() & WB_HASBUTTONS)!=0; + SvTreeListEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath ); + SvButtonState state = getListBox()->GetCheckButtonState( pEntry ); + sal_uInt16 treeFlag = getListBox()->GetTreeFlags(); + if(nIndex == 0 && (treeFlag & TREEFLAG_CHKBTN)) + { + if(getAccessibleRole() == AccessibleRole::CHECK_BOX) + { + if ( state == SV_BUTTON_CHECKED ) + return sActionDesc2; + else if (state == SV_BMP_UNCHECKED) + return sActionDesc1; + } + else + { + //Sometimes, a List or Tree may have both checkbox and label at the same time + return OUString(); + } + }else if( (nIndex == 1 && (treeFlag & TREEFLAG_CHKBTN)) || nIndex == 0 ) + { + if( pEntry->HasChildren() || pEntry->HasChildrenOnDemand() ) + return getListBox()->IsExpanded( pEntry ) ? \ + OUString(TK_RES_STRING(STR_SVT_ACC_ACTION_COLLAPSE)) : + OUString(TK_RES_STRING(STR_SVT_ACC_ACTION_EXPAND)); + return OUString(); + + } + throw IndexOutOfBoundsException(); } // ----------------------------------------------------------------------------- Reference< XAccessibleKeyBinding > AccessibleListBoxEntry::getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) @@ -688,8 +877,7 @@ namespace accessibility EnsureIsAlive(); - SvTreeListEntry* pParent = getListBox()->GetEntryFromPath( m_aEntryPath ); - SvTreeListEntry* pEntry = getListBox()->GetEntry( pParent, nChildIndex ); + SvTreeListEntry* pEntry = GetRealChild(nChildIndex); if ( !pEntry ) throw IndexOutOfBoundsException(); @@ -930,6 +1118,111 @@ namespace accessibility return OCommonAccessibleText::getTextBehindIndex( nIndex ,aTextType); } + // ----------------------------------------------------------------------------- + // XAccessibleValue + // ----------------------------------------------------------------------------- + + Any AccessibleListBoxEntry::getCurrentValue( ) throw (RuntimeException) + { + ::osl::MutexGuard aGuard( m_aMutex ); + Any aValue; + sal_Int32 level = ((sal_Int32) m_aEntryPath.size() - 1); + level = level < 0 ? 0: level; + aValue <<= level; + return aValue; + } + + // ----------------------------------------------------------------------------- + + sal_Bool AccessibleListBoxEntry::setCurrentValue( const Any& aNumber ) throw (RuntimeException) + { + ::osl::MutexGuard aGuard( m_aMutex ); + + + sal_Bool bReturn = sal_False; + SvTreeListBox* pBox = getListBox(); + if(getAccessibleRole() == AccessibleRole::CHECK_BOX) + { + SvTreeListEntry* pEntry = pBox->GetEntryFromPath( m_aEntryPath ); + if ( pEntry ) + { + sal_Int32 nValue(0), nValueMin(0), nValueMax(0); + aNumber >>= nValue; + getMinimumValue() >>= nValueMin; + getMaximumValue() >>= nValueMax; + + if ( nValue < nValueMin ) + nValue = nValueMin; + else if ( nValue > nValueMax ) + nValue = nValueMax; + + pBox->SetCheckButtonState(pEntry, (SvButtonState) nValue ); + bReturn = sal_True; + } + } + + return bReturn; + } + + // ----------------------------------------------------------------------------- + + Any AccessibleListBoxEntry::getMaximumValue( ) throw (RuntimeException) + { + ::osl::MutexGuard aGuard( m_aMutex ); + + Any aValue; + // SvTreeListBox* pBox = getListBox(); + switch(getAccessibleRole()) + { + case AccessibleRole::CHECK_BOX: + aValue <<= (sal_Int32)1; + break; + case AccessibleRole::LABEL: + default: + break; + } + + return aValue; + } + + // ----------------------------------------------------------------------------- + + Any AccessibleListBoxEntry::getMinimumValue( ) throw (RuntimeException) + { + ::osl::MutexGuard aGuard( m_aMutex ); + + Any aValue; + // SvTreeListBox* pBox = getListBox(); + switch(getAccessibleRole()) + { + case AccessibleRole::CHECK_BOX: + aValue <<= (sal_Int32)0; + break; + case AccessibleRole::LABEL: + default: + break; + } + + return aValue; + } + + // ----------------------------------------------------------------------------- + + SvTreeListEntry* AccessibleListBoxEntry::GetRealChild(sal_Int32 nIndex) + { + SvTreeListEntry* pEntry = NULL; + SvTreeListEntry* pParent = getListBox()->GetEntryFromPath( m_aEntryPath ); + if (pParent) + { + pEntry = getListBox()->GetEntry( pParent, nIndex ); + if ( !pEntry && getAccessibleChildCount() > 0 ) + { + getListBox()->RequestingChildren(pParent); + pEntry = getListBox()->GetEntry( pParent, nIndex ); + } + } + return pEntry; + } //........................................................................ }// namespace accessibility //........................................................................ |