openoffice-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From stev...@apache.org
Subject svn commit: r1526782 [2/6] - in /openoffice/branches/ia2/main: accessibility/source/extended/ accessibility/source/standard/ cui/source/customize/ cui/source/inc/ editeng/inc/editeng/ editeng/source/accessibility/ editeng/source/editeng/ filter/source/...
Date Fri, 27 Sep 2013 03:21:47 GMT
Modified: openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocument.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocument.cxx?rev=1526782&r1=1526781&r2=1526782&view=diff
==============================================================================
--- openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocument.cxx (original)
+++ openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocument.cxx Fri Sep 27 03:21:44 2013
@@ -70,9 +70,23 @@
 #include <unotools/accessiblerelationsethelper.hxx>
 #include <toolkit/helper/convert.hxx>
 
+//IAccessibility2 Implementation 2009-----
+#include <svx/AccessibleControlShape.hxx>
+#include <svx/AccessibleShape.hxx>
+#include <svx/ShapeTypeHandler.hxx>
+#include <svx/SvxShapeTypes.hxx>
+#include <sfx2/objsh.hxx>
+#include <editeng/editview.hxx>
+#include <editeng/editeng.hxx>
+//-----IAccessibility2 Implementation 2009
 #include <list>
 #include <algorithm>
+//IAccessibility2 Implementation 2009-----
+#include "AccessibleCell.hxx"
 
+#include "svx/unoapi.hxx"
+#include "scmod.hxx"
+//-----IAccessibility2 Implementation 2009
 using namespace	::com::sun::star;
 using namespace	::com::sun::star::accessibility;
 using ::std::for_each;
@@ -245,6 +259,16 @@ public:
 		const ::accessibility::AccessibleShapeTreeInfo& _rShapeTreeInfo
 	)	throw (::com::sun::star::uno::RuntimeException);
 
+//IAccessibility2 Implementation 2009-----
+	virtual ::accessibility::AccessibleControlShape* GetAccControlShapeFromModel
+		(::com::sun::star::beans::XPropertySet* pSet) 
+		throw (::com::sun::star::uno::RuntimeException);
+	virtual  ::com::sun::star::uno::Reference<
+            ::com::sun::star::accessibility::XAccessible>
+        GetAccessibleCaption (const ::com::sun::star::uno::Reference<
+            ::com::sun::star::drawing::XShape>& xShape)
+			throw (::com::sun::star::uno::RuntimeException);
+//-----IAccessibility2 Implementation 2009
     ///=====  Internal  ========================================================
     void SetDrawBroadcaster();
 
@@ -465,6 +489,45 @@ sal_Bool ScChildrenShapes::ReplaceChild 
     return bResult;
 }
 
+//IAccessibility2 Implementation 2009-----
+::accessibility::AccessibleControlShape * ScChildrenShapes::GetAccControlShapeFromModel(::com::sun::star::beans::XPropertySet* pSet) throw (::com::sun::star::uno::RuntimeException)
+{
+	sal_Int32 count = GetCount();
+	for (sal_Int32 index=0;index<count;index++)
+	{
+		ScAccessibleShapeData* pShape = maZOrderedShapes[index];
+            	if (pShape)
+   	     	{
+   	     		::accessibility::AccessibleShape* pAccShape = pShape->pAccShape;
+          	 	if (pAccShape  && ::accessibility::ShapeTypeHandler::Instance().GetTypeId (pAccShape->GetXShape()) == ::accessibility::DRAWING_CONTROL)
+          	  	{
+				::accessibility::AccessibleControlShape *pCtlAccShape = static_cast < ::accessibility::AccessibleControlShape* >(pAccShape);
+				if (pCtlAccShape && pCtlAccShape->GetControlModel() == pSet)
+					return pCtlAccShape;
+			  }
+            	}
+	}
+	return NULL;
+}
+::com::sun::star::uno::Reference < ::com::sun::star::accessibility::XAccessible >
+ScChildrenShapes::GetAccessibleCaption (const ::com::sun::star::uno::Reference < ::com::sun::star::drawing::XShape>& xShape)
+			throw (::com::sun::star::uno::RuntimeException)
+{
+	sal_Int32 count = GetCount();
+	for (sal_Int32 index=0;index<count;index++)
+	{
+		ScAccessibleShapeData* pShape = maZOrderedShapes[index];
+			if (pShape && pShape->xShape == xShape )
+   	     	{
+				::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xNewChild(  pShape->pAccShape );	
+//				uno::Reference<XAccessible> xNewChild( pShape->pAccShape , uno::UNO_QUERY );					
+				if(xNewChild.get())
+				return xNewChild;
+			}
+	}
+	return NULL;
+}
+//-----IAccessibility2 Implementation 2009
 sal_Int32 ScChildrenShapes::GetCount() const
 {
 	SdrPage* pDrawPage = GetDrawPage();
@@ -743,6 +806,9 @@ uno::Reference< XAccessible > ScChildren
         std::vector < uno::Reference < drawing::XShape > > aShapes;
         FillShapes(aShapes);
 
+//IAccessibility2 Implementation 2009-----
+		if(aShapes.size()<=0) return xAccessible;
+//-----IAccessibility2 Implementation 2009
         SortedShapes::iterator aItr;
         if (FindShape(aShapes[nSelectedChildIndex], aItr))
             xAccessible = Get(aItr - maZOrderedShapes.begin());
@@ -887,9 +953,20 @@ sal_Bool ScChildrenShapes::FindSelectedS
     }
     else
         mnShapesSelected = 0;
+//IAccessibility2 Implementation 2009-----
+	SdrObject *pFocusedObj = NULL;
+	if( mnShapesSelected == 1 && aShapesList.size() == 1)
+	{
+		pFocusedObj = GetSdrObjectFromXShape(aShapesList[0]->xShape);
+	}
+//-----IAccessibility2 Implementation 2009
     ScShapeDataLess aLess;
     std::sort(aShapesList.begin(), aShapesList.end(), aLess);
-
+//IAccessibility2 Implementation 2009-----
+	SortedShapes vecSelectedShapeAdd;
+	SortedShapes vecSelectedShapeRemove;
+	sal_Bool bHasSelect=sal_False;
+//-----IAccessibility2 Implementation 2009
     SortedShapes::iterator aXShapesItr(aShapesList.begin());
     SortedShapes::const_iterator aXShapesEndItr(aShapesList.end());
     SortedShapes::iterator aDataItr(maZOrderedShapes.begin());
@@ -914,9 +991,18 @@ sal_Bool ScChildrenShapes::FindSelectedS
                         (*aDataItr)->pAccShape->SetState(AccessibleStateType::SELECTED);
                         (*aDataItr)->pAccShape->ResetState(AccessibleStateType::FOCUSED);
                         bResult = sal_True;
+//IAccessibility2 Implementation 2009-----
+						vecSelectedShapeAdd.push_back((*aDataItr));
+//-----IAccessibility2 Implementation 2009
                     }
                     aFocusedItr = aDataItr;
                 }
+//IAccessibility2 Implementation 2009-----
+				else
+				{
+					 bHasSelect = sal_True;
+				}
+//-----IAccessibility2 Implementation 2009
                 ++aDataItr;
                 ++aXShapesItr;
             }
@@ -930,6 +1016,9 @@ sal_Bool ScChildrenShapes::FindSelectedS
                         (*aDataItr)->pAccShape->ResetState(AccessibleStateType::SELECTED);
                         (*aDataItr)->pAccShape->ResetState(AccessibleStateType::FOCUSED);
                         bResult = sal_True;
+//IAccessibility2 Implementation 2009-----
+						vecSelectedShapeRemove.push_back(*aDataItr);
+//-----IAccessibility2 Implementation 2009
                     }
                 }
                 ++aDataItr;
@@ -944,9 +1033,122 @@ sal_Bool ScChildrenShapes::FindSelectedS
         else
             ++aDataItr;
     }
-    if ((aFocusedItr != aDataEndItr) && (*aFocusedItr)->pAccShape && (mnShapesSelected == 1))
+//IAccessibility2 Implementation 2009-----
+	bool bWinFocus=false;
+	ScGridWindow* pWin = static_cast<ScGridWindow*>(mpViewShell->GetWindowByPos(meSplitPos));
+	if (pWin)
+	{
+		bWinFocus = pWin->HasFocus();
+	}
+	const SdrMarkList* pMarkList = NULL;
+	SdrObject* pMarkedObj = NULL;
+	SdrObject* pUpObj = NULL;
+	sal_Bool bIsFocuseMarked = sal_True;
+	if( mpViewShell && mnShapesSelected == 1 && bWinFocus)	
+	{		
+		ScDrawView* pScDrawView = mpViewShell->GetViewData()->GetScDrawView();
+		if( pScDrawView )
+		{
+			if( pScDrawView->GetMarkedObjectList().GetMarkCount() == 1 )
+			{
+				pMarkList = &(pScDrawView->GetMarkedObjectList());
+				pMarkedObj = pMarkList->GetMark(0)->GetMarkedSdrObj();
+				uno::Reference< drawing::XShape > xMarkedXShape (pMarkedObj->getUnoShape(), uno::UNO_QUERY);
+				if( aFocusedItr != aDataEndItr &&
+					(*aFocusedItr)->xShape.is() && 
+					xMarkedXShape.is() && 
+					(*aFocusedItr)->xShape != xMarkedXShape )
+					bIsFocuseMarked = sal_False;
+			}
+		}
+	}
+    //if ((aFocusedItr != aDataEndItr) && (*aFocusedItr)->pAccShape && (mnShapesSelected == 1))
+    if ( bIsFocuseMarked && (aFocusedItr != aDataEndItr) && (*aFocusedItr)->pAccShape && (mnShapesSelected == 1) && bWinFocus)
+	{
         (*aFocusedItr)->pAccShape->SetState(AccessibleStateType::FOCUSED);
+	}
+	else if( pFocusedObj && bWinFocus && pMarkList && pMarkList->GetMarkCount() == 1 && mnShapesSelected == 1 )
+	{		
+		if( pMarkedObj )
+		{
+			uno::Reference< drawing::XShape > xMarkedXShape (pMarkedObj->getUnoShape(), uno::UNO_QUERY);
+			pUpObj = pMarkedObj->GetUpGroup();
 
+			if( pMarkedObj == pFocusedObj )
+			{
+				if( pUpObj )
+				{
+					uno::Reference< drawing::XShape > xUpGroupXShape (pUpObj->getUnoShape(), uno::UNO_QUERY);
+					uno::Reference < XAccessible > xAccGroupShape = 
+						const_cast<ScChildrenShapes*>(this)->GetAccessibleCaption( xUpGroupXShape );
+					if( xAccGroupShape.is() )
+					{
+						::accessibility::AccessibleShape* pAccGroupShape =  
+							static_cast< ::accessibility::AccessibleShape* >(xAccGroupShape.get());
+						if( pAccGroupShape )
+						{
+							sal_Int32 nCount =  pAccGroupShape->getAccessibleChildCount();
+							for( sal_Int32 i = 0; i < nCount; i++ )
+							{
+								uno::Reference<XAccessible> xAccShape = pAccGroupShape->getAccessibleChild(i);
+								if (xAccShape.is())
+								{
+									::accessibility::AccessibleShape* pChildAccShape =  static_cast< ::accessibility::AccessibleShape* >(xAccShape.get());
+									uno::Reference< drawing::XShape > xChildShape = pChildAccShape->GetXShape();
+									if (xChildShape == xMarkedXShape)
+									{
+			                			pChildAccShape->SetState(AccessibleStateType::FOCUSED);
+									}
+									else
+									{
+										pChildAccShape->ResetState(AccessibleStateType::FOCUSED);
+									}
+								}
+							}
+						}
+					}			
+				}
+			}
+		}
+	}
+	if (vecSelectedShapeAdd.size() >= 10 )
+	{
+		AccessibleEventObject aEvent;
+		aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_WITHIN;
+		aEvent.Source = uno::Reference< XAccessible >(mpAccessibleDocument);
+		mpAccessibleDocument->CommitChange(aEvent);
+	}
+	else
+	{
+		SortedShapes::iterator vi = vecSelectedShapeAdd.begin();
+		for (; vi != vecSelectedShapeAdd.end() ; ++vi )
+		{
+			AccessibleEventObject aEvent;
+			if (bHasSelect)
+			{
+				aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_ADD;
+			}
+			else
+			{
+				aEvent.EventId = AccessibleEventId::SELECTION_CHANGED;
+			}
+			aEvent.Source = uno::Reference< XAccessible >(mpAccessibleDocument);
+			uno::Reference< XAccessible > xChild( (*vi)->pAccShape);
+			aEvent.NewValue <<= xChild;
+			mpAccessibleDocument->CommitChange(aEvent);
+		}
+	}
+	SortedShapes::iterator vi = vecSelectedShapeRemove.begin();
+	for (; vi != vecSelectedShapeRemove.end() ; ++vi )
+	{
+		AccessibleEventObject aEvent;
+		aEvent.EventId =  AccessibleEventId::SELECTION_CHANGED_REMOVE;		
+		aEvent.Source = uno::Reference< XAccessible >(mpAccessibleDocument);
+		uno::Reference< XAccessible > xChild( (*vi)->pAccShape);
+		aEvent.NewValue <<= xChild;
+		mpAccessibleDocument->CommitChange(aEvent);
+	}
+//-----IAccessibility2 Implementation 2009
     std::for_each(aShapesList.begin(), aShapesList.end(), Destroy());
 
     return bResult;
@@ -1357,12 +1559,32 @@ void ScAccessibleDocument::Notify( SfxBr
 		const ScAccGridWinFocusGotHint& rRef = (const ScAccGridWinFocusGotHint&)rHint;
 		if (rRef.GetNewGridWin() == meSplitPos)
         {
+//IAccessibility2 Implementation 2009-----
+			uno::Reference<XAccessible> xAccessible;
+			if (mpChildrenShapes)
+			{
+				sal_Bool bTabMarked(IsTableSelected());				
+				xAccessible = mpChildrenShapes->GetSelected(0, bTabMarked);				
+			}
+			if( xAccessible.is() )
+			{				
+				uno::Any aNewValue;
+				aNewValue<<=AccessibleStateType::FOCUSED;
+				static_cast< ::accessibility::AccessibleShape* >(xAccessible.get())->
+					CommitChange(AccessibleEventId::STATE_CHANGED,
+								aNewValue,
+								uno::Any() );
+			}
+			else
+			{
             if (mxTempAcc.is() && mpTempAccEdit)
                 mpTempAccEdit->GotFocus();
             else if (mpAccessibleSpreadsheet)
                 mpAccessibleSpreadsheet->GotFocus();
             else
                 CommitFocusGained();
+			}            
+//-----IAccessibility2 Implementation 2009
         }
 	}
 	else if (rHint.ISA( SfxSimpleHint ))
@@ -1381,11 +1603,18 @@ void ScAccessibleDocument::Notify( SfxBr
             {
                 mpChildrenShapes = new ScChildrenShapes( this, mpViewShell, meSplitPos );
             }
-
+//IAccessibility2 Implementation 2009-----
+			//Invoke Init() to rebuild the mpChildrenShapes variable
+			this->Init();
+//-----IAccessibility2 Implementation 2009
 			AccessibleEventObject aEvent;
 			aEvent.EventId = AccessibleEventId::INVALIDATE_ALL_CHILDREN;
 			aEvent.Source = uno::Reference< XAccessibleContext >(this);
 			CommitChange(aEvent); // all childs changed
+//IAccessibility2 Implementation 2009-----
+			if (mpAccessibleSpreadsheet)
+				mpAccessibleSpreadsheet->FireFirstCellFocus();
+//-----IAccessibility2 Implementation 2009
 		}
         else if (rRef.GetId() == SC_HINT_ACC_MAKEDRAWLAYER)
         {
@@ -1396,19 +1625,25 @@ void ScAccessibleDocument::Notify( SfxBr
         {
             if (mpViewShell && mpViewShell->GetViewData()->HasEditView(meSplitPos))
             {
-                mpTempAccEdit = new ScAccessibleEditObject(this, mpViewShell->GetViewData()->GetEditView(meSplitPos),
-                    mpViewShell->GetWindowByPos(meSplitPos), GetCurrentCellName(),
-                    rtl::OUString(String(ScResId(STR_ACC_EDITLINE_DESCR))), CellInEditMode);
-                uno::Reference<XAccessible> xAcc = mpTempAccEdit;
-
-                AddChild(xAcc, sal_True);
-
-                if (mpAccessibleSpreadsheet)
-                    mpAccessibleSpreadsheet->LostFocus();
-                else
-                    CommitFocusLost();
+				//IAccessibility2 Implementation 2009------
+				EditEngine* pEditEng = mpViewShell->GetViewData()->GetEditView(meSplitPos)->GetEditEngine();
+				if (pEditEng && pEditEng->GetUpdateMode())
+				{
+					mpTempAccEdit = new ScAccessibleEditObject(this, mpViewShell->GetViewData()->GetEditView(meSplitPos),
+						mpViewShell->GetWindowByPos(meSplitPos), GetCurrentCellName(),
+						rtl::OUString(String(ScResId(STR_ACC_EDITLINE_DESCR))), CellInEditMode);
+					uno::Reference<XAccessible> xAcc = mpTempAccEdit;
+
+					AddChild(xAcc, sal_True);
+
+					if (mpAccessibleSpreadsheet)
+						mpAccessibleSpreadsheet->LostFocus();
+					else
+						CommitFocusLost();
 
-                mpTempAccEdit->GotFocus();
+					mpTempAccEdit->GotFocus();
+				}
+				//------IAccessibility2 Implementation 2009
             }
         }
         else if (rRef.GetId() == SC_HINT_ACC_LEAVEEDITMODE)
@@ -1420,10 +1655,15 @@ void ScAccessibleDocument::Notify( SfxBr
 
                 mpTempAccEdit = NULL;
                 RemoveChild(mxTempAcc, sal_True);
-
-                if (mpAccessibleSpreadsheet)
+//IAccessibility2 Implementation 2009-----
+                //if (mpAccessibleSpreadsheet)
+                if (mpAccessibleSpreadsheet && mpViewShell->IsActive())
+//-----IAccessibility2 Implementation 2009
                     mpAccessibleSpreadsheet->GotFocus();
-                else
+//IAccessibility2 Implementation 2009-----
+                //else
+                else if( mpViewShell->IsActive())
+//-----IAccessibility2 Implementation 2009
                     CommitFocusGained();
             }
         }
@@ -1484,6 +1724,12 @@ void SAL_CALL ScAccessibleDocument::sele
 
 		CommitChange(aEvent);
 	}
+//IAccessibility2 Implementation 2009-----
+    if(mpChildrenShapes )
+	{
+		mpChildrenShapes->SelectionChanged();
+	}
+//-----IAccessibility2 Implementation 2009
 }
 
 	//=====  XInterface  =====================================================
@@ -1491,6 +1737,15 @@ void SAL_CALL ScAccessibleDocument::sele
 uno::Any SAL_CALL ScAccessibleDocument::queryInterface( uno::Type const & rType )
 	throw (uno::RuntimeException)
 {
+//IAccessibility2 Implementation 2009-----
+	uno::Any aAnyTmp;
+	if(rType == ::getCppuType((com::sun::star::uno::Reference<XAccessibleGetAccFlowTo> *)NULL) )
+       {
+	     com::sun::star::uno::Reference<XAccessibleGetAccFlowTo> AccFromXShape = this;
+            aAnyTmp <<= AccFromXShape;
+	     return aAnyTmp;
+       }
+//-----IAccessibility2 Implementation 2009
 	uno::Any aAny (ScAccessibleDocumentImpl::queryInterface(rType));
 	return aAny.hasValue() ? aAny : ScAccessibleContextBase::queryInterface(rType);
 }
@@ -1642,6 +1897,37 @@ uno::Reference<XAccessibleStateSet> SAL_
 	return pStateSet;
 }
 
+//IAccessibility2 Implementation 2009-----
+::rtl::OUString SAL_CALL
+    ScAccessibleDocument::getAccessibleName(void)
+    throw (::com::sun::star::uno::RuntimeException)
+{
+	rtl::OUString sName = String(ScResId(STR_ACC_DOC_SPREADSHEET));
+	ScDocument* pScDoc = GetDocument();
+	if ( pScDoc )
+	{
+		rtl::OUString sFileName = pScDoc->getDocAccTitle();
+		if ( !sFileName.getLength() )
+		{
+			SfxObjectShell* pObjSh = pScDoc->GetDocumentShell();
+			if ( pObjSh )
+			{
+				sFileName = pObjSh->GetTitle( SFX_TITLE_APINAME );
+			}
+		}
+		rtl::OUString sReadOnly;
+		if (pScDoc->getDocReadOnly())
+		{
+			sReadOnly = String(ScResId(STR_ACC_DOC_SPREADSHEET_READONLY));
+		}
+		if ( sFileName.getLength() )
+		{
+			sName = sFileName + sReadOnly + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" - ")) + sName;
+		}
+	}
+	return sName;
+}
+//-----IAccessibility2 Implementation 2009
 	///=====  XAccessibleSelection  ===========================================
 
 void SAL_CALL
@@ -2114,3 +2400,202 @@ rtl::OUString ScAccessibleDocument::GetC
 {
     return rtl::OUString();
 }
+//IAccessibility2 Implementation 2009-----
+ScDocument *ScAccessibleDocument::GetDocument() const
+{
+	return mpViewShell ? mpViewShell->GetViewData()->GetDocument() : NULL;  
+}
+ScAddress   ScAccessibleDocument::GetCurCellAddress() const
+{ 
+	return mpViewShell ? mpViewShell->GetViewData()->GetCurPos() :ScAddress(); 
+}
+uno::Any SAL_CALL ScAccessibleDocument::getExtendedAttributes() 
+		throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException) 
+{
+	
+	uno::Any anyAtrribute;
+	
+	rtl::OUString sName;
+	rtl::OUString sValue;
+	sal_uInt16 sheetIndex;
+	String sSheetName;
+	sheetIndex = getVisibleTable();
+	if(GetDocument()==NULL)
+		return anyAtrribute;
+	GetDocument()->GetName(sheetIndex,sSheetName);
+	sName = rtl::OUString::createFromAscii("page-name:");
+	sValue = sName + sSheetName ;
+	sName = rtl::OUString::createFromAscii(";page-number:");
+	sValue += sName;
+	sValue += String::CreateFromInt32(sheetIndex+1) ;
+	sName = rtl::OUString::createFromAscii(";total-pages:");
+	sValue += sName;
+	sValue += String::CreateFromInt32(GetDocument()->GetTableCount());
+	sValue +=  rtl::OUString::createFromAscii(";");
+	anyAtrribute <<= sValue;
+	return anyAtrribute;
+}
+com::sun::star::uno::Sequence< com::sun::star::uno::Any > ScAccessibleDocument::GetScAccFlowToSequence()
+{
+	if ( getAccessibleChildCount() )
+	{
+		uno::Reference < XAccessible > xSCTableAcc = getAccessibleChild( 0 ); // table
+		if ( xSCTableAcc.is() )
+		{		
+			uno::Reference < XAccessibleSelection > xAccSelection( xSCTableAcc, uno::UNO_QUERY );
+			sal_Int32 nSelCount = xAccSelection->getSelectedAccessibleChildCount();
+			if( nSelCount )
+			{
+				uno::Reference < XAccessible > xSel = xAccSelection->getSelectedAccessibleChild( 0 ); // selected cell
+				if ( xSel.is() )
+				{
+					uno::Reference < XAccessibleContext > xSelContext( xSel->getAccessibleContext() );
+					if ( xSelContext.is() )
+					{										
+						if ( xSelContext->getAccessibleRole() == AccessibleRole::TABLE_CELL )
+						{
+							sal_Int32 nParaCount = 0;
+							uno::Sequence <uno::Any> aSequence(nSelCount);
+							for ( sal_Int32 i = 0; i < nSelCount; i++ )
+							{
+								xSel = xAccSelection->getSelectedAccessibleChild( i )	;
+								if ( xSel.is() )
+								{
+									xSelContext = xSel->getAccessibleContext();
+									if ( xSelContext.is() )
+									{
+										if ( xSelContext->getAccessibleRole() == AccessibleRole::TABLE_CELL )
+										{
+											aSequence[nParaCount] = uno::makeAny( xSel );
+											nParaCount++;
+										}
+									}
+								}
+							}
+							return aSequence;
+						}
+					}
+				}
+			}									
+		}
+	}
+	uno::Sequence <uno::Any> aEmpty;
+	return aEmpty;
+}
+::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >
+		SAL_CALL ScAccessibleDocument::get_AccFlowTo(const ::com::sun::star::uno::Any& rAny, sal_Int32 nType)
+		throw ( ::com::sun::star::uno::RuntimeException )
+{
+	const sal_Int32 SPELLCHECKFLOWTO = 1;
+	const sal_Int32 FINDREPLACEFLOWTO = 2;
+	if ( nType == SPELLCHECKFLOWTO )
+	{
+		uno::Reference< ::com::sun::star::drawing::XShape > xShape;
+		rAny >>= xShape;
+		if ( xShape.is() )
+		{
+			uno::Reference < XAccessible > xAcc = mpChildrenShapes->GetAccessibleCaption(xShape);
+			uno::Reference < XAccessibleSelection > xAccSelection( xAcc, uno::UNO_QUERY );
+			if ( xAccSelection.is() )
+			{
+				if ( xAccSelection->getSelectedAccessibleChildCount() ) 
+				{
+					uno::Reference < XAccessible > xSel = xAccSelection->getSelectedAccessibleChild( 0 );
+					if ( xSel.is() )
+					{
+						uno::Reference < XAccessibleContext > xSelContext( xSel->getAccessibleContext() );
+						if ( xSelContext.is() )
+						{
+							//if in sw we find the selected paragraph here
+							if ( xSelContext->getAccessibleRole() == AccessibleRole::PARAGRAPH )
+							{
+								uno::Sequence<uno::Any> aRet( 1 );
+								aRet[0] = uno::makeAny( xSel );
+								return aRet;
+							}
+						}
+					}
+				}
+			}
+		}
+		else
+		{
+			if ( getSelectedAccessibleChildCount() ) 
+			{
+				uno::Reference < XAccessible > xSel = getSelectedAccessibleChild( 0 );
+				if ( xSel.is() )
+				{
+					uno::Reference < XAccessibleContext > xSelContext( xSel->getAccessibleContext() );
+					if ( xSelContext.is() )
+					{
+						uno::Reference < XAccessibleSelection > xAccChildSelection( xSel, uno::UNO_QUERY );
+						if ( xAccChildSelection.is() )
+						{
+							if ( xAccChildSelection->getSelectedAccessibleChildCount() )
+							{
+								uno::Reference < XAccessible > xChildSel = xAccChildSelection->getSelectedAccessibleChild( 0 );
+								if ( xChildSel.is() )
+								{
+									uno::Reference < ::com::sun::star::accessibility::XAccessibleContext > xChildSelContext( xChildSel->getAccessibleContext() );
+									if ( xChildSelContext.is() &&
+										xChildSelContext->getAccessibleRole() == ::com::sun::star::accessibility::AccessibleRole::PARAGRAPH )
+									{
+										uno::Sequence<uno::Any> aRet( 1 );
+										aRet[0] = uno::makeAny( xChildSel );
+										return aRet;	
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	else if ( nType == FINDREPLACEFLOWTO )
+	{
+		sal_Bool bSuccess;
+		rAny >>= bSuccess;
+		if ( bSuccess )
+		{
+			uno::Sequence< uno::Any> aSeq = GetScAccFlowToSequence();
+			if ( aSeq.getLength() )
+			{
+				return aSeq;
+			}
+			else if( mpAccessibleSpreadsheet )
+			{
+				uno::Reference < XAccessible > xFindCellAcc = mpAccessibleSpreadsheet->GetActiveCell();
+				// add xFindCellAcc to the return the Sequence
+				uno::Sequence< uno::Any> aSeq2(1);
+				aSeq2[0] = uno::makeAny( xFindCellAcc );
+				return aSeq2;
+			}
+		}
+	}
+	uno::Sequence< uno::Any> aEmpty;
+	return aEmpty;
+}
+void ScAccessibleDocument::SwitchViewFireFocus()
+{
+	if (mpAccessibleSpreadsheet)
+	{
+		mpAccessibleSpreadsheet->FireFirstCellFocus();
+	}
+}
+
+sal_Int32 SAL_CALL ScAccessibleDocument::getForeground(  )
+        throw (uno::RuntimeException)
+{
+    return COL_BLACK;
+}
+
+sal_Int32 SAL_CALL ScAccessibleDocument::getBackground(  )
+        throw (uno::RuntimeException)
+{
+	ScUnoGuard aGuard;
+    IsObjectValid();
+    return SC_MOD()->GetColorConfig().GetColorValue( ::svtools::DOCCOLOR ).nColor;
+}
+//-----IAccessibility2 Implementation 2009
+

Modified: openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocumentBase.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocumentBase.cxx?rev=1526782&r1=1526781&r2=1526782&view=diff
==============================================================================
--- openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocumentBase.cxx (original)
+++ openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocumentBase.cxx Fri Sep 27 03:21:44 2013
@@ -45,3 +45,10 @@ ScAccessibleDocumentBase::ScAccessibleDo
 ScAccessibleDocumentBase::~ScAccessibleDocumentBase(void)
 {
 }
+//IAccessibility2 Implementation 2009-----
+void ScAccessibleDocumentBase::SwitchViewFireFocus()
+{
+	CommitFocusGained();
+}
+//-----IAccessibility2 Implementation 2009
+

Modified: openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocumentPagePreview.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocumentPagePreview.cxx?rev=1526782&r1=1526781&r2=1526782&view=diff
==============================================================================
--- openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocumentPagePreview.cxx (original)
+++ openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleDocumentPagePreview.cxx Fri Sep 27 03:21:44 2013
@@ -1899,6 +1899,35 @@ ScShapeChilds* ScAccessibleDocumentPageP
     return mpShapeChilds;
 }
 
+//IAccessibility2 Implementation 2009-----
+::rtl::OUString ScAccessibleDocumentPagePreview::getAccessibleName(void)
+throw (::com::sun::star::uno::RuntimeException)
+{
+	rtl::OUString sName = String(ScResId(STR_ACC_DOC_SPREADSHEET));
+	ScDocument* pScDoc = mpViewShell->GetDocument();
+	if ( pScDoc )
+	{
+		rtl::OUString sFileName = pScDoc->getDocAccTitle();
+		if ( !sFileName.getLength() )
+		{
+			SfxObjectShell* pObjSh = pScDoc->GetDocumentShell();
+			if ( pObjSh )
+			{
+				sFileName = pObjSh->GetTitle( SFX_TITLE_APINAME );
+			}
+		}
+		if ( sFileName.getLength() )
+		{
+			sName = sFileName + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" - ")) + sName;
+			sName += String(ScResId(STR_ACC_DOC_PREVIEW_SUFFIX));
+			
+		}
+	}
+
+	return sName;
+}
+//-----IAccessibility2 Implementation 2009=======
+
 //UNUSED2009-05 uno::Reference < XAccessible > ScAccessibleDocumentPagePreview::GetCurrentAccessibleTable()
 //UNUSED2009-05 {
 //UNUSED2009-05     if (!mpTable)

Modified: openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleEditObject.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleEditObject.cxx?rev=1526782&r1=1526781&r2=1526782&view=diff
==============================================================================
--- openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleEditObject.cxx (original)
+++ openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleEditObject.cxx Fri Sep 27 03:21:44 2013
@@ -44,10 +44,23 @@
 #include <rtl/uuid.h>
 #include <tools/debug.hxx>
 #include <svx/AccessibleTextHelper.hxx>
+//IAccessibility2 Implementation 2009-----
+#include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
+#include <com/sun/star/sheet/XSpreadsheet.hpp>
 #include <editeng/editview.hxx>
 #include <editeng/editeng.hxx>
 #include <svx/svdmodel.hxx>
+#include <sfx2/objsh.hxx>
 
+#include "unonames.hxx"
+#include "document.hxx"
+#include "AccessibleDocument.hxx"
+#include <com/sun/star/accessibility/AccessibleRelationType.hpp>
+#include <unotools/accessiblerelationsethelper.hxx>
+#include <com/sun/star/accessibility/XAccessibleText.hpp>
+using ::com::sun::star::lang::IndexOutOfBoundsException;
+using ::com::sun::star::uno::RuntimeException;
+//-----IAccessibility2 Implementation 2009
 using namespace	::com::sun::star;
 using namespace	::com::sun::star::accessibility;
 
@@ -68,6 +81,23 @@ ScAccessibleEditObject::ScAccessibleEdit
     CreateTextHelper();
     SetName(rName);
     SetDescription(rDescription);
+//IAccessibility2 Implementation 2009-----
+	if( meObjectType == CellInEditMode)
+	{
+		const ScAccessibleDocument *pAccDoc = const_cast<ScAccessibleDocument*>(static_cast<ScAccessibleDocument*>(rxParent.get())) ;
+		if (pAccDoc)
+		{
+			m_pScDoc = pAccDoc->GetDocument();
+			m_curCellAddress =pAccDoc->GetCurCellAddress();
+		}
+		else
+		{
+			m_pScDoc=NULL;
+		}
+	}
+	else
+		m_pScDoc=NULL;
+//-----IAccessibility2 Implementation 2009
 }
 
 ScAccessibleEditObject::~ScAccessibleEditObject()
@@ -106,6 +136,33 @@ void ScAccessibleEditObject::GotFocus()
         mpTextHelper->SetFocus(sal_True);
 }
 
+//IAccessibility2 Implementation 2009-----
+//=====  XInterface  ==========================================================
+
+com::sun::star::uno::Any SAL_CALL
+    ScAccessibleEditObject::queryInterface (const com::sun::star::uno::Type & rType)
+    throw (::com::sun::star::uno::RuntimeException)
+{
+    ::com::sun::star::uno::Any aReturn = ScAccessibleContextBase::queryInterface (rType);
+    if ( ! aReturn.hasValue())
+        aReturn = ::cppu::queryInterface (rType,
+            static_cast< ::com::sun::star::accessibility::XAccessibleSelection* >(this)
+            );
+    return aReturn;
+}
+void SAL_CALL
+    ScAccessibleEditObject::acquire (void)
+    throw ()
+{
+    ScAccessibleContextBase::acquire ();
+}
+void SAL_CALL
+    ScAccessibleEditObject::release (void)
+    throw ()
+{
+    ScAccessibleContextBase::release ();
+}
+//-----IAccessibility2 Implementation 2009
 	//=====  XAccessibleComponent  ============================================
 
 uno::Reference< XAccessible > SAL_CALL ScAccessibleEditObject::getAccessibleAtPoint(
@@ -351,4 +408,153 @@ void ScAccessibleEditObject::CreateTextH
         }
     }
 }
+//IAccessibility2 Implementation 2009-----
+sal_Int32 SAL_CALL ScAccessibleEditObject::getForeground(  ) 
+        throw (::com::sun::star::uno::RuntimeException)
+{
+	return GetFgBgColor(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_CCOLOR)));
+}
+
+sal_Int32 SAL_CALL ScAccessibleEditObject::getBackground(  ) 
+        throw (::com::sun::star::uno::RuntimeException)
+{
+	return GetFgBgColor(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_CELLBACK)));
+}
+sal_Int32 ScAccessibleEditObject::GetFgBgColor( const rtl::OUString &strPropColor)
+{
+    ScUnoGuard aGuard;
+    sal_Int32 nColor(0);
+    if (m_pScDoc)
+    {
+        SfxObjectShell* pObjSh = m_pScDoc->GetDocumentShell();
+        if ( pObjSh )
+        {
+            uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY );
+            if ( xSpreadDoc.is() )
+            {
+                uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets();
+                uno::Reference<container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY );
+                if ( xIndex.is() )
+                {
+                    uno::Any aTable = xIndex->getByIndex(m_curCellAddress.Tab());
+                    uno::Reference<sheet::XSpreadsheet> xTable;
+                    if (aTable>>=xTable)
+                    {
+                        uno::Reference<table::XCell> xCell = xTable->getCellByPosition(m_curCellAddress.Col(), m_curCellAddress.Row());
+                        if (xCell.is())
+                        {
+                            uno::Reference<beans::XPropertySet> xCellProps(xCell, uno::UNO_QUERY);
+                            if (xCellProps.is())
+                            {
+                                uno::Any aAny = xCellProps->getPropertyValue(strPropColor);
+                                aAny >>= nColor;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return nColor;
+}
+//=====  XAccessibleSelection  ============================================
+//--------------------------------------------------------------------------------
+void SAL_CALL ScAccessibleEditObject::selectAccessibleChild( sal_Int32 ) 
+throw ( IndexOutOfBoundsException, RuntimeException )
+{
+}
+//----------------------------------------------------------------------------------
+sal_Bool SAL_CALL ScAccessibleEditObject::isAccessibleChildSelected( sal_Int32 nChildIndex ) 
+throw ( IndexOutOfBoundsException, 
+	   RuntimeException )
+{	
+	uno::Reference<XAccessible> xAcc = getAccessibleChild( nChildIndex );
+	uno::Reference<XAccessibleContext> xContext;
+	if( xAcc.is() )
+		xContext = xAcc->getAccessibleContext();
+	if( xContext.is() )
+	{
+		if( xContext->getAccessibleRole() == AccessibleRole::PARAGRAPH )
+		{
+			uno::Reference< ::com::sun::star::accessibility::XAccessibleText >
+				xText(xAcc, uno::UNO_QUERY);
+			if( xText.is() )
+			{				
+				if( xText->getSelectionStart() >= 0 ) return sal_True;
+			}		
+		}
+	}	
+	return sal_False;	
+}
+//---------------------------------------------------------------------
+void SAL_CALL ScAccessibleEditObject::clearAccessibleSelection(  ) 
+throw ( RuntimeException )
+{
+}
+//-------------------------------------------------------------------------
+void SAL_CALL ScAccessibleEditObject::selectAllAccessibleChildren(  ) 
+throw ( RuntimeException )
+{
+}
+//----------------------------------------------------------------------------
+sal_Int32 SAL_CALL ScAccessibleEditObject::getSelectedAccessibleChildCount() 
+throw ( RuntimeException )
+{	
+	sal_Int32 nCount = 0;
+	sal_Int32 TotalCount = getAccessibleChildCount();
+	for( sal_Int32 i = 0; i < TotalCount; i++ )
+		if( isAccessibleChildSelected(i) ) nCount++;
+	return nCount;
+}
+//--------------------------------------------------------------------------------------
+uno::Reference<XAccessible> SAL_CALL ScAccessibleEditObject::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) 
+throw ( IndexOutOfBoundsException, RuntimeException)
+{
+	if ( nSelectedChildIndex > getSelectedAccessibleChildCount() )
+		throw IndexOutOfBoundsException();
+	sal_Int32 i1, i2;
+	for( i1 = 0, i2 = 0; i1 < getAccessibleChildCount(); i1++ )
+		if( isAccessibleChildSelected(i1) )
+		{
+			if( i2 == nSelectedChildIndex )
+				return getAccessibleChild( i1 );
+			i2++;
+		}
+	return uno::Reference<XAccessible>();
+}
+//----------------------------------------------------------------------------------
+void SAL_CALL ScAccessibleEditObject::deselectAccessibleChild( 
+															sal_Int32 ) 
+															throw ( IndexOutOfBoundsException, 
+															RuntimeException )
+{    
+}
+uno::Reference< XAccessibleRelationSet > ScAccessibleEditObject::getAccessibleRelationSet(  )
+    throw (uno::RuntimeException)
+{
+       ScUnoGuard aGuard;
+	Window* pWindow = mpWindow;
+	utl::AccessibleRelationSetHelper* rRelationSet = new utl::AccessibleRelationSetHelper;
+	uno::Reference< XAccessibleRelationSet > rSet = rRelationSet;
+	if ( pWindow )
+	{
+		Window *pLabeledBy = pWindow->GetAccessibleRelationLabeledBy();
+		if ( pLabeledBy && pLabeledBy != pWindow )
+		{
+			uno::Sequence< uno::Reference< uno::XInterface > > aSequence(1);
+			aSequence[0] = pLabeledBy->GetAccessible();
+			rRelationSet->AddRelation( AccessibleRelation( AccessibleRelationType::LABELED_BY, aSequence ) );
+		}
+		Window* pMemberOf = pWindow->GetAccessibleRelationMemberOf();
+		if ( pMemberOf && pMemberOf != pWindow )
+		{
+			uno::Sequence< uno::Reference< uno::XInterface > > aSequence(1);
+			aSequence[0] = pMemberOf->GetAccessible();
+			rRelationSet->AddRelation( AccessibleRelation( AccessibleRelationType::MEMBER_OF, aSequence ) );
+		}
+		return rSet;
+	}
+	return uno::Reference< XAccessibleRelationSet >();
+}
+//-----IAccessibility2 Implementation 2009
 

Modified: openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx?rev=1526782&r1=1526781&r2=1526782&view=diff
==============================================================================
--- openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx (original)
+++ openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx Fri Sep 27 03:21:44 2013
@@ -50,12 +50,212 @@
 #include <tools/debug.hxx>
 #include <tools/gen.hxx>
 #include <svtools/colorcfg.hxx>
-
+//IAccessibility2 Implementation 2009-----
+#include "scresid.hxx"
+#include "sc.hrc"
+//-----IAccessibility2 Implementation 2009
 #include <algorithm>
 
 using namespace	::com::sun::star;
 using namespace	::com::sun::star::accessibility;
 
+//IAccessibility2 Implementation 2009-----
+bool CompMinCol(const std::pair<sal_uInt16,sal_uInt16> & pc1,const std::pair<sal_uInt16,sal_uInt16>  &pc2)
+{
+    return pc1.first < pc2.first;
+}
+ScMyAddress ScAccessibleSpreadsheet::CalcScAddressFromRangeList(ScRangeList *pMarkedRanges,sal_Int32 nSelectedChildIndex)
+{
+    if (pMarkedRanges->Count() <= 1)
+    {
+        ScRange* pRange = pMarkedRanges->First();
+        if (pRange)
+        {
+			// MT IA2: Not used.
+            // const int nRowNum = pRange->aEnd.Row() - pRange->aStart.Row() + 1;
+            const int nColNum = pRange->aEnd.Col() - pRange->aStart.Col() + 1;
+            const int nCurCol = nSelectedChildIndex % nColNum;
+            const int nCurRow = (nSelectedChildIndex - nCurCol)/nColNum;
+            return ScMyAddress(static_cast<SCCOL>(pRange->aStart.Col() + nCurCol), pRange->aStart.Row() + nCurRow, maActiveCell.Tab());
+        }
+    }
+    else
+    {
+        sal_Int32 nMinRow = MAXROW;
+        sal_Int32 nMaxRow = 0;
+        m_vecTempRange.clear();
+        ScRange* pRange = pMarkedRanges->First();
+        while (pRange)
+        {
+            if (pRange->aStart.Tab() != pRange->aEnd.Tab())
+            {
+                if ((maActiveCell.Tab() >= pRange->aStart.Tab()) ||
+                    maActiveCell.Tab() <= pRange->aEnd.Tab())
+                {
+                    m_vecTempRange.push_back(pRange);
+                    nMinRow = std::min(pRange->aStart.Row(),nMinRow);
+                    nMaxRow = std::max(pRange->aEnd.Row(),nMaxRow);
+                }
+                else
+                    DBG_ERROR("Range of wrong table");
+            }
+            else if(pRange->aStart.Tab() == maActiveCell.Tab())
+            {
+                m_vecTempRange.push_back(pRange);
+                nMinRow = std::min(pRange->aStart.Row(),nMinRow);
+                nMaxRow = std::max(pRange->aEnd.Row(),nMaxRow);
+            }
+            else
+                DBG_ERROR("Range of wrong table");
+            pRange = pMarkedRanges->Next();
+        }
+        int nCurrentIndex = 0 ;
+        for(sal_Int32 row = nMinRow ; row <= nMaxRow ; ++row)
+        {
+            m_vecTempCol.clear();
+            {
+                VEC_RANGE::const_iterator vi = m_vecTempRange.begin();
+                for (; vi < m_vecTempRange.end(); ++vi)
+                {
+                    ScRange *p = *vi;
+                    if ( row >= p->aStart.Row() && row <= p->aEnd.Row())
+                    {
+                        m_vecTempCol.push_back(std::make_pair(p->aStart.Col(),p->aEnd.Col()));
+                    }
+                }
+            }
+            std::sort(m_vecTempCol.begin(),m_vecTempCol.end(),CompMinCol);
+            {
+                VEC_COL::const_iterator vic = m_vecTempCol.begin();
+                for(; vic != m_vecTempCol.end(); ++vic)
+                {
+                    const PAIR_COL &pariCol = *vic;
+                    sal_uInt16 nCol = pariCol.second - pariCol.first + 1;
+                    if (nCol + nCurrentIndex > nSelectedChildIndex)
+                    {
+                        return ScMyAddress(static_cast<SCCOL>(pariCol.first + nSelectedChildIndex - nCurrentIndex), row, maActiveCell.Tab());
+                    }
+                    nCurrentIndex += nCol;
+                }
+            }
+        }
+    }
+    return ScMyAddress(0,0,maActiveCell.Tab());
+}
+sal_Bool ScAccessibleSpreadsheet::CalcScRangeDifferenceMax(ScRange *pSrc,ScRange *pDest,int nMax,VEC_MYADDR &vecRet,int &nSize)
+{
+    //Src Must be :Src > Dest
+    if (pDest->In(*pSrc))
+    {//Here is Src In Dest,Src <= Dest
+        return sal_False;
+    }
+	if (!pDest->Intersects(*pSrc))
+	{
+		int nCellCount = sal_uInt32(pDest->aEnd.Col() - pDest->aStart.Col() + 1)
+			* sal_uInt32(pDest->aEnd.Row() - pDest->aStart.Row() + 1)
+			* sal_uInt32(pDest->aEnd.Tab() - pDest->aStart.Tab() + 1);
+		if (nCellCount + nSize > nMax)
+		{
+			return sal_True;
+		}
+		else if(nCellCount > 0)
+		{
+			nCellCount +=nSize;
+			for (sal_Int32 row = pDest->aStart.Row(); row <=  pDest->aEnd.Row();++row)
+			{
+				for (sal_uInt16 col = pDest->aStart.Col(); col <=  pDest->aEnd.Col();++col)
+				{
+					vecRet.push_back(ScMyAddress(col,row,pDest->aStart.Tab()));
+				}
+			}
+		}
+		return sal_False;
+	}
+	sal_Int32 nMinRow = pSrc->aStart.Row(); 
+	sal_Int32 nMaxRow = pSrc->aEnd.Row();
+	for (; nMinRow <= nMaxRow ; ++nMinRow,--nMaxRow)
+	{
+		for (sal_uInt16 col = pSrc->aStart.Col(); col <=  pSrc->aEnd.Col();++col)
+		{
+			if (nSize > nMax)
+			{
+				return sal_True;
+			}
+			ScMyAddress cell(col,nMinRow,pSrc->aStart.Tab());
+			if(!pDest->In(cell))
+			{//In Src ,Not In Dest
+				vecRet.push_back(cell);
+				++nSize;
+			}
+		}
+		if (nMinRow != nMaxRow)
+		{
+			for (sal_uInt16 col = pSrc->aStart.Col(); col <=  pSrc->aEnd.Col();++col)
+			{
+				if (nSize > nMax)
+				{
+					return sal_True;
+				}
+				ScMyAddress cell(col,nMaxRow,pSrc->aStart.Tab());
+				if(!pDest->In(cell))
+				{//In Src ,Not In Dest
+					vecRet.push_back(cell);
+					++nSize;
+				}
+			}
+		}
+	}
+    return sal_False;
+}
+//In Src , Not in Dest
+sal_Bool ScAccessibleSpreadsheet::CalcScRangeListDifferenceMax(ScRangeList *pSrc,ScRangeList *pDest,int nMax,VEC_MYADDR &vecRet)
+{
+    if (pSrc == NULL || pDest == NULL)
+    {
+        return sal_False;
+    }
+    int nSize =0;
+    if (pDest->GetCellCount() == 0)//if the Dest Rang List is empty
+    {
+        if (pSrc->GetCellCount() > sal_uInt32(nMax))//if the Src Cell count is greater then  nMax
+        {
+            return sal_True;
+        }
+        //now the cell count is less then nMax
+        vecRet.reserve(10);
+        ScRange* pRange = pSrc->First();
+        while (pRange)
+        {
+            for (sal_Int32 row = pRange->aStart.Row(); row <=  pRange->aEnd.Row();++row)
+            {
+                for (sal_uInt16 col = pRange->aStart.Col(); col <=  pRange->aEnd.Col();++col)
+                {
+                    vecRet.push_back(ScMyAddress(col,row,pRange->aStart.Tab()));
+                }
+            }
+            pRange = pSrc->Next();
+        }
+        return sal_False;
+    }
+    //the Dest Rang List is not empty
+    vecRet.reserve(10);
+    ScRange* pRange = pSrc->First();
+    while (pRange)
+    {
+        ScRange* pRangeDest = pDest->First();
+        while (pRangeDest)
+        {   
+            if (CalcScRangeDifferenceMax(pRange,pRangeDest,nMax,vecRet,nSize))
+            {
+                return sal_True;
+            }
+            pRangeDest = pDest->Next();
+        }
+        pRange = pSrc->Next();
+    }
+    return sal_False;
+}
+//-----IAccessibility2 Implementation 2009
 //=====  internal  ============================================================
 
 ScAccessibleSpreadsheet::ScAccessibleSpreadsheet(
@@ -66,7 +266,13 @@ ScAccessibleSpreadsheet::ScAccessibleSpr
 	:
 	ScAccessibleTableBase (pAccDoc, GetDocument(pViewShell),
         ScRange(ScAddress(0, 0, nTab),ScAddress(MAXCOL, MAXROW, nTab))),
-    mbIsSpreadsheet( sal_True )
+    mbIsSpreadsheet( sal_True ),
+//IAccessibility2 Implementation 2009-----
+	m_bFormulaMode(sal_False),
+	m_bFormulaLastMode(sal_False),
+	m_pAccFormulaCell(NULL),
+	m_nMinX(0),m_nMaxX(0),m_nMinY(0),m_nMaxY(0)
+//-----IAccessibility2 Implementation 2009
 {
     ConstructScAccessibleSpreadsheet( pAccDoc, pViewShell, nTab, eSplitPos );
 }
@@ -83,8 +289,10 @@ ScAccessibleSpreadsheet::~ScAccessibleSp
 {
 	if (mpMarkedRanges)
 		delete mpMarkedRanges;
-	if (mpSortedMarkedCells)
-		delete mpSortedMarkedCells;
+//IAccessibility2 Implementation 2009-----
+	//if (mpSortedMarkedCells)
+	//	delete mpSortedMarkedCells;
+//-----IAccessibility2 Implementation 2009
 	if (mpViewShell)
 		mpViewShell->RemoveAccessibilityObject(*this);
 }
@@ -118,7 +326,14 @@ void ScAccessibleSpreadsheet::ConstructS
         mpAccCell = GetAccessibleCellAt(maActiveCell.Row(), maActiveCell.Col());
         mpAccCell->acquire();
         mpAccCell->Init();
-    }
+		//IAccessibility2 Implementation 2009-----
+		ScDocument* pScDoc= GetDocument(mpViewShell);
+		if (pScDoc)
+		{
+			pScDoc->GetName( maActiveCell.Tab(), m_strOldTabName );
+		}
+		//-----IAccessibility2 Implementation 2009
+    }	
 }
 
 void SAL_CALL ScAccessibleSpreadsheet::disposing()
@@ -140,11 +355,18 @@ void SAL_CALL ScAccessibleSpreadsheet::d
 
 void ScAccessibleSpreadsheet::CompleteSelectionChanged(sal_Bool bNewState)
 {
+//IAccessibility2 Implementation 2009-----
+	if (IsFormulaMode())
+	{
+		return ;
+	}
+//-----IAccessibility2 Implementation 2009
 	if (mpMarkedRanges)
 		DELETEZ(mpMarkedRanges);
-	if (mpSortedMarkedCells)
-		DELETEZ(mpSortedMarkedCells);
-
+//IAccessibility2 Implementation 2009-----
+	//if (mpSortedMarkedCells)
+	//	DELETEZ(mpSortedMarkedCells);
+//-----IAccessibility2 Implementation 2009
 	mbHasSelection = bNewState;
 
     AccessibleEventObject aEvent;
@@ -173,12 +395,46 @@ void ScAccessibleSpreadsheet::LostFocus(
 
 void ScAccessibleSpreadsheet::GotFocus()
 {
-    CommitFocusGained();
-
+//IAccessibility2 Implementation 2009-----
+    //CommitFocusGained();
+//-----IAccessibility2 Implementation 2009
 	AccessibleEventObject aEvent;
 	aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
 	aEvent.Source = uno::Reference< XAccessibleContext >(this);
-    uno::Reference< XAccessible > xNew = mpAccCell;
+//IAccessibility2 Implementation 2009-----
+    //uno::Reference< XAccessible > xNew = mpAccCell;
+    uno::Reference< XAccessible > xNew;
+	if (IsFormulaMode())
+	{
+		if (!m_pAccFormulaCell || !m_bFormulaLastMode)
+		{
+			ScAddress aFormulaAddr;
+			if(!GetFormulaCurrentFocusCell(aFormulaAddr))
+			{
+				return;
+			}
+			m_pAccFormulaCell = GetAccessibleCellAt(aFormulaAddr.Row(),aFormulaAddr.Col());
+
+			m_pAccFormulaCell->acquire();
+			m_pAccFormulaCell->Init();
+
+
+		}
+	    xNew = m_pAccFormulaCell;
+	}
+	else
+	{
+		if(mpAccCell->GetCellAddress() == maActiveCell)
+		{
+			xNew = mpAccCell;
+		}
+		else
+		{
+			CommitFocusCell(maActiveCell);
+			return ;
+		}		
+	}
+//-----IAccessibility2 Implementation 2009
 	aEvent.NewValue <<= xNew;
 
 	CommitChange(aEvent);
@@ -210,58 +466,247 @@ void ScAccessibleSpreadsheet::Notify( Sf
 	{
 		const SfxSimpleHint& rRef = (const SfxSimpleHint&)rHint;
 		// only notify if child exist, otherwise it is not necessary
+//IAccessibility2 Implementation 2009-----		
+		//if ((rRef.GetId() == SC_HINT_ACC_CURSORCHANGED))
+		//{
+		//	if (mpViewShell)
+		//	{
+		//		ScAddress aNewCell = mpViewShell->GetViewData()->GetCurPos();
+		//		sal_Bool bNewMarked(mpViewShell->GetViewData()->GetMarkData().GetTableSelect(aNewCell.Tab()) &&
+		//			(mpViewShell->GetViewData()->GetMarkData().IsMarked() ||
+		//			mpViewShell->GetViewData()->GetMarkData().IsMultiMarked()));
+		//		sal_Bool bNewCellSelected(isAccessibleSelected(aNewCell.Row(), aNewCell.Col()));
+		//		if ((bNewMarked != mbHasSelection) ||
+		//			(!bNewCellSelected && bNewMarked) ||
+		//			(bNewCellSelected && mbHasSelection))
+		//		{
+		//			if (mpMarkedRanges)
+		//				DELETEZ(mpMarkedRanges);
+		//			if (mpSortedMarkedCells)
+		//				DELETEZ(mpSortedMarkedCells);
+		//			AccessibleEventObject aEvent;
+		//			aEvent.EventId = AccessibleEventId::SELECTION_CHANGED;
+		//			aEvent.Source = uno::Reference< XAccessibleContext >(this);
+
+		//			mbHasSelection = bNewMarked;
+
+		//			CommitChange(aEvent);
+		//		}
+
+  //              // active descendant changed event (new cell selected)
+  //              bool bFireActiveDescChanged = (aNewCell != maActiveCell) &&
+  //                  (aNewCell.Tab() == maActiveCell.Tab()) && IsFocused();
+
+  //              /*  Remember old active cell and set new active cell.
+  //                  #i82409# always update the class members mpAccCell and
+  //                  maActiveCell, even if the sheet is not focused, e.g. when
+  //                  using the name box in the toolbar. */
+  //              uno::Reference< XAccessible > xOld = mpAccCell;
+  //              mpAccCell->release();
+  //              mpAccCell = GetAccessibleCellAt(aNewCell.Row(), aNewCell.Col());
+  //              mpAccCell->acquire();
+  //              mpAccCell->Init();
+  //              uno::Reference< XAccessible > xNew = mpAccCell;
+  //              maActiveCell = aNewCell;
+
+  //              // #i14108# fire event only if sheet is focused
+  //              if( bFireActiveDescChanged )
+  //              {
+  //                  AccessibleEventObject aEvent;
+  //                  aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
+  //                  aEvent.Source = uno::Reference< XAccessibleContext >(this);
+  //                  aEvent.OldValue <<= xOld;
+  //                  aEvent.NewValue <<= xNew;
+		//			CommitChange(aEvent);
+  //              }
+		//	}
+		//}
+		//else if ((rRef.GetId() == SC_HINT_DATACHANGED))
+		//{
+		//	if (!mbDelIns)
+		//		CommitTableModelChange(maRange.aStart.Row(), maRange.aStart.Col(), maRange.aEnd.Row(), maRange.aEnd.Col(), AccessibleTableModelChangeType::UPDATE);
+		//	else
+		//		mbDelIns = sal_False;
+		//}
 		if ((rRef.GetId() == SC_HINT_ACC_CURSORCHANGED))
 		{
 			if (mpViewShell)
 			{
-				ScAddress aNewCell = mpViewShell->GetViewData()->GetCurPos();
-				sal_Bool bNewMarked(mpViewShell->GetViewData()->GetMarkData().GetTableSelect(aNewCell.Tab()) &&
-					(mpViewShell->GetViewData()->GetMarkData().IsMarked() ||
-					mpViewShell->GetViewData()->GetMarkData().IsMultiMarked()));
-				sal_Bool bNewCellSelected(isAccessibleSelected(aNewCell.Row(), aNewCell.Col()));
-				if ((bNewMarked != mbHasSelection) ||
-					(!bNewCellSelected && bNewMarked) ||
-					(bNewCellSelected && mbHasSelection))
-				{
-					if (mpMarkedRanges)
-						DELETEZ(mpMarkedRanges);
-					if (mpSortedMarkedCells)
-						DELETEZ(mpSortedMarkedCells);
-					AccessibleEventObject aEvent;
-					aEvent.EventId = AccessibleEventId::SELECTION_CHANGED;
-					aEvent.Source = uno::Reference< XAccessibleContext >(this);
+				ScViewData *pViewData = mpViewShell->GetViewData();
 
-					mbHasSelection = bNewMarked;
+				m_bFormulaMode = pViewData->IsRefMode() || SC_MOD()->IsFormulaMode();
+				if ( m_bFormulaMode )
+				{
+					NotifyRefMode();
+					m_bFormulaLastMode = true;
+					return ;
+				}
+				if (m_bFormulaLastMode)
+				{//Last Notify Mode  Is Formula Mode.
+					m_vecFormulaLastMyAddr.clear();
+					RemoveFormulaSelection(sal_True);
+					if(m_pAccFormulaCell)
+					{
+						m_pAccFormulaCell->release();
+						m_pAccFormulaCell =NULL;
+					}
+					//Remove All Selection
+				}
+				m_bFormulaLastMode = m_bFormulaMode;
 
+				AccessibleEventObject aEvent;
+				aEvent.Source = uno::Reference< XAccessible >(this);
+				ScAddress aNewCell = pViewData->GetCurPos();
+				if(aNewCell.Tab() != maActiveCell.Tab())
+				{
+					aEvent.EventId = AccessibleEventId::PAGE_CHANGED;
+					ScAccessibleDocument *pAccDoc = 
+						static_cast<ScAccessibleDocument*>(getAccessibleParent().get());
+					if(pAccDoc)
+					{
+						pAccDoc->CommitChange(aEvent);
+					}
+				}
+				sal_Bool bNewPosCell = (aNewCell != maActiveCell);
+				sal_Bool bNewPosCellFocus=sal_False;
+				if ( bNewPosCell && IsFocused() && aNewCell.Tab() == maActiveCell.Tab() )
+				{//single Focus
+					bNewPosCellFocus=sal_True;
+				}
+				ScMarkData &refScMarkData = pViewData->GetMarkData();
+				// MT IA2: Not used
+				// int nSelCount = refScMarkData.GetSelectCount();
+				sal_Bool bIsMark =refScMarkData.IsMarked();
+				sal_Bool bIsMultMark = refScMarkData.IsMultiMarked();
+				sal_Bool bNewMarked = refScMarkData.GetTableSelect(aNewCell.Tab()) && ( bIsMark || bIsMultMark );				
+//				sal_Bool bNewCellSelected = isAccessibleSelected(aNewCell.Row(), aNewCell.Col());
+				sal_uInt16 nTab = pViewData->GetTabNo();
+				ScRange aMarkRange;
+				refScMarkData.GetMarkArea(aMarkRange);
+				aEvent.OldValue <<= ::com::sun::star::uno::Any();
+				//Mark All
+				if ( !bNewPosCellFocus && 
+					(bNewMarked || bIsMark || bIsMultMark ) &&
+					aMarkRange == ScRange( 0,0,nTab, MAXCOL,MAXROW,nTab ) )
+				{
+					aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_WITHIN;
+					aEvent.NewValue <<= ::com::sun::star::uno::Any();
 					CommitChange(aEvent);
+					return ;
+				}					
+				if (!mpMarkedRanges)
+				{
+					mpMarkedRanges = new ScRangeList();
+				}				
+				refScMarkData.FillRangeListWithMarks(mpMarkedRanges, sal_True);
+	
+				//For Whole Col Row  
+				sal_Bool bWholeRow = ::labs(aMarkRange.aStart.Row() - aMarkRange.aEnd.Row()) == MAXROW ;
+				sal_Bool bWholeCol = ::abs(aMarkRange.aStart.Col() - aMarkRange.aEnd.Col()) == MAXCOL ;
+				if ((bNewMarked || bIsMark || bIsMultMark ) && (bWholeCol || bWholeRow))
+				{
+					if ( aMarkRange != m_aLastWithInMarkRange )
+					{
+						RemoveSelection(refScMarkData);						
+						if(bNewPosCell)
+						{
+							CommitFocusCell(aNewCell);
+						}
+						sal_Bool bLastIsWholeColRow = 
+						::labs(m_aLastWithInMarkRange.aStart.Row() - m_aLastWithInMarkRange.aEnd.Row()) == MAXROW && bWholeRow || 
+						::abs(m_aLastWithInMarkRange.aStart.Col() - m_aLastWithInMarkRange.aEnd.Col()) == MAXCOL && bWholeCol ;
+						sal_Bool bSelSmaller= 
+							bLastIsWholeColRow && 
+							!aMarkRange.In(m_aLastWithInMarkRange) && 
+							aMarkRange.Intersects(m_aLastWithInMarkRange);
+						if( !bSelSmaller )
+						{
+							aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_WITHIN;
+							aEvent.NewValue <<= ::com::sun::star::uno::Any();
+							CommitChange(aEvent);
+						}
+						m_aLastWithInMarkRange = aMarkRange;
+					}
+					return ;
 				}
-
-                // active descendant changed event (new cell selected)
-                bool bFireActiveDescChanged = (aNewCell != maActiveCell) &&
-                    (aNewCell.Tab() == maActiveCell.Tab()) && IsFocused();
-
-                /*  Remember old active cell and set new active cell.
-                    #i82409# always update the class members mpAccCell and
-                    maActiveCell, even if the sheet is not focused, e.g. when
-                    using the name box in the toolbar. */
-                uno::Reference< XAccessible > xOld = mpAccCell;
-                mpAccCell->release();
-                mpAccCell = GetAccessibleCellAt(aNewCell.Row(), aNewCell.Col());
-                mpAccCell->acquire();
-                mpAccCell->Init();
-                uno::Reference< XAccessible > xNew = mpAccCell;
-                maActiveCell = aNewCell;
-
-                // #i14108# fire event only if sheet is focused
-                if( bFireActiveDescChanged )
-                {
-                    AccessibleEventObject aEvent;
-                    aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
-                    aEvent.Source = uno::Reference< XAccessibleContext >(this);
-                    aEvent.OldValue <<= xOld;
-                    aEvent.NewValue <<= xNew;
+				m_aLastWithInMarkRange = aMarkRange;
+				int nNewMarkCount = mpMarkedRanges->GetCellCount();
+				sal_Bool bSendSingle= (0 == nNewMarkCount) && bNewPosCell;
+				if (bSendSingle)
+				{
+					RemoveSelection(refScMarkData);
+					if(bNewPosCellFocus)
+					{
+						CommitFocusCell(aNewCell);
+					}
+					uno::Reference< XAccessible > xChild ;
+					if (bNewPosCellFocus)
+					{
+						xChild = mpAccCell;
+					}
+					else
+					{
+						xChild = getAccessibleCellAt(aNewCell.Row(),aNewCell.Col());
+						
+						maActiveCell = aNewCell;
+						aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED_NOFOCUS;							
+						aEvent.NewValue <<= xChild;
+						aEvent.OldValue <<= uno::Reference< XAccessible >();
+						CommitChange(aEvent);
+					}
+					aEvent.EventId = AccessibleEventId::SELECTION_CHANGED;
+					aEvent.NewValue <<= xChild;
 					CommitChange(aEvent);
-                }
+					OSL_ASSERT(m_mapSelectionSend.count(aNewCell) == 0 );
+					m_mapSelectionSend.insert(MAP_ADDR_XACC::value_type(aNewCell,xChild));
+					
+				}
+				else
+				{
+					ScRange aDelRange;
+					sal_Bool bIsDel = pViewData->GetDelMark( aDelRange );
+					if ( (!bIsDel || (bIsDel && aMarkRange != aDelRange)) && 
+						bNewMarked && 
+						nNewMarkCount > 0 && 
+						!IsSameMarkCell() )
+					{
+						RemoveSelection(refScMarkData);						
+						if(bNewPosCellFocus)
+						{
+							CommitFocusCell(aNewCell);
+						}
+						VEC_MYADDR vecNew;
+                        if(CalcScRangeListDifferenceMax(mpMarkedRanges,&m_LastMarkedRanges,10,vecNew))
+						{
+							aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_WITHIN;
+							aEvent.NewValue <<= ::com::sun::star::uno::Any();
+							CommitChange(aEvent);
+						}
+						else
+						{
+							VEC_MYADDR::iterator viAddr = vecNew.begin(); 
+							for(; viAddr < vecNew.end() ; ++viAddr )
+							{
+								uno::Reference< XAccessible > xChild = getAccessibleCellAt(viAddr->Row(),viAddr->Col());
+								if (!(bNewPosCellFocus && *viAddr == aNewCell) )
+								{
+									aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED_NOFOCUS;							
+									aEvent.NewValue <<= xChild;							
+									CommitChange(aEvent);
+								}
+								aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_ADD;
+								aEvent.NewValue <<= xChild;
+								CommitChange(aEvent);
+								m_mapSelectionSend.insert(MAP_ADDR_XACC::value_type(*viAddr,xChild));
+							}
+						}	
+					}
+				}
+				if (bNewPosCellFocus && maActiveCell != aNewCell)
+				{
+					CommitFocusCell(aNewCell);
+				}
+                m_LastMarkedRanges = *mpMarkedRanges;		
 			}
 		}
 		else if ((rRef.GetId() == SC_HINT_DATACHANGED))
@@ -270,7 +715,41 @@ void ScAccessibleSpreadsheet::Notify( Sf
 				CommitTableModelChange(maRange.aStart.Row(), maRange.aStart.Col(), maRange.aEnd.Row(), maRange.aEnd.Col(), AccessibleTableModelChangeType::UPDATE);
 			else
 				mbDelIns = sal_False;
-		}
+            ScViewData *pViewData = mpViewShell->GetViewData();
+            ScAddress aNewCell = pViewData->GetCurPos();
+            if( maActiveCell == aNewCell)
+            {
+                ScDocument* pScDoc= GetDocument(mpViewShell);
+                if (pScDoc)
+                {
+                    String valStr;
+                    pScDoc->GetString(aNewCell.Col(),aNewCell.Row(),aNewCell.Tab(), valStr);
+                    if(m_strCurCellValue != valStr)
+                    {
+                        AccessibleEventObject aEvent;
+                        aEvent.EventId = AccessibleEventId::VALUE_CHANGED;
+                        mpAccCell->CommitChange(aEvent);
+                        m_strCurCellValue=valStr;
+                    }
+					String tabName;
+					pScDoc->GetName( maActiveCell.Tab(), tabName );
+					if( m_strOldTabName != tabName )
+					{
+						AccessibleEventObject aEvent;
+                        aEvent.EventId = AccessibleEventId::NAME_CHANGED;
+						String sOldName(ScResId(STR_ACC_TABLE_NAME));
+						sOldName.SearchAndReplaceAscii("%1", m_strOldTabName);
+						aEvent.OldValue <<= ::rtl::OUString( sOldName );
+						String sNewName(ScResId(STR_ACC_TABLE_NAME));
+						sNewName.SearchAndReplaceAscii("%1", tabName);
+						aEvent.NewValue <<= ::rtl::OUString( sNewName );
+						CommitChange( aEvent );
+						m_strOldTabName = tabName;
+					}
+                }
+            }
+        }
+//-----IAccessibility2 Implementation 2009
         // no longer needed, because the document calls the VisAreaChanged method
 /*		else if (rRef.GetId() == SC_HINT_ACC_VISAREACHANGED)
 		{
@@ -371,7 +850,62 @@ void ScAccessibleSpreadsheet::Notify( Sf
 
 	ScAccessibleTableBase::Notify(rBC, rHint);
 }
-
+//IAccessibility2 Implementation 2009-----
+void ScAccessibleSpreadsheet::RemoveSelection(ScMarkData &refScMarkData)
+{
+	AccessibleEventObject aEvent;
+	aEvent.Source = uno::Reference< XAccessible >(this);
+	aEvent.OldValue <<= ::com::sun::star::uno::Any();
+	MAP_ADDR_XACC::iterator miRemove = m_mapSelectionSend.begin();
+	for(;  miRemove != m_mapSelectionSend.end() ;)
+	{
+		if (refScMarkData.IsCellMarked(miRemove->first.Col(),miRemove->first.Row(),sal_True) ||
+			refScMarkData.IsCellMarked(miRemove->first.Col(),miRemove->first.Row(),sal_False) )
+		{
+			++miRemove;
+			continue;
+		}
+		aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_REMOVE;
+		aEvent.NewValue <<= miRemove->second;							
+		CommitChange(aEvent);
+		MAP_ADDR_XACC::iterator miNext = miRemove;
+		++miNext;
+		m_mapSelectionSend.erase(miRemove);
+		miRemove = miNext;
+	}
+}
+void ScAccessibleSpreadsheet::CommitFocusCell(const ScAddress &aNewCell)
+{
+	OSL_ASSERT(!IsFormulaMode());
+	if(IsFormulaMode())
+	{
+		return ;
+	}
+	AccessibleEventObject aEvent;
+	aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
+	aEvent.Source = uno::Reference< XAccessible >(this);
+	uno::Reference< XAccessible > xOld = mpAccCell;
+	mpAccCell->release();
+	mpAccCell=NULL;
+	aEvent.OldValue <<= xOld;
+	mpAccCell = GetAccessibleCellAt(aNewCell.Row(), aNewCell.Col());
+	mpAccCell->acquire();
+	mpAccCell->Init();
+	uno::Reference< XAccessible > xNew = mpAccCell;
+	aEvent.NewValue <<= xNew;
+	maActiveCell = aNewCell;
+    ScDocument* pScDoc= GetDocument(mpViewShell);
+    if (pScDoc)
+    {
+        pScDoc->GetString(maActiveCell.Col(),maActiveCell.Row(),maActiveCell.Tab(), m_strCurCellValue);
+    }
+	CommitChange(aEvent);
+}
+sal_Bool ScAccessibleSpreadsheet::IsSameMarkCell()
+{
+    return m_LastMarkedRanges == *mpMarkedRanges;
+}
+//-----IAccessibility2 Implementation 2009
 	//=====  XAccessibleTable  ================================================
 
 uno::Reference< XAccessibleTable > SAL_CALL ScAccessibleSpreadsheet::getAccessibleRowHeaders(  )
@@ -418,6 +952,12 @@ uno::Sequence< sal_Int32 > SAL_CALL ScAc
 	ScUnoGuard aGuard;
     IsObjectValid();
 	uno::Sequence<sal_Int32> aSequence;
+//IAccessibility2 Implementation 2009-----
+	if (IsFormulaMode())
+	{
+		return aSequence;
+	}
+//-----IAccessibility2 Implementation 2009
 	if (mpViewShell && mpViewShell->GetViewData())
 	{
 		aSequence.realloc(maRange.aEnd.Row() - maRange.aStart.Row() + 1);
@@ -445,6 +985,12 @@ uno::Sequence< sal_Int32 > SAL_CALL ScAc
 	ScUnoGuard aGuard;
     IsObjectValid();
 	uno::Sequence<sal_Int32> aSequence;
+//IAccessibility2 Implementation 2009-----
+	if (IsFormulaMode())
+	{
+		return aSequence;
+	}
+//-----IAccessibility2 Implementation 2009
 	if (mpViewShell && mpViewShell->GetViewData())
 	{
 		aSequence.realloc(maRange.aEnd.Col() - maRange.aStart.Col() + 1);
@@ -471,6 +1017,12 @@ sal_Bool SAL_CALL ScAccessibleSpreadshee
 {
 	ScUnoGuard aGuard;
     IsObjectValid();
+//IAccessibility2 Implementation 2009-----
+	if (IsFormulaMode())
+	{
+		return sal_False;
+	}
+//-----IAccessibility2 Implementation 2009
 
     if ((nRow > (maRange.aEnd.Row() - maRange.aStart.Row())) || (nRow < 0))
         throw lang::IndexOutOfBoundsException();
@@ -490,6 +1042,12 @@ sal_Bool SAL_CALL ScAccessibleSpreadshee
 	ScUnoGuard aGuard;
     IsObjectValid();
 
+//IAccessibility2 Implementation 2009-----
+	if (IsFormulaMode())
+	{
+		return sal_False;
+	}
+//-----IAccessibility2 Implementation 2009
     if ((nColumn > (maRange.aEnd.Col() - maRange.aStart.Col())) || (nColumn < 0))
         throw lang::IndexOutOfBoundsException();
 
@@ -505,6 +1063,20 @@ sal_Bool SAL_CALL ScAccessibleSpreadshee
 ScAccessibleCell* ScAccessibleSpreadsheet::GetAccessibleCellAt(sal_Int32 nRow, sal_Int32 nColumn)
 {
     ScAccessibleCell* pAccessibleCell = NULL;
+//IAccessibility2 Implementation 2009-----
+	if (IsFormulaMode())
+	{
+		ScAddress aCellAddress(static_cast<SCCOL>(nColumn), nRow, mpViewShell->GetViewData()->GetTabNo());
+		if ((aCellAddress == m_aFormulaActiveCell) && m_pAccFormulaCell)
+		{
+			pAccessibleCell = m_pAccFormulaCell;
+		}
+		else
+			pAccessibleCell = new ScAccessibleCell(this, mpViewShell, aCellAddress, GetAccessibleIndexFormula(nRow, nColumn), meSplitPos, mpAccDoc);
+	}
+	else
+	{
+//-----IAccessibility2 Implementation 2009
 	ScAddress aCellAddress(static_cast<SCCOL>(maRange.aStart.Col() + nColumn),
 		static_cast<SCROW>(maRange.aStart.Row() + nRow), maRange.aStart.Tab());
     if ((aCellAddress == maActiveCell) && mpAccCell)
@@ -513,6 +1085,7 @@ ScAccessibleCell* ScAccessibleSpreadshee
     }
     else
 	    pAccessibleCell = new ScAccessibleCell(this, mpViewShell, aCellAddress, getAccessibleIndex(nRow, nColumn), meSplitPos, mpAccDoc);
+	}
 
     return pAccessibleCell;
 }
@@ -522,12 +1095,16 @@ uno::Reference< XAccessible > SAL_CALL S
 {
 	ScUnoGuard aGuard;
     IsObjectValid();
+//IAccessibility2 Implementation 2009-----
+	if (!IsFormulaMode())
+	{
     if (nRow > (maRange.aEnd.Row() - maRange.aStart.Row()) ||
         nRow < 0 ||
         nColumn > (maRange.aEnd.Col() - maRange.aStart.Col()) ||
         nColumn < 0)
         throw lang::IndexOutOfBoundsException();
-
+	}
+//-----IAccessibility2 Implementation 2009
     uno::Reference<XAccessible> xAccessible;
     ScAccessibleCell* pAccessibleCell = GetAccessibleCellAt(nRow, nColumn);
     xAccessible = pAccessibleCell;
@@ -541,6 +1118,13 @@ sal_Bool SAL_CALL ScAccessibleSpreadshee
 	ScUnoGuard aGuard;
     IsObjectValid();
 
+//IAccessibility2 Implementation 2009-----
+	if (IsFormulaMode())
+	{
+		ScAddress addr(static_cast<SCCOL>(nColumn), nRow, 0);
+		return IsScAddrFormulaSel(addr);
+	}
+//-----IAccessibility2 Implementation 2009
     if ((nColumn > (maRange.aEnd.Col() - maRange.aStart.Col())) || (nColumn < 0) ||
         (nRow > (maRange.aEnd.Row() - maRange.aStart.Row())) || (nRow < 0))
         throw lang::IndexOutOfBoundsException();
@@ -570,7 +1154,15 @@ uno::Reference< XAccessible > SAL_CALL S
 		    SCsCOL nX;
             SCsROW nY;
 		    mpViewShell->GetViewData()->GetPosFromPixel( rPoint.X, rPoint.Y, meSplitPos, nX, nY);
+//IAccessibility2 Implementation 2009-----
+			try{
 		    xAccessible = getAccessibleCellAt(nY, nX);
+			}
+			catch( ::com::sun::star::lang::IndexOutOfBoundsException e)
+			{
+				return NULL;
+			}
+//-----IAccessibility2 Implementation 2009
 	    }
     }
 	return xAccessible;
@@ -678,6 +1270,9 @@ void SAL_CALL
     IsObjectValid();
 	if (mpViewShell)
 	{
+//IAccessibility2 Implementation 2009-----
+		if (!IsFormulaMode())
+//-----IAccessibility2 Implementation 2009
 		mpViewShell->Unmark();
 	}
 }
@@ -690,6 +1285,17 @@ void SAL_CALL
     IsObjectValid();
 	if (mpViewShell)
 	{
+//IAccessibility2 Implementation 2009-----
+		if (IsFormulaMode())
+		{
+			ScViewData *pViewData = mpViewShell->GetViewData();		
+			mpViewShell->InitRefMode( 0, 0, pViewData->GetTabNo(), SC_REFTYPE_REF );
+			pViewData->SetRefStart(0,0,pViewData->GetTabNo());
+			pViewData->SetRefStart(MAXCOL,MAXROW,pViewData->GetTabNo());
+			mpViewShell->UpdateRef(MAXCOL, MAXROW, pViewData->GetTabNo());
+		}
+		else
+//-----IAccessibility2 Implementation 2009
 		mpViewShell->SelectAll();
 	}
 }
@@ -703,16 +1309,27 @@ sal_Int32 SAL_CALL
 	sal_Int32 nResult(0);
 	if (mpViewShell)
 	{
+//IAccessibility2 Implementation 2009-----
+		if (IsFormulaMode())
+		{
+			nResult =  GetRowAll() * GetColAll() ;
+		}
+		else
+		{		
+//-----IAccessibility2 Implementation 2009
 		if (!mpMarkedRanges)
 		{
 			mpMarkedRanges = new ScRangeList();
             ScMarkData aMarkData(mpViewShell->GetViewData()->GetMarkData());
-            aMarkData.MarkToMulti();
+//IAccessibility2 Implementation 2009-----
+            //aMarkData.MarkToMulti();
+//-----IAccessibility2 Implementation 2009
 			aMarkData.FillRangeListWithMarks(mpMarkedRanges, sal_False);
 		}
 		// is possible, because there shouldn't be overlapped ranges in it
 		if (mpMarkedRanges)
 			nResult = mpMarkedRanges->GetCellCount();
+		}
 	}
 	return nResult;
 }
@@ -724,6 +1341,17 @@ uno::Reference<XAccessible > SAL_CALL
 	ScUnoGuard aGuard;
     IsObjectValid();
 	uno::Reference < XAccessible > xAccessible;
+//IAccessibility2 Implementation 2009-----
+	if (IsFormulaMode())
+	{
+		if(CheckChildIndex(nSelectedChildIndex))
+		{
+			ScAddress addr = GetChildIndexAddress(nSelectedChildIndex);
+			xAccessible = getAccessibleCellAt(addr.Row(), addr.Col());
+		}
+		return xAccessible;
+	}
+//-----IAccessibility2 Implementation 2009
 	if (mpViewShell)
 	{
 		if (!mpMarkedRanges)
@@ -733,16 +1361,27 @@ uno::Reference<XAccessible > SAL_CALL
 		}
 		if (mpMarkedRanges)
 		{
-			if (!mpSortedMarkedCells)
-				CreateSortedMarkedCells();
-			if (mpSortedMarkedCells)
-			{
-				if ((nSelectedChildIndex < 0) ||
-					(mpSortedMarkedCells->size() <= static_cast<sal_uInt32>(nSelectedChildIndex)))
-					throw lang::IndexOutOfBoundsException();
-				else
-					xAccessible = getAccessibleCellAt((*mpSortedMarkedCells)[nSelectedChildIndex].Row(), (*mpSortedMarkedCells)[nSelectedChildIndex].Col());
+//IAccessibility2 Implementation 2009-----
+			//if (!mpSortedMarkedCells)
+			//	CreateSortedMarkedCells();
+			//if (mpSortedMarkedCells)
+			//{
+			//	if ((nSelectedChildIndex < 0) ||
+			//		(mpSortedMarkedCells->size() <= static_cast<sal_uInt32>(nSelectedChildIndex)))
+			//		throw lang::IndexOutOfBoundsException();
+			//	else
+			//		xAccessible = getAccessibleCellAt((*mpSortedMarkedCells)[nSelectedChildIndex].Row(), (*mpSortedMarkedCells)[nSelectedChildIndex].Col());
+			if ((nSelectedChildIndex < 0) ||
+					(mpMarkedRanges->GetCellCount() <= static_cast<sal_uInt32>(nSelectedChildIndex)))
+			{
+				throw lang::IndexOutOfBoundsException();
 			}
+			ScMyAddress addr = CalcScAddressFromRangeList(mpMarkedRanges,nSelectedChildIndex);
+			if( m_mapSelectionSend.find(addr) != m_mapSelectionSend.end() )
+				xAccessible = m_mapSelectionSend[addr];
+			else			
+				xAccessible = getAccessibleCellAt(addr.Row(), addr.Col());
+//-----IAccessibility2 Implementation 2009
 		}
 	}
 	return xAccessible;
@@ -763,6 +1402,18 @@ void SAL_CALL
 		sal_Int32 nCol(getAccessibleColumn(nChildIndex));
 		sal_Int32 nRow(getAccessibleRow(nChildIndex));
 
+//IAccessibility2 Implementation 2009-----
+		if (IsFormulaMode())
+		{
+			if(IsScAddrFormulaSel(
+				ScAddress(static_cast<SCCOL>(nCol), nRow,mpViewShell->GetViewData()->GetTabNo()))
+				)
+			{
+				SelectCell(nRow, nCol, sal_True);
+			}
+			return ;
+		}
+//-----IAccessibility2 Implementation 2009
 		if (mpViewShell->GetViewData()->GetMarkData().IsCellMarked(static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow)))
 			SelectCell(nRow, nCol, sal_True);
 	}
@@ -770,6 +1421,23 @@ void SAL_CALL
 
 void ScAccessibleSpreadsheet::SelectCell(sal_Int32 nRow, sal_Int32 nCol, sal_Bool bDeselect)
 {
+//IAccessibility2 Implementation 2009-----
+	if (IsFormulaMode())
+	{
+		if (bDeselect)
+		{//??
+			return ;
+		}
+		else
+		{
+			ScViewData *pViewData = mpViewShell->GetViewData();
+
+			mpViewShell->InitRefMode( static_cast<SCCOL>(nCol), nRow, pViewData->GetTabNo(), SC_REFTYPE_REF );
+			mpViewShell->UpdateRef(static_cast<SCCOL>(nCol), nRow, pViewData->GetTabNo());
+		}
+		return ;
+	}
+//-----IAccessibility2 Implementation 2009
 	mpViewShell->SetTabNo( maRange.aStart.Tab() );
 
 	mpViewShell->DoneBlockMode( sal_True ); // continue selecting
@@ -777,41 +1445,41 @@ void ScAccessibleSpreadsheet::SelectCell
 
 	mpViewShell->SelectionChanged();
 }
+//IAccessibility2 Implementation 2009-----
+//void ScAccessibleSpreadsheet::CreateSortedMarkedCells()
+//{
+//	mpSortedMarkedCells = new std::vector<ScMyAddress>();
+//	mpSortedMarkedCells->reserve(mpMarkedRanges->GetCellCount());
+//	ScRange* pRange = mpMarkedRanges->First();
+//	while (pRange)
+//	{
+//		if (pRange->aStart.Tab() != pRange->aEnd.Tab())
+//		{
+//			if ((maActiveCell.Tab() >= pRange->aStart.Tab()) ||
+//				maActiveCell.Tab() <= pRange->aEnd.Tab())
+//			{
+//				ScRange aRange(*pRange);
+//				aRange.aStart.SetTab(maActiveCell.Tab());
+//				aRange.aEnd.SetTab(maActiveCell.Tab());
+//				AddMarkedRange(aRange);
+//			}
+//			else
+//			{
+//				DBG_ERROR("Range of wrong table");
+//			}
+//		}
+//		else if(pRange->aStart.Tab() == maActiveCell.Tab())
+//			AddMarkedRange(*pRange);
+//		else
+//		{
+//			DBG_ERROR("Range of wrong table");
+//		}
+//		pRange = mpMarkedRanges->Next();
+//	}
+//	std::sort(mpSortedMarkedCells->begin(), mpSortedMarkedCells->end());
+//}
 
-void ScAccessibleSpreadsheet::CreateSortedMarkedCells()
-{
-	mpSortedMarkedCells = new std::vector<ScMyAddress>();
-	mpSortedMarkedCells->reserve(mpMarkedRanges->GetCellCount());
-	ScRange* pRange = mpMarkedRanges->First();
-	while (pRange)
-	{
-		if (pRange->aStart.Tab() != pRange->aEnd.Tab())
-		{
-			if ((maActiveCell.Tab() >= pRange->aStart.Tab()) ||
-				maActiveCell.Tab() <= pRange->aEnd.Tab())
-			{
-				ScRange aRange(*pRange);
-				aRange.aStart.SetTab(maActiveCell.Tab());
-				aRange.aEnd.SetTab(maActiveCell.Tab());
-				AddMarkedRange(aRange);
-			}
-			else
-			{
-				DBG_ERROR("Range of wrong table");
-			}
-		}
-		else if(pRange->aStart.Tab() == maActiveCell.Tab())
-			AddMarkedRange(*pRange);
-		else
-		{
-			DBG_ERROR("Range of wrong table");
-		}
-		pRange = mpMarkedRanges->Next();
-	}
-	std::sort(mpSortedMarkedCells->begin(), mpSortedMarkedCells->end());
-}
-
-void ScAccessibleSpreadsheet::AddMarkedRange(const ScRange& rRange)
+/*void ScAccessibleSpreadsheet::AddMarkedRange(const ScRange& rRange)
 {
 	for (SCROW nRow = rRange.aStart.Row(); nRow <= rRange.aEnd.Row(); ++nRow)
 	{
@@ -821,7 +1489,8 @@ void ScAccessibleSpreadsheet::AddMarkedR
 			mpSortedMarkedCells->push_back(aCell);
 		}
 	}
-}
+}*/
+//-----IAccessibility2 Implementation 2009
 
 	//=====  XServiceInfo  ====================================================
 
@@ -871,7 +1540,8 @@ void SAL_CALL ScAccessibleSpreadsheet::a
     IsObjectValid();
     ScAccessibleTableBase::addEventListener(xListener);
 
-    if (!mbIsFocusSend)
+//IAccessibility2 Implementation 2009-----
+/*    if (!mbIsFocusSend)
     {
         mbIsFocusSend = sal_True;
         CommitFocusGained();
@@ -883,6 +1553,8 @@ void SAL_CALL ScAccessibleSpreadsheet::a
 
 		CommitChange(aEvent);
     }
+*/
+//-----IAccessibility2 Implementation 2009
 }
 
 	//====  internal  =========================================================
@@ -924,6 +1596,12 @@ sal_Bool ScAccessibleSpreadsheet::IsDefu
 sal_Bool ScAccessibleSpreadsheet::IsEditable(
     const uno::Reference<XAccessibleStateSet>& /* rxParentStates */)
 {
+//IAccessibility2 Implementation 2009-----
+	if (IsFormulaMode())
+	{
+		return sal_False;
+	}
+//-----IAccessibility2 Implementation 2009
 	sal_Bool bProtected(sal_False);
 	if (mpDoc && mpDoc->IsTabProtected(maRange.aStart.Tab()))
 		bProtected = sal_True;
@@ -943,6 +1621,12 @@ sal_Bool ScAccessibleSpreadsheet::IsFocu
 
 sal_Bool ScAccessibleSpreadsheet::IsCompleteSheetSelected()
 {
+//IAccessibility2 Implementation 2009-----
+	if (IsFormulaMode())
+	{
+		return sal_False;
+	}
+//-----IAccessibility2 Implementation 2009
 	sal_Bool bResult(sal_False);
 	if(mpViewShell)
 	{
@@ -993,3 +1677,277 @@ Rectangle ScAccessibleSpreadsheet::GetVi
 	else
 		return Rectangle();
 }
+//IAccessibility2 Implementation 2009-----
+sal_Bool SAL_CALL ScAccessibleSpreadsheet::selectRow( sal_Int32 row ) 
+throw (lang::IndexOutOfBoundsException, uno::RuntimeException) 
+{
+	if (IsFormulaMode())
+	{
+		return sal_False;
+	}
+
+	mpViewShell->SetTabNo( maRange.aStart.Tab() );
+	mpViewShell->DoneBlockMode( sal_True ); // continue selecting
+	mpViewShell->InitBlockMode( 0, row, maRange.aStart.Tab(), sal_False, sal_False, sal_True );
+	mpViewShell->MarkCursor( MAXCOL, row, maRange.aStart.Tab(), sal_False, sal_True );
+	mpViewShell->SelectionChanged();
+	return sal_True;
+}
+
+sal_Bool SAL_CALL ScAccessibleSpreadsheet::selectColumn( sal_Int32 column ) 
+		throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
+{
+	if (IsFormulaMode())
+	{
+		return sal_False;
+	}
+
+	mpViewShell->SetTabNo( maRange.aStart.Tab() );
+	mpViewShell->DoneBlockMode( sal_True ); // continue selecting
+	mpViewShell->InitBlockMode( static_cast<SCCOL>(column), 0, maRange.aStart.Tab(), sal_False, sal_True, sal_False );
+	mpViewShell->MarkCursor( static_cast<SCCOL>(column), MAXROW, maRange.aStart.Tab(), sal_True, sal_False );	
+    mpViewShell->SelectionChanged();
+	return sal_True;
+}
+
+sal_Bool SAL_CALL ScAccessibleSpreadsheet::unselectRow( sal_Int32 row ) 
+		throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
+{	
+	if (IsFormulaMode())
+	{
+		return sal_False;
+	}
+
+	mpViewShell->SetTabNo( maRange.aStart.Tab() );
+	mpViewShell->DoneBlockMode( sal_True ); // continue selecting
+	mpViewShell->InitBlockMode( 0, row, maRange.aStart.Tab(), sal_False, sal_False, sal_True, sal_True );
+	mpViewShell->MarkCursor( MAXCOL, row, maRange.aStart.Tab(), sal_False, sal_True );	
+	mpViewShell->SelectionChanged();
+	mpViewShell->DoneBlockMode( sal_True );
+	return sal_True;
+}
+
+sal_Bool SAL_CALL ScAccessibleSpreadsheet::unselectColumn( sal_Int32 column ) 
+		throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
+{	
+	if (IsFormulaMode())
+	{
+		return sal_False;
+	}
+
+	mpViewShell->SetTabNo( maRange.aStart.Tab() );
+	mpViewShell->DoneBlockMode( sal_True ); // continue selecting
+	mpViewShell->InitBlockMode( static_cast<SCCOL>(column), 0, maRange.aStart.Tab(), sal_False, sal_True, sal_False, sal_True );
+	mpViewShell->MarkCursor( static_cast<SCCOL>(column), MAXROW, maRange.aStart.Tab(), sal_True, sal_False );	
+	mpViewShell->SelectionChanged();		
+	mpViewShell->DoneBlockMode( sal_True );
+	return sal_True;
+}
+
+void ScAccessibleSpreadsheet::FireFirstCellFocus()
+{	
+	if (IsFormulaMode())
+	{
+		return ;
+	}
+	if (mbIsFocusSend)
+	{
+		return ;
+	}
+	mbIsFocusSend = sal_True;
+	AccessibleEventObject aEvent;
+	aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
+	aEvent.Source = uno::Reference< XAccessible >(this);
+	aEvent.NewValue <<= getAccessibleCellAt(maActiveCell.Row(), maActiveCell.Col());
+	CommitChange(aEvent);
+}
+void ScAccessibleSpreadsheet::NotifyRefMode()
+{
+	ScViewData *pViewData = mpViewShell->GetViewData();
+	sal_uInt16 nRefStartX =pViewData->GetRefStartX();
+	sal_Int32 nRefStartY=pViewData->GetRefStartY();
+	sal_uInt16 nRefEndX=pViewData->GetRefEndX(); 
+	sal_Int32 nRefEndY=pViewData->GetRefEndY(); 
+	ScAddress aFormulaAddr;
+	if(!GetFormulaCurrentFocusCell(aFormulaAddr))
+	{
+		return ;
+	}
+	if (m_aFormulaActiveCell != aFormulaAddr)
+	{//New Focus
+		m_nMinX =std::min(nRefStartX,nRefEndX);
+		m_nMaxX =std::max(nRefStartX,nRefEndX);
+		m_nMinY = std::min(nRefStartY,nRefEndY);
+		m_nMaxY = std::max(nRefStartY,nRefEndY);
+		RemoveFormulaSelection();
+		AccessibleEventObject aEvent;
+		aEvent.Source = uno::Reference< XAccessible >(this);
+		aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED;
+		aEvent.Source = uno::Reference< XAccessible >(this);
+		uno::Reference< XAccessible > xOld = m_pAccFormulaCell;
+		aEvent.OldValue <<= xOld;
+		m_pAccFormulaCell = GetAccessibleCellAt(aFormulaAddr.Row(), aFormulaAddr.Col());
+        m_pAccFormulaCell->acquire();
+        m_pAccFormulaCell->Init();
+		uno::Reference< XAccessible > xNew = m_pAccFormulaCell;
+		aEvent.NewValue <<= xNew;	
+		CommitChange(aEvent);
+		if (nRefStartX == nRefEndX && nRefStartY == nRefEndY)
+		{//Selection Single
+			aEvent.EventId = AccessibleEventId::SELECTION_CHANGED;
+			aEvent.NewValue <<= xNew;
+			CommitChange(aEvent);
+			m_mapFormulaSelectionSend.insert(MAP_ADDR_XACC::value_type(aFormulaAddr,xNew));
+			m_vecFormulaLastMyAddr.clear();
+			m_vecFormulaLastMyAddr.push_back(aFormulaAddr);
+		}
+		else
+		{
+			VEC_MYADDR vecCurSel;
+			int nCurSize =  (m_nMaxX - m_nMinX +1)*(m_nMaxY - m_nMinY +1) ;
+			vecCurSel.reserve(nCurSize);
+			for (sal_uInt16 x = m_nMinX ; x <= m_nMaxX ; ++x)
+			{
+				for (sal_Int32 y = m_nMinY ; y <= m_nMaxY ; ++y)
+				{
+					ScMyAddress aAddr(x,y,0);
+					vecCurSel.push_back(aAddr);
+				}
+			}
+			std::sort(vecCurSel.begin(), vecCurSel.end());
+			VEC_MYADDR vecNew;							
+			std::set_difference(vecCurSel.begin(),vecCurSel.end(),
+				m_vecFormulaLastMyAddr.begin(),m_vecFormulaLastMyAddr.end(),						
+				std::back_insert_iterator<VEC_MYADDR>(vecNew));
+			int nNewSize = vecNew.size();
+			if ( nNewSize > 10 )
+			{
+				aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_WITHIN;
+				aEvent.NewValue <<= ::com::sun::star::uno::Any();
+				CommitChange(aEvent);
+			}
+			else
+			{
+				VEC_MYADDR::iterator viAddr = vecNew.begin(); 
+				for(; viAddr != vecNew.end() ; ++viAddr )
+				{
+					uno::Reference< XAccessible > xChild;
+					if (*viAddr == aFormulaAddr)
+					{
+						xChild = m_pAccFormulaCell;
+					}
+					else
+					{
+						xChild = getAccessibleCellAt(viAddr->Row(),viAddr->Col());
+						aEvent.EventId = AccessibleEventId::ACTIVE_DESCENDANT_CHANGED_NOFOCUS;							
+						aEvent.NewValue <<= xChild;							
+						CommitChange(aEvent);
+					}					
+					aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_ADD;
+					aEvent.NewValue <<= xChild;
+					CommitChange(aEvent);
+					m_mapFormulaSelectionSend.insert(MAP_ADDR_XACC::value_type(*viAddr,xChild));
+				}
+			}						
+			m_vecFormulaLastMyAddr.swap(vecCurSel);					
+		}
+	}
+	m_aFormulaActiveCell = aFormulaAddr;
+}
+void ScAccessibleSpreadsheet::RemoveFormulaSelection(sal_Bool bRemoveAll )
+{
+	AccessibleEventObject aEvent;
+	aEvent.Source = uno::Reference< XAccessible >(this);
+	aEvent.OldValue <<= ::com::sun::star::uno::Any();
+	MAP_ADDR_XACC::iterator miRemove = m_mapFormulaSelectionSend.begin();
+	for(;  miRemove != m_mapFormulaSelectionSend.end() ;)
+	{
+		if( !bRemoveAll && IsScAddrFormulaSel(miRemove->first) )
+		{
+			++miRemove;
+			continue;
+		}
+		aEvent.EventId = AccessibleEventId::SELECTION_CHANGED_REMOVE;
+		aEvent.NewValue <<= miRemove->second;							
+		CommitChange(aEvent);
+		MAP_ADDR_XACC::iterator miNext = miRemove;
+		++miNext;
+		m_mapFormulaSelectionSend.erase(miRemove);
+		miRemove = miNext;
+	}	
+}
+sal_Bool ScAccessibleSpreadsheet::IsScAddrFormulaSel(const ScAddress &addr) const
+{
+	if( addr.Col() >= m_nMinX && addr.Col() <= m_nMaxX &&
+		addr.Row() >= m_nMinY && addr.Row() <= m_nMaxY &&
+		addr.Tab() == mpViewShell->GetViewData()->GetTabNo() )
+	{
+		return sal_True;
+	}
+	return sal_False;
+}
+sal_Bool ScAccessibleSpreadsheet::CheckChildIndex(sal_Int32 nIndex) const
+{
+	sal_Int32 nMaxIndex = (m_nMaxX - m_nMinX +1)*(m_nMaxY - m_nMinY +1) -1 ;
+	return nIndex <= nMaxIndex && nIndex >= 0 ;
+}
+ScAddress ScAccessibleSpreadsheet::GetChildIndexAddress(sal_Int32 nIndex) const
+{
+	sal_Int32 nRowAll = GetRowAll();
+	sal_uInt16  nColAll = GetColAll();
+	if (nIndex < 0 || nIndex >=  nRowAll * nColAll )
+	{
+		return ScAddress();
+	}
+	return ScAddress(		
+		static_cast<SCCOL>((nIndex - nIndex % nRowAll) / nRowAll +  + m_nMinX),
+		nIndex % nRowAll + m_nMinY, 
+		mpViewShell->GetViewData()->GetTabNo()
+		);
+}
+sal_Int32 ScAccessibleSpreadsheet::GetAccessibleIndexFormula( sal_Int32 nRow, sal_Int32 nColumn )
+{
+	sal_uInt16 nColRelative = sal_uInt16(nColumn) - GetColAll();
+	sal_Int32 nRowRelative = nRow - GetRowAll();
+	if (nRow < 0 || nColumn < 0  || nRowRelative >= GetRowAll() || nColRelative >= GetColAll() )
+	{
+		return -1;
+	}
+	return GetRowAll() * nRowRelative + nColRelative;
+}
+sal_Bool ScAccessibleSpreadsheet::IsFormulaMode() 
+{ 
+	ScViewData *pViewData = mpViewShell->GetViewData();
+	m_bFormulaMode = pViewData->IsRefMode() || SC_MOD()->IsFormulaMode();
+	return m_bFormulaMode ;
+}
+sal_Bool ScAccessibleSpreadsheet::GetFormulaCurrentFocusCell(ScAddress &addr)
+{
+	ScViewData *pViewData = mpViewShell->GetViewData();
+	sal_uInt16 nRefX=0;
+	sal_Int32 nRefY=0;
+	if(m_bFormulaLastMode)
+	{
+		nRefX=pViewData->GetRefEndX(); 
+		nRefY=pViewData->GetRefEndY(); 
+	}
+	else
+	{
+		nRefX=pViewData->GetRefStartX(); 
+		nRefY=pViewData->GetRefStartY(); 
+	}
+	if( /* Always true: nRefX >= 0 && */ nRefX <= MAXCOL && nRefY >= 0 && nRefY <= MAXROW)
+	{
+		addr = ScAddress(nRefX,nRefY,pViewData->GetTabNo());
+		return sal_True;
+	}
+	return sal_False;
+}
+uno::Reference < XAccessible > ScAccessibleSpreadsheet::GetActiveCell()
+{
+	if( m_mapSelectionSend.find( maActiveCell ) != m_mapSelectionSend.end() )
+			return m_mapSelectionSend[maActiveCell];
+		else
+			return getAccessibleCellAt(maActiveCell.Row(), maActiveCell .Col());
+}
+//-----IAccessibility2 Implementation 2009

Modified: openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleTableBase.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleTableBase.cxx?rev=1526782&r1=1526781&r2=1526782&view=diff
==============================================================================
--- openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleTableBase.cxx (original)
+++ openoffice/branches/ia2/main/sc/source/ui/Accessibility/AccessibleTableBase.cxx Fri Sep 27 03:21:44 2013
@@ -77,8 +77,23 @@ void SAL_CALL ScAccessibleTableBase::dis
 uno::Any SAL_CALL ScAccessibleTableBase::queryInterface( uno::Type const & rType )
 	throw (uno::RuntimeException)
 {
-	uno::Any aAny (ScAccessibleTableBaseImpl::queryInterface(rType));
-	return aAny.hasValue() ? aAny : ScAccessibleContextBase::queryInterface(rType);
+//IAccessibility2 Implementation 2009-----
+	//uno::Any aAny (ScAccessibleTableBaseImpl::queryInterface(rType));
+	//return aAny.hasValue() ? aAny : ScAccessibleContextBase::queryInterface(rType);
+	uno::Any aRet;
+	if ( rType == ::getCppuType((uno::Reference<XAccessibleTableSelection> *)0) )
+    {
+		uno::Reference<XAccessibleTableSelection> xThis( this );
+       	aRet <<= xThis;
+		return aRet;
+    }
+	else
+	{
+		uno::Any aAny (ScAccessibleTableBaseImpl::queryInterface(rType));
+		return aAny.hasValue() ? aAny : ScAccessibleContextBase::queryInterface(rType);
+	}
+	return aRet;
+//-----IAccessibility2 Implementation 2009
 }
 
 void SAL_CALL ScAccessibleTableBase::acquire()
@@ -153,12 +168,18 @@ sal_Int32 SAL_CALL ScAccessibleTableBase
 	{
 		SCROW nEndRow(0);
         SCCOL nEndCol(0);
-		if (mpDoc->ExtendMerge(static_cast<SCCOL>(nColumn), static_cast<SCROW>(nRow),
-			nEndCol, nEndRow, maRange.aStart.Tab()))
-        {
-		    if (nEndRow > nRow)
-			    nCount = nEndRow - nRow + 1;
-        }
+//IAccessibility2 Implementation 2009-----
+		mpDoc->GetTableByIndex(maRange.aStart.Tab())->GetColumnByIndex(nColumn)->
+			ExtendMerge( static_cast<SCCOL>(nColumn), static_cast<SCROW>(nRow), nRow, nEndCol, nEndRow, sal_False, sal_False );
+		if (nEndRow > nRow)
+			   nCount = nEndRow - nRow + 1;
+	//	if (mpDoc->ExtendMerge(static_cast<SCCOL>(nColumn), static_cast<SCROW>(nRow),
+	//		nEndCol, nEndRow, maRange.aStart.Tab()))
+        //{
+	//	    if (nEndRow > nRow)
+	//		    nCount = nEndRow - nRow + 1;
+        //}
+//-----IAccessibility2 Implementation 2009
 	}
 
 	return nCount;
@@ -182,12 +203,18 @@ sal_Int32 SAL_CALL ScAccessibleTableBase
 	{
 		SCROW nEndRow(0);
         SCCOL nEndCol(0);
-		if (mpDoc->ExtendMerge(static_cast<SCCOL>(nColumn), static_cast<SCROW>(nRow),
-			nEndCol, nEndRow, maRange.aStart.Tab()))
-        {
-		    if (nEndCol > nColumn)
+//IAccessibility2 Implementation 2009-----
+		mpDoc->GetTableByIndex(maRange.aStart.Tab())->GetColumnByIndex(nColumn)->
+			ExtendMerge( static_cast<SCCOL>(nColumn), static_cast<SCROW>(nRow), nRow, nEndCol, nEndRow, sal_False, sal_False );
+		if (nEndCol > nColumn)
 			    nCount = nEndCol - nColumn + 1;
-        }
+	//	if (mpDoc->ExtendMerge(static_cast<SCCOL>(nColumn), static_cast<SCROW>(nRow),
+	//		nEndCol, nEndRow, maRange.aStart.Tab()))
+        //{
+	//	    if (nEndCol > nColumn)
+	//		    nCount = nEndCol - nColumn + 1;
+        //}
+//-----IAccessibility2 Implementation 2009
 	}
 
 	return nCount;
@@ -489,3 +516,27 @@ void ScAccessibleTableBase::CommitTableM
 
 	CommitChange(aEvent);
 }
+//IAccessibility2 Implementation 2009-----
+sal_Bool SAL_CALL ScAccessibleTableBase::selectRow( sal_Int32 ) 
+throw (lang::IndexOutOfBoundsException, uno::RuntimeException) 
+{
+	return sal_True;
+}
+sal_Bool SAL_CALL ScAccessibleTableBase::selectColumn( sal_Int32 ) 
+		throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
+{
+	return sal_True;
+}
+sal_Bool SAL_CALL ScAccessibleTableBase::unselectRow( sal_Int32 ) 
+		throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
+{
+		return sal_True;
+}
+sal_Bool SAL_CALL ScAccessibleTableBase::unselectColumn( sal_Int32 ) 
+		throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
+{
+	return sal_True;
+}
+//-----IAccessibility2 Implementation 2009
+
+



Mime
View raw message