1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package ifc.sheet;
25 
26 import lib.MultiMethodTest;
27 
28 import com.sun.star.sheet.CellFlags;
29 import com.sun.star.sheet.XArrayFormulaRange;
30 import com.sun.star.sheet.XCellRangeAddressable;
31 import com.sun.star.sheet.XSheetCellCursor;
32 import com.sun.star.sheet.XSheetOperation;
33 import com.sun.star.sheet.XSpreadsheet;
34 import com.sun.star.table.CellRangeAddress;
35 import com.sun.star.table.XCellRange;
36 import com.sun.star.table.XColumnRowRange;
37 import com.sun.star.uno.UnoRuntime;
38 import com.sun.star.util.XMergeable;
39 
40 /**
41 * Testing <code>com.sun.star.sheet.XSheetCellCursor</code>
42 * interface methods :
43 * <ul>
44 *  <li><code> collapseToCurrentRegion()</code></li>
45 *  <li><code> collapseToCurrentArray()</code></li>
46 *  <li><code> collapseToMergedArea()</code></li>
47 *  <li><code> expandToEntireColumns()</code></li>
48 *  <li><code> expandToEntireRows()</code></li>
49 *  <li><code> collapseToSize()</code></li>
50 * </ul> <p>
51 * Component must also implement the following interfaces :
52 * <ul>
53 *  <li> <code> com.sun.star.sheet.XCellRangeAddressable </code> :
54 *  to get range address </li>
55 * <ul> <p>
56 * Range of cursor must be of size 4 x 4. <p>
57 * @see com.sun.star.sheet.XSheetCellCursor
58 */
59 public class _XSheetCellCursor extends MultiMethodTest {
60 
61     public XSheetCellCursor oObj = null;
62 
63     /**
64     * Test creates the array formula, assigns this array to another array,
65     * collapses cursor into one cell, applies method, checks the size of the
66     * result range, erases array formula, checks that array formula has been
67     * cleared. <p>
68     * Has <b>OK</b> status if no exceptions were thrown, if size of the result
69     * range is equal to size of the range where the array formula was set and
70     * if array formula was successfully cleared. <p>
71     */
_collapseToCurrentArray()72     public void _collapseToCurrentArray() {
73         boolean bResult = false;
74 
75         XCellRangeAddressable crAddr = (XCellRangeAddressable)
76             UnoRuntime.queryInterface(XCellRangeAddressable.class, oObj);
77         CellRangeAddress addr = crAddr.getRangeAddress() ;
78         int leftCol = addr.StartColumn ;
79         int topRow = addr.StartRow ;
80         int width = addr.EndColumn - addr.StartColumn + 1 ;
81         int height = addr.EndRow - addr.StartRow + 1 ;
82 
83         log.println( "Object area is ((" + leftCol + "," + topRow + "),(" +
84             (leftCol + width - 1) + "," + (topRow + height - 1) + ")" );
85 
86         XCellRange new_range = null;
87         try {
88             // first we need to create an array formula
89             new_range =
90                 oObj.getCellRangeByPosition(0, 0, 0, height - 1);
91         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
92             log.print("Get cell range by position failed: ");
93             e.printStackTrace(log);
94             tRes.tested("collapseToCurrentArray()", false);
95         }
96 
97         log.println("DB: Successfully new range created");
98         XArrayFormulaRange arrFormulaRange = (XArrayFormulaRange)
99             UnoRuntime.queryInterface (XArrayFormulaRange.class, new_range);
100         // write a simple formula (this array assigns another array)
101         arrFormulaRange.setArrayFormula("A1:A" + height) ;
102 
103         // collapse cursor into one cell and then try to apply the method
104         oObj.collapseToSize (1, 1) ;
105         oObj.collapseToCurrentArray() ;
106 
107         // check the size of result range
108         int cols = ( (XColumnRowRange)UnoRuntime.queryInterface(
109                   XColumnRowRange.class, oObj) ).getColumns().getCount();
110         int rows = ( (XColumnRowRange)UnoRuntime.queryInterface(
111                   XColumnRowRange.class, oObj) ).getRows().getCount();
112 
113         if (cols == 1 && rows == height) {
114             bResult = true;
115         } else {
116             bResult = false;
117             log.println("The size of cell range must be 1x" + height +
118                 ", but after method call it was " + cols + "x" + rows);
119         }
120 
121         // erase array formula
122         arrFormulaRange.setArrayFormula("");
123 
124         // check if array formula has been cleared with last statement
125         try {
126             // if array formula isn't cleared exception is thrown
127             new_range.getCellByPosition(0,0).setValue(111) ;
128         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
129             bResult = false ;
130             log.println(
131                 "Array formula hasn't been cleared with setArrayFormula(\"\")");
132             XSheetOperation clearRange = (XSheetOperation)
133                 UnoRuntime.queryInterface (XSheetOperation.class, new_range);
134             int allFlags =
135                 CellFlags.ANNOTATION | CellFlags.DATETIME | CellFlags.EDITATTR;
136             allFlags = allFlags
137                 | CellFlags.HARDATTR | CellFlags.OBJECTS | CellFlags.STRING;
138             allFlags = allFlags
139                 | CellFlags.VALUE | CellFlags.FORMULA | CellFlags.STYLES;
140             clearRange.clearContents(allFlags) ;
141         }
142 
143         tRes.tested("collapseToCurrentArray()", bResult );
144     }
145 
146     /**
147     * Test clears contents of spreadsheet, collapses cursor to current range,
148     * checks size of cursor range, fills a cell that is close to
149     * cursor range, collapses cursor to current range, checks size of cursor
150     * range again and restores original size. <p>
151     * Has <b> OK </b> status if after clearing of content and collapsing cursor
152     * range size remains 4 x 4, if after filling of cell and collapsing cursor
153     * range extends by one in both dimensions and no exceptions were thrown.<p>
154     */
_collapseToCurrentRegion()155     public void _collapseToCurrentRegion(){
156         boolean bResult = true;
157         int width = 4, height = 4;
158         int leftCol = -1, topRow = -1;
159 
160         XSpreadsheet oSheet = oObj.getSpreadsheet();
161         ((XSheetOperation) UnoRuntime.queryInterface(
162             XSheetOperation.class, oSheet) ).clearContents(65535);
163         oObj.collapseToCurrentRegion();
164         int cols = ((XColumnRowRange)
165             UnoRuntime.queryInterface(
166                 XColumnRowRange.class, oObj) ).getColumns().getCount();
167         int rows = ((XColumnRowRange)
168             UnoRuntime.queryInterface(
169                 XColumnRowRange.class, oObj) ).getRows().getCount();
170 
171         if (cols != width || rows != height) {
172             bResult = false ;
173             log.println("After collapseToCurrentRegion()"
174                  + " call Region must have size " + width + "x" + height
175                  + " but it is " + cols + "x" + rows);
176         }
177 
178         // if previous test was successful try more complicated case
179         if (bResult) {
180             if (leftCol != -1 && topRow != -1) {
181                 try {
182                     oSheet.getCellByPosition(
183                         leftCol + width, topRow + height).setValue(1);
184                 } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
185                     log.print("Can't get cell by position:");
186                     e.printStackTrace(log);
187                     bResult = false;
188                 }
189 
190                 oObj.collapseToCurrentRegion() ;
191 
192                 // checking results
193                 cols = ((XColumnRowRange)
194                     UnoRuntime.queryInterface(
195                         XColumnRowRange.class, oObj)).getColumns().getCount();
196                 rows = ((XColumnRowRange)
197                     UnoRuntime.queryInterface(
198                         XColumnRowRange.class, oObj)).getRows().getCount();
199 
200                 if (cols == width + 1 && rows == height + 1) {
201                     bResult &= true;
202                 } else {
203                     bResult = false;
204                     log.println("After collapseToCurrentRegion() call [2]"
205                          + " region must have size " + (width+1) + "x"
206                          + (height + 1) + " but it is " + cols + "x" + rows );
207                 }
208             }
209         }
210 
211         tRes.tested("collapseToCurrentRegion()", bResult);
212 
213         // restore original size
214         oObj.collapseToSize(width, height);
215     }
216 
217     /**
218     * Test merges a cells of range that has a greater size, collapses cursor to
219     * merged area, checks size of cursor range and restores original size
220     * of cursor range. <p>
221     * Has <b> OK </b> status if after merging of cells and collapsing cursor
222     * range extends by one in both dimensions and no exceptions were thrown.<p>
223     */
_collapseToMergedArea()224     public void _collapseToMergedArea(){
225         int width = 1, height = 1 ;
226         int leftCol = 0, topRow = 0 ;
227 
228         boolean bResult = true ;
229 
230         log.println("DB: Starting collapseToMergedArea() method test ...") ;
231         XSpreadsheet oSheet = oObj.getSpreadsheet() ;
232         log.println ("DB: got Spreadsheet.") ;
233 
234         XCellRange newRange = null;
235         try {
236             newRange = oSheet.getCellRangeByPosition (
237                 leftCol + width - 1, topRow + height - 1,
238                 leftCol + width, topRow + height );
239         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
240             log.println("Can't get cell range by position");
241             e.printStackTrace(log);
242             bResult = false;
243         }
244 
245         XMergeable mergeRange = (XMergeable)
246             UnoRuntime.queryInterface (XMergeable.class, newRange);
247         if (mergeRange == null) {
248             log.println("DB: newRange doesn't implement XMergeable interface");
249         } else {
250             log.println("DB: XMergeable interface successfully queried.");
251         }
252 
253         mergeRange.merge(true);
254         log.println("DB: Successfully merged.") ;
255 
256         oObj.collapseToMergedArea() ;
257         log.println("DB: Successfully collapseToMergedArea() method called");
258 
259         // unmerge area to restore SpreadSheet
260         mergeRange.merge(false);
261         log.println("DB: Successfully unmerged.") ;
262 
263         // checking results
264         int cols = ((XColumnRowRange)
265             UnoRuntime.queryInterface(
266                 XColumnRowRange.class, oObj) ).getColumns().getCount();
267         int rows = ((XColumnRowRange)
268             UnoRuntime.queryInterface(
269                 XColumnRowRange.class, oObj) ).getRows().getCount();
270         log.println("DB: Column and row numbers successfully get") ;
271 
272         if (cols == width + 1  && rows == height + 3) {
273             bResult &= true;
274         } else {
275             bResult = false;
276             log.println(
277                 "After collapseToMergedArea() call region must have size "
278                 + (width + 1) + "x" + (height + 1) + " but it is " + cols
279                 + "x" + rows );
280         }
281 
282         tRes.tested("collapseToMergedArea()", bResult) ;
283 
284         // restore original size
285         oObj.collapseToSize(width, height);
286     }
287 
288     /**
289     * Test collapses cursor to the new size, checks size
290     * of cursor range and restores original size of cursor range. <p>
291     * Has <b> OK </b> status if after collapsing cursor
292     * range extends by three in both dimensions. <p>
293     */
_collapseToSize()294     public void _collapseToSize(){
295         boolean bResult = false;
296         int width = 1, height = 1;
297 
298         // collapseToSize() method test
299         oObj.collapseToSize (width + 3, height + 3);
300 
301         // checking results
302         int cols = ((XColumnRowRange)
303             UnoRuntime.queryInterface(
304                 XColumnRowRange.class, oObj) ).getColumns().getCount();
305         int rows = ((XColumnRowRange)
306             UnoRuntime.queryInterface(
307                 XColumnRowRange.class, oObj) ).getRows().getCount();
308 
309         if (cols == width + 3  && rows == height + 3) {
310             bResult = true ;
311         } else {
312             bResult = false ;
313             log.println( "After collapseToSize() call region must have size "
314                 + (width + 3) + "x" + (height + 3) + " but it is "
315                 + cols + "x" +rows);
316         }
317 
318         tRes.tested("collapseToSize()", bResult) ;
319 
320         // restore original size
321         oObj.collapseToSize(width, height) ;
322     }
323 
324     /**
325     * Test expands cursor to entire columns, checks size
326     * of cursor range and restores original size of cursor range. <p>
327     * Has <b> OK </b> status if after expanding cursor
328     * range extends to all rows in the columns (number of rows is greater than
329     * 32000 and number of columns remains the same). <p>
330     */
_expandToEntireColumns()331     public void _expandToEntireColumns(){
332         boolean bResult = false;
333         int width = 1, height = 1 ;
334 
335         // expandToEntireColumns() method test
336         oObj.expandToEntireColumns () ;
337 
338         // checking results
339         int cols = ((XColumnRowRange)
340             UnoRuntime.queryInterface(
341                 XColumnRowRange.class, oObj) ).getColumns().getCount();
342         int rows = ((XColumnRowRange)
343             UnoRuntime.queryInterface(
344                 XColumnRowRange.class, oObj) ).getRows().getCount();
345 
346         if (cols == width && rows >= 32000) {
347             bResult = true ;
348         } else {
349             bResult = false ;
350             log.println(
351                 "After expandToEntireColumns() call region must have size "+
352                 width + "x(>=32000) but it is " + cols + "x" + rows);
353         }
354 
355         tRes.tested("expandToEntireColumns()", bResult) ;
356 
357         // restore original size
358         oObj.collapseToSize(width, height) ;
359     }
360 
361     /**
362     * Test expands cursor to entire rows, checks size
363     * of cursor range and restores original size of cursor range. <p>
364     * Has <b> OK </b> status if after expanding cursor
365     * range extends to all columns in the rows (number of columns is greater
366     * than 256 and number of rows remains the same). <p>
367     */
_expandToEntireRows()368     public void _expandToEntireRows(){
369         boolean bResult = false;
370         int width = 1, height = 1 ;
371 
372         // expandToEntireRows() method test
373         oObj.expandToEntireRows () ;
374 
375         // checking results
376         int cols = ((XColumnRowRange)
377             UnoRuntime.queryInterface(
378                 XColumnRowRange.class, oObj) ).getColumns().getCount();
379         int rows = ((XColumnRowRange)
380             UnoRuntime.queryInterface(
381                 XColumnRowRange.class, oObj) ).getRows().getCount();
382 
383         if (cols >= 256 && rows == height) {
384             bResult = true;
385         } else {
386             bResult = false ;
387             log.println("After expandToEntireRows() call region " +
388                 "must have size (>=256)x" + height + " but it is " +
389                 cols + "x" + rows );
390         }
391 
392         tRes.tested("expandToEntireRows()", bResult) ;
393 
394         // restore original size
395         oObj.collapseToSize(width, height) ;
396     }
397 
398 } // EOC _XSheetCellCursor
399 
400