diff options
Diffstat (limited to 'accessibility/source/standard/vclxaccessiblebox.cxx')
-rw-r--r-- | accessibility/source/standard/vclxaccessiblebox.cxx | 235 |
1 files changed, 229 insertions, 6 deletions
diff --git a/accessibility/source/standard/vclxaccessiblebox.cxx b/accessibility/source/standard/vclxaccessiblebox.cxx index 6676b15e3159..2f40002e3147 100644 --- a/accessibility/source/standard/vclxaccessiblebox.cxx +++ b/accessibility/source/standard/vclxaccessiblebox.cxx @@ -110,11 +110,98 @@ void VCLXAccessibleBox::ProcessWindowEvent (const VclWindowEvent& rVclWindowEven { switch ( rVclWindowEvent.GetId() ) { + case VCLEVENT_LISTBOX_SELECT: + case VCLEVENT_LISTBOX_FOCUSITEMCHANGED: + + { + // Forward the call to the list child. + VCLXAccessibleList* pList = static_cast<VCLXAccessibleList*>(m_xList.get()); + if ( pList == NULL ) + { + getAccessibleChild ( m_bHasTextChild ? 1 : 0 ); + pList = static_cast<VCLXAccessibleList*>(m_xList.get()); + } + if ( pList != NULL ) + { + pList->ProcessWindowEvent (rVclWindowEvent, m_bIsDropDownBox); + if(m_bIsDropDownBox) + { + NotifyAccessibleEvent(AccessibleEventId::VALUE_CHANGED, Any(), Any()); + Any aOldValue; + Any aNewValue; + aOldValue <<= AccessibleStateType::INDETERMINATE; + NotifyAccessibleEvent(AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue); + + } + } + break; + } case VCLEVENT_DROPDOWN_OPEN: + { + VCLXAccessibleList* pList = static_cast<VCLXAccessibleList*>(m_xList.get()); + if ( pList == NULL ) + { + getAccessibleChild ( m_bHasTextChild ? 1 : 0 ); + pList = static_cast<VCLXAccessibleList*>(m_xList.get()); + } + if ( pList != NULL ) + { + pList->ProcessWindowEvent (rVclWindowEvent); + pList->HandleDropOpen(); + } + break; + } case VCLEVENT_DROPDOWN_CLOSE: + { + VCLXAccessibleList* pList = static_cast<VCLXAccessibleList*>(m_xList.get()); + if ( pList == NULL ) + { + getAccessibleChild ( m_bHasTextChild ? 1 : 0 ); + pList = static_cast<VCLXAccessibleList*>(m_xList.get()); + } + if ( pList != NULL ) + { + pList->ProcessWindowEvent (rVclWindowEvent); + } + Window* pWindow = GetWindow(); + if( pWindow && (pWindow->HasFocus() || pWindow->HasChildPathFocus()) ) + { + Any aOldValue, aNewValue; + aNewValue <<= AccessibleStateType::FOCUSED; + NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue ); + } + break; + } + case VCLEVENT_COMBOBOX_SELECT: + { + VCLXAccessibleList* pList = static_cast<VCLXAccessibleList*>(m_xList.get()); + if (pList != NULL) + { + Reference<XAccessibleText> xText (m_xText->getAccessibleContext(), UNO_QUERY); + if ( xText.is() ) + { + ::rtl::OUString sText = xText->getSelectedText(); + if ( !sText.getLength() ) + sText = xText->getText(); + pList->UpdateSelection_Acc (sText, m_bIsDropDownBox); + //if(m_bIsDropDownBox && !pList->IsInDropDown()) + if (m_bIsDropDownBox || ( !m_bIsDropDownBox && m_aBoxType==COMBOBOX)) + NotifyAccessibleEvent(AccessibleEventId::VALUE_CHANGED, Any(), Any()); + + Any aOldValue; + Any aNewValue; + aOldValue <<= AccessibleStateType::INDETERMINATE; + NotifyAccessibleEvent(AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue); + + } + } + break; + } + //case VCLEVENT_DROPDOWN_OPEN: + //case VCLEVENT_DROPDOWN_CLOSE: case VCLEVENT_LISTBOX_DOUBLECLICK: case VCLEVENT_LISTBOX_SCROLLED: - case VCLEVENT_LISTBOX_SELECT: + //case VCLEVENT_LISTBOX_SELECT: case VCLEVENT_LISTBOX_ITEMADDED: case VCLEVENT_LISTBOX_ITEMREMOVED: case VCLEVENT_COMBOBOX_ITEMADDED: @@ -133,7 +220,7 @@ void VCLXAccessibleBox::ProcessWindowEvent (const VclWindowEvent& rVclWindowEven break; } - case VCLEVENT_COMBOBOX_SELECT: + //case VCLEVENT_COMBOBOX_SELECT: case VCLEVENT_COMBOBOX_DESELECT: { // Selection is handled by VCLXAccessibleList which operates on @@ -157,6 +244,7 @@ void VCLXAccessibleBox::ProcessWindowEvent (const VclWindowEvent& rVclWindowEven case VCLEVENT_EDIT_MODIFY: case VCLEVENT_EDIT_SELECTIONCHANGED: + // case VCLEVENT_EDIT_CARETCHANGED: // Modify/Selection events are handled by the combo box instead of // directly by the edit field (Why?). Therefore, delegate this // call to the edit field. @@ -171,7 +259,30 @@ void VCLXAccessibleBox::ProcessWindowEvent (const VclWindowEvent& rVclWindowEven } } break; - + /* + // MT: Not sending VCLEVENT_LISTBOX_STATEUPDATE, see comment in ListBox::SelectEntryPos + case VCLEVENT_LISTBOX_STATEUPDATE: + { + // Need to update the INDETERMINATE state sometimes + if (m_bIsDropDownBox && m_aBoxType==LISTBOX) + { + sal_Int32 nSelectedEntryCount = 0; + ListBox* pListBox = static_cast< ListBox* >( GetWindow() ); + if (pListBox != NULL && pListBox->GetEntryCount() > 0) + { + nSelectedEntryCount = pListBox->GetSelectEntryCount(); + Any aOldValue; + Any aNewValue; + if ( nSelectedEntryCount == 0) + aNewValue <<= AccessibleStateType::INDETERMINATE; + else + aOldValue <<= AccessibleStateType::INDETERMINATE; + NotifyAccessibleEvent(AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue); + } + } + break; + } + */ default: VCLXAccessibleComponent::ProcessWindowEvent( rVclWindowEvent ); } @@ -250,7 +361,11 @@ Reference<XAccessible> SAL_CALL VCLXAccessibleBox::getAccessibleChild (sal_Int32 { ComboBox* pComboBox = static_cast<ComboBox*>(GetWindow()); if (pComboBox!=NULL && pComboBox->GetSubEdit()!=NULL) + //Set the edit's acc name the same as parent + { + pComboBox->GetSubEdit()->SetAccessibleName(getAccessibleName()); m_xText = pComboBox->GetSubEdit()->GetAccessible(); + } } else if (m_bIsDropDownBox) m_xText = new VCLXAccessibleTextField (GetVCLXWindow(),this); @@ -269,7 +384,11 @@ sal_Int16 SAL_CALL VCLXAccessibleBox::getAccessibleRole (void) throw (RuntimeExc // Return the role <const>COMBO_BOX</const> for both VCL combo boxes and // VCL list boxes in DropDown-Mode else <const>PANEL</const>. // This way the Java bridge has not to handle both independently. - return m_bIsDropDownBox ? AccessibleRole::COMBO_BOX : AccessibleRole::PANEL; + //return m_bIsDropDownBox ? AccessibleRole::COMBO_BOX : AccessibleRole::PANEL; + if (m_bIsDropDownBox || (!m_bIsDropDownBox && m_aBoxType == COMBOBOX )) + return AccessibleRole::COMBO_BOX; + else + return AccessibleRole::PANEL; } sal_Int32 SAL_CALL VCLXAccessibleBox::getAccessibleIndexInParent (void) @@ -290,7 +409,7 @@ sal_Int32 SAL_CALL VCLXAccessibleBox::getAccessibleActionCount (void) // There is one action for drop down boxes (toggle popup) and none for // the other boxes. - return m_bIsDropDownBox ? 1 : 0; + return m_bIsDropDownBox ? 0 : 1; } sal_Bool SAL_CALL VCLXAccessibleBox::doAccessibleAction (sal_Int32 nIndex) @@ -337,7 +456,11 @@ OUString SAL_CALL VCLXAccessibleBox::getAccessibleActionDescription (sal_Int32 n ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); if (nIndex<0 || nIndex>=getAccessibleActionCount()) throw ::com::sun::star::lang::IndexOutOfBoundsException(); - return TK_RES_STRING( RID_STR_ACC_ACTION_TOGGLEPOPUP); + //Solution:When combo_box,it should not has action information. + //return TK_RES_STRING( RID_STR_ACC_ACTION_TOGGLEPOPUP); + if (m_aBoxType == LISTBOX) + return ::rtl::OUString(); + return m_bIsDropDownBox?::rtl::OUString():TK_RES_STRING( RID_STR_ACC_ACTION_TOGGLEPOPUP); } Reference< XAccessibleKeyBinding > VCLXAccessibleBox::getAccessibleActionKeyBinding( sal_Int32 nIndex ) @@ -361,4 +484,104 @@ void SAL_CALL VCLXAccessibleBox::disposing (void) VCLXAccessibleComponent::disposing(); } +// ===== XAccessibleValue =============================================== +Any VCLXAccessibleBox::getCurrentValue( ) + throw( RuntimeException ) +{ + SolarMutexGuard aSolarGuard; + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + + Any aAny; + if( m_xList.is() && m_xText.is()) + { + // VCLXAccessibleList* pList = static_cast<VCLXAccessibleList*>(m_xList.get()); + Reference<XAccessibleText> xText (m_xText->getAccessibleContext(), UNO_QUERY); + if ( xText.is() ) + { + ::rtl::OUString sText = xText->getText(); + aAny <<= sText; + } + } + if (m_aBoxType == LISTBOX && m_bIsDropDownBox && m_xList.is() ) + { + + VCLXAccessibleList* pList = static_cast<VCLXAccessibleList*>(m_xList.get()); + if(pList->IsInDropDown()) + { + if(pList->getSelectedAccessibleChildCount()>0) + { + Reference<XAccessibleContext> xName (pList->getSelectedAccessibleChild((sal_Int32)(0)), UNO_QUERY); + if(xName.is()) + { + aAny <<= xName->getAccessibleName(); + } + } + } + } + + return aAny; +} + +sal_Bool VCLXAccessibleBox::setCurrentValue( const Any& aNumber ) + throw( RuntimeException ) +{ + SolarMutexGuard aSolarGuard; + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + + ::rtl::OUString fValue; + sal_Bool bValid = (aNumber >>= fValue); + if( bValid ) + { + + } + return bValid; + +} + +Any VCLXAccessibleBox::getMaximumValue( ) + throw( RuntimeException ) +{ + Any aAny; + return aAny; +} + +Any VCLXAccessibleBox::getMinimumValue( ) + throw( RuntimeException ) +{ + Any aAny; + return aAny; +} + +// Set the INDETERMINATE state when there is no selected item for combobox +void VCLXAccessibleBox::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet ) +{ + VCLXAccessibleComponent::FillAccessibleStateSet(rStateSet); + if (m_aBoxType == COMBOBOX ) + { + ::rtl::OUString sText; + sal_Int32 nEntryCount = 0; + ComboBox* pComboBox = static_cast<ComboBox*>(GetWindow()); + if (pComboBox != NULL) + { + Edit* pSubEdit = pComboBox->GetSubEdit(); + if ( pSubEdit) + sText = pSubEdit->GetText(); + nEntryCount = pComboBox->GetEntryCount(); + } + if (sText.getLength() == 0 && nEntryCount >0) + rStateSet.AddState(AccessibleStateType::INDETERMINATE); + } + else if (m_aBoxType == LISTBOX && m_bIsDropDownBox == true) + { + sal_Int32 nSelectedEntryCount = 0; + ListBox* pListBox = static_cast< ListBox* >( GetWindow() ); + if (pListBox != NULL && pListBox->GetEntryCount() > 0) + { + nSelectedEntryCount = pListBox->GetSelectEntryCount(); + if ( nSelectedEntryCount == 0) + rStateSet.AddState(AccessibleStateType::INDETERMINATE); + } + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |