in main/winaccessibility/source/service/AccObject.cxx [722:899]
void AccObject::UpdateState()
{
if (!m_pIMAcc)
{
return;
}
XAccessibleContext* pContext = m_xAccContextRef.get();
Reference< XAccessibleStateSet > pRState = pContext->getAccessibleStateSet();
if( !pRState.is() )
{
assert(false);
return ;
}
m_pIMAcc->SetState(0L);
if ( m_accRole == POPUP_MENU )
{
return;
}
Sequence<short> pStates = pRState->getStates();
int count = pStates.getLength();
sal_Bool isEnable = sal_False;
sal_Bool isShowing = sal_False;
sal_Bool isEditable = sal_False;
sal_Bool isVisible = sal_False;
sal_Bool isFocusable = sal_False;
for( int iIndex = 0;iIndex < count;iIndex++ )
{
if( pStates[iIndex] == ENABLED )
isEnable = sal_True;
else if( pStates[iIndex] == SHOWING)
isShowing = sal_True;
else if( pStates[iIndex] == VISIBLE)
isVisible = sal_True;
else if( pStates[iIndex] == EDITABLE )
isEditable = sal_True;
else if (pStates[iIndex] == FOCUSABLE)
isFocusable = sal_True;
IncreaseState( pStates[iIndex]);
}
sal_Bool bIsMenuItem = m_accRole == MENU_ITEM || m_accRole == RADIO_MENU_ITEM || m_accRole == CHECK_MENU_ITEM;
if(bIsMenuItem)
{
if(!(isShowing && isVisible) )
{
m_pIMAcc->IncreaseState( STATE_SYSTEM_INVISIBLE );
m_pIMAcc->DecreaseState( STATE_SYSTEM_FOCUSABLE );
}
}
else
{
if(!(isShowing || isVisible) )
m_pIMAcc->IncreaseState( STATE_SYSTEM_INVISIBLE );
}
short Role = m_accRole;
if( m_pIMAcc )
{
switch(m_accRole)
{
case LABEL:
m_pIMAcc->IncreaseState( STATE_SYSTEM_READONLY );
break;
case TEXT:
// 2. editable combobox -> readonly ------ bridge
case EMBEDDED_OBJECT:
case END_NOTE:
case FOOTER:
case FOOTNOTE:
case GRAPHIC:
case HEADER:
case HEADING:
//Image Map
case PARAGRAPH:
case PASSWORD_TEXT:
case SHAPE:
case SPIN_BOX:
case TABLE:
case TABLE_CELL:
case TEXT_FRAME:
case DATE_EDITOR:
case DOCUMENT:
case COLUMN_HEADER:
{
if(!isEditable)
m_pIMAcc->IncreaseState( STATE_SYSTEM_READONLY );
}
break;
default:
break;
}
}
if( isEnable )
{
if(!(Role == FILLER || Role == END_NOTE || Role == FOOTER || Role == FOOTNOTE || Role == GROUP_BOX || Role == RULER
|| Role == HEADER || Role == ICON || Role == INTERNAL_FRAME || Role == LABEL || Role == LAYERED_PANE
|| Role == SCROLL_BAR || Role == SCROLL_PANE || Role == SPLIT_PANE || Role == STATUS_BAR || Role == TOOL_TIP))
{
if( SEPARATOR == Role )
{
if( ( m_pParentObj != NULL ) && ( MENU == m_pParentObj->m_accRole || POPUP_MENU == m_pParentObj->m_accRole ))
IncreaseState( FOCUSABLE );
}
else if (TABLE_CELL == Role || TABLE == Role || PANEL == Role || OPTION_PANE == Role ||
COLUMN_HEADER == Role)
{
if (isFocusable)
IncreaseState( FOCUSABLE );
}
else
{
if(bIsMenuItem)
{
if ( isShowing && isVisible)
{
IncreaseState( FOCUSABLE );
}
}
else
{
IncreaseState( FOCUSABLE );
}
}
}
}
else
{
m_pIMAcc->IncreaseState( STATE_SYSTEM_UNAVAILABLE );
sal_Bool isDecreaseFocusable = sal_False;
if( !((Role == MENU_ITEM) ||
(Role == RADIO_MENU_ITEM) ||
(Role == CHECK_MENU_ITEM)) )
{
if ( Role == TOGGLE_BUTTON || Role == PUSH_BUTTON || BUTTON_DROPDOWN == Role)
{
if(( m_pParentObj != NULL )&& (TOOL_BAR == m_pParentObj->m_accRole ) )
IncreaseState( FOCUSABLE );
else
DecreaseState( FOCUSABLE );
}
else
DecreaseState( FOCUSABLE );
}
else if( isShowing || isVisible )
{
IncreaseState( FOCUSABLE );
}
}
if( m_pIMAcc )
{
switch(m_accRole)
{
case POPUP_MENU:
case MENU:
if( pContext->getAccessibleChildCount() > 0 )
m_pIMAcc->IncreaseState( STATE_SYSTEM_HASPOPUP );
break;
case PASSWORD_TEXT:
m_pIMAcc->IncreaseState( STATE_SYSTEM_PROTECTED );
break;
default:
break;
}
}
}