<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="table_XCellCursor" script:language="StarBasic">


'*************************************************************************
'
'  Licensed to the Apache Software Foundation (ASF) under one
'  or more contributor license agreements.  See the NOTICE file
'  distributed with this work for additional information
'  regarding copyright ownership.  The ASF licenses this file
'  to you under the Apache License, Version 2.0 (the
'  "License"); you may not use this file except in compliance
'  with the License.  You may obtain a copy of the License at
'  
'    http://www.apache.org/licenses/LICENSE-2.0
'  
'  Unless required by applicable law or agreed to in writing,
'  software distributed under the License is distributed on an
'  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
'  KIND, either express or implied.  See the License for the
'  specific language governing permissions and limitations
'  under the License.
'
'*************************************************************************





' Be sure that all variables are dimensioned:
option explicit

'*************************************************************************
'XCellCursor walks in a range of data. That
' means: If you have the range (A1:B10) filled
' with data gotoStart() goes to (A1), gotoEnd()
' goes to (B10). But: you must insite this range.
' If you are in (C3) you will nerver go to (A1).

'*************************************************************************






Sub RunTest()

'*************************************************************************
' INTERFACE: 
' com.sun.star.table.XCellCursor
'*************************************************************************
On Error Goto ErrHndl
    Dim bOK As Boolean
    Dim bSupport As Boolean
    Dim ResetCols As Integer, ResetRows As Long
    Dim nStartSCol, nStartECol As Integer
    Dim nStartSRow, nStartERow As Long
    Dim nNextECol As Integer, nNextERow As Long
    Dim nEndECol As Integer, nEndERow As Long
    Dim nPrevECol As Integer, nPrevERow As Long
    Dim nOffECol As Integer, nOffERow As Long
    Dim oAddress As Object

    if hasUnoInterfaces(oObj, "com.sun.star.sheet.XSheetCellCursor") then
        bSupport = true
        ResetCols = oObj.getColumns().getCount()
        ResetRows = oObj.getRows().getCount()
    else
        bSupport = false
    end if

    Test.StartMethod("gotoStart()")
    bOK = true
    oObj.gotoStart()
    oAddress = oObj.getRangeAddress()
    nStartSCol = oAddress.StartColumn
    nStartECol = oAddress.EndColumn
    nStartSRow = oAddress.StartRow
    nStartERow = oAddress.EndRow
    bOK = bOK AND (nStartSCol = nStartECol) AND (nStartSRow = nStartERow)
    Out.Log("nStartSCol = " &amp; nStartSCol &amp; " nStartECol = " &amp; nStartECol &amp;_
           " nStartSRow = " &amp; nStartSRow &amp; " nStartERow = " &amp; nStartERow)
    Test.MethodTested("gotoStart()", bOK)

    Test.StartMethod("gotoNext()")
    bOK = true
    oObj.gotoNext()
    oAddress = oObj.getRangeAddress()
    nNextECol = oAddress.EndColumn
    nNextERow = oAddress.EndRow
    bOK = bOK AND ((nNextECol = nStartSCol + 1) OR (nNextERow = nStartSRow + 1))
    Out.Log("nNextECol = " &amp; nNextECol &amp; " nNextERow = " &amp; nNextERow)
    Test.MethodTested("gotoNext()", bOK)

    Test.StartMethod("gotoEnd()")
    bOK = true
    oObj.gotoEnd()
    oAddress = oObj.getRangeAddress()
    nEndECol = oAddress.EndColumn
    nEndERow = oAddress.EndRow
    bOK = bOK AND ((nEndECol &gt; nStartECol) OR (nEndERow &gt; nStartERow))
    Out.Log("nEndSCol = " &amp; nEndECol &amp; " nEndERow = " &amp; nEndERow)
    Test.MethodTested("gotoEnd()", bOK)

    Test.StartMethod("gotoPrevious()")
    bOK = true
    oObj.gotoPrevious()
    oAddress = oObj.getRangeAddress()
    nPrevECol = oAddress.EndColumn
    nPrevERow = oAddress.EndRow
    bOK = bOK AND ((nPrevECol &lt; nEndECol) OR (nPrevERow &lt; nEndERow))
    Out.Log("nPrevECol = " &amp; nPrevECol &amp; " nPrevERow = " &amp; nPrevERow)
    Test.MethodTested("gotoPrevious()", bOK)

    Test.StartMethod("gotoOffset()")
    bOK = true
    oObj.gotoStart()
    oObj.gotoOffset(1,1)
    oAddress = oObj.getRangeAddress()
    nOffECol = oAddress.EndColumn
    nOffERow = oAddress.EndRow
    bOK = bOK AND (nOffECol = nStartSCol + 1) AND (nOffERow = nStartSRow + 1)
    Out.Log("nOffECol = " &amp; nOffECol &amp; " nOffERow = " &amp; nOffERow)
    Test.MethodTested("gotoOffset()", bOK)

    if bSupport then
        Out.Log("Reset to old range: " &amp; ResetCols &amp; "," &amp; ResetRows)
        oObj.collapseToSize(ResetCols, ResetRows)
    end if

Exit Sub
ErrHndl:
    Test.Exception()
    bOK = false
    resume next
End Sub
</script:module>
