openoffice-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From stev...@apache.org
Subject svn commit: r1420522 [11/12] - in /openoffice/branches/ia2/main/winaccessibility: ./ inc/ prj/ source/ source/UAccCOM/ source/UAccCOMIDL/ source/service/
Date Wed, 12 Dec 2012 04:41:33 GMT
Added: openoffice/branches/ia2/main/winaccessibility/source/service/AccObjectWinManager.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/winaccessibility/source/service/AccObjectWinManager.cxx?rev=1420522&view=auto
==============================================================================
--- openoffice/branches/ia2/main/winaccessibility/source/service/AccObjectWinManager.cxx (added)
+++ openoffice/branches/ia2/main/winaccessibility/source/service/AccObjectWinManager.cxx Wed Dec 12 04:41:12 2012
@@ -0,0 +1,1340 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2010.
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <cassert>
+
+#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventListener.hpp>
+#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+
+#include <oleacc.h>
+#ifndef _SV_AccObjectWinManager_HXX
+#include "AccObjectWinManager.hxx"
+#endif
+#include "AccEventListener.hxx"
+#include "AccComponentEventListener.hxx"
+#include "AccContainerEventListener.hxx"
+#include "AccDialogEventListener.hxx"
+#include "AccWindowEventListener.hxx"
+#include "AccFrameEventListener.hxx"
+#include "AccMenuEventListener.hxx"
+#include "AccObjectContainerEventListener.hxx"
+#include "AccParagraphEventListener.hxx"
+#include "AccTextComponentEventListener.hxx"
+#include "AccListEventListener.hxx"
+#include "AccTreeEventListener.hxx"
+#include "AccTableEventListener.hxx"
+#include "AccObject.hxx"
+#include "AccessibleEventId.h"
+#include "AccessibleApplication.h"
+#include "AccessibleApplication_i.c"
+#include "unomsaaevent.hxx"
+#include "checkmt.hxx"
+
+#define CHILDID_SELF             0
+
+
+using namespace std;
+using namespace com::sun::star::accessibility;
+using namespace com::sun::star::uno;
+
+AccObjectWinManager* g_acc_manager = NULL;
+AccObjectWinManager* AccObjectWinManager::me = NULL;
+
+/**
+   * Implementation of interface XMSAAService's method getAccObjectPtr() that return the
+   * corresponding com interface with the MS event.
+   *
+   * @param   
+   * @return  Com interface.
+   */
+long GetMSComPtr(long hWnd, long lParam, long wParam)
+{
+    if( g_acc_manager )
+        return (long)g_acc_manager->Get_ToATInterface(HWND((void*)hWnd),lParam,wParam );
+    return NULL;
+}
+
+/**
+   * constructor
+   * @param   Agent The agent kept in all listeners,it's the sole interface by which
+   *                listener communicate with windows manager.
+   *          pEventAccObj The present event accobject.
+   *          oldFocus     Last focused object.
+   *          isSelectionChanged flag that identifies if there is selection changed.
+   *		  selectionChildObj  Selected object.
+   *          dChildID	Chile resource ID.
+   *          hAcc TopWindowHWND
+   * @return  
+   */
+AccObjectWinManager::AccObjectWinManager( AccObjectManagerAgent* Agent ):
+        pAgent( Agent ),
+        oldFocus( NULL )
+{
+	m_bBridgeRegistered =IsBridgeRegisteredAcc();
+}
+
+/**
+   * Public method to produce manager
+   * @param   Agent The agent kept in all listeners,it's the sole interface by which
+   *          listener communicate with windows manager.
+   * @return  
+   */
+AccObjectWinManager* AccObjectWinManager::CreateAccObjectWinManagerInstance( AccObjectManagerAgent* Agent )
+{
+    if( me == NULL )
+    {
+        me = new AccObjectWinManager( Agent );
+        g_acc_manager = me;
+        return me;
+    }
+
+    return me;
+}
+
+
+/**
+   * Destructor,clear all resource.
+   * @param   
+   * @return  
+   */
+AccObjectWinManager::~AccObjectWinManager()
+{
+    XIdAccList.clear();
+    HwndXAcc.clear();
+    XResIdAccList.clear();
+    XHWNDDocList.clear();
+#ifdef ACC_DEBUG
+
+    fclose( pFile );
+#endif
+}
+
+
+/**
+   * Get valid com object interface when notifying some MSAA event
+   * @param pWND The top window handle that contains that event control.
+   * @param wParam Windows system interface. 
+   * @return Com interface with event. 
+   */
+
+long AccObjectWinManager::Get_ToATInterface( HWND hWnd, long lParam, long wParam)
+{
+    vos::OGuard localGuard(maATInterfaceMutex);//
+
+    IMAccessible* pRetIMAcc = NULL;
+
+    if(lParam == OBJID_CLIENT )
+    {
+        AccObject* topWindowAccObj = GetTopWindowAccObj(hWnd);
+        if(topWindowAccObj)
+        {
+            pRetIMAcc = topWindowAccObj->GetIMAccessible();
+            if(pRetIMAcc)
+                pRetIMAcc->AddRef();//increase COM reference count
+        }
+    }
+
+    if ( pRetIMAcc && lParam == OBJID_CLIENT )
+    {
+        IAccessible* pTemp = dynamic_cast<IAccessible*>( pRetIMAcc );
+        HRESULT result = LresultFromObject(IID_IAccessible, wParam, pTemp);
+        pTemp->Release();
+        return result;
+    }
+    return 0;
+}
+
+/**
+   * Search AccObject by XAccessible pointer from our container.
+   * @param pXAcc XAccessible interface.
+   * @return Pointer of accObject that is found. 
+   */
+AccObject* AccObjectWinManager::GetAccObjByXAcc( XAccessible* pXAcc)
+{
+    if( pXAcc == NULL)
+        return NULL;
+
+    XIdToAccObjHash::iterator pIndTemp = XIdAccList.find( (void*)pXAcc );
+    if ( pIndTemp == XIdAccList.end() )
+        return NULL;
+
+    return &(pIndTemp->second);
+}
+
+/**
+   * Search XAccessible by AccObject pointer from our container.
+   * @param pAccObj AccObject pointer.
+   * @return Pointer of XAccessible Interface. 
+   */
+XAccessible* AccObjectWinManager::GetXAccByAccObj(AccObject* pAccObj)
+{
+    XIdToAccObjHash::iterator iter = XIdAccList.begin();
+    while(iter!=XIdAccList.end())
+    {
+        AccObject* tmp = &(iter->second);
+        if(tmp== pAccObj)
+            return (XAccessible*)(iter->first);
+        iter++;
+    }
+    return NULL;
+}
+
+/**
+   * get acc object of top window by its handle
+   * @param hWnd, top window handle
+   * @return pointer to AccObject
+   */
+AccObject* AccObjectWinManager::GetTopWindowAccObj(HWND hWnd)
+{
+    XHWNDToXAccHash::iterator iterResult =HwndXAcc.find(hWnd);
+    if(iterResult == HwndXAcc.end())
+        return NULL;
+    XAccessible* pXAcc = (XAccessible*)(iterResult->second);
+    return GetAccObjByXAcc(pXAcc);
+}
+
+/**
+   * Simulate MSAA event via XAccessible interface and event type.
+   * @param pXAcc XAccessible interface.
+   * @param state Customize Interface   
+   * @return The terminate result that identifies if the call is successful. 
+   */
+sal_Bool AccObjectWinManager::NotifyAccEvent(XAccessible* pXAcc,short state)
+{
+    vos::OGuard aGuard(aNotifyMutex);
+
+	if (!m_bBridgeRegistered)
+	{
+		return sal_False;
+	}
+    if (!IsInMainThread())
+    {
+        return sal_False;
+    }
+
+    Reference< XAccessibleContext > pRContext;
+
+    if( pXAcc == NULL)
+        return sal_False;
+
+
+    pRContext = pXAcc->getAccessibleContext();
+    if( !pRContext.is() )
+        return sal_False;
+
+
+    AccObject* selfAccObj= GetAccObjByXAcc(pXAcc);
+
+    if(selfAccObj==NULL)
+        return sal_False;
+
+    int selectNum =0;
+
+    long dChildID = selfAccObj->GetResID();
+    HWND hAcc = selfAccObj->GetParentHWND();
+
+    switch(state)
+    {
+    case UM_EVENT_STATE_FOCUSED:
+        {
+            UpdateAccFocus(pXAcc);
+            if( selfAccObj )
+                selfAccObj->UpdateDefaultAction( );
+            UpdateValue(pXAcc);
+            NotifyWinEvent( EVENT_OBJECT_FOCUS,hAcc, OBJID_CLIENT,dChildID  );
+            break;
+        }
+    case UM_EVENT_STATE_BUSY:
+        NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_STATE_CHECKED:
+        NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_STATE_PRESSED:
+        NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+
+    //Removed fire out selected event
+    //case UM_EVENT_STATE_SELECTED:
+    //	NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID  );
+    //	break;
+    case UM_EVENT_STATE_ARMED:
+        UpdateAccFocus(pXAcc);
+        NotifyWinEvent( EVENT_OBJECT_FOCUS,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_MENU_START:
+        NotifyWinEvent( EVENT_SYSTEM_MENUSTART,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_MENU_END:
+        NotifyWinEvent( EVENT_SYSTEM_MENUEND,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_MENUPOPUPSTART:
+        NotifyWinEvent( EVENT_SYSTEM_MENUPOPUPSTART,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_MENUPOPUPEND:
+        NotifyWinEvent( EVENT_SYSTEM_MENUPOPUPEND,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_SELECTION_CHANGED:
+        NotifyWinEvent( EVENT_OBJECT_SELECTION,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_SELECTION_CHANGED_ADD:
+       	NotifyWinEvent( EVENT_OBJECT_SELECTIONADD,hAcc, OBJID_CLIENT,dChildID  );
+       	break;
+    case UM_EVENT_SELECTION_CHANGED_REMOVE:
+       	NotifyWinEvent( EVENT_OBJECT_SELECTIONREMOVE,hAcc, OBJID_CLIENT,dChildID  );
+       	break;
+    case UM_EVENT_SELECTION_CHANGED_WITHIN:
+       	NotifyWinEvent( EVENT_OBJECT_SELECTIONWITHIN,hAcc, OBJID_CLIENT,dChildID  );
+       	break;
+    case UM_EVENT_OBJECT_VALUECHANGE:
+        UpdateValue(pXAcc);
+        NotifyWinEvent( EVENT_OBJECT_VALUECHANGE,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_OBJECT_NAMECHANGE:
+        NotifyWinEvent( EVENT_OBJECT_NAMECHANGE,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_OBJECT_DESCRIPTIONCHANGE:
+        NotifyWinEvent( EVENT_OBJECT_DESCRIPTIONCHANGE,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_OBJECT_DEFACTIONCHANGE:
+        NotifyWinEvent( IA2_EVENT_ACTION_CHANGED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_OBJECT_CARETCHANGE:
+        NotifyWinEvent( IA2_EVENT_TEXT_CARET_MOVED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_OBJECT_TEXTCHANGE:
+        NotifyWinEvent( IA2_EVENT_TEXT_CHANGED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_ACTIVE_DESCENDANT_CHANGED:
+        UpdateAccFocus(pXAcc);
+        NotifyWinEvent( EVENT_OBJECT_FOCUS,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_BOUNDRECT_CHANGED:
+        NotifyWinEvent( EVENT_OBJECT_LOCATIONCHANGE,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_VISIBLE_DATA_CHANGED:
+        NotifyWinEvent( IA2_EVENT_VISIBLE_DATA_CHANGED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_SHOW :
+        NotifyWinEvent( EVENT_OBJECT_SHOW,hAcc, OBJID_CLIENT,dChildID  );
+        NotifyWinEvent( EVENT_SYSTEM_FOREGROUND,hAcc, OBJID_CLIENT,dChildID  );
+	break;
+    case UM_EVENT_TABLE_CAPTION_CHANGED:
+        NotifyWinEvent( IA2_EVENT_TABLE_CAPTION_CHANGED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED:
+        NotifyWinEvent( IA2_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_TABLE_COLUMN_HEADER_CHANGED:
+        NotifyWinEvent( IA2_EVENT_TABLE_COLUMN_HEADER_CHANGED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_TABLE_MODEL_CHANGED:
+        NotifyWinEvent( IA2_EVENT_TABLE_MODEL_CHANGED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_TABLE_ROW_HEADER_CHANGED:
+        NotifyWinEvent( IA2_EVENT_TABLE_ROW_HEADER_CHANGED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_TABLE_SUMMARY_CHANGED:
+        NotifyWinEvent( IA2_EVENT_TABLE_SUMMARY_CHANGED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_TABLE_ROW_DESCRIPTION_CHANGED:
+        NotifyWinEvent( IA2_EVENT_TABLE_ROW_DESCRIPTION_CHANGED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_OBJECT_REORDER:
+        NotifyWinEvent( EVENT_OBJECT_REORDER,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_PAGE_CHANGED:
+        NotifyWinEvent( IA2_EVENT_PAGE_CHANGED,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_CHILD_REMOVED:
+        NotifyWinEvent( EVENT_OBJECT_DESTROY,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_CHILD_ADDED:
+        NotifyWinEvent( EVENT_OBJECT_CREATE ,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_OBJECT_PAGECHANGED:
+        NotifyWinEvent( IA2_EVENT_PAGE_CHANGED ,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_TEXT_SELECTION_CHANGED:
+        NotifyWinEvent( IA2_EVENT_TEXT_SELECTION_CHANGED ,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_SECTION_CHANGED:
+        NotifyWinEvent( IA2_EVENT_SECTION_CHANGED ,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    case UM_EVENT_COLUMN_CHANGED:
+        NotifyWinEvent( IA2_EVENT_TEXT_COLUMN_CHANGED ,hAcc, OBJID_CLIENT,dChildID  );
+        break;
+    default:
+        break;
+    }
+
+    return sal_True;
+}
+
+/**
+   * Get Parent XAccessible interface by XAccessible interface.
+   * @param pXAcc XAccessible interface.
+   * @return Parent XAccessible interface.
+   */
+XAccessible* AccObjectWinManager::GetParentXAccessible( XAccessible* pXAcc )
+{
+    AccObject* pObj= GetAccObjByXAcc(pXAcc);
+    if( pObj ==NULL )
+        return NULL;
+    if(pObj->GetParentObj())
+    {
+        pObj = pObj->GetParentObj();
+        return pObj->GetXAccessible().get();
+    }
+    return NULL;
+}
+
+/**
+   * Get Parent role by XAccessible interface.
+   * @param pXAcc XAccessible interface.
+   * @return Parent role.
+   */
+short AccObjectWinManager::GetParentRole( XAccessible* pXAcc )
+{
+    AccObject* pObj= GetAccObjByXAcc(pXAcc);
+    if( pObj ==NULL )
+        return -1;
+    if(pObj->GetParentObj())
+    {
+        pObj = pObj->GetParentObj();
+        if(pObj->GetXAccessible().is())
+        {
+            XAccessible* pXAcc = pObj->GetXAccessible().get();
+            Reference< XAccessibleContext > pRContext = pXAcc->getAccessibleContext();
+            if(pRContext.is())
+                return pRContext->getAccessibleRole();
+        }
+    }
+    return -1;
+}
+
+/**
+   * Update focus objcet by new focused XAccessible interface.
+   * @param newFocus New XAccessible interface that gets focus.
+   * @return 
+   */
+void AccObjectWinManager::UpdateAccFocus(XAccessible* newFocus)
+{
+    AccObject* pAccObjNew = GetAccObjByXAcc(newFocus);
+    if(pAccObjNew)
+    {
+        AccObject* pAccObjOld = GetAccObjByXAcc(oldFocus);
+        oldFocus = newFocus;
+        pAccObjNew->setFocus();
+        //if old == new, the pAccObjNew will be without focused state
+        if (pAccObjOld && pAccObjOld != pAccObjNew)
+            pAccObjOld->unsetFocus();
+    }
+}
+
+/**
+   * Update selected objcet by new focused XAccessible interface.
+   * @param pXAcc XAccessible interface that has selected child changed.
+   * @return Selected children count.
+   */
+int AccObjectWinManager::UpdateAccSelection(XAccessible* pXAcc)
+{
+    XAccessibleSelection* pSelection = NULL;
+    Reference< XAccessibleContext > pRContext;
+
+    if( pXAcc == NULL)
+        return sal_False;
+
+    pRContext = pXAcc->getAccessibleContext();
+    if( !pRContext.is() )
+        return sal_False;
+
+    Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY);
+    if( !pRSelection.is() )
+        return sal_False;
+
+    AccObject* pAccObj = GetAccObjByXAcc(pXAcc);
+    if(pAccObj==NULL)
+        return sal_False;
+
+    Reference<XAccessible> pRChild = NULL;
+    AccObject* pAccChildObj = NULL;
+    int selectNum= pRSelection->getSelectedAccessibleChildCount();
+
+    IAccSelectionList oldSelection = pAccObj->GetSelection();
+
+    if(selectNum > 4)//for selected.
+        return selectNum;
+    if(selectNum == 1 && oldSelection.size() == 0)
+        return 1;
+
+    for (int i=0;i<selectNum;i++)
+    {
+        pRChild = pRSelection->getSelectedAccessibleChild(i);
+        if(!pRChild.is())
+        {
+            continue;
+        }
+        Reference<XAccessibleContext> pRChildContext = pRChild->getAccessibleContext();
+        if(!pRChildContext.is())
+        {
+            continue;
+        }
+        long index = pRChildContext->getAccessibleIndexInParent();
+        IAccSelectionList::iterator temp = oldSelection.find(index);
+        if ( temp != oldSelection.end() )
+        {
+            oldSelection.erase(index);
+            continue;
+        }
+
+        pAccChildObj = NULL;
+        pAccChildObj = GetAccObjByXAcc(pRChild.get());
+        if(!pAccChildObj)
+        {
+            InsertAccObj(pRChild.get(), pXAcc,pAccObj->GetParentHWND());
+            pAccChildObj = GetAccObjByXAcc(pRChild.get());
+        }
+
+        pAccObj->AddSelect(index, pAccChildObj);
+
+        if(pAccChildObj != NULL)
+            NotifyWinEvent(EVENT_OBJECT_SELECTIONADD,pAccObj->GetParentHWND(), OBJID_CLIENT,pAccChildObj->GetResID());
+    }
+
+    IAccSelectionList::iterator iter = oldSelection.begin();
+    while(iter!=oldSelection.end())
+    {
+        pAccObj->GetSelection().erase(iter->first);
+        pAccChildObj = (AccObject*)(iter->second);
+        if(pAccChildObj != NULL)
+            NotifyWinEvent(EVENT_OBJECT_SELECTIONREMOVE,pAccObj->GetParentHWND(), OBJID_CLIENT,pAccChildObj->GetResID());
+        iter++;
+    }
+    return 0;
+
+}
+
+/**
+   * Delete child element from children list.
+   * @param pObj Child element that should be removed from parant child list.
+   * @return 
+   */
+void AccObjectWinManager::DeleteAccChildNode( AccObject* pObj )
+{
+    AccObject *parentAccObj = pObj->GetParentObj();
+    if( parentAccObj )
+        parentAccObj->DeleteChild( pObj );
+}
+
+/**
+   * Delete XAccessible items in top window handle hashtable
+   * @param pXAcc XAccessible interface.
+   * @return 
+   */
+void AccObjectWinManager::DeleteFromHwndXAcc(XAccessible* pXAcc )
+{
+    XHWNDToXAccHash::iterator iter = HwndXAcc.begin();
+    while(iter!=HwndXAcc.end())
+    {
+        if(iter->second == pXAcc )
+        {
+            HwndXAcc.erase(iter);
+            return;
+        }
+        iter++;
+    }
+}
+
+/**
+   * Delete Delete all children with the tree root of XAccessible pointer
+   * @param pXAcc Tree root XAccessible interface.
+   * @return 
+   */
+void AccObjectWinManager::DeleteChildrenAccObj(XAccessible* pXAcc)
+{
+    vos::OGuard aGuard( aDeleteMutex );
+    AccObject* currentObj=NULL;
+    AccObject* childObj=NULL;
+    XAccessible* pTmpXAcc=NULL;
+
+    currentObj =  GetAccObjByXAcc( pXAcc);
+    if(currentObj)
+    {
+        childObj = currentObj->NextChild();
+        while(childObj)
+        {
+            pTmpXAcc = GetXAccByAccObj(childObj);
+            if(pTmpXAcc)
+            {
+                DeleteChildrenAccObj(pTmpXAcc);
+                DeleteAccObj(pTmpXAcc);
+            }
+            childObj = currentObj->NextChild();
+        }
+    }
+}
+
+/**
+   * Delete Delete Acc object self.
+   * @param pXAcc The XAccessible interface.
+   * @return 
+   */
+void AccObjectWinManager::DeleteAccObj( XAccessible* pXAcc )
+{
+    vos::OGuard aGuard( aDeleteMutex );
+    if( pXAcc == NULL )
+        return;
+    XIdToAccObjHash::iterator temp = XIdAccList.find(pXAcc);
+    if( temp != XIdAccList.end() )
+    {
+        ResIdGen.SetSub( temp->second.GetResID() );
+    }
+    else
+    {
+        return;
+    }
+
+    AccObject& accObj = temp->second;
+    DeleteAccChildNode( &accObj );
+    DeleteAccListener( &accObj );
+    if( accObj.GetIMAccessible() )
+    {
+        accObj.GetIMAccessible()->Release();
+    }
+    XIdAccList.erase( pXAcc );
+    XResIdAccList.erase( accObj.GetResID() );
+    DeleteFromHwndXAcc(pXAcc);
+}
+
+/**
+   * Delete listener that inspects some XAccessible object
+   * @param pAccObj Accobject pointer.
+   * @return 
+   */
+void AccObjectWinManager::DeleteAccListener( AccObject*  pAccObj )
+{
+    AccEventListener* listener = pAccObj->getListener();
+    if( listener==NULL )
+        return;
+    listener->removeMeFromBroadcaster();
+    pAccObj->SetListener(NULL);
+}
+
+/**
+   * Generate a child ID, which is used for AT
+   * @param 
+   * @return New resource ID.
+   */
+inline long AccObjectWinManager::ImpleGenerateResID()
+{
+    return ResIdGen.GenerateNewResID();
+}
+
+/**
+   * Insert all children of the current acc object
+   * @param pXAcc XAccessible interface
+   * @param pWnd  Top Window handle
+   * @return The calling result.
+   */
+sal_Bool AccObjectWinManager::InsertChildrenAccObj( com::sun::star::accessibility::XAccessible* pXAcc,
+        HWND pWnd)
+{
+    if(!IsContainer(pXAcc))
+        return sal_False;
+
+    Reference< XAccessibleContext > pRContext;
+
+    if( pXAcc == NULL)
+        return sal_False;
+    pRContext = pXAcc->getAccessibleContext();
+    if( !pRContext.is() )
+        return sal_False;
+
+    short role = pRContext->getAccessibleRole();
+
+    if(com::sun::star::accessibility::AccessibleRole::DOCUMENT == role )
+    {
+        if(IsStateManageDescendant(pXAcc))
+        {
+            return sal_True;
+        }
+    }
+
+    int count = pRContext->getAccessibleChildCount();
+    for (int i=0;i<count;i++)
+    {
+        Reference<XAccessible> mxAccessible
+        = pRContext->getAccessibleChild(i);
+        XAccessible* mpAccessible = mxAccessible.get();
+        if(mpAccessible != NULL)
+        {
+            InsertAccObj( mpAccessible,pXAcc,pWnd );
+            InsertChildrenAccObj(mpAccessible,pWnd);
+        }
+    }
+
+    return sal_True;
+}
+
+/**
+   * Insert child object.
+   * @param pCurObj The child object
+   * @param pParentObj The parant object
+   * @param pWnd Top window handle.
+   * @return 
+   */
+void AccObjectWinManager::InsertAccChildNode( AccObject* pCurObj, AccObject* pParentObj, HWND /* pWnd */ )
+{
+    if(pCurObj)
+    {
+        if(pParentObj)
+        {
+            pParentObj->InsertChild(pCurObj);
+        }
+        else
+        {
+            pCurObj->UpdateValidWindow();
+        }
+    }
+}
+
+/**
+   * Insert child object.
+   * @param pCurObj The child object
+   * @param pParentObj The parant object
+   * @param pWnd Top window handle.
+   * @return 
+   */
+sal_Bool AccObjectWinManager::InsertAccObj( XAccessible* pXAcc,XAccessible* pParentXAcc,HWND pWnd )
+{
+	if (!m_bBridgeRegistered)
+	{
+		return sal_False;
+	}
+    XIdToAccObjHash::iterator itXacc = XIdAccList.find( (void*)pXAcc );
+    if (itXacc != XIdAccList.end() )
+    {
+        short nCurRole =GetRole(pXAcc);
+        if (AccessibleRole::SHAPE == nCurRole)
+        {
+            AccObject &objXacc = itXacc->second;
+            AccObject *pObjParent = objXacc.GetParentObj();
+            if (pObjParent &&
+                    pObjParent->GetXAccessible().is() &&
+                    pObjParent->GetXAccessible().get() != pParentXAcc)
+            {
+                XIdToAccObjHash::iterator itXaccParent  = XIdAccList.find( (void*)pParentXAcc );
+                if(itXaccParent != XIdAccList.end())
+                {
+                    objXacc.SetParentObj(&(itXaccParent->second));
+                }
+            }
+        }
+        return sal_False;
+    }
+
+
+    Reference< XAccessibleContext > pRContext;
+
+    if( pXAcc == NULL)
+        return sal_False;
+
+    pRContext = pXAcc->getAccessibleContext();
+    if( !pRContext.is() )
+        return sal_False;
+
+    if( pWnd == NULL )
+    {
+        if(pParentXAcc)
+        {
+            AccObject* pObj = GetAccObjByXAcc(pParentXAcc);
+            if(pObj)
+                pWnd = pObj->GetParentHWND();
+        }
+        if( pWnd == NULL )
+            return sal_False;
+    }
+
+    AccObject pObj( pXAcc,pAgent );
+    if( pObj.GetIMAccessible() == NULL )
+        return sal_False;
+    pObj.SetResID( this->ImpleGenerateResID());
+    pObj.SetParentHWND( pWnd );
+
+    //for file name support
+    if ( pObj.GetRole() == DOCUMENT )
+    {
+        XHWNDToDocumentHash::iterator aIter = XHWNDDocList.find( (long)pWnd );
+        if ( aIter != XHWNDDocList.end() )
+        {
+            XHWNDDocList.erase( aIter );
+        }
+        XHWNDDocList.insert( XHWNDToDocumentHash::value_type( (long)pWnd, pXAcc ) );
+
+    }
+    //end of file name
+
+    AccEventListener* listener = createAccEventListener(pXAcc, pAgent);
+    if(listener==NULL)
+        return sal_False;
+    Reference<XAccessibleComponent> xComponent(pRContext,UNO_QUERY);
+    Reference<XAccessibleEventBroadcaster> broadcaster(xComponent,UNO_QUERY);
+    if (broadcaster.is())
+    {
+        Reference <XAccessibleEventListener> pp (
+            static_cast< XAccessibleEventListener* >(listener),UNO_QUERY );
+        if(pp.is())
+        {
+            broadcaster->addEventListener(pp);
+        }
+        else
+        {
+            delete listener;
+            return sal_False;
+        }
+    }
+    else
+        return sal_False;
+
+    XIdAccList.insert( XIdToAccObjHash::value_type( (void*)pXAcc, pObj ));
+    XIdToAccObjHash::iterator pIndTemp = XIdAccList.find( (void*)pXAcc );
+    XResIdAccList.insert(XResIdToAccObjHash::value_type(pObj.GetResID(),&(pIndTemp->second)));
+
+    AccObject* pCurObj = GetAccObjByXAcc(pXAcc);
+    if( pCurObj )
+    {
+        pCurObj->SetListener( listener );
+        if(listener != NULL)
+            listener->acquire();
+    }
+
+    AccObject* pParentObj = GetAccObjByXAcc(pParentXAcc);
+    InsertAccChildNode(pCurObj,pParentObj,pWnd);
+    if( pCurObj )
+        pCurObj->UpdateAccessibleInfoFromUnoToMSAA();
+    return sal_True;
+}
+
+
+/**
+   * save the pair <topwindowhandle, XAccessible>
+   * @param hWnd, top window handle
+   * @param pXAcc XAccessible interface for top window
+   * @return void
+   */
+void AccObjectWinManager::SaveTopWindowHandle(HWND hWnd, com::sun::star::accessibility::XAccessible* pXAcc)
+{
+    HwndXAcc.insert( XHWNDToXAccHash::value_type( hWnd,(void*)pXAcc ) );
+}
+
+
+/**
+   * create the corresponding listener.
+   * @param pXAcc XAccessible interface.
+   * @param Agent The agent kept in all listeners,it's the sole interface by which
+   *        listener communicate with windows manager.
+   * @return 
+   */
+AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc, AccObjectManagerAgent* /* Agent */ )
+{
+    AccEventListener* listener = NULL;
+    Reference<XAccessibleContext> xContext(pXAcc->getAccessibleContext(),UNO_QUERY);
+    if(xContext.is())
+    {
+        switch( xContext->getAccessibleRole() )
+        {
+        case /*AccessibleRole::*/DIALOG:
+            listener = new AccDialogEventListener(pXAcc,pAgent);
+            break;
+        case /*AccessibleRole::*/FRAME:
+            listener = new AccFrameEventListener(pXAcc,pAgent);
+            break;
+        case /*AccessibleRole::*/WINDOW:
+            listener = new AccWindowEventListener(pXAcc,pAgent);
+            break;
+        case /*AccessibleRole::*/ROOT_PANE:
+            listener = new AccFrameEventListener(pXAcc,pAgent);
+            break;
+            //Container
+        case /*AccessibleRole::*/CANVAS:
+        case /*AccessibleRole::*/COMBO_BOX:
+        case /*AccessibleRole::*/DOCUMENT:
+        case /*AccessibleRole::*/END_NOTE:
+        case /*AccessibleRole::*/FILLER:
+        case /*AccessibleRole::*/FOOTNOTE:
+        case /*AccessibleRole::*/FOOTER:
+        case /*AccessibleRole::*/HEADER:
+        case /*AccessibleRole::*/LAYERED_PANE:
+        case /*AccessibleRole::*/MENU_BAR:
+        case /*AccessibleRole::*/POPUP_MENU:
+        case /*AccessibleRole::*/OPTION_PANE:
+        case /*AccessibleRole::*/PAGE_TAB:
+        case /*AccessibleRole::*/PAGE_TAB_LIST:
+        case /*AccessibleRole::*/PANEL:
+        case /*AccessibleRole::*/SCROLL_PANE:
+        case /*AccessibleRole::*/SPLIT_PANE:
+        case /*AccessibleRole::*/STATUS_BAR:
+        case /*AccessibleRole::*/TABLE_CELL:
+        case /*AccessibleRole::*/TOOL_BAR:
+        case /*AccessibleRole::*/VIEW_PORT:
+            listener = new AccContainerEventListener(pXAcc,pAgent);
+            break;
+        case /*AccessibleRole::*/PARAGRAPH:
+        case /*AccessibleRole::*/HEADING:
+            listener = new AccParagraphEventListener(pXAcc,pAgent);
+            break;
+            //Component
+        case /*AccessibleRole::*/CHECK_BOX:
+        case /*AccessibleRole::*/ICON:
+        case /*AccessibleRole::*/LABEL:
+        case /*AccessibleRole::*/MENU_ITEM:
+        case /*AccessibleRole::*/CHECK_MENU_ITEM:
+        case /*AccessibleRole::*/RADIO_MENU_ITEM:
+        case /*AccessibleRole::*/PUSH_BUTTON:
+        case /*AccessibleRole::*/RADIO_BUTTON:
+        case /*AccessibleRole::*/SCROLL_BAR:
+        case /*AccessibleRole::*/SEPARATOR:
+        case /*AccessibleRole::*/TOGGLE_BUTTON:
+        case /*AccessibleRole::*/BUTTON_DROPDOWN:
+        case /*AccessibleRole::*/TOOL_TIP:
+        case /*AccessibleRole::*/SPIN_BOX:
+        case DATE_EDITOR:
+            listener = new AccComponentEventListener(pXAcc,pAgent);
+            break;
+            //text component
+        case /*AccessibleRole::*/TEXT:
+            listener = new AccTextComponentEventListener(pXAcc,pAgent);
+            break;
+            //menu
+        case /*AccessibleRole::*/MENU:
+            listener = new AccMenuEventListener(pXAcc,pAgent);
+            break;
+            //object container
+        case /*AccessibleRole::*/SHAPE:
+
+        case /*AccessibleRole::*/EMBEDDED_OBJECT:
+        case /*AccessibleRole::*/GRAPHIC:
+        case /*AccessibleRole::*/TEXT_FRAME:
+            listener = new AccObjectContainerEventListener(pXAcc,pAgent);
+            break;
+            //descendmanager
+        case /*AccessibleRole::*/LIST:
+            listener = new AccListEventListener(pXAcc,pAgent);
+            break;
+        case /*AccessibleRole::*/TREE:
+            listener = new AccTreeEventListener(pXAcc,pAgent);
+            break;
+            //special
+        case /*AccessibleRole::*/COLUMN_HEADER:
+        case /*AccessibleRole::*/TABLE:
+            listener = new AccTableEventListener(pXAcc,pAgent);
+            break;
+        default:
+            listener = new AccContainerEventListener(pXAcc,pAgent);
+            break;
+        }
+    }
+
+    return listener;
+}
+
+/**
+   * state is a combination integer, each bit of which represents a single state,
+   * such as focused,1 for the state on,0 for the state off. Here call COM interface
+   * to modify the state value, including DecreaseState.
+   * @param pXAcc XAccessible interface.
+   * @param pState Changed state.
+   * @return 
+   */
+void AccObjectWinManager::DecreaseState( XAccessible* pXAcc,unsigned short pState )
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if( pAccObj )
+        pAccObj->DecreaseState( pState );
+}
+
+/**
+   * state is a combination integer, each bit of which represents a single state,such as focused,1 for
+   * the state on,0 for the state off. Here call COM interface to modify the state value, including 
+   * IncreaseState.
+   * @param pXAcc XAccessible interface.
+   * @param pState Changed state.
+   * @return 
+   */
+void AccObjectWinManager::IncreaseState( XAccessible* pXAcc,unsigned short pState )
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if( pAccObj )
+        pAccObj->IncreaseState( pState );
+}
+
+void  AccObjectWinManager::UpdateState( com::sun::star::accessibility::XAccessible* pXAcc )
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if( pAccObj )
+        pAccObj->UpdateState( );
+}
+
+/**
+   * Set corresponding com object's accessible name via XAccessilbe interface and new
+   * name
+   * @param pXAcc XAccessible interface.
+   * @return 
+   */
+void  AccObjectWinManager::UpdateAccName( XAccessible* pXAcc )
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if( pAccObj )
+        pAccObj->UpdateName();
+}
+
+void  AccObjectWinManager::UpdateAction( XAccessible* pXAcc )
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if( pAccObj )
+        pAccObj->UpdateAction();
+}
+
+void AccObjectWinManager::UpdateDescription( XAccessible* pXAcc )
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if ( pAccObj )
+        pAccObj->UpdateDescription();
+}
+
+/**
+   * Set corresponding com object's accessible location via XAccessilbe interface and new
+   * location.
+   * @param pXAcc XAccessible interface.
+   * @return 
+   */
+void  AccObjectWinManager::SetLocation( XAccessible* pXAcc, long /*top*/, long /*left*/, long /*width*/, long /*height*/ )
+{
+    AccObject* pObj = GetAccObjByXAcc( pXAcc );
+    //get the location from XComponent.
+    Reference< XAccessibleContext > pRContext = pXAcc->getAccessibleContext();
+    if( pObj )
+        pObj->UpdateLocation();
+}
+
+/**
+   * Set corresponding com object's value  via XAccessilbe interface and new value.
+   * @param pXAcc XAccessible interface.
+   * @param pAny new value.
+   * @return 
+   */
+void  AccObjectWinManager::SetValue( XAccessible* pXAcc, Any pAny )
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if( pAccObj )
+        pAccObj->SetValue( pAny );
+}
+
+/**
+   * Set corresponding com object's value  via XAccessilbe interface.
+   * @param pXAcc XAccessible interface.
+   * @return 
+   */
+void  AccObjectWinManager::UpdateValue( XAccessible* pXAcc )
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if( pAccObj )
+        pAccObj->UpdateValue();
+}
+
+/**
+   * Set corresponding com object's name via XAccessilbe interface and new name.
+   * @param pXAcc XAccessible interface.
+   * @param newName new name
+   * @return 
+   */
+void  AccObjectWinManager::SetAccName( XAccessible* pXAcc, Any newName)
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if( pAccObj )
+        pAccObj->SetName( newName );
+}
+
+/**
+   * Set corresponding com object's description via XAccessilbe interface and new description.
+   * @param pXAcc XAccessible interface.
+   * @param newDesc new description
+   * @return 
+   */
+void  AccObjectWinManager::SetDescription( XAccessible* pXAcc, Any newDesc )
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if( pAccObj )
+        pAccObj->SetDescription( newDesc );
+}
+
+/**
+   * Set corresponding com object's role via XAccessilbe interface and new role.
+   * @param pXAcc XAccessible interface.
+   * @param Role new role
+   * @return 
+   */
+void  AccObjectWinManager::SetRole( XAccessible* pXAcc, long Role )
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if( pAccObj )
+        pAccObj->SetRole( (short)Role );
+}
+
+/**
+   * Judge if a XAccessible object is a container object.
+   * @param pAccessible XAccessible interface.
+   * @return If XAccessible object is container.
+   */
+sal_Bool AccObjectWinManager::IsContainer(XAccessible* pAccessible)
+{
+    try
+    {
+        if(pAccessible)
+        {
+            Reference<XAccessibleContext> xContext(pAccessible->getAccessibleContext(),UNO_QUERY);
+            if(xContext.is())
+            {
+                switch( xContext->getAccessibleRole() )
+                {
+                case /*AccessibleRole::*/DIALOG:
+                case /*AccessibleRole::*/FRAME:
+                case /*AccessibleRole::*/WINDOW:
+                case /*AccessibleRole::*/ROOT_PANE:
+                case /*AccessibleRole::*/CANVAS:
+                case /*AccessibleRole::*/COMBO_BOX:
+                case /*AccessibleRole::*/DOCUMENT:
+                case /*AccessibleRole::*/EMBEDDED_OBJECT:
+                case /*AccessibleRole::*/END_NOTE:
+                case /*AccessibleRole::*/FILLER:
+                case /*AccessibleRole::*/FOOTNOTE:
+                case /*AccessibleRole::*/FOOTER:
+                case /*AccessibleRole::*/GRAPHIC:
+                case /*AccessibleRole::*/GROUP_BOX:
+                case /*AccessibleRole::*/HEADER:
+                case /*AccessibleRole::*/LAYERED_PANE:
+                case /*AccessibleRole::*/MENU_BAR:
+                case /*AccessibleRole::*/POPUP_MENU:
+                case /*AccessibleRole::*/OPTION_PANE:
+                case /*AccessibleRole::*/PAGE_TAB:
+                case /*AccessibleRole::*/PAGE_TAB_LIST:
+                case /*AccessibleRole::*/PANEL:
+                case /*AccessibleRole::*/SCROLL_PANE:
+                case /*AccessibleRole::*/SPLIT_PANE:
+                case /*AccessibleRole::*/STATUS_BAR:
+                case /*AccessibleRole::*/TABLE_CELL:
+                case /*AccessibleRole::*/TEXT_FRAME:
+                case /*AccessibleRole::*/TOOL_BAR:
+                case /*AccessibleRole::*/VIEW_PORT:
+                case /*AccessibleRole::*/SHAPE:
+                    return sal_True;
+                    break;
+                case /*AccessibleRole::*/COLUMN_HEADER:
+                case /*AccessibleRole::*/TABLE:
+                    if(!IsStateManageDescendant(pAccessible))
+                        return sal_True;
+                    break;
+                case /*AccessibleRole::*/MENU:
+                    return sal_True;
+                    break;
+                default:
+                    return sal_False;
+                }
+            }
+        }
+    }
+    catch(...)
+    {
+        return sal_False;
+    }
+    return sal_False;
+}
+
+/**
+   * Judge if a XAccessible object has ManageDescendant event.
+   * @param pAccessible XAccessible interface.
+   * @return If XAccessible object is managedescendant.
+   */
+bool AccObjectWinManager::IsStateManageDescendant(XAccessible* pAccessible)
+{
+    if(pAccessible)
+    {
+        Reference<XAccessibleContext> xContext(pAccessible->getAccessibleContext(),UNO_QUERY);
+        if(xContext.is())
+        {
+            Reference< XAccessibleStateSet > pRState = xContext->getAccessibleStateSet();
+            if( !pRState.is() )
+                return sal_False;
+
+            Sequence<short> pStates = pRState->getStates();
+            int count = pStates.getLength();
+            for( int iIndex = 0;iIndex < count;iIndex++ )
+            {
+                if(pStates[iIndex] == /*AccessibleStateType::*/MANAGES_DESCENDANTS)
+                    return sal_True;
+            }
+        }
+    }
+    return sal_False;
+}
+
+/**
+   * Query and get IAccessible interface by XAccessible interface from list.
+   * @param pXAcc XAccessible interface.
+   * @return Com accobject interface.
+   */
+IMAccessible* AccObjectWinManager::GetIMAccByXAcc(XAccessible* pXAcc)
+{
+    AccObject* pAccObj = GetAccObjByXAcc(pXAcc);
+    if(pAccObj)
+    {
+        return pAccObj->GetIMAccessible();
+    }
+    else
+    {
+        return NULL;
+    }
+}
+
+/**
+   * Query and get IAccessible interface by child id from list.
+   * @param resID, childID.
+   * @return Com accobject interface.
+   */
+IMAccessible * AccObjectWinManager::GetIAccessibleFromResID(long resID)
+{
+    XResIdToAccObjHash::iterator pIndTemp = XResIdAccList.find( resID );
+    if ( pIndTemp == XResIdAccList.end() )
+        return NULL;
+
+    AccObject* pObj = pIndTemp->second;
+
+    if(pObj->GetIMAccessible())
+        return pObj->GetIMAccessible();
+    return NULL;
+}
+/**
+   * Notify some object will be destroyed.
+   * @param pXAcc XAccessible interface.
+   * @return Com accobject interface.
+   */
+void AccObjectWinManager::NotifyDestroy(XAccessible* pXAcc)
+{
+    AccObject* accObj = GetAccObjByXAcc(pXAcc);
+    if(accObj)
+    {
+        accObj->NotifyDestroy(sal_True);
+    }
+}
+
+
+void AccObjectWinManager::UpdateChildState(com::sun::star::accessibility::XAccessible* pAccSubMenu)
+{
+    Reference<com::sun::star::accessibility::XAccessibleContext> xContext(pAccSubMenu,UNO_QUERY);
+    if (!xContext.is())
+    {
+        return;
+    }
+    sal_Int32 nCount = xContext->getAccessibleChildCount();
+    for (sal_Int32 i = 0 ; i < nCount ; ++i)
+    {
+        Reference<com::sun::star::accessibility::XAccessible> xChild = xContext->getAccessibleChild(i);
+        if (xChild.is())
+        {
+            AccObject *pObj =  GetAccObjByXAcc(xChild.get());
+            if (pObj)
+            {
+                pObj->UpdateState();
+            }
+        }
+    }
+}
+
+
+bool AccObjectWinManager::IsSpecialToolboItem(com::sun::star::accessibility::XAccessible* pXAcc)
+{
+    if (pXAcc && oldFocus != pXAcc)
+    {
+        if(GetParentRole(pXAcc) == TOOL_BAR)
+        {
+            Reference< XAccessibleContext > pRContext(pXAcc->getAccessibleContext());
+            if (pRContext.is())
+            {
+                if(pRContext->getAccessibleRole() == TOGGLE_BUTTON)
+                {
+                    return true;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+short AccObjectWinManager::GetRole(com::sun::star::accessibility::XAccessible* pXAcc)
+{
+    assert(pXAcc != NULL);
+    Reference<com::sun::star::accessibility::XAccessibleContext> xContext(pXAcc->getAccessibleContext(),UNO_QUERY);
+    if(xContext.is())
+    {
+        return xContext->getAccessibleRole();
+    }
+    return -1;
+}
+
+XAccessible* AccObjectWinManager::GetAccDocByHWND( long pWnd )
+{
+    XHWNDToDocumentHash::iterator aIter;
+    aIter = XHWNDDocList.find( pWnd );
+    if ( aIter != XHWNDDocList.end() )
+    {
+        return aIter->second;
+    }
+
+    return NULL;
+}
+
+XAccessible* AccObjectWinManager::GetAccDocByAccTopWin( XAccessible* pXAcc )
+{
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    long pWnd = (long)( pAccObj->GetParentHWND() );
+    return GetAccDocByHWND( pWnd );
+}
+
+bool AccObjectWinManager::IsTopWinAcc( com::sun::star::accessibility::XAccessible* pXAcc )
+{
+    bool bRet = false;
+    AccObject* pAccObj = GetAccObjByXAcc( pXAcc );
+    if ( pAccObj )
+    {
+        bRet = ( pAccObj->GetParentObj() == NULL );
+    }
+    return bRet;
+}

Added: openoffice/branches/ia2/main/winaccessibility/source/service/AccParagraphEventListener.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/winaccessibility/source/service/AccParagraphEventListener.cxx?rev=1420522&view=auto
==============================================================================
--- openoffice/branches/ia2/main/winaccessibility/source/service/AccParagraphEventListener.cxx (added)
+++ openoffice/branches/ia2/main/winaccessibility/source/service/AccParagraphEventListener.cxx Wed Dec 12 04:41:12 2012
@@ -0,0 +1,152 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2010.
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <com/sun/star/accessibility/XAccessible.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
+
+#include "AccParagraphEventListener.hxx"
+#include "AccObjectManagerAgent.hxx"
+#include "unomsaaevent.hxx"
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::accessibility;
+
+AccParagraphEventListener::AccParagraphEventListener(com::sun::star::accessibility::XAccessible* pAcc, AccObjectManagerAgent* Agent)
+        :AccContainerEventListener(pAcc, Agent)
+{}
+AccParagraphEventListener::~AccParagraphEventListener()
+{
+}
+
+/**
+ *	Uno's event notifier when event is captured
+ *	@param AccessibleEventObject	the event object which contains information about event
+ */
+void  AccParagraphEventListener::notifyEvent( const ::com::sun::star::accessibility::AccessibleEventObject& aEvent )
+throw (::com::sun::star::uno::RuntimeException)
+{
+    switch (aEvent.EventId)
+    {
+    case AccessibleEventId::CARET_CHANGED:
+        handleCaretChangedEvent(aEvent.OldValue, aEvent.NewValue);
+        break;
+    case AccessibleEventId::VISIBLE_DATA_CHANGED:
+        handleVisibleDataChangedEvent();
+        break;
+    case AccessibleEventId::BOUNDRECT_CHANGED:
+        handleBoundrectChangedEvent();
+        break;
+        //Added for paragraph selected state.
+    case AccessibleEventId::STATE_CHANGED:
+        {
+            short State;
+            if( (aEvent.NewValue >>= State) && (State == AccessibleStateType::SELECTED) )
+            {
+                pAgent->IncreaseState( pAccessible, State);
+                break;
+            }
+            else if( (aEvent.OldValue >>= State) && (State == AccessibleStateType::SELECTED) )
+            {
+                pAgent->DecreaseState( pAccessible, State);
+                break;
+            }
+
+            AccContainerEventListener::notifyEvent(aEvent);
+            break;
+        }
+
+    case AccessibleEventId::TEXT_SELECTION_CHANGED:
+        handleTextSelectionChangedEvent();
+        break;
+
+    default:
+        AccContainerEventListener::notifyEvent(aEvent);
+        break;
+    }
+}
+
+/**
+ *	handle the CARET_CHANGED event
+ *	@param oldValue		in UNO, this parameter is always NULL
+ *	@param newValue		in UNO, this parameter is always NULL
+ */
+void AccParagraphEventListener::handleCaretChangedEvent(Any oldValue, Any newValue)
+{
+    pAgent->UpdateLocation(pAccessible);
+    pAgent->NotifyAccEvent(UM_EVENT_OBJECT_CARETCHANGE, pAccessible);
+}
+
+/**
+ *	handle the VISIBLE_DATA_CHANGED event
+ */
+void AccParagraphEventListener::handleVisibleDataChangedEvent()
+{
+    AccEventListener::handleVisibleDataChangedEvent();
+}
+
+/**
+ *	handle the BOUNDRECT_CHANGED event
+ */
+void AccParagraphEventListener::handleBoundrectChangedEvent()
+{
+    AccEventListener::handleBoundrectChangedEvent();
+}
+
+/**
+ *	set the new state and fire the MSAA event
+ *	@param state	new state id
+ *	@param enable	true if state is set, false if state is unset
+ */
+void AccParagraphEventListener::setComponentState(short state, bool enable )
+{
+    // only the following state can be fired state event.
+    switch (state)
+    {
+    case AccessibleStateType::EDITABLE:
+        // no msaa state
+        break;
+    case AccessibleStateType::MULTI_LINE:
+        // no msaa state mapping
+        break;
+    case AccessibleStateType::SINGLE_LINE:
+        // no msaa state mapping
+        break;
+    default:
+        AccContainerEventListener::setComponentState(state, enable);
+        break;
+    }
+}
+
+void AccParagraphEventListener::handleTextSelectionChangedEvent()
+{
+    pAgent->NotifyAccEvent(UM_EVENT_TEXT_SELECTION_CHANGED, pAccessible);
+}
+

Added: openoffice/branches/ia2/main/winaccessibility/source/service/AccResource.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/winaccessibility/source/service/AccResource.cxx?rev=1420522&view=auto
==============================================================================
--- openoffice/branches/ia2/main/winaccessibility/source/service/AccResource.cxx (added)
+++ openoffice/branches/ia2/main/winaccessibility/source/service/AccResource.cxx Wed Dec 12 04:41:12 2012
@@ -0,0 +1,92 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2010.
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "AccResource.hxx"
+
+#include <tools/simplerm.hxx>
+
+// ---- needed as long as we have no contexts for components ---
+#include <vcl/svapp.hxx>
+
+//2009.04. Comment the following code because the acc resource is not necessary now. Can open them if necessary
+//#ifndef _TOOLS_INTN_HXX
+//#include <tools/intn.hxx>
+//#endif
+//#ifndef _SOLAR_HRC
+//#include <svtools/solar.hrc>
+//#endif
+
+//.........................................................................
+
+//==================================================================
+//= ResourceManager
+//==================================================================
+SimpleResMgr* ResourceManager::m_pImpl = NULL;
+
+//------------------------------------------------------------------
+ResourceManager::EnsureDelete::~EnsureDelete()
+{
+    delete ResourceManager::m_pImpl;
+}
+
+//------------------------------------------------------------------
+void ResourceManager::ensureImplExists()
+{
+	//Comment the following code because the acc resource is not necessary now. Can open them if necessary
+	/* 
+    if (m_pImpl)
+        return;
+
+    LanguageType nType = Application::GetSettings().GetUILanguage();
+
+    ByteString sFileName("winaccessibility");
+    sFileName += ByteString::CreateFromInt32( (sal_Int32)SOLARUPD );
+
+    m_pImpl = SimpleResMgr::Create(sFileName.GetBuffer(), nType);
+
+    if (m_pImpl)
+    {
+        // no that we have a impl class make sure it's deleted on unloading the library
+        static ResourceManager::EnsureDelete	s_aDeleteTheImplClas;
+    }
+  */
+}
+
+//------------------------------------------------------------------
+::rtl::OUString ResourceManager::loadString(sal_uInt16 _nResId)
+{
+    ::rtl::OUString sReturn;
+
+    ensureImplExists();
+    if (m_pImpl)
+        sReturn = m_pImpl->ReadString(_nResId);
+
+    return sReturn;
+}
+
+

Added: openoffice/branches/ia2/main/winaccessibility/source/service/AccTableEventListener.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/winaccessibility/source/service/AccTableEventListener.cxx?rev=1420522&view=auto
==============================================================================
--- openoffice/branches/ia2/main/winaccessibility/source/service/AccTableEventListener.cxx (added)
+++ openoffice/branches/ia2/main/winaccessibility/source/service/AccTableEventListener.cxx Wed Dec 12 04:41:12 2012
@@ -0,0 +1,153 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2010.
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <com/sun/star/accessibility/XAccessible.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
+#include <com/sun/star/accessibility/AccessibleTableModelChange.hpp>
+
+#include "AccTableEventListener.hxx"
+#include "AccObjectManagerAgent.hxx"
+#include "unomsaaevent.hxx"
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::accessibility;
+
+AccTableEventListener::AccTableEventListener(com::sun::star::accessibility::XAccessible* pAcc, AccObjectManagerAgent* Agent)
+        :AccDescendantManagerEventListener(pAcc, Agent)
+{}
+AccTableEventListener::~AccTableEventListener()
+{
+}
+
+/**
+ *	Uno's event notifier when event is captured
+ *	@param AccessibleEventObject	the event object which contains information about event
+ */
+void  AccTableEventListener::notifyEvent( const ::com::sun::star::accessibility::AccessibleEventObject& aEvent )
+throw (::com::sun::star::uno::RuntimeException)
+{
+    switch (aEvent.EventId)
+    {
+    case AccessibleEventId::ACTIVE_DESCENDANT_CHANGED:
+        handleActiveDescendantChangedEvent(aEvent.OldValue, aEvent.NewValue);
+        break;
+
+    case AccessibleEventId::TABLE_CAPTION_CHANGED:
+        {
+
+            pAgent->NotifyAccEvent(UM_EVENT_TABLE_CAPTION_CHANGED, pAccessible);
+            break;
+        }
+    case AccessibleEventId::TABLE_COLUMN_DESCRIPTION_CHANGED:
+        {
+
+            pAgent->NotifyAccEvent(UM_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED, pAccessible);
+            break;
+        }
+    case AccessibleEventId::TABLE_COLUMN_HEADER_CHANGED:
+        {
+
+            pAgent->NotifyAccEvent(UM_EVENT_TABLE_COLUMN_HEADER_CHANGED, pAccessible);
+            break;
+        }
+    case AccessibleEventId::TABLE_ROW_HEADER_CHANGED:
+        {
+
+            pAgent->NotifyAccEvent(UM_EVENT_TABLE_ROW_HEADER_CHANGED, pAccessible);
+            break;
+        }
+    case AccessibleEventId::TABLE_MODEL_CHANGED:
+        {
+
+            handleTableModelChangeEvent(aEvent.NewValue);
+            break;
+        }
+    case AccessibleEventId::TABLE_SUMMARY_CHANGED:
+        {
+
+            pAgent->NotifyAccEvent(UM_EVENT_TABLE_SUMMARY_CHANGED, pAccessible);
+            break;
+        }
+    case AccessibleEventId::TABLE_ROW_DESCRIPTION_CHANGED:
+        {
+
+            pAgent->NotifyAccEvent(UM_EVENT_TABLE_ROW_DESCRIPTION_CHANGED, pAccessible);
+            break;
+        }
+    default:
+        AccDescendantManagerEventListener::notifyEvent(aEvent);
+        break;
+    }
+}
+
+/**
+ *	handle the ACTIVE_DESCENDANT_CHANGED event
+ *  @param	oldValue	the child to lose active
+ *  @param	newValue	the child to get active
+ */
+void AccTableEventListener::handleActiveDescendantChangedEvent(Any oldValue, Any newValue)
+{
+    Reference< XAccessible > xChild;
+    if(newValue >>= xChild )
+    {
+        if(xChild.is())
+        {
+            XAccessible* pAcc = xChild.get();
+            pAgent->InsertAccObj(pAcc,pAccessible);
+            pAgent->NotifyAccEvent(UM_EVENT_ACTIVE_DESCENDANT_CHANGED, pAcc);
+        }
+    }
+    else if (oldValue >>= xChild)
+    {
+        //delete an existing child
+        if(xChild.is())
+        {
+            XAccessible* pAcc = xChild.get();
+            pAgent->DeleteAccObj( pAcc );
+        }
+    }
+
+}
+void AccTableEventListener::handleTableModelChangeEvent(Any newValue)
+{
+	AccessibleTableModelChange aModelChange;
+	if (newValue >>= aModelChange)
+	{
+	    if( pAccessible )
+	    {
+	        //delete all oldValue's existing children
+	        pAgent->DeleteChildrenAccObj( pAccessible );
+	        //add all oldValue's existing children
+	        pAgent->InsertChildrenAccObj( pAccessible );
+	    }		
+		pAgent->NotifyAccEvent(UM_EVENT_TABLE_MODEL_CHANGED, pAccessible);
+	}
+}

Added: openoffice/branches/ia2/main/winaccessibility/source/service/AccTextComponentEventListener.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/winaccessibility/source/service/AccTextComponentEventListener.cxx?rev=1420522&view=auto
==============================================================================
--- openoffice/branches/ia2/main/winaccessibility/source/service/AccTextComponentEventListener.cxx (added)
+++ openoffice/branches/ia2/main/winaccessibility/source/service/AccTextComponentEventListener.cxx Wed Dec 12 04:41:12 2012
@@ -0,0 +1,72 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2010.
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <com/sun/star/accessibility/XAccessible.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
+
+#include "AccTextComponentEventListener.hxx"
+#include "AccObjectManagerAgent.hxx"
+#include "unomsaaevent.hxx"
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::accessibility;
+
+AccTextComponentEventListener::AccTextComponentEventListener(com::sun::star::accessibility::XAccessible* pAcc, AccObjectManagerAgent* Agent)
+        :AccComponentEventListener(pAcc, Agent)
+{}
+AccTextComponentEventListener::~AccTextComponentEventListener()
+{
+}
+
+/**
+ *	set the new state and fire the MSAA event
+ *	@param state	new state id
+ *	@param enable	true if state is set, false if state is unset
+ */
+void AccTextComponentEventListener::setComponentState(short state, bool enable )
+{
+    // only the following state can be fired state event.
+    switch (state)
+    {
+    case AccessibleStateType::EDITABLE:
+        // no msaa state mapping
+        break;
+    case AccessibleStateType::MULTI_LINE:
+        // no msaa state mapping
+        break;
+    case AccessibleStateType::SINGLE_LINE:
+        // no msaa state mapping
+        break;
+    default:
+        AccComponentEventListener::setComponentState(state, enable);
+        break;
+    }
+}

Added: openoffice/branches/ia2/main/winaccessibility/source/service/AccTopWindowListener.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/winaccessibility/source/service/AccTopWindowListener.cxx?rev=1420522&view=auto
==============================================================================
--- openoffice/branches/ia2/main/winaccessibility/source/service/AccTopWindowListener.cxx (added)
+++ openoffice/branches/ia2/main/winaccessibility/source/service/AccTopWindowListener.cxx Wed Dec 12 04:41:12 2012
@@ -0,0 +1,355 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2010.
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <cppuhelper/bootstrap.hxx>
+#include <com/sun/star/bridge/XUnoUrlResolver.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <vcl/window.hxx>
+#include <toolkit/awt/Vclxwindow.hxx>
+
+#ifndef _SV_SYSDATA_HXX
+#if defined( WIN ) || defined( WNT ) || defined( OS2 )
+typedef sal_Int32 HWND;
+typedef sal_Int32 HMENU;
+typedef sal_Int32 HDC;
+typedef void *PVOID;
+typedef PVOID HANDLE;
+typedef HANDLE HFONT;
+#endif
+#include <vcl/sysdata.hxx>
+#endif
+
+#include "AccTopWindowListener.hxx"
+#include "unomsaaevent.hxx"
+
+#include <com/sun/star/awt/XExtendedToolkit.hpp>
+#include <com/sun/star/uno/XInterface.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventListener.hpp>
+#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::bridge;
+using namespace com::sun::star::awt;
+using namespace rtl;
+using namespace cppu;
+using namespace com::sun::star::accessibility;
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+AccTopWindowListener* g_pTop = NULL;
+//when proccess exit, call FreeTopWindowListener() in svmain
+void FreeTopWindowListener()
+{
+    if( g_pTop )
+    {
+        g_pTop->release();
+        g_pTop = NULL;
+    }
+}
+
+/**
+ *	As a global method to invoke the handleWindowOpened() method
+ */
+void handleWindowOpened_impl(long pAcc)
+{
+    if( g_pTop && pAcc != NULL )
+        g_pTop->handleWindowOpened( (com::sun::star::accessibility::XAccessible*)((void*)pAcc) );
+}
+
+/**
+ *	For the new opened window, generate all the UNO accessible's object, COM object and add
+ *	accessible listener to monitor all these objects. 
+ *	@param pAccessible		the accessible of the new opened window
+ */
+void AccTopWindowListener::handleWindowOpened( com::sun::star::accessibility::XAccessible* pAccessible )
+{
+    //get SystemData from window
+    VCLXWindow* pvclwindow = (VCLXWindow*)pAccessible;
+    Window* window = pvclwindow->GetWindow();
+	// The SalFrame of window may be destructed at this time
+    const SystemEnvData* systemdata = NULL;
+	try
+	{
+		systemdata = window->GetSystemData();
+	}
+	catch(...)
+	{
+		systemdata = NULL;
+	}
+    Reference<com::sun::star::accessibility::XAccessibleContext> xContext(pAccessible->getAccessibleContext(),UNO_QUERY);
+    if(!xContext.is())
+    {
+        return;
+    }
+    com::sun::star::accessibility::XAccessibleContext* pAccessibleContext = xContext.get();
+    //Only AccessibleContext exist, add all listeners
+    if(pAccessibleContext != NULL && systemdata != NULL)
+    {
+        accManagerAgent.SaveTopWindowHandle((HWND)systemdata->hWnd,  pAccessible);
+
+        AddAllListeners(pAccessible,NULL,(HWND)systemdata->hWnd);
+
+        if( window->GetStyle() & WB_MOVEABLE )
+            accManagerAgent.IncreaseState( pAccessible, -1 /* U_MOVEBLE */ );
+
+        short role = pAccessibleContext->getAccessibleRole();
+
+
+        if (role == com::sun::star::accessibility::AccessibleRole::POPUP_MENU ||
+                role == com::sun::star::accessibility::AccessibleRole::MENU )
+        {
+            accManagerAgent.NotifyAccEvent(UM_EVENT_MENUPOPUPSTART, pAccessible);
+        }
+
+        if (role == com::sun::star::accessibility::AccessibleRole::FRAME ||
+                role == com::sun::star::accessibility::AccessibleRole::DIALOG ||
+                role == com::sun::star::accessibility::AccessibleRole::WINDOW || 
+				role == com::sun::star::accessibility::AccessibleRole::ALERT)
+        {
+            accManagerAgent.NotifyAccEvent(UM_EVENT_SHOW, pAccessible);
+        }
+    }
+}
+
+AccTopWindowListener::AccTopWindowListener():
+        accManagerAgent(),
+        m_refcount(1)
+{
+}
+
+AccTopWindowListener::~AccTopWindowListener()
+{
+}
+
+/**
+ *	It is invoked when a new window is opened, the source of this EventObject is the window
+ */
+void AccTopWindowListener::windowOpened( const ::com::sun::star::lang::EventObject& e ) throw (::com::sun::star::uno::RuntimeException)
+{
+    if ( !e.Source.is())
+    {
+        return;
+    }
+
+    Reference< com::sun::star::accessibility::XAccessible > xAccessible ( e.Source, UNO_QUERY );
+    com::sun::star::accessibility::XAccessible* pAccessible = xAccessible.get();
+    if ( pAccessible == NULL)
+    {
+        return;
+    }
+
+    handleWindowOpened(pAccessible);
+
+}
+
+/**
+ *	Add the accessible event listener to object and all its children objects. 
+ *	@param	pAccessible		the accessible object
+ *	@param	pParentXAcc		the parent of current accessible object
+ *	@param	pWND			the handle of top window which current object resides
+ */
+void AccTopWindowListener::AddAllListeners(com::sun::star::accessibility::XAccessible* pAccessible, com::sun::star::accessibility::XAccessible* pParentXAcc, HWND pWND)
+{
+    Reference<com::sun::star::accessibility::XAccessibleContext> xContext(pAccessible->getAccessibleContext(),UNO_QUERY);
+    if(!xContext.is())
+    {
+        return;
+    }
+    com::sun::star::accessibility::XAccessibleContext* pAccessibleContext = xContext.get();
+    if(pAccessibleContext == NULL)
+    {
+        return;
+    }
+
+    accManagerAgent.InsertAccObj( pAccessible, pParentXAcc,pWND );
+
+    if (!accManagerAgent.IsContainer(pAccessible))
+    {
+        return;
+    }
+
+
+    short role = pAccessibleContext->getAccessibleRole();
+    if(com::sun::star::accessibility::AccessibleRole::DOCUMENT == role )
+    {
+        if(accManagerAgent.IsStateManageDescendant(pAccessible))
+        {
+        	// Here, for sw document, the last children may be post it window or ole window, they need to be cached because their focus event
+        	// won't be handled together with other children. 
+        	int count = pAccessibleContext->getAccessibleChildCount();
+			sal_Bool bValid = sal_True; 
+			for (int i = count - 1; i >= 0 && bValid; i--)
+			{
+				Reference<XAccessible> mxAccessible	= pAccessibleContext->getAccessibleChild(i);
+				XAccessible* mpAccessible = mxAccessible.get();
+				if (mpAccessible != NULL)
+				{
+					Reference< XAccessibleContext > xChildContext = mpAccessible->getAccessibleContext();
+					if (xChildContext.is())
+					{
+						short childRole = xChildContext->getAccessibleRole();
+						if (childRole == com::sun::star::accessibility::AccessibleRole::WINDOW || 
+							childRole == com::sun::star::accessibility::AccessibleRole::SCROLL_PANE)
+						{
+							AddAllListeners(mpAccessible,pAccessible,pWND);
+						}
+						else
+							bValid = sal_False;
+					}
+				}
+				else
+					bValid = sal_False;				
+			}
+            return ;
+        }
+    }
+
+
+    int count = pAccessibleContext->getAccessibleChildCount();
+    for (int i=0;i<count;i++)
+    {
+        Reference<com::sun::star::accessibility::XAccessible> mxAccessible
+        = pAccessibleContext->getAccessibleChild(i);
+
+        com::sun::star::accessibility::XAccessible* mpAccessible = mxAccessible.get();
+        if(mpAccessible != NULL)
+        {
+            Reference<com::sun::star::accessibility::XAccessibleContext> mxAccessibleContext
+            = mpAccessible->getAccessibleContext();
+            com::sun::star::accessibility::XAccessibleContext* mpContext = mxAccessibleContext.get();
+            if(mpContext != NULL)
+            {
+                //fprintf(output, "go on add child's children event listener\n");
+                AddAllListeners(mpAccessible,pAccessible,pWND);
+            }
+        }
+    }
+}
+
+void AccTopWindowListener::windowClosing( const ::com::sun::star::lang::EventObject& e ) throw (::com::sun::star::uno::RuntimeException)
+{
+}
+
+/**
+ *	Invoke this method when the top window is closed, remove all the objects and its children
+ *	from current manager's cache, and remove the COM object and the accessible event listener
+ *	assigned to the accessible objects.
+ */
+void AccTopWindowListener::windowClosed( const ::com::sun::star::lang::EventObject& e ) throw (::com::sun::star::uno::RuntimeException)
+{
+    if ( !e.Source.is())
+    {
+        return;
+    }
+    Reference< com::sun::star::accessibility::XAccessible > xAccessible ( e.Source, UNO_QUERY );
+    com::sun::star::accessibility::XAccessible* pAccessible = xAccessible.get();
+    if ( pAccessible == NULL)
+    {
+        return;
+    }
+
+
+    VCLXWindow* pvclwindow = (VCLXWindow*)pAccessible;
+    Window* window = pvclwindow->GetWindow();
+    const SystemEnvData* systemdata=window->GetSystemData();
+
+    Reference<com::sun::star::accessibility::XAccessibleContext> xContext(pAccessible->getAccessibleContext(),UNO_QUERY);
+    if(!xContext.is())
+    {
+        return;
+    }
+    com::sun::star::accessibility::XAccessibleContext* pAccessibleContext = xContext.get();
+
+    short role = -1;
+    if(pAccessibleContext != NULL)
+    {
+        role = pAccessibleContext->getAccessibleRole();
+
+        if (role == com::sun::star::accessibility::AccessibleRole::POPUP_MENU ||
+                role == com::sun::star::accessibility::AccessibleRole::MENU)
+        {
+            accManagerAgent.NotifyAccEvent(UM_EVENT_MENUPOPUPEND, pAccessible);
+        }
+    }
+
+
+    accManagerAgent.DeleteChildrenAccObj( pAccessible );
+    if( role != com::sun::star::accessibility::AccessibleRole::POPUP_MENU )
+        accManagerAgent.DeleteAccObj( pAccessible );
+
+}
+
+void AccTopWindowListener::windowMinimized( const ::com::sun::star::lang::EventObject& ) throw (::com::sun::star::uno::RuntimeException)
+{
+}
+
+void AccTopWindowListener::windowNormalized( const ::com::sun::star::lang::EventObject& ) throw (::com::sun::star::uno::RuntimeException)
+{
+}
+
+void AccTopWindowListener::windowActivated( const ::com::sun::star::lang::EventObject& ) throw (::com::sun::star::uno::RuntimeException)
+{
+}
+
+void AccTopWindowListener::windowDeactivated( const ::com::sun::star::lang::EventObject& ) throw (::com::sun::star::uno::RuntimeException)
+{
+}
+
+void AccTopWindowListener::disposing( const ::com::sun::star::lang::EventObject&  ) throw (::com::sun::star::uno::RuntimeException)
+{
+}
+
+//need to investigate further
+::com::sun::star::uno::Any SAL_CALL AccTopWindowListener::queryInterface( const ::com::sun::star::uno::Type& aType ) throw (::com::sun::star::uno::RuntimeException)
+{
+    if (aType.equals( ::getCppuType( (Reference< com::sun::star::awt::XTopWindowListener> const *)0 ) ))
+    {
+        Reference< com::sun::star::awt::XTopWindowListener> xTopListener( static_cast< com::sun::star::awt::XTopWindowListener* >(this));
+        return makeAny(xTopListener);
+    }
+    return Any();
+}
+
+void AccTopWindowListener::acquire( ) throw ()
+{
+    ::osl_incrementInterlockedCount( &m_refcount );
+}
+
+void AccTopWindowListener::release() throw ()
+{
+    // thread-safe decrementation of reference count
+    if (0 == ::osl_decrementInterlockedCount( &m_refcount ))
+    {
+        delete this; // shutdown this object
+    }
+}

Added: openoffice/branches/ia2/main/winaccessibility/source/service/AccTreeEventListener.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/winaccessibility/source/service/AccTreeEventListener.cxx?rev=1420522&view=auto
==============================================================================
--- openoffice/branches/ia2/main/winaccessibility/source/service/AccTreeEventListener.cxx (added)
+++ openoffice/branches/ia2/main/winaccessibility/source/service/AccTreeEventListener.cxx Wed Dec 12 04:41:12 2012
@@ -0,0 +1,94 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2010.
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <com/sun/star/accessibility/XAccessible.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
+
+#include "AccTreeEventListener.hxx"
+#include "AccObjectManagerAgent.hxx"
+#include "unomsaaevent.hxx"
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::accessibility;
+
+AccTreeEventListener::AccTreeEventListener(com::sun::star::accessibility::XAccessible* pAcc, AccObjectManagerAgent* Agent)
+        :AccDescendantManagerEventListener(pAcc, Agent)
+{}
+AccTreeEventListener::~AccTreeEventListener()
+{
+}
+
+/**
+ *	Uno's event notifier when event is captured
+ *	@param AccessibleEventObject	the event object which contains information about event
+ */
+void  AccTreeEventListener::notifyEvent( const ::com::sun::star::accessibility::AccessibleEventObject& aEvent ) throw (::com::sun::star::uno::RuntimeException)
+{
+    switch (aEvent.EventId)
+    {
+    case AccessibleEventId::ACTIVE_DESCENDANT_CHANGED:
+        handleActiveDescendantChangedEvent(aEvent.OldValue, aEvent.NewValue);
+        break;
+    default:
+        AccDescendantManagerEventListener::notifyEvent(aEvent);
+        break;
+    }
+}
+
+/**
+ *	handle the ACTIVE_DESCENDANT_CHANGED event
+ *  @param	oldValue	the child to lose active
+ *  @param	newValue	the child to get active
+ */
+void AccTreeEventListener::handleActiveDescendantChangedEvent(Any oldValue, Any newValue)
+{
+    Reference< XAccessible > xChild;
+    if(newValue >>= xChild )
+    {
+        if(xChild.is())
+        {
+            XAccessible* pAcc = xChild.get();
+            pAgent->InsertAccObj(pAcc,pAccessible);
+            pAgent->NotifyAccEvent(UM_EVENT_ACTIVE_DESCENDANT_CHANGED, pAcc);
+            pActiveDescendant = pAcc;
+        }
+    }
+    if (oldValue >>= xChild)
+    {
+        //delete an existing child
+        if(xChild.is())
+        {
+            XAccessible* pAcc = xChild.get();
+            pAgent->DeleteAccObj( pAcc );
+        }
+    }
+
+}

Added: openoffice/branches/ia2/main/winaccessibility/source/service/AccWindowEventListener.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/winaccessibility/source/service/AccWindowEventListener.cxx?rev=1420522&view=auto
==============================================================================
--- openoffice/branches/ia2/main/winaccessibility/source/service/AccWindowEventListener.cxx (added)
+++ openoffice/branches/ia2/main/winaccessibility/source/service/AccWindowEventListener.cxx Wed Dec 12 04:41:12 2012
@@ -0,0 +1,159 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2010.
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <com/sun/star/accessibility/XAccessible.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
+
+#include "AccWindowEventListener.hxx"
+#include "AccObjectManagerAgent.hxx"
+#include "unomsaaevent.hxx"
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::accessibility;
+
+AccWindowEventListener::AccWindowEventListener(com::sun::star::accessibility::XAccessible* pAcc, AccObjectManagerAgent* Agent)
+        :AccEventListener(pAcc, Agent)
+{}
+AccWindowEventListener::~AccWindowEventListener()
+{
+}
+
+/**
+ *	Uno's event notifier when event is captured
+ *	@param AccessibleEventObject: the event object which contains information about event
+ */
+void  AccWindowEventListener::notifyEvent( const ::com::sun::star::accessibility::AccessibleEventObject& aEvent ) throw (::com::sun::star::uno::RuntimeException)
+{
+    switch (aEvent.EventId)
+    {
+    case AccessibleEventId::CHILD:
+        handleChildChangedEvent(aEvent.OldValue, aEvent.NewValue);
+        break;
+    case AccessibleEventId::VISIBLE_DATA_CHANGED:
+        handleVisibleDataChangedEvent();
+        break;
+    case AccessibleEventId::BOUNDRECT_CHANGED:
+        handleBoundrectChangedEvent();
+        break;
+    default:
+        AccEventListener::notifyEvent(aEvent);
+        break;
+    }
+}
+
+/**
+ *	handle the VISIBLE_DATA_CHANGED event
+ */
+void AccWindowEventListener::handleVisibleDataChangedEvent()
+{
+    AccEventListener::handleVisibleDataChangedEvent();
+}
+
+/**
+ *	handle the BOUNDRECT_CHANGED event
+ */
+void AccWindowEventListener::handleBoundrectChangedEvent()
+{
+    AccEventListener::handleBoundrectChangedEvent();
+}
+
+/**
+ *	handle the CHILD event
+ *	@param	oldValue	the child to be deleted
+ *	@param	newValue	the child to be added
+ */
+void AccWindowEventListener::handleChildChangedEvent(Any oldValue, Any newValue)
+{
+    Reference< XAccessible > xChild;
+    if( newValue >>= xChild)
+    {
+        //create a new child
+        if(xChild.is())
+        {
+            XAccessible* pAcc = xChild.get();
+            //add this child
+            pAgent->InsertAccObj( pAcc,pAccessible);
+            //add all oldValue's existing children
+            pAgent->InsertChildrenAccObj(pAcc);
+            pAgent->NotifyAccEvent(UM_EVENT_CHILD_ADDED, pAcc);
+        }
+        else
+        {}
+    }
+    else if (oldValue >>= xChild)
+    {
+        //delete a existing child
+        if(xChild.is())
+        {
+            XAccessible* pAcc = xChild.get();
+            pAgent->NotifyAccEvent(UM_EVENT_CHILD_REMOVED, pAcc);
+            pAgent->DeleteChildrenAccObj( pAcc );
+            //delete this child
+            pAgent->DeleteAccObj( pAcc );
+        }
+        else
+        {}
+    }
+}
+
+/**
+ *	set the new state and fire the MSAA event
+ *	@param state	new state id
+ *	@param enable	true if state is set, false if state is unset
+ */
+void AccWindowEventListener::setComponentState(short state, bool enable )
+{
+    // only the following state can be fired state event.
+    switch (state)
+    {
+    case AccessibleStateType::ICONIFIED:
+        // no msaa state
+        break;
+    case AccessibleStateType::VISIBLE:
+        // UNO !VISIBLE == MSAA INVISIBLE
+        if( enable )
+            pAgent->IncreaseState( pAccessible, AccessibleStateType::VISIBLE );
+        else
+            pAgent->DecreaseState( pAccessible, AccessibleStateType::VISIBLE );
+        break;
+    case AccessibleStateType::SHOWING:
+        // UNO !SHOWING == MSAA OFFSCREEN
+        if( enable )
+        {
+            pAgent->IncreaseState( pAccessible, AccessibleStateType::SHOWING );
+        }
+        else
+            pAgent->DecreaseState( pAccessible, AccessibleStateType::SHOWING );
+        break;
+    default:
+        break;
+    }
+}

Added: openoffice/branches/ia2/main/winaccessibility/source/service/ResIDGenerator.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/winaccessibility/source/service/ResIDGenerator.cxx?rev=1420522&view=auto
==============================================================================
--- openoffice/branches/ia2/main/winaccessibility/source/service/ResIDGenerator.cxx (added)
+++ openoffice/branches/ia2/main/winaccessibility/source/service/ResIDGenerator.cxx Wed Dec 12 04:41:12 2012
@@ -0,0 +1,61 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2010.
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "ResIDGenerator.hxx"
+
+/**
+   * Destructor 
+   *
+   * @param   
+   * @return  
+   */
+ResIDGenerator::~ResIDGenerator()
+{
+}
+
+/**
+   * SubList stores those IDs that were ever generated and deleted, the method 
+   * return the ID from subList first if subList is not empty,else return ++max. 
+   * Add the obsolete IDs by calling SetSub method
+   * 
+   * @param   
+   * @return  new resource ID.
+   */
+long ResIDGenerator::GenerateNewResID()
+{
+    if (max == LONG_MAX)
+    {
+        if (!subList.empty())
+        {
+            long nRes = *(subList.begin());
+            subList.pop_front();
+            return nRes;
+        }
+    }
+    return -(++max);
+}

Added: openoffice/branches/ia2/main/winaccessibility/source/service/checkmt.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/winaccessibility/source/service/checkmt.cxx?rev=1420522&view=auto
==============================================================================
--- openoffice/branches/ia2/main/winaccessibility/source/service/checkmt.cxx (added)
+++ openoffice/branches/ia2/main/winaccessibility/source/service/checkmt.cxx Wed Dec 12 04:41:12 2012
@@ -0,0 +1,47 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2010.
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "checkmt.hxx"
+#include <vcl/svapp.hxx>
+
+bool IsInMainThread()
+{
+    if( Application::GetMainThreadIdentifier() == ::vos::OThread::getCurrentIdentifier())
+        return true;
+    else
+        return false;
+}
+
+vos::IMutex& GetSolarMutex()
+{
+    return Application::GetSolarMutex();
+}
+bool IsBridgeRegisteredAcc()
+{
+	return IsBridgeRegistered();
+}



Mime
View raw message