13a700b0aSSteve Yin /**************************************************************
23a700b0aSSteve Yin  *
33a700b0aSSteve Yin  * Licensed to the Apache Software Foundation (ASF) under one
43a700b0aSSteve Yin  * or more contributor license agreements.  See the NOTICE file
53a700b0aSSteve Yin  * distributed with this work for additional information
63a700b0aSSteve Yin  * regarding copyright ownership.  The ASF licenses this file
73a700b0aSSteve Yin  * to you under the Apache License, Version 2.0 (the
83a700b0aSSteve Yin  * "License"); you may not use this file except in compliance
93a700b0aSSteve Yin  * with the License.  You may obtain a copy of the License at
103a700b0aSSteve Yin  *
113a700b0aSSteve Yin  *   http://www.apache.org/licenses/LICENSE-2.0
123a700b0aSSteve Yin  *
133a700b0aSSteve Yin  * Unless required by applicable law or agreed to in writing,
143a700b0aSSteve Yin  * software distributed under the License is distributed on an
153a700b0aSSteve Yin  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
163a700b0aSSteve Yin  * KIND, either express or implied.  See the License for the
173a700b0aSSteve Yin  * specific language governing permissions and limitations
183a700b0aSSteve Yin  * under the License.
193a700b0aSSteve Yin  *
203a700b0aSSteve Yin  *************************************************************/
215fdc4257SSteve Yin 
225fdc4257SSteve Yin #include <com/sun/star/uno/Sequence.h>
235fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleStateType.hpp>
245fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleRole.hpp>
255fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleValue.hpp>
265fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleComponent.hpp>
275fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleText.hpp>
285fdc4257SSteve Yin 
295fdc4257SSteve Yin #include <stdlib.h>
305fdc4257SSteve Yin #include <memory.h>
315fdc4257SSteve Yin #include <stdio.h>
325fdc4257SSteve Yin #include <memory.h>
335fdc4257SSteve Yin #include <algorithm>
345fdc4257SSteve Yin #include <assert.h>
355fdc4257SSteve Yin 
365fdc4257SSteve Yin #include "AccObject.hxx"
375fdc4257SSteve Yin #include "AccEventListener.hxx"
385fdc4257SSteve Yin #include "UAccCOM_i.c"
395fdc4257SSteve Yin #include "AccResource.hxx"
403a700b0aSSteve Yin 
41b0a7a3cfSSteve Yin #include "act.hxx"
425fdc4257SSteve Yin 
435fdc4257SSteve Yin using namespace std;
445fdc4257SSteve Yin using namespace com::sun::star::uno;
455fdc4257SSteve Yin using namespace com::sun::star::accessibility;
465fdc4257SSteve Yin using namespace com::sun::star::accessibility::AccessibleRole;
475fdc4257SSteve Yin using namespace com::sun::star::accessibility::AccessibleStateType;
485fdc4257SSteve Yin 
495fdc4257SSteve Yin 
505fdc4257SSteve Yin /**
515fdc4257SSteve Yin    * Constructor.
525fdc4257SSteve Yin    * @param pXAcc Uno XAccessible interface of control.
535fdc4257SSteve Yin    * @param Agent The agent kept in all listeners,it's the sole interface by which
545fdc4257SSteve Yin    *              listener communicate with windows manager.
555fdc4257SSteve Yin    * @param listener listener that registers in UNO system.
565fdc4257SSteve Yin    * @return.
575fdc4257SSteve Yin    */
AccObject(XAccessible * pAcc,AccObjectManagerAgent * pAgent,AccEventListener * listener)585fdc4257SSteve Yin AccObject::AccObject(XAccessible* pAcc,AccObjectManagerAgent* pAgent ,AccEventListener* listener) :
595fdc4257SSteve Yin         m_pIMAcc	(NULL),
605fdc4257SSteve Yin         m_resID		(NULL),
615fdc4257SSteve Yin         m_pParantID	(NULL),
625fdc4257SSteve Yin         m_pParentObj(NULL),
635fdc4257SSteve Yin         m_accListener (listener),
645fdc4257SSteve Yin         m_bShouldDestroy(sal_False),
655fdc4257SSteve Yin         m_xAccRef( pAcc )
665fdc4257SSteve Yin {
675fdc4257SSteve Yin     sal_Bool bRet = ImplInitilizeCreateObj();
685fdc4257SSteve Yin 
695fdc4257SSteve Yin     m_xAccContextRef = m_xAccRef->getAccessibleContext();
705fdc4257SSteve Yin     m_xAccActionRef = Reference< XAccessibleAction > (m_xAccContextRef,UNO_QUERY);
715fdc4257SSteve Yin     m_accRole = m_xAccContextRef -> getAccessibleRole();
725fdc4257SSteve Yin     if( m_pIMAcc )
735fdc4257SSteve Yin     {
745fdc4257SSteve Yin         m_pIMAcc->SetXAccessible((long) m_xAccRef.get());
755fdc4257SSteve Yin         m_pIMAcc->Put_XAccAgent((long)pAgent);
765fdc4257SSteve Yin         m_pIMAcc->SetDefaultAction((long)m_xAccActionRef.get());
775fdc4257SSteve Yin     }
785fdc4257SSteve Yin }
795fdc4257SSteve Yin /**
805fdc4257SSteve Yin    * Destructor.
815fdc4257SSteve Yin    * @param
825fdc4257SSteve Yin    * @return
835fdc4257SSteve Yin    */
~AccObject()845fdc4257SSteve Yin AccObject::~AccObject()
855fdc4257SSteve Yin {
865fdc4257SSteve Yin     m_pIMAcc = NULL;
875fdc4257SSteve Yin     m_xAccRef = NULL;
885fdc4257SSteve Yin     m_xAccActionRef = NULL;
895fdc4257SSteve Yin     m_xAccContextRef = NULL;
905fdc4257SSteve Yin }
915fdc4257SSteve Yin 
925fdc4257SSteve Yin 
935fdc4257SSteve Yin 
945fdc4257SSteve Yin /**
955fdc4257SSteve Yin    * Insert a child element.
965fdc4257SSteve Yin    * @param pChild Child element that should be inserted into child list.
97*86e1cf34SPedro Giffuni    * @param pos Insert position.
985fdc4257SSteve Yin    * @return
995fdc4257SSteve Yin    */
InsertChild(AccObject * pChild,short pos)1005fdc4257SSteve Yin void AccObject::InsertChild( AccObject* pChild,short pos )
1015fdc4257SSteve Yin {
1025fdc4257SSteve Yin 
1035fdc4257SSteve Yin     std::vector<AccObject*>::iterator iter;
1045fdc4257SSteve Yin     iter = std::find(m_childrenList.begin(),m_childrenList.end(),pChild);
1055fdc4257SSteve Yin     if(iter!=m_childrenList.end())
1065fdc4257SSteve Yin         return;
1075fdc4257SSteve Yin     if(LAST_CHILD==pos)
1085fdc4257SSteve Yin     {
1095fdc4257SSteve Yin         m_childrenList.push_back(pChild);
1105fdc4257SSteve Yin     }
1115fdc4257SSteve Yin     else
1125fdc4257SSteve Yin     {
1135fdc4257SSteve Yin         std::vector<AccObject*>::iterator iter=m_childrenList.begin()+pos;
1145fdc4257SSteve Yin         m_childrenList.insert(iter,pChild);
1155fdc4257SSteve Yin     }
1165fdc4257SSteve Yin 
1175fdc4257SSteve Yin     pChild->SetParentObj(this);
1185fdc4257SSteve Yin }
1195fdc4257SSteve Yin 
1205fdc4257SSteve Yin /**
1215fdc4257SSteve Yin    * Delete a child element
1225fdc4257SSteve Yin    * @param pChild Child element that should be inserted into child list.
123*86e1cf34SPedro Giffuni    * @param pos Insert position.
1245fdc4257SSteve Yin    * @return
1255fdc4257SSteve Yin    */
DeleteChild(AccObject * pChild)1265fdc4257SSteve Yin void AccObject::DeleteChild( AccObject* pChild )
1275fdc4257SSteve Yin {
1285fdc4257SSteve Yin     std::vector<AccObject*>::iterator iter;
1295fdc4257SSteve Yin     iter = std::find(m_childrenList.begin(),m_childrenList.end(),pChild);
1305fdc4257SSteve Yin     if(iter!=m_childrenList.end())
1315fdc4257SSteve Yin     {
1325fdc4257SSteve Yin         m_childrenList.erase(iter);
1335fdc4257SSteve Yin         if(m_pIMAcc)
1345fdc4257SSteve Yin             pChild->SetParentObj(NULL);
1355fdc4257SSteve Yin     }
1365fdc4257SSteve Yin }
1375fdc4257SSteve Yin 
1385fdc4257SSteve Yin /**
1395fdc4257SSteve Yin    * In order to windows API WindowFromAccessibleObject,we sometimes to set a pure
1405fdc4257SSteve Yin    * top window accessible object created by windows system as top ancestor.
1415fdc4257SSteve Yin    * @param.
1425fdc4257SSteve Yin    * @return
1435fdc4257SSteve Yin    */
UpdateValidWindow()1445fdc4257SSteve Yin void AccObject::UpdateValidWindow()
1455fdc4257SSteve Yin {
1465fdc4257SSteve Yin     if(m_pIMAcc)
1475fdc4257SSteve Yin         m_pIMAcc->Put_XAccWindowHandle(m_pParantID);
1485fdc4257SSteve Yin }
1495fdc4257SSteve Yin 
1505fdc4257SSteve Yin /**
1515fdc4257SSteve Yin    * Translate all UNO basic information into MSAA com information.
1525fdc4257SSteve Yin    * @param
1535fdc4257SSteve Yin    * @return If the method is correctly processed.
1545fdc4257SSteve Yin    */
ImplInitilizeCreateObj()1555fdc4257SSteve Yin sal_Bool AccObject::ImplInitilizeCreateObj()
1565fdc4257SSteve Yin {
157b0a7a3cfSSteve Yin 	ActivateActContext();
1583a700b0aSSteve Yin 	HRESULT hr = CoCreateInstance( CLSID_MAccessible, NULL, CLSCTX_ALL ,
1595fdc4257SSteve Yin                                    IID_IMAccessible,
1603a700b0aSSteve Yin                                    (void **)&m_pIMAcc);
161b0a7a3cfSSteve Yin 	DeactivateActContext();
1623a700b0aSSteve Yin 
1633a700b0aSSteve Yin     if ( S_OK != hr )
1645fdc4257SSteve Yin     {
1655fdc4257SSteve Yin         return sal_False;
1665fdc4257SSteve Yin     }
1675fdc4257SSteve Yin 
1685fdc4257SSteve Yin     return sal_True;
1695fdc4257SSteve Yin }
1705fdc4257SSteve Yin 
1715fdc4257SSteve Yin /**
1725fdc4257SSteve Yin    * Update name property to com object.
1735fdc4257SSteve Yin    * @param
1745fdc4257SSteve Yin    * @return
1755fdc4257SSteve Yin    */
UpdateName()1765fdc4257SSteve Yin void  AccObject::UpdateName( )
1775fdc4257SSteve Yin {
1785fdc4257SSteve Yin     if (!m_pIMAcc)
1795fdc4257SSteve Yin     {
1805fdc4257SSteve Yin         return;
1815fdc4257SSteve Yin     }
1825fdc4257SSteve Yin 
1835fdc4257SSteve Yin     if( ( TEXT_FRAME == m_accRole   ) && ( m_pParentObj !=NULL )&& ( SCROLL_PANE == m_pParentObj -> m_accRole ) )
1845fdc4257SSteve Yin         m_pIMAcc->Put_XAccName( m_pParentObj->m_xAccContextRef->getAccessibleName().getStr() );
1855fdc4257SSteve Yin     if ( PARAGRAPH == m_accRole)
1865fdc4257SSteve Yin     {
1875fdc4257SSteve Yin     	::rtl::OUString emptyStr = ::rtl::OUString::createFromAscii("");
1885fdc4257SSteve Yin     	m_pIMAcc->Put_XAccName(emptyStr.getStr());
1895fdc4257SSteve Yin     }
1905fdc4257SSteve Yin     else
1915fdc4257SSteve Yin         m_pIMAcc->Put_XAccName(m_xAccContextRef->getAccessibleName().getStr());
1925fdc4257SSteve Yin 
1935fdc4257SSteve Yin     return ;
1945fdc4257SSteve Yin }
1955fdc4257SSteve Yin /**
1965fdc4257SSteve Yin    * Update description property to com object.
1975fdc4257SSteve Yin    * no content for update description
1985fdc4257SSteve Yin    * @param
1995fdc4257SSteve Yin    * @return
2005fdc4257SSteve Yin    */
UpdateDescription()2015fdc4257SSteve Yin void AccObject::UpdateDescription()
2025fdc4257SSteve Yin {
2035fdc4257SSteve Yin     if (!m_pIMAcc)
2045fdc4257SSteve Yin     {
2055fdc4257SSteve Yin         return;
2065fdc4257SSteve Yin     }
2075fdc4257SSteve Yin 
2085fdc4257SSteve Yin     m_pIMAcc->Put_XAccDescription(m_xAccContextRef->getAccessibleDescription().getStr());
2095fdc4257SSteve Yin     return ;
2105fdc4257SSteve Yin }
2115fdc4257SSteve Yin 
2125fdc4257SSteve Yin /**
2135fdc4257SSteve Yin    * Update default action property to com object.
2145fdc4257SSteve Yin    * @param
2155fdc4257SSteve Yin    * @return
2165fdc4257SSteve Yin    */
UpdateAction()2175fdc4257SSteve Yin void  AccObject::UpdateAction()
2185fdc4257SSteve Yin {
2195fdc4257SSteve Yin     m_xAccActionRef = Reference< XAccessibleAction > (m_xAccContextRef,UNO_QUERY);
2205fdc4257SSteve Yin 
2215fdc4257SSteve Yin     if( m_xAccActionRef.is() && m_pIMAcc )
2225fdc4257SSteve Yin     {
2235fdc4257SSteve Yin         if( m_xAccActionRef->getAccessibleActionCount() > 0 )
2245fdc4257SSteve Yin         {
2255fdc4257SSteve Yin             UpdateDefaultAction( );
2265fdc4257SSteve Yin             m_pIMAcc->SetDefaultAction((long)m_xAccActionRef.get());
2275fdc4257SSteve Yin         }
2285fdc4257SSteve Yin     }
2295fdc4257SSteve Yin }
2305fdc4257SSteve Yin 
2315fdc4257SSteve Yin /**
2325fdc4257SSteve Yin    * Update value property to com object.
2335fdc4257SSteve Yin    * @param
2345fdc4257SSteve Yin    * @return
2355fdc4257SSteve Yin    */
UpdateValue()2365fdc4257SSteve Yin void AccObject::UpdateValue()
2375fdc4257SSteve Yin {
2385fdc4257SSteve Yin     if( NULL == m_pIMAcc  || !m_xAccContextRef.is() )
2395fdc4257SSteve Yin     {
2405fdc4257SSteve Yin         assert(false);
2415fdc4257SSteve Yin         return ;
2425fdc4257SSteve Yin     }
2435fdc4257SSteve Yin 
2445fdc4257SSteve Yin     Reference< XAccessibleValue > pRValue(m_xAccContextRef.get(),UNO_QUERY);
2455fdc4257SSteve Yin     Any pAny;
2465fdc4257SSteve Yin     if( pRValue.is() )
2475fdc4257SSteve Yin     {
2485fdc4257SSteve Yin         pAny = pRValue->getCurrentValue();
2495fdc4257SSteve Yin     }
2505fdc4257SSteve Yin 
2515fdc4257SSteve Yin     SetValue( pAny );
2525fdc4257SSteve Yin }
2535fdc4257SSteve Yin 
2545fdc4257SSteve Yin /**
2555fdc4257SSteve Yin    * Set special default action description string via UNO role.
2565fdc4257SSteve Yin    * @param Role UNO role
2575fdc4257SSteve Yin    * @return
2585fdc4257SSteve Yin    */
UpdateDefaultAction()2595fdc4257SSteve Yin void AccObject::UpdateDefaultAction( )
2605fdc4257SSteve Yin {
2615fdc4257SSteve Yin     if(!m_xAccActionRef.is())
2625fdc4257SSteve Yin         return ;
2635fdc4257SSteve Yin 
2645fdc4257SSteve Yin     switch(m_accRole)
2655fdc4257SSteve Yin     {
2665fdc4257SSteve Yin     case PUSH_BUTTON:
2675fdc4257SSteve Yin     case TOGGLE_BUTTON:
2685fdc4257SSteve Yin     case RADIO_BUTTON:
2695fdc4257SSteve Yin     case MENU_ITEM:
2705fdc4257SSteve Yin     case RADIO_MENU_ITEM:
2715fdc4257SSteve Yin     case CHECK_MENU_ITEM:
2725fdc4257SSteve Yin     case LIST_ITEM:
2735fdc4257SSteve Yin     case CHECK_BOX:
2745fdc4257SSteve Yin     case TREE_ITEM:
2755fdc4257SSteve Yin     case BUTTON_DROPDOWN:
2765fdc4257SSteve Yin         m_pIMAcc->Put_ActionDescription( m_xAccActionRef->getAccessibleActionDescription((sal_Int32)0).getStr() );
2775fdc4257SSteve Yin         return;
2785fdc4257SSteve Yin     }
2795fdc4257SSteve Yin }
2805fdc4257SSteve Yin 
2815fdc4257SSteve Yin /**
2825fdc4257SSteve Yin    * Set value property via pAny.
2835fdc4257SSteve Yin    * @param pAny New value.
2845fdc4257SSteve Yin    * @return
2855fdc4257SSteve Yin    */
SetValue(Any pAny)2865fdc4257SSteve Yin void  AccObject::SetValue( Any pAny )
2875fdc4257SSteve Yin {
2885fdc4257SSteve Yin     unsigned short pUNumberString[100];
2895fdc4257SSteve Yin     memset( pUNumberString, 0 , sizeof( pUNumberString) );
2905fdc4257SSteve Yin 
2915fdc4257SSteve Yin     if( NULL == m_pIMAcc || !m_xAccContextRef.is() )
2925fdc4257SSteve Yin     {
2935fdc4257SSteve Yin         assert(false);
2945fdc4257SSteve Yin         return ;
2955fdc4257SSteve Yin     }
2965fdc4257SSteve Yin     Reference< XAccessibleText > pRText(m_xAccContextRef,UNO_QUERY);
2975fdc4257SSteve Yin     ::rtl::OUString val;
2985fdc4257SSteve Yin     int index = 0 ;
2995fdc4257SSteve Yin     switch(m_accRole)
3005fdc4257SSteve Yin     {
3015fdc4257SSteve Yin     case SPIN_BOX:
3025fdc4257SSteve Yin         // 3. date editor's msaa value should be the same as spinbox
3035fdc4257SSteve Yin     case DATE_EDITOR:
3045fdc4257SSteve Yin     case TEXT:
3055fdc4257SSteve Yin     case PARAGRAPH:
3065fdc4257SSteve Yin     case HEADING:
3075fdc4257SSteve Yin 
3085fdc4257SSteve Yin         if(pRText.get())
3095fdc4257SSteve Yin         {
3105fdc4257SSteve Yin             val = pRText->getText();
3115fdc4257SSteve Yin         }
3125fdc4257SSteve Yin         m_pIMAcc->Put_XAccValue( val.getStr() );
3135fdc4257SSteve Yin         break;
3145fdc4257SSteve Yin     case TREE_ITEM:
3155fdc4257SSteve Yin     //case CHECK_BOX:	//Commented by Li Xing to disable the value for general checkbox
3165fdc4257SSteve Yin     case COMBO_BOX:
3175fdc4257SSteve Yin     case TABLE_CELL:
3185fdc4257SSteve Yin     case NOTE:
3195fdc4257SSteve Yin     case SCROLL_BAR:
3205fdc4257SSteve Yin         m_pIMAcc->Put_XAccValue( GetMAccessibleValueFromAny(pAny).getStr() );
3215fdc4257SSteve Yin         break ;
3225fdc4257SSteve Yin 	// Added by Li Xing, only the checkbox in tree should have the value.
3235fdc4257SSteve Yin 	case CHECK_BOX:
3245fdc4257SSteve Yin 		if( ( m_pParentObj !=NULL ) && (TREE == m_pParentObj->m_accRole || TREE_ITEM == m_pParentObj->m_accRole ))
3255fdc4257SSteve Yin 	        m_pIMAcc->Put_XAccValue( GetMAccessibleValueFromAny(pAny).getStr() );
3265fdc4257SSteve Yin 		break;
3275fdc4257SSteve Yin     default:
3285fdc4257SSteve Yin         break;
3295fdc4257SSteve Yin     }
3305fdc4257SSteve Yin 
3315fdc4257SSteve Yin     return;
3325fdc4257SSteve Yin 
3335fdc4257SSteve Yin 
3345fdc4257SSteve Yin }
GetMAccessibleValueFromAny(Any pAny)3355fdc4257SSteve Yin ::rtl::OUString AccObject::GetMAccessibleValueFromAny(Any pAny)
3365fdc4257SSteve Yin {
3375fdc4257SSteve Yin     ::rtl::OUString strValue;
3385fdc4257SSteve Yin 
3395fdc4257SSteve Yin     if(NULL == m_pIMAcc)
3405fdc4257SSteve Yin         return strValue;
3415fdc4257SSteve Yin 
3425fdc4257SSteve Yin     if(pAny.getValueType() == getCppuType( (sal_uInt16 *)0 ) )
3435fdc4257SSteve Yin     {
3445fdc4257SSteve Yin         sal_uInt16 val;
3455fdc4257SSteve Yin         if (pAny >>= val)
3465fdc4257SSteve Yin         {
3475fdc4257SSteve Yin             strValue=::rtl::OUString::valueOf((sal_Int32)val);
3485fdc4257SSteve Yin 
3495fdc4257SSteve Yin         }
3505fdc4257SSteve Yin     }
3515fdc4257SSteve Yin     else if(pAny.getValueType() == getCppuType( (::rtl::OUString *)0 ) )
3525fdc4257SSteve Yin     {
3535fdc4257SSteve Yin 
3545fdc4257SSteve Yin         pAny >>= strValue ;
3555fdc4257SSteve Yin 
3565fdc4257SSteve Yin     }
3575fdc4257SSteve Yin     else if(pAny.getValueType() == getCppuType( (Sequence< ::rtl::OUString > *)0 ) )
3585fdc4257SSteve Yin     {
3595fdc4257SSteve Yin         Sequence< ::rtl::OUString > val;
3605fdc4257SSteve Yin         if (pAny >>= val)
3615fdc4257SSteve Yin         {
3625fdc4257SSteve Yin 
3635fdc4257SSteve Yin             int count = val.getLength();
3645fdc4257SSteve Yin 
3655fdc4257SSteve Yin             for( int iIndex = 0;iIndex < count;iIndex++ )
3665fdc4257SSteve Yin             {
3675fdc4257SSteve Yin                 strValue += val[iIndex];
3685fdc4257SSteve Yin             }
3695fdc4257SSteve Yin 
3705fdc4257SSteve Yin         }
3715fdc4257SSteve Yin     }
3725fdc4257SSteve Yin     else if(pAny.getValueType() == getCppuType( (double *)0 ) )
3735fdc4257SSteve Yin     {
3745fdc4257SSteve Yin         double val;
3755fdc4257SSteve Yin         if (pAny >>= val)
3765fdc4257SSteve Yin         {
3775fdc4257SSteve Yin             strValue=::rtl::OUString::valueOf(val);
3785fdc4257SSteve Yin         }
3795fdc4257SSteve Yin     }
3805fdc4257SSteve Yin     else if(pAny.getValueType() == getCppuType( (sal_Int32 *)0 ) )
3815fdc4257SSteve Yin     {
3825fdc4257SSteve Yin         sal_Int32 val;
3835fdc4257SSteve Yin         if (pAny >>= val)
3845fdc4257SSteve Yin         {
3855fdc4257SSteve Yin             strValue=::rtl::OUString::valueOf(val);
3865fdc4257SSteve Yin         }
3875fdc4257SSteve Yin     }
3885fdc4257SSteve Yin     else if (pAny.getValueType() == getCppuType( (com::sun::star::accessibility::TextSegment *)0 ) )
3895fdc4257SSteve Yin     {
3905fdc4257SSteve Yin         com::sun::star::accessibility::TextSegment val;
3915fdc4257SSteve Yin         if (pAny >>= val)
3925fdc4257SSteve Yin         {
3935fdc4257SSteve Yin             ::rtl::OUString realVal(val.SegmentText);
3945fdc4257SSteve Yin             strValue = realVal;
3955fdc4257SSteve Yin 
3965fdc4257SSteve Yin         }
3975fdc4257SSteve Yin     }
3985fdc4257SSteve Yin 
3995fdc4257SSteve Yin     return strValue;
4005fdc4257SSteve Yin }
4015fdc4257SSteve Yin /**
4025fdc4257SSteve Yin    * Set name property via pAny.
4035fdc4257SSteve Yin    * @param pAny New accessible name.
4045fdc4257SSteve Yin    * @return
4055fdc4257SSteve Yin    */
SetName(Any pAny)4065fdc4257SSteve Yin void  AccObject::SetName( Any pAny)
4075fdc4257SSteve Yin {
4085fdc4257SSteve Yin     if( NULL == m_pIMAcc )
4095fdc4257SSteve Yin         return ;
4105fdc4257SSteve Yin 
4115fdc4257SSteve Yin     m_pIMAcc->Put_XAccName( GetMAccessibleValueFromAny(pAny).getStr() );
4125fdc4257SSteve Yin 
4135fdc4257SSteve Yin }
4145fdc4257SSteve Yin 
4155fdc4257SSteve Yin /**
4165fdc4257SSteve Yin    * Set description property via pAny.
4175fdc4257SSteve Yin    * @param pAny New accessible description.
4185fdc4257SSteve Yin    * @return
4195fdc4257SSteve Yin    */
SetDescription(Any pAny)4205fdc4257SSteve Yin void  AccObject::SetDescription( Any pAny )
4215fdc4257SSteve Yin {
4225fdc4257SSteve Yin     if( NULL == m_pIMAcc )
4235fdc4257SSteve Yin         return ;
4245fdc4257SSteve Yin     m_pIMAcc->Put_XAccDescription( GetMAccessibleValueFromAny(pAny).getStr() );
4255fdc4257SSteve Yin }
4265fdc4257SSteve Yin 
4275fdc4257SSteve Yin /**
4285fdc4257SSteve Yin    * Set role property via pAny
4295fdc4257SSteve Yin    * @param Role New accessible role.
4305fdc4257SSteve Yin    * @return
4315fdc4257SSteve Yin    */
SetRole(short Role)4325fdc4257SSteve Yin void  AccObject::SetRole( short Role )
4335fdc4257SSteve Yin {
4345fdc4257SSteve Yin     if( NULL == m_pIMAcc )
4355fdc4257SSteve Yin         return ;
4365fdc4257SSteve Yin     m_pIMAcc->Put_XAccRole( Role );
4375fdc4257SSteve Yin }
4385fdc4257SSteve Yin 
4395fdc4257SSteve Yin /**
4405fdc4257SSteve Yin * Get role property via pAny
4415fdc4257SSteve Yin * @param
4425fdc4257SSteve Yin * @return accessible role
4435fdc4257SSteve Yin */
GetRole() const4445fdc4257SSteve Yin short AccObject::GetRole() const
4455fdc4257SSteve Yin {
4465fdc4257SSteve Yin     return m_accRole;
4475fdc4257SSteve Yin }
4485fdc4257SSteve Yin 
4495fdc4257SSteve Yin /**
4505fdc4257SSteve Yin    * Get MSAA state from UNO state
4515fdc4257SSteve Yin    * @Role xState UNO state.
4525fdc4257SSteve Yin    * @return
4535fdc4257SSteve Yin    */
GetMSAAStateFromUNO(short xState)4545fdc4257SSteve Yin DWORD AccObject::GetMSAAStateFromUNO(short xState)
4555fdc4257SSteve Yin {
4565fdc4257SSteve Yin     DWORD IState = UNO_MSAA_UNMAPPING;
4575fdc4257SSteve Yin 
4585fdc4257SSteve Yin     if( !m_xAccContextRef.is() )
4595fdc4257SSteve Yin     {
4605fdc4257SSteve Yin         assert(false);
4615fdc4257SSteve Yin         return IState;
4625fdc4257SSteve Yin     }
4635fdc4257SSteve Yin     short Role = m_accRole;
4645fdc4257SSteve Yin 
4655fdc4257SSteve Yin     switch( xState )
4665fdc4257SSteve Yin     {
4675fdc4257SSteve Yin     case  BUSY:
4685fdc4257SSteve Yin         IState = STATE_SYSTEM_BUSY;
4695fdc4257SSteve Yin         break;
4705fdc4257SSteve Yin     case  CHECKED:
4715fdc4257SSteve Yin         if( Role == PUSH_BUTTON || Role == TOGGLE_BUTTON )
4725fdc4257SSteve Yin         {
4735fdc4257SSteve Yin             IState = STATE_SYSTEM_PRESSED;
4745fdc4257SSteve Yin         }
4755fdc4257SSteve Yin         else
4765fdc4257SSteve Yin             IState = STATE_SYSTEM_CHECKED;
4775fdc4257SSteve Yin         break;
4785fdc4257SSteve Yin     case  DEFUNC:
4795fdc4257SSteve Yin         IState = STATE_SYSTEM_UNAVAILABLE;
4805fdc4257SSteve Yin         break;
4815fdc4257SSteve Yin     case  EXPANDED:
4825fdc4257SSteve Yin         IState = STATE_SYSTEM_EXPANDED;
4835fdc4257SSteve Yin         break;
4845fdc4257SSteve Yin     case  FOCUSABLE:
4855fdc4257SSteve Yin         IState = STATE_SYSTEM_FOCUSABLE;
4865fdc4257SSteve Yin         break;
4875fdc4257SSteve Yin     case  FOCUSED:
4885fdc4257SSteve Yin         IState = STATE_SYSTEM_FOCUSED;
4895fdc4257SSteve Yin         break;
4905fdc4257SSteve Yin     case  INDETERMINATE:
4915fdc4257SSteve Yin         IState = STATE_SYSTEM_MIXED;
4925fdc4257SSteve Yin         break;
4935fdc4257SSteve Yin     case  MULTI_SELECTABLE:
4945fdc4257SSteve Yin         IState = STATE_SYSTEM_MULTISELECTABLE;
4955fdc4257SSteve Yin         break;
4965fdc4257SSteve Yin     case  PRESSED:
4975fdc4257SSteve Yin         IState = STATE_SYSTEM_PRESSED;
4985fdc4257SSteve Yin         break;
4995fdc4257SSteve Yin     case  RESIZABLE:
5005fdc4257SSteve Yin         IState = STATE_SYSTEM_SIZEABLE;
5015fdc4257SSteve Yin         break;
5025fdc4257SSteve Yin     case  SELECTABLE:
5035fdc4257SSteve Yin         if( m_accRole == MENU || m_accRole == MENU_ITEM)
5045fdc4257SSteve Yin         {
5055fdc4257SSteve Yin             IState = UNO_MSAA_UNMAPPING;
5065fdc4257SSteve Yin         }
5075fdc4257SSteve Yin         else
5085fdc4257SSteve Yin         {
5095fdc4257SSteve Yin             IState = STATE_SYSTEM_SELECTABLE;
5105fdc4257SSteve Yin         }
5115fdc4257SSteve Yin         break;
5125fdc4257SSteve Yin     case  SELECTED:
5135fdc4257SSteve Yin         if( m_accRole == MENU || m_accRole == MENU_ITEM )
5145fdc4257SSteve Yin         {
5155fdc4257SSteve Yin             IState = UNO_MSAA_UNMAPPING;
5165fdc4257SSteve Yin         }
5175fdc4257SSteve Yin         else
5185fdc4257SSteve Yin         {
5195fdc4257SSteve Yin             IState = STATE_SYSTEM_SELECTED;
5205fdc4257SSteve Yin         }
5215fdc4257SSteve Yin         break;
5225fdc4257SSteve Yin     case  ARMED:
5235fdc4257SSteve Yin         IState = STATE_SYSTEM_FOCUSED;
5245fdc4257SSteve Yin         break;
5255fdc4257SSteve Yin     case  EXPANDABLE:
5265fdc4257SSteve Yin         {
5275fdc4257SSteve Yin             sal_Bool isExpanded = sal_True;
5285fdc4257SSteve Yin             sal_Bool isExpandable = sal_True;
5295fdc4257SSteve Yin             if( Role == PUSH_BUTTON || Role == TOGGLE_BUTTON  || BUTTON_DROPDOWN == Role )
5305fdc4257SSteve Yin             {
5315fdc4257SSteve Yin                 IState = STATE_SYSTEM_HASPOPUP;
5325fdc4257SSteve Yin             }
5335fdc4257SSteve Yin             else
5345fdc4257SSteve Yin             {
5355fdc4257SSteve Yin                 GetExpandedState(&isExpandable,&isExpanded);
5365fdc4257SSteve Yin                 if(!isExpanded)
5375fdc4257SSteve Yin                     IState = STATE_SYSTEM_COLLAPSED;
5385fdc4257SSteve Yin             }
5395fdc4257SSteve Yin         }
5405fdc4257SSteve Yin         break;
5415fdc4257SSteve Yin 	//Remove the SENSITIVE state mapping. There is no corresponding MSAA state.
5425fdc4257SSteve Yin     //case  SENSITIVE:
5435fdc4257SSteve Yin     //    IState = STATE_SYSTEM_PROTECTED;
5445fdc4257SSteve Yin     case EDITABLE:
5455fdc4257SSteve Yin         if( m_pIMAcc )
5465fdc4257SSteve Yin         {
5475fdc4257SSteve Yin             m_pIMAcc->DecreaseState( STATE_SYSTEM_READONLY );
5485fdc4257SSteve Yin         }
5495fdc4257SSteve Yin         break;
5505fdc4257SSteve Yin     case OFFSCREEN:
5515fdc4257SSteve Yin         IState = STATE_SYSTEM_OFFSCREEN;
5525fdc4257SSteve Yin         break;
5535fdc4257SSteve Yin     case MOVEABLE:
5545fdc4257SSteve Yin         IState = STATE_SYSTEM_MOVEABLE;
5555fdc4257SSteve Yin         break;
5565fdc4257SSteve Yin     case COLLAPSE:
5575fdc4257SSteve Yin         IState = STATE_SYSTEM_COLLAPSED;
5585fdc4257SSteve Yin         break;
5595fdc4257SSteve Yin     case DEFAULT:
5605fdc4257SSteve Yin         IState = STATE_SYSTEM_DEFAULT;
5615fdc4257SSteve Yin         break;
5625fdc4257SSteve Yin     default:
5635fdc4257SSteve Yin         break;
5645fdc4257SSteve Yin     }
5655fdc4257SSteve Yin 
5665fdc4257SSteve Yin     return IState;
5675fdc4257SSteve Yin }
5685fdc4257SSteve Yin 
5695fdc4257SSteve Yin /**
5705fdc4257SSteve Yin    * Decrease state of com object
5715fdc4257SSteve Yin    * @param xState The lost state.
5725fdc4257SSteve Yin    * @return
5735fdc4257SSteve Yin    */
DecreaseState(short xState)5745fdc4257SSteve Yin void  AccObject::DecreaseState( short xState )
5755fdc4257SSteve Yin {
5765fdc4257SSteve Yin     if( NULL == m_pIMAcc )
5775fdc4257SSteve Yin     {
5785fdc4257SSteve Yin         return;
5795fdc4257SSteve Yin     }
5805fdc4257SSteve Yin 
5815fdc4257SSteve Yin     if( xState == FOCUSABLE)
5825fdc4257SSteve Yin     {
5835fdc4257SSteve Yin         short Role = m_accRole ;
5845fdc4257SSteve Yin         if(Role == MENU_ITEM
5855fdc4257SSteve Yin                 || Role == RADIO_MENU_ITEM
5865fdc4257SSteve Yin                 || Role == CHECK_MENU_ITEM)
5875fdc4257SSteve Yin             return;
5885fdc4257SSteve Yin         else
5895fdc4257SSteve Yin         {
5905fdc4257SSteve Yin             if (Role == TOGGLE_BUTTON || Role == PUSH_BUTTON || BUTTON_DROPDOWN == Role)
5915fdc4257SSteve Yin             {
5925fdc4257SSteve Yin                 if( ( m_pParentObj !=NULL ) && (TOOL_BAR == m_pParentObj->m_accRole ) )
5935fdc4257SSteve Yin                     return;
5945fdc4257SSteve Yin             }
5955fdc4257SSteve Yin         }
5965fdc4257SSteve Yin     }
5975fdc4257SSteve Yin 
5985fdc4257SSteve Yin     else if( xState == AccessibleStateType::VISIBLE  )
5995fdc4257SSteve Yin     {
6005fdc4257SSteve Yin         m_pIMAcc->IncreaseState( STATE_SYSTEM_INVISIBLE );
6015fdc4257SSteve Yin     }
6025fdc4257SSteve Yin     else if( xState == AccessibleStateType::SHOWING )
6035fdc4257SSteve Yin     {
6045fdc4257SSteve Yin         m_pIMAcc->IncreaseState( STATE_SYSTEM_OFFSCREEN );
6055fdc4257SSteve Yin     }
6065fdc4257SSteve Yin 
6075fdc4257SSteve Yin     DWORD msState = GetMSAAStateFromUNO(xState);
6085fdc4257SSteve Yin     if(msState!=UNO_MSAA_UNMAPPING)
6095fdc4257SSteve Yin         m_pIMAcc->DecreaseState(msState);
6105fdc4257SSteve Yin }
6115fdc4257SSteve Yin 
6125fdc4257SSteve Yin /**
6135fdc4257SSteve Yin    * Increase state of com object
6145fdc4257SSteve Yin    * @param xState The new state.
6155fdc4257SSteve Yin    * @return
6165fdc4257SSteve Yin    */
IncreaseState(short xState)6175fdc4257SSteve Yin void AccObject::IncreaseState( short xState )
6185fdc4257SSteve Yin {
6195fdc4257SSteve Yin     if( NULL == m_pIMAcc )
6205fdc4257SSteve Yin     {
6215fdc4257SSteve Yin         assert(false);
6225fdc4257SSteve Yin         return;
6235fdc4257SSteve Yin     }
6245fdc4257SSteve Yin 
6255fdc4257SSteve Yin 
6265fdc4257SSteve Yin     if( xState == AccessibleStateType::VISIBLE  )
6275fdc4257SSteve Yin     {
6285fdc4257SSteve Yin         m_pIMAcc->DecreaseState( STATE_SYSTEM_INVISIBLE );
6295fdc4257SSteve Yin     }
6305fdc4257SSteve Yin     else if( xState == AccessibleStateType::SHOWING )
6315fdc4257SSteve Yin     {
6325fdc4257SSteve Yin         m_pIMAcc->DecreaseState( STATE_SYSTEM_OFFSCREEN );
6335fdc4257SSteve Yin     }
6345fdc4257SSteve Yin 
6355fdc4257SSteve Yin 
6365fdc4257SSteve Yin     DWORD msState = GetMSAAStateFromUNO(xState);
6375fdc4257SSteve Yin     if(msState!=UNO_MSAA_UNMAPPING)
6385fdc4257SSteve Yin         m_pIMAcc->IncreaseState( msState );
6395fdc4257SSteve Yin }
6405fdc4257SSteve Yin 
6415fdc4257SSteve Yin /**
6425fdc4257SSteve Yin    * Get next child element
6435fdc4257SSteve Yin    * @param
6445fdc4257SSteve Yin    * @return AccObject Object interface.
6455fdc4257SSteve Yin    */
NextChild()6465fdc4257SSteve Yin AccObject* AccObject::NextChild()
6475fdc4257SSteve Yin {
6485fdc4257SSteve Yin     IAccChildList::iterator pInd = m_childrenList.begin();
6495fdc4257SSteve Yin     if( pInd != m_childrenList.end() )
6505fdc4257SSteve Yin         return 	*pInd;
6515fdc4257SSteve Yin     return NULL;
6525fdc4257SSteve Yin }
6535fdc4257SSteve Yin /**
6545fdc4257SSteve Yin    * update action desciption desc
6555fdc4257SSteve Yin    * @param
6565fdc4257SSteve Yin    * @return
6575fdc4257SSteve Yin    */
UpdateActionDesc()6585fdc4257SSteve Yin void AccObject::UpdateActionDesc()
6595fdc4257SSteve Yin {
6605fdc4257SSteve Yin     if (!m_pIMAcc)
6615fdc4257SSteve Yin     {
6625fdc4257SSteve Yin         return;
6635fdc4257SSteve Yin     }
6645fdc4257SSteve Yin 
6655fdc4257SSteve Yin     ::rtl::OUString	pXString = m_xAccContextRef->getAccessibleDescription();
6665fdc4257SSteve Yin     m_pIMAcc->Put_XAccDescription(pXString.getStr());
6675fdc4257SSteve Yin     long Role = m_accRole;
6685fdc4257SSteve Yin 
6695fdc4257SSteve Yin     if(  Role == PUSH_BUTTON || Role == RADIO_BUTTON || Role == MENU_ITEM ||
6705fdc4257SSteve Yin             Role == LIST_ITEM || Role == CHECK_BOX || Role == TREE_ITEM ||
6715fdc4257SSteve Yin             Role == CHECK_MENU_ITEM || Role == RADIO_MENU_ITEM )
6725fdc4257SSteve Yin     {
6735fdc4257SSteve Yin         UpdateDefaultAction(  );
6745fdc4257SSteve Yin     }
6755fdc4257SSteve Yin     else
6765fdc4257SSteve Yin     {
6775fdc4257SSteve Yin 
6785fdc4257SSteve Yin         if( m_xAccActionRef.is() )
6795fdc4257SSteve Yin         {
6805fdc4257SSteve Yin             if( m_xAccActionRef->getAccessibleActionCount() > 0 )
6815fdc4257SSteve Yin             {
6823a700b0aSSteve Yin 				if (!(Role == SPIN_BOX || Role == COMBO_BOX || Role == DATE_EDITOR ||
6833a700b0aSSteve Yin 					  Role == EDIT_BAR || Role == PASSWORD_TEXT || Role == TEXT))
6845fdc4257SSteve Yin 				{
6855fdc4257SSteve Yin 					pXString = m_xAccActionRef->getAccessibleActionDescription( 0 );
6865fdc4257SSteve Yin 					//Solution:If string length is more than zero,action will will be set.
6875fdc4257SSteve Yin 					if( pXString.getLength() > 0)
6885fdc4257SSteve Yin 						m_pIMAcc->Put_ActionDescription( pXString.getStr() );
6893a700b0aSSteve Yin 				}
6905fdc4257SSteve Yin             }
6915fdc4257SSteve Yin         }
6925fdc4257SSteve Yin     }
6935fdc4257SSteve Yin 
6945fdc4257SSteve Yin }
6955fdc4257SSteve Yin /**
6965fdc4257SSteve Yin    * update role information from uno to com
6975fdc4257SSteve Yin    * @param
6985fdc4257SSteve Yin    * @return
6995fdc4257SSteve Yin    */
UpdateRole()7005fdc4257SSteve Yin void AccObject::UpdateRole()
7015fdc4257SSteve Yin {
7025fdc4257SSteve Yin     if (!m_pIMAcc)
7035fdc4257SSteve Yin     {
7045fdc4257SSteve Yin         return;
7055fdc4257SSteve Yin     }
7065fdc4257SSteve Yin 
7075fdc4257SSteve Yin     XAccessibleContext* pContext  = m_xAccContextRef.get();
7085fdc4257SSteve Yin     m_pIMAcc->Put_XAccRole( ROLE_SYSTEM_WINDOW  );
7095fdc4257SSteve Yin     short iRoleIndex = pContext->getAccessibleRole();
7105fdc4257SSteve Yin     if (( 0 <= iRoleIndex) && ( iRoleIndex <= (sizeof(ROLE_TABLE)/(sizeof(short)*2))))
7115fdc4257SSteve Yin     {
7125fdc4257SSteve Yin         short iIA2Role = ROLE_TABLE[iRoleIndex][1] ;
7135fdc4257SSteve Yin         m_pIMAcc->Put_XAccRole( iIA2Role  );
7145fdc4257SSteve Yin     }
7155fdc4257SSteve Yin 
7165fdc4257SSteve Yin }
7175fdc4257SSteve Yin /**
7185fdc4257SSteve Yin    * update state information from uno to com
7195fdc4257SSteve Yin    * @param
7205fdc4257SSteve Yin    * @return
7215fdc4257SSteve Yin    */
UpdateState()7225fdc4257SSteve Yin void AccObject::UpdateState()
7235fdc4257SSteve Yin {
7245fdc4257SSteve Yin     if (!m_pIMAcc)
7255fdc4257SSteve Yin     {
7265fdc4257SSteve Yin         return;
7275fdc4257SSteve Yin     }
7285fdc4257SSteve Yin 
7295fdc4257SSteve Yin     XAccessibleContext* pContext  = m_xAccContextRef.get();
7305fdc4257SSteve Yin     Reference< XAccessibleStateSet > pRState = pContext->getAccessibleStateSet();
7315fdc4257SSteve Yin     if( !pRState.is() )
7325fdc4257SSteve Yin     {
7335fdc4257SSteve Yin         assert(false);
7345fdc4257SSteve Yin         return ;
7355fdc4257SSteve Yin     }
7365fdc4257SSteve Yin 
7375fdc4257SSteve Yin     m_pIMAcc->SetState(0L);
7385fdc4257SSteve Yin 
7395fdc4257SSteve Yin     if ( m_accRole == POPUP_MENU )
7405fdc4257SSteve Yin     {
7415fdc4257SSteve Yin         return;
7425fdc4257SSteve Yin     }
7435fdc4257SSteve Yin 
7445fdc4257SSteve Yin     Sequence<short> pStates = pRState->getStates();
7455fdc4257SSteve Yin     int count = pStates.getLength();
7465fdc4257SSteve Yin 
7475fdc4257SSteve Yin     sal_Bool isEnable = sal_False;
7485fdc4257SSteve Yin     sal_Bool isShowing = sal_False;
7495fdc4257SSteve Yin     sal_Bool isEditable = sal_False;
7505fdc4257SSteve Yin     sal_Bool isVisible = sal_False;
7515fdc4257SSteve Yin     sal_Bool isFocusable = sal_False;
7525fdc4257SSteve Yin 
7535fdc4257SSteve Yin     for( int iIndex = 0;iIndex < count;iIndex++ )
7545fdc4257SSteve Yin     {
7555fdc4257SSteve Yin         if( pStates[iIndex] == ENABLED )
7565fdc4257SSteve Yin             isEnable = sal_True;
7575fdc4257SSteve Yin         else if( pStates[iIndex] == SHOWING)
7585fdc4257SSteve Yin             isShowing = sal_True;
7595fdc4257SSteve Yin         else if( pStates[iIndex] == VISIBLE)
7605fdc4257SSteve Yin             isVisible = sal_True;
7615fdc4257SSteve Yin         else if( pStates[iIndex] == EDITABLE )
7625fdc4257SSteve Yin             isEditable = sal_True;
7635fdc4257SSteve Yin         else if (pStates[iIndex] == FOCUSABLE)
7645fdc4257SSteve Yin             isFocusable = sal_True;
7655fdc4257SSteve Yin         IncreaseState( pStates[iIndex]);
7665fdc4257SSteve Yin     }
7675fdc4257SSteve Yin     sal_Bool bIsMenuItem = m_accRole == MENU_ITEM || m_accRole == RADIO_MENU_ITEM || m_accRole == CHECK_MENU_ITEM;
7685fdc4257SSteve Yin 
7695fdc4257SSteve Yin     if(bIsMenuItem)
7705fdc4257SSteve Yin     {
7715fdc4257SSteve Yin         if(!(isShowing && isVisible) )
7725fdc4257SSteve Yin         {
7735fdc4257SSteve Yin             m_pIMAcc->IncreaseState( STATE_SYSTEM_INVISIBLE );
7745fdc4257SSteve Yin             m_pIMAcc->DecreaseState( STATE_SYSTEM_FOCUSABLE );
7755fdc4257SSteve Yin         }
7765fdc4257SSteve Yin     }
7775fdc4257SSteve Yin     else
7785fdc4257SSteve Yin     {
7795fdc4257SSteve Yin         if(!(isShowing || isVisible) )
7805fdc4257SSteve Yin             m_pIMAcc->IncreaseState( STATE_SYSTEM_INVISIBLE );
7815fdc4257SSteve Yin     }
7825fdc4257SSteve Yin 
7835fdc4257SSteve Yin     short Role = m_accRole;
7845fdc4257SSteve Yin 
7855fdc4257SSteve Yin     if( m_pIMAcc )
7865fdc4257SSteve Yin     {
7875fdc4257SSteve Yin         switch(m_accRole)
7885fdc4257SSteve Yin         {
7895fdc4257SSteve Yin         case LABEL:
7905fdc4257SSteve Yin             m_pIMAcc->IncreaseState( STATE_SYSTEM_READONLY );
7915fdc4257SSteve Yin             break;
7925fdc4257SSteve Yin         case TEXT:
7935fdc4257SSteve Yin             // 2. editable combobox -> readonly ------ bridge
7945fdc4257SSteve Yin         case EMBEDDED_OBJECT:
7955fdc4257SSteve Yin         case END_NOTE:
7965fdc4257SSteve Yin         case FOOTER:
7975fdc4257SSteve Yin         case FOOTNOTE:
7985fdc4257SSteve Yin         case GRAPHIC:
7995fdc4257SSteve Yin         case HEADER:
8005fdc4257SSteve Yin         case HEADING:
8015fdc4257SSteve Yin 
8025fdc4257SSteve Yin             //Image Map
8035fdc4257SSteve Yin         case PARAGRAPH:
8045fdc4257SSteve Yin         case PASSWORD_TEXT:
8055fdc4257SSteve Yin         case SHAPE:
8065fdc4257SSteve Yin         case SPIN_BOX:
8075fdc4257SSteve Yin         case TABLE:
8085fdc4257SSteve Yin         case TABLE_CELL:
8095fdc4257SSteve Yin         case TEXT_FRAME:
8105fdc4257SSteve Yin         case DATE_EDITOR:
8115fdc4257SSteve Yin         case DOCUMENT:
8125fdc4257SSteve Yin         case COLUMN_HEADER:
8135fdc4257SSteve Yin             {
8145fdc4257SSteve Yin                 if(!isEditable)
8155fdc4257SSteve Yin                     m_pIMAcc->IncreaseState( STATE_SYSTEM_READONLY );
8165fdc4257SSteve Yin             }
8175fdc4257SSteve Yin             break;
8185fdc4257SSteve Yin         default:
8195fdc4257SSteve Yin             break;
8205fdc4257SSteve Yin         }
8215fdc4257SSteve Yin     }
8225fdc4257SSteve Yin 
8235fdc4257SSteve Yin     if( isEnable )
8245fdc4257SSteve Yin     {
8255fdc4257SSteve Yin 
8265fdc4257SSteve Yin         if(!(Role == FILLER || Role == END_NOTE || Role == FOOTER || Role == FOOTNOTE || Role == GROUP_BOX || Role == RULER
8275fdc4257SSteve Yin                 || Role == HEADER || Role == ICON || Role == INTERNAL_FRAME || Role == LABEL || Role == LAYERED_PANE
8285fdc4257SSteve Yin                 || Role == SCROLL_BAR || Role == SCROLL_PANE || Role == SPLIT_PANE || Role == STATUS_BAR || Role == TOOL_TIP))
8295fdc4257SSteve Yin         {
8305fdc4257SSteve Yin             if( SEPARATOR == Role  )
8315fdc4257SSteve Yin             {
8325fdc4257SSteve Yin                 if( ( m_pParentObj != NULL ) && ( MENU == m_pParentObj->m_accRole  || POPUP_MENU == m_pParentObj->m_accRole ))
8335fdc4257SSteve Yin                     IncreaseState( FOCUSABLE );
8345fdc4257SSteve Yin             }
8355fdc4257SSteve Yin 
8365fdc4257SSteve Yin             else if (TABLE_CELL == Role || TABLE == Role || PANEL == Role || OPTION_PANE == Role ||
8375fdc4257SSteve Yin                      COLUMN_HEADER == Role)
8385fdc4257SSteve Yin             {
8395fdc4257SSteve Yin                 if (isFocusable)
8405fdc4257SSteve Yin                     IncreaseState( FOCUSABLE );
8415fdc4257SSteve Yin             }
8425fdc4257SSteve Yin             else
8435fdc4257SSteve Yin             {
8445fdc4257SSteve Yin                 if(bIsMenuItem)
8455fdc4257SSteve Yin                 {
8465fdc4257SSteve Yin                     if ( isShowing && isVisible)
8475fdc4257SSteve Yin                     {
8485fdc4257SSteve Yin                         IncreaseState( FOCUSABLE );
8495fdc4257SSteve Yin                     }
8505fdc4257SSteve Yin                 }
8515fdc4257SSteve Yin                 else
8525fdc4257SSteve Yin                 {
8535fdc4257SSteve Yin                     IncreaseState( FOCUSABLE );
8545fdc4257SSteve Yin                 }
8555fdc4257SSteve Yin             }
8565fdc4257SSteve Yin         }
8575fdc4257SSteve Yin     }
8585fdc4257SSteve Yin     else
8595fdc4257SSteve Yin     {
8605fdc4257SSteve Yin         m_pIMAcc->IncreaseState( STATE_SYSTEM_UNAVAILABLE );
8615fdc4257SSteve Yin         sal_Bool isDecreaseFocusable = sal_False;
8625fdc4257SSteve Yin         if( !((Role == MENU_ITEM) ||
8635fdc4257SSteve Yin                 (Role == RADIO_MENU_ITEM) ||
8645fdc4257SSteve Yin                 (Role == CHECK_MENU_ITEM)) )
8655fdc4257SSteve Yin         {
8665fdc4257SSteve Yin             if  ( Role == TOGGLE_BUTTON || Role == PUSH_BUTTON || BUTTON_DROPDOWN == Role)
8675fdc4257SSteve Yin             {
8685fdc4257SSteve Yin                 if(( m_pParentObj != NULL )&& (TOOL_BAR ==  m_pParentObj->m_accRole ) )
8695fdc4257SSteve Yin                     IncreaseState( FOCUSABLE );
8705fdc4257SSteve Yin                 else
8715fdc4257SSteve Yin                     DecreaseState( FOCUSABLE );
8725fdc4257SSteve Yin             }
8735fdc4257SSteve Yin             else
8745fdc4257SSteve Yin                 DecreaseState( FOCUSABLE );
8755fdc4257SSteve Yin         }
8765fdc4257SSteve Yin         else if( isShowing || isVisible )
8775fdc4257SSteve Yin         {
8785fdc4257SSteve Yin             IncreaseState( FOCUSABLE );
8795fdc4257SSteve Yin         }
8805fdc4257SSteve Yin     }
8815fdc4257SSteve Yin 
8825fdc4257SSteve Yin     if( m_pIMAcc )
8835fdc4257SSteve Yin     {
8845fdc4257SSteve Yin         switch(m_accRole)
8855fdc4257SSteve Yin         {
8865fdc4257SSteve Yin         case POPUP_MENU:
8875fdc4257SSteve Yin         case MENU:
8885fdc4257SSteve Yin             if( pContext->getAccessibleChildCount() > 0 )
8895fdc4257SSteve Yin                 m_pIMAcc->IncreaseState( STATE_SYSTEM_HASPOPUP );
8905fdc4257SSteve Yin             break;
8915fdc4257SSteve Yin         case PASSWORD_TEXT:
8925fdc4257SSteve Yin             m_pIMAcc->IncreaseState( STATE_SYSTEM_PROTECTED );
8935fdc4257SSteve Yin             break;
8945fdc4257SSteve Yin         default:
8955fdc4257SSteve Yin             break;
8965fdc4257SSteve Yin         }
8975fdc4257SSteve Yin     }
8985fdc4257SSteve Yin 
8995fdc4257SSteve Yin }
9005fdc4257SSteve Yin /**
9015fdc4257SSteve Yin    * update location information from uno to com
9025fdc4257SSteve Yin    * @param
9035fdc4257SSteve Yin    * @return
9045fdc4257SSteve Yin    */
UpdateLocation()9055fdc4257SSteve Yin void AccObject::UpdateLocation()
9065fdc4257SSteve Yin {
9075fdc4257SSteve Yin     if (!m_pIMAcc)
9085fdc4257SSteve Yin     {
9095fdc4257SSteve Yin         return;
9105fdc4257SSteve Yin     }
9115fdc4257SSteve Yin     XAccessibleContext* pContext  = m_xAccContextRef.get();
9125fdc4257SSteve Yin 
9135fdc4257SSteve Yin     Reference< XAccessibleComponent > pRComponent(pContext,UNO_QUERY);
9145fdc4257SSteve Yin     if( pRComponent.is() )
9155fdc4257SSteve Yin     {
9165fdc4257SSteve Yin         ::com::sun::star::awt::Point pCPoint = pRComponent->getLocationOnScreen();
9175fdc4257SSteve Yin         ::com::sun::star::awt::Size pCSize = pRComponent->getSize();
9185fdc4257SSteve Yin         Location tempLocation;
9195fdc4257SSteve Yin         tempLocation.m_dLeft = pCPoint.X;
9205fdc4257SSteve Yin         tempLocation.m_dTop =  pCPoint.Y;
9215fdc4257SSteve Yin         tempLocation.m_dWidth = pCSize.Width;
9225fdc4257SSteve Yin         tempLocation.m_dHeight = pCSize.Height;
9235fdc4257SSteve Yin         m_pIMAcc->Put_XAccLocation( tempLocation );
9245fdc4257SSteve Yin     }
9255fdc4257SSteve Yin 
9265fdc4257SSteve Yin }
9275fdc4257SSteve Yin 
9285fdc4257SSteve Yin 
9295fdc4257SSteve Yin /**
9305fdc4257SSteve Yin    * Public method to mapping information between MSAA and UNO.
9315fdc4257SSteve Yin    * @param
9325fdc4257SSteve Yin    * @return If the method is correctly processed.
9335fdc4257SSteve Yin    */
UpdateAccessibleInfoFromUnoToMSAA()9345fdc4257SSteve Yin sal_Bool AccObject:: UpdateAccessibleInfoFromUnoToMSAA ( )
9355fdc4257SSteve Yin {
9365fdc4257SSteve Yin     if( NULL == m_pIMAcc || !m_xAccContextRef.is()  )
9375fdc4257SSteve Yin     {
9385fdc4257SSteve Yin         assert(false);
9395fdc4257SSteve Yin         return sal_False;
9405fdc4257SSteve Yin     }
9415fdc4257SSteve Yin 
9425fdc4257SSteve Yin     UpdateName();
9435fdc4257SSteve Yin 
9445fdc4257SSteve Yin     UpdateValue();
9455fdc4257SSteve Yin 
9465fdc4257SSteve Yin     UpdateActionDesc();
9475fdc4257SSteve Yin 
9485fdc4257SSteve Yin     UpdateRole();
9495fdc4257SSteve Yin 
9505fdc4257SSteve Yin     UpdateLocation();
9515fdc4257SSteve Yin 
9525fdc4257SSteve Yin     UpdateState();
9535fdc4257SSteve Yin 
9545fdc4257SSteve Yin     return sal_True;
9555fdc4257SSteve Yin }
9565fdc4257SSteve Yin 
9575fdc4257SSteve Yin /*
9585fdc4257SSteve Yin    * Add a child selected element.
9595fdc4257SSteve Yin    * @param pAccObj Child object pointer.
9605fdc4257SSteve Yin    * @return
9615fdc4257SSteve Yin    */
AddSelect(long index,AccObject * accObj)9625fdc4257SSteve Yin void AccObject::AddSelect( long index, AccObject* accObj)
9635fdc4257SSteve Yin {
9645fdc4257SSteve Yin     m_selectionList.insert(IAccSelectionList::value_type(index,accObj));
9655fdc4257SSteve Yin }
9665fdc4257SSteve Yin 
GetSelection()9675fdc4257SSteve Yin IAccSelectionList& AccObject::GetSelection()
9685fdc4257SSteve Yin {
9695fdc4257SSteve Yin     return m_selectionList;
9705fdc4257SSteve Yin }
9715fdc4257SSteve Yin 
9725fdc4257SSteve Yin 
9735fdc4257SSteve Yin /**
9745fdc4257SSteve Yin    * Set self to focus object in parant child list
9755fdc4257SSteve Yin    * @param
9765fdc4257SSteve Yin    * @return
9775fdc4257SSteve Yin    */
setFocus()9785fdc4257SSteve Yin void AccObject::setFocus()
9795fdc4257SSteve Yin {
9805fdc4257SSteve Yin     if(m_pIMAcc)
9815fdc4257SSteve Yin     {
9825fdc4257SSteve Yin         IncreaseState(FOCUSED);
9835fdc4257SSteve Yin         m_pIMAcc->Put_XAccFocus(CHILDID_SELF);
9845fdc4257SSteve Yin 
9855fdc4257SSteve Yin         UpdateRole();
9865fdc4257SSteve Yin     }
9875fdc4257SSteve Yin }
9885fdc4257SSteve Yin 
9895fdc4257SSteve Yin /**
9905fdc4257SSteve Yin    * Unset self from focus object in parant child list.
9915fdc4257SSteve Yin    * @param
9925fdc4257SSteve Yin    * @return
9935fdc4257SSteve Yin    */
unsetFocus()9945fdc4257SSteve Yin void AccObject::unsetFocus()
9955fdc4257SSteve Yin {
9965fdc4257SSteve Yin     if(m_pIMAcc)
9975fdc4257SSteve Yin     {
9985fdc4257SSteve Yin         DecreaseState( FOCUSED );
9995fdc4257SSteve Yin         m_pIMAcc->Put_XAccFocus(UACC_NO_FOCUS);
10005fdc4257SSteve Yin     }
10015fdc4257SSteve Yin }
10025fdc4257SSteve Yin 
GetExpandedState(sal_Bool * isExpandable,sal_Bool * isExpanded)10035fdc4257SSteve Yin void AccObject::GetExpandedState( sal_Bool* isExpandable, sal_Bool* isExpanded)
10045fdc4257SSteve Yin {
10055fdc4257SSteve Yin     *isExpanded = sal_False;
10065fdc4257SSteve Yin     *isExpandable = sal_False;
10075fdc4257SSteve Yin 
10085fdc4257SSteve Yin     if( !m_xAccContextRef.is() )
10095fdc4257SSteve Yin     {
10105fdc4257SSteve Yin         return;
10115fdc4257SSteve Yin     }
10125fdc4257SSteve Yin     Reference< XAccessibleStateSet > pRState = m_xAccContextRef->getAccessibleStateSet();
10135fdc4257SSteve Yin     if( !pRState.is() )
10145fdc4257SSteve Yin     {
10155fdc4257SSteve Yin         return;
10165fdc4257SSteve Yin     }
10175fdc4257SSteve Yin 
10185fdc4257SSteve Yin     Sequence<short> pStates = pRState->getStates();
10195fdc4257SSteve Yin     int count = pStates.getLength();
10205fdc4257SSteve Yin 
10215fdc4257SSteve Yin     for( int iIndex = 0;iIndex < count;iIndex++ )
10225fdc4257SSteve Yin     {
10235fdc4257SSteve Yin         if( EXPANDED == pStates[iIndex]  )
10245fdc4257SSteve Yin         {
10255fdc4257SSteve Yin             *isExpanded = sal_True;
10265fdc4257SSteve Yin         }
10275fdc4257SSteve Yin         else if( EXPANDABLE == pStates[iIndex]  )
10285fdc4257SSteve Yin         {
10295fdc4257SSteve Yin             *isExpandable = sal_True;
10305fdc4257SSteve Yin         }
10315fdc4257SSteve Yin     }
10325fdc4257SSteve Yin }
10335fdc4257SSteve Yin 
NotifyDestroy(sal_Bool ifDelete)10345fdc4257SSteve Yin void AccObject::NotifyDestroy(sal_Bool ifDelete)
10355fdc4257SSteve Yin {
10365fdc4257SSteve Yin     m_bShouldDestroy=ifDelete;
10375fdc4257SSteve Yin     if(m_pIMAcc)
10385fdc4257SSteve Yin         m_pIMAcc->NotifyDestroy(m_bShouldDestroy);
10395fdc4257SSteve Yin }
10405fdc4257SSteve Yin 
SetParentObj(AccObject * pParentAccObj)10415fdc4257SSteve Yin void AccObject::SetParentObj(AccObject* pParentAccObj)
10425fdc4257SSteve Yin {
10435fdc4257SSteve Yin     m_pParentObj = pParentAccObj;
10445fdc4257SSteve Yin 
10455fdc4257SSteve Yin     if(m_pIMAcc)
10465fdc4257SSteve Yin     {
10475fdc4257SSteve Yin         if(m_pParentObj)
10485fdc4257SSteve Yin         {
10495fdc4257SSteve Yin             m_pIMAcc->Put_XAccParent(m_pParentObj->GetIMAccessible());
10505fdc4257SSteve Yin         }
10515fdc4257SSteve Yin         else
10525fdc4257SSteve Yin         {
10535fdc4257SSteve Yin             m_pIMAcc->Put_XAccParent(NULL);
10545fdc4257SSteve Yin         }
10555fdc4257SSteve Yin     }
10565fdc4257SSteve Yin }
10575fdc4257SSteve Yin //ResID means ChildID in MSAA
SetResID(long id)10585fdc4257SSteve Yin void AccObject::SetResID(long id)
10595fdc4257SSteve Yin {
10605fdc4257SSteve Yin     m_resID = id;
10615fdc4257SSteve Yin     if(m_pIMAcc)
10625fdc4257SSteve Yin         m_pIMAcc->Put_XAccChildID(m_resID);
10635fdc4257SSteve Yin }
10645fdc4257SSteve Yin //return COM interface in acc object
GetIMAccessible()10655fdc4257SSteve Yin IMAccessible*  AccObject::GetIMAccessible()
10665fdc4257SSteve Yin {
10675fdc4257SSteve Yin     return m_pIMAcc;
10685fdc4257SSteve Yin }
10695fdc4257SSteve Yin 
GetXAccessible()10705fdc4257SSteve Yin Reference < XAccessible > AccObject::GetXAccessible()
10715fdc4257SSteve Yin {
10725fdc4257SSteve Yin     return m_xAccRef;
10735fdc4257SSteve Yin }
10745fdc4257SSteve Yin 
SetParentHWND(HWND hWnd)10755fdc4257SSteve Yin void AccObject::SetParentHWND(HWND hWnd)
10765fdc4257SSteve Yin {
10775fdc4257SSteve Yin     m_pParantID = hWnd;
10785fdc4257SSteve Yin }
SetListener(AccEventListener * Listener)10795fdc4257SSteve Yin void AccObject::SetListener( AccEventListener* Listener )
10805fdc4257SSteve Yin {
10815fdc4257SSteve Yin     m_accListener = Listener;
10825fdc4257SSteve Yin }
getListener()10835fdc4257SSteve Yin AccEventListener* AccObject::getListener()
10845fdc4257SSteve Yin {
10855fdc4257SSteve Yin     return m_accListener;
10865fdc4257SSteve Yin }
10875fdc4257SSteve Yin 
GetResID()10885fdc4257SSteve Yin long AccObject::GetResID()
10895fdc4257SSteve Yin {
10905fdc4257SSteve Yin     return m_resID;
10915fdc4257SSteve Yin }
10925fdc4257SSteve Yin 
GetParentHWND()10935fdc4257SSteve Yin HWND AccObject::GetParentHWND()
10945fdc4257SSteve Yin {
10955fdc4257SSteve Yin     return m_pParantID;
10965fdc4257SSteve Yin }
10975fdc4257SSteve Yin 
GetParentObj()10985fdc4257SSteve Yin AccObject* AccObject::GetParentObj()
10995fdc4257SSteve Yin {
11005fdc4257SSteve Yin     return m_pParentObj;
11015fdc4257SSteve Yin }
ifShouldDestroy()11025fdc4257SSteve Yin sal_Bool  AccObject::ifShouldDestroy()
11035fdc4257SSteve Yin {
11045fdc4257SSteve Yin     return m_bShouldDestroy;
11055fdc4257SSteve Yin }
1106