Handle disabled/hidden/invisible items for wxDVC accessibility purposes

Return corresponding states (wxACC_STATE_SYSTEM_UNAVAILABLE, wxACC_STATE_SYSTEM_INVISIBLE, wxACC_STATE_SYSTEM_OFFSCREEN) for objects which are disabled, hidden or invisible (out of screen).
This commit is contained in:
Artur Wieczorek
2016-10-14 23:57:08 +02:00
parent 239361c7c4
commit d25cfa0e50

View File

@@ -5560,18 +5560,17 @@ wxAccStatus wxDataViewCtrlAccessible::GetLocation(wxRect& rect, int elementId)
{ {
wxDataViewCtrl* dvCtrl = wxDynamicCast(GetWindow(), wxDataViewCtrl); wxDataViewCtrl* dvCtrl = wxDynamicCast(GetWindow(), wxDataViewCtrl);
wxCHECK( dvCtrl, wxACC_FAIL ); wxCHECK( dvCtrl, wxACC_FAIL );
wxDataViewMainWindow* dvWnd = wxDynamicCast(dvCtrl->GetMainWindow(), wxDataViewMainWindow);
if ( elementId == wxACC_SELF ) if ( elementId == wxACC_SELF )
{ {
// Header accesibility requestes are handled separately // Header accesibility requestes are handled separately
// so header is excluded from effective client area // so header is excluded from effective client area
// and hence only main window area is reported. // and hence only main window area is reported.
wxDataViewMainWindow* dvWnd = wxDynamicCast(dvCtrl->GetMainWindow(), wxDataViewMainWindow);
rect = dvWnd->GetScreenRect(); rect = dvWnd->GetScreenRect();
} }
else else
{ {
wxDataViewMainWindow* dvWnd = wxDynamicCast(dvCtrl->GetMainWindow(), wxDataViewMainWindow);
wxDataViewItem item = dvWnd->GetItemByRow(elementId-1); wxDataViewItem item = dvWnd->GetItemByRow(elementId-1);
if ( !item.IsOk() ) if ( !item.IsOk() )
{ {
@@ -5727,7 +5726,7 @@ wxAccStatus wxDataViewCtrlAccessible::GetName(int childId, wxString* name)
if ( itemName.empty() ) if ( itemName.empty() )
{ {
// Return row number if not textual column found. // Return row number if no textual column found.
// Rows are numbered from 1. // Rows are numbered from 1.
*name = _("Row") + wxString::Format(wxS(" %i"), childId); *name = _("Row") + wxString::Format(wxS(" %i"), childId);
} }
@@ -5992,29 +5991,38 @@ wxAccStatus wxDataViewCtrlAccessible::GetState(int childId, long* state)
wxDataViewMainWindow* dvWnd = wxDynamicCast(dvCtrl->GetMainWindow(), wxDataViewMainWindow); wxDataViewMainWindow* dvWnd = wxDynamicCast(dvCtrl->GetMainWindow(), wxDataViewMainWindow);
long st = 0; long st = 0;
// State flags common to the object and its children.
if ( !dvWnd->IsEnabled() )
st |= wxACC_STATE_SYSTEM_UNAVAILABLE;
if ( !dvWnd->IsShown() )
st |= wxACC_STATE_SYSTEM_INVISIBLE;
if ( childId == wxACC_SELF ) if ( childId == wxACC_SELF )
{ {
if( dvWnd->IsFocusable() ) if( dvWnd->IsFocusable() )
st |= wxACC_STATE_SYSTEM_FOCUSABLE; st |= wxACC_STATE_SYSTEM_FOCUSABLE;
if ( dvWnd->HasFocus() ) if ( dvWnd->HasFocus() )
st |= wxACC_STATE_SYSTEM_FOCUSED; st |= wxACC_STATE_SYSTEM_FOCUSED;
} }
else else
{ {
const unsigned int rowNum = childId-1;
if( dvWnd->IsFocusable() ) if( dvWnd->IsFocusable() )
st |= wxACC_STATE_SYSTEM_FOCUSABLE | wxACC_STATE_SYSTEM_SELECTABLE; st |= wxACC_STATE_SYSTEM_FOCUSABLE | wxACC_STATE_SYSTEM_SELECTABLE;
if ( !dvWnd->IsSingleSel() ) if ( !dvWnd->IsSingleSel() )
st |= wxACC_STATE_SYSTEM_MULTISELECTABLE | wxACC_STATE_SYSTEM_EXTSELECTABLE; st |= wxACC_STATE_SYSTEM_MULTISELECTABLE | wxACC_STATE_SYSTEM_EXTSELECTABLE;
if ( dvWnd->GetCurrentRow() == (unsigned int)childId-1 ) if ( rowNum < dvWnd->GetFirstVisibleRow() || rowNum > dvWnd->GetLastVisibleRow() )
st |= wxACC_STATE_SYSTEM_OFFSCREEN;
if ( dvWnd->GetCurrentRow() == rowNum )
st |= wxACC_STATE_SYSTEM_FOCUSED; st |= wxACC_STATE_SYSTEM_FOCUSED;
if ( dvWnd->IsRowSelected(childId-1) ) if ( dvWnd->IsRowSelected(rowNum) )
st |= wxACC_STATE_SYSTEM_SELECTED; st |= wxACC_STATE_SYSTEM_SELECTED;
if ( !dvWnd->IsList() ) if ( !dvWnd->IsList() )
{ {
wxDataViewTreeNode* node = dvWnd->GetTreeNodeByRow(childId-1); wxDataViewTreeNode* node = dvWnd->GetTreeNodeByRow(rowNum);
if ( node ) if ( node )
{ {
if ( node->HasChildren() ) if ( node->HasChildren() )
@@ -6027,7 +6035,7 @@ wxAccStatus wxDataViewCtrlAccessible::GetState(int childId, long* state)
} }
} }
wxDataViewItem item = dvWnd->GetItemByRow(childId-1); wxDataViewItem item = dvWnd->GetItemByRow(rowNum);
if ( item.IsOk() ) if ( item.IsOk() )
{ {
if ( !dvWnd->HasEditableColumn(item) ) if ( !dvWnd->HasEditableColumn(item) )