/************************************************************** * * 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. * *************************************************************/ package testlib.gui; import static org.openoffice.test.vcl.Tester.*; import static testlib.gui.UIMap.*; import java.lang.reflect.Array; import java.util.StringTokenizer; import java.util.logging.Logger; public class SCTool { private static Logger LOG = Logger.getLogger(SCTool.class.getName()); /** * Select a range. * * @param range * e.g. Sheet1.A10, Sheet1.A11:B30, A11, A30:B45 */ public static void selectRange(String range) { scInputBarPosition.click(0.5, 0.5); scInputBarPosition.setText(range); typeKeys(""); sleep(1); } /** * Get the input at the given cell. If the cell is a formula, return the * formula rather than the result * * @param cell * @return */ public static String getCellInput(String cell) { if (cell != null) selectRange(cell); String caption = scInputBarInput.getCaption(); // Fix: When formulaEdit's caption is blank, the hook will return the // document window's caption // So if it's document window caption, return "" return caption.contains("[12479]") ? "" : caption; } /** * Get the text at the given cell. If the cell is a formula, return the * result rather than the formula * * @param cell * @return */ public static String getCellText(String cell) { app.setClipboard("$$$$"); selectRange(cell); typeKeys("<$copy>"); String content = app.getClipboard(); if (content.endsWith("\r\n")) content = content.substring(0, content.length() - 2); else if (content.endsWith("\n")) content = content.substring(0, content.length() - 1); return content; } /** * convert the format of column number to integer e.g. A -> 1 AA -> 27 AMJ * -> 1024 * * @param no * @return */ public static int toIntColumnNo(String no) { int len = no.length(); int ret = 0; for (int i = 0; i < len; i++) { char c = no.charAt(len - i - 1); ret += Math.pow(26, i) * (c - 'A' + 1); } return ret; } /** * Convert the format of column number to char * * @param no * @return */ public static String toCharColumnNo(int no) { String ret = ""; int f = 0; do { f = (no - 1) / 26; int s = (no - 1) % 26; ret = (char) ('A' + s) + ret; no = f; } while (f != 0); return ret; } /** * Parse location string into integer values * * @param loc * e.g. A1 * @return */ public static int[] parseLocation(String loc) { int i = 0; for (; i < loc.length(); i++) { char c = loc.charAt(i); if (c >= '0' && c <= '9') break; } String col = loc.substring(0, i); String row = loc.substring(i); int sC = toIntColumnNo(col); int sR = Integer.parseInt(row); return new int[] { sC, sR }; } /** * Parse range string into integer values * * @param range * e.g. A3:F9 * @return */ public static int[] parseRange(String range) { int dotIndex = range.indexOf("."); if (dotIndex != -1) { range = range.substring(dotIndex + 1); } String[] locs = range.split(":"); int[] ret = new int[4]; int[] start = parseLocation(locs[0]); ret[0] = start[0]; ret[1] = start[1]; if (locs.length == 1) { ret[2] = start[0]; ret[3] = start[1]; } else { int[] end = parseLocation(locs[1]); ret[2] = end[0]; ret[3] = end[1]; } return ret; } /** * Get the text at the given cells. If the cell is a formula, return the * result rather than the formula. Note: * * @param range * e.g. A3:D9 * @return */ public static String[][] getCellTexts(String range) { selectRange(range); int[] intRange = parseRange(range); int rowCount = intRange[3] - intRange[1] + 1; int colCount = intRange[2] - intRange[0] + 1; String[][] texts = new String[rowCount][colCount]; app.setClipboard("$$$$"); typeKeys("<$copy>"); sleep(1); String text = app.getClipboard(); StringTokenizer tokenizer = new StringTokenizer(text, "\"\t\n", true); int state = 0; String cellContent = ""; int r = 0, c = 0; while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); switch (state) { case 0: if ("\"".equals(token)) { state = 1; } else if ("\t".equals(token)) { texts[r][c] = cellContent; cellContent = ""; c++; } else if ("\n".equals(token)) { if (cellContent.endsWith("\r")) cellContent = cellContent.substring(0, cellContent.length() - 1); texts[r][c] = cellContent; cellContent = ""; c = 0; r++; } else { cellContent += token; } break; case 1: if ("\"".equals(token)) { state = 0; } else { cellContent += token; } break; } } LOG.info("Text of range [" + range + "]:\n" + arrayToString(texts)); return texts; } private static String arrayToString(Object array) { if (array == null) return "null"; if (!array.getClass().isArray()) return array.toString(); int len = Array.getLength(array); String ret = "{"; for (int i = 0; i < len; i++) { Object el = Array.get(array, i); if (el == null) { ret += "null"; } else if (el.getClass().isArray()) { ret += arrayToString(el); } else { ret += "\"" + el + "\""; } if (i + 1 != len) ret += ","; } ret += "}"; return ret; } }