You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by st...@apache.org on 2013/11/14 09:18:14 UTC
svn commit: r1541847 [6/18] - in /openoffice/trunk: ./
main/accessibility/inc/accessibility/extended/
main/accessibility/inc/accessibility/helper/
main/accessibility/inc/accessibility/standard/
main/accessibility/source/extended/ main/accessibility/sou...
Modified: openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleDocument.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleDocument.cxx?rev=1541847&r1=1541846&r2=1541847&view=diff
==============================================================================
--- openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleDocument.cxx (original)
+++ openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleDocument.cxx Thu Nov 14 08:18:05 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/trunk/main/sc/source/ui/Accessibility/AccessibleDocumentBase.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleDocumentBase.cxx?rev=1541847&r1=1541846&r2=1541847&view=diff
==============================================================================
--- openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleDocumentBase.cxx (original)
+++ openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleDocumentBase.cxx Thu Nov 14 08:18:05 2013
@@ -45,3 +45,10 @@ ScAccessibleDocumentBase::ScAccessibleDo
ScAccessibleDocumentBase::~ScAccessibleDocumentBase(void)
{
}
+//IAccessibility2 Implementation 2009-----
+void ScAccessibleDocumentBase::SwitchViewFireFocus()
+{
+ CommitFocusGained();
+}
+//-----IAccessibility2 Implementation 2009
+
Modified: openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleDocumentPagePreview.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleDocumentPagePreview.cxx?rev=1541847&r1=1541846&r2=1541847&view=diff
==============================================================================
--- openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleDocumentPagePreview.cxx (original)
+++ openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleDocumentPagePreview.cxx Thu Nov 14 08:18:05 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/trunk/main/sc/source/ui/Accessibility/AccessibleEditObject.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleEditObject.cxx?rev=1541847&r1=1541846&r2=1541847&view=diff
==============================================================================
--- openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleEditObject.cxx (original)
+++ openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleEditObject.cxx Thu Nov 14 08:18:05 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/trunk/main/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx?rev=1541847&r1=1541846&r2=1541847&view=diff
==============================================================================
--- openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx (original)
+++ openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx Thu Nov 14 08:18:05 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/trunk/main/sc/source/ui/Accessibility/AccessibleTableBase.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleTableBase.cxx?rev=1541847&r1=1541846&r2=1541847&view=diff
==============================================================================
--- openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleTableBase.cxx (original)
+++ openoffice/trunk/main/sc/source/ui/Accessibility/AccessibleTableBase.cxx Thu Nov 14 08:18:05 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
+
+