1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski package testlib.gui;
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski import static org.openoffice.test.vcl.Tester.*;
25*b1cdbd2cSJim Jagielski import static testlib.gui.UIMap.*;
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski import java.lang.reflect.Array;
28*b1cdbd2cSJim Jagielski import java.util.StringTokenizer;
29*b1cdbd2cSJim Jagielski import java.util.logging.Logger;
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski public class SCTool {
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski 	private static Logger LOG = Logger.getLogger(SCTool.class.getName());
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski 	/**
36*b1cdbd2cSJim Jagielski 	 * Select a range.
37*b1cdbd2cSJim Jagielski 	 *
38*b1cdbd2cSJim Jagielski 	 * @param range
39*b1cdbd2cSJim Jagielski 	 *            e.g. Sheet1.A10, Sheet1.A11:B30, A11, A30:B45
40*b1cdbd2cSJim Jagielski 	 */
selectRange(String range)41*b1cdbd2cSJim Jagielski 	public static void selectRange(String range) {
42*b1cdbd2cSJim Jagielski 		scInputBarPosition.click(0.5, 0.5);
43*b1cdbd2cSJim Jagielski 		scInputBarPosition.setText(range);
44*b1cdbd2cSJim Jagielski 		typeKeys("<enter>");
45*b1cdbd2cSJim Jagielski 		sleep(1);
46*b1cdbd2cSJim Jagielski 	}
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 	/**
49*b1cdbd2cSJim Jagielski 	 * Get the input at the given cell. If the cell is a formula, return the
50*b1cdbd2cSJim Jagielski 	 * formula rather than the result
51*b1cdbd2cSJim Jagielski 	 *
52*b1cdbd2cSJim Jagielski 	 * @param cell
53*b1cdbd2cSJim Jagielski 	 * @return
54*b1cdbd2cSJim Jagielski 	 */
getCellInput(String cell)55*b1cdbd2cSJim Jagielski 	public static String getCellInput(String cell) {
56*b1cdbd2cSJim Jagielski 		if (cell != null)
57*b1cdbd2cSJim Jagielski 			selectRange(cell);
58*b1cdbd2cSJim Jagielski 		String caption = scInputBarInput.getCaption();
59*b1cdbd2cSJim Jagielski 		// Fix: When formulaEdit's caption is blank, the hook will return the
60*b1cdbd2cSJim Jagielski 		// document window's caption
61*b1cdbd2cSJim Jagielski 		// So if it's document window caption, return ""
62*b1cdbd2cSJim Jagielski 		return caption.contains("[12479]") ? "" : caption;
63*b1cdbd2cSJim Jagielski 	}
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski 	/**
66*b1cdbd2cSJim Jagielski 	 * Get the text at the given cell. If the cell is a formula, return the
67*b1cdbd2cSJim Jagielski 	 * result rather than the formula
68*b1cdbd2cSJim Jagielski 	 *
69*b1cdbd2cSJim Jagielski 	 * @param cell
70*b1cdbd2cSJim Jagielski 	 * @return
71*b1cdbd2cSJim Jagielski 	 */
getCellText(String cell)72*b1cdbd2cSJim Jagielski 	public static String getCellText(String cell) {
73*b1cdbd2cSJim Jagielski 		app.setClipboard("$$$$");
74*b1cdbd2cSJim Jagielski 		selectRange(cell);
75*b1cdbd2cSJim Jagielski 		typeKeys("<$copy>");
76*b1cdbd2cSJim Jagielski 		String content = app.getClipboard();
77*b1cdbd2cSJim Jagielski 		if (content.endsWith("\r\n"))
78*b1cdbd2cSJim Jagielski 			content = content.substring(0, content.length() - 2);
79*b1cdbd2cSJim Jagielski 		else if (content.endsWith("\n"))
80*b1cdbd2cSJim Jagielski 			content = content.substring(0, content.length() - 1);
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski 		return content;
83*b1cdbd2cSJim Jagielski 	}
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski 	/**
86*b1cdbd2cSJim Jagielski 	 * convert the format of column number to integer e.g. A -> 1 AA -> 27 AMJ
87*b1cdbd2cSJim Jagielski 	 * -> 1024
88*b1cdbd2cSJim Jagielski 	 *
89*b1cdbd2cSJim Jagielski 	 * @param no
90*b1cdbd2cSJim Jagielski 	 * @return
91*b1cdbd2cSJim Jagielski 	 */
toIntColumnNo(String no)92*b1cdbd2cSJim Jagielski 	public static int toIntColumnNo(String no) {
93*b1cdbd2cSJim Jagielski 		int len = no.length();
94*b1cdbd2cSJim Jagielski 		int ret = 0;
95*b1cdbd2cSJim Jagielski 		for (int i = 0; i < len; i++) {
96*b1cdbd2cSJim Jagielski 			char c = no.charAt(len - i - 1);
97*b1cdbd2cSJim Jagielski 			ret += Math.pow(26, i) * (c - 'A' + 1);
98*b1cdbd2cSJim Jagielski 		}
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 		return ret;
101*b1cdbd2cSJim Jagielski 	}
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 	/**
104*b1cdbd2cSJim Jagielski 	 * Convert the format of column number to char
105*b1cdbd2cSJim Jagielski 	 *
106*b1cdbd2cSJim Jagielski 	 * @param no
107*b1cdbd2cSJim Jagielski 	 * @return
108*b1cdbd2cSJim Jagielski 	 */
toCharColumnNo(int no)109*b1cdbd2cSJim Jagielski 	public static String toCharColumnNo(int no) {
110*b1cdbd2cSJim Jagielski 		String ret = "";
111*b1cdbd2cSJim Jagielski 		int f = 0;
112*b1cdbd2cSJim Jagielski 		do {
113*b1cdbd2cSJim Jagielski 			f = (no - 1) / 26;
114*b1cdbd2cSJim Jagielski 			int s = (no - 1) % 26;
115*b1cdbd2cSJim Jagielski 			ret = (char) ('A' + s) + ret;
116*b1cdbd2cSJim Jagielski 			no = f;
117*b1cdbd2cSJim Jagielski 		} while (f != 0);
118*b1cdbd2cSJim Jagielski 		return ret;
119*b1cdbd2cSJim Jagielski 	}
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 	/**
122*b1cdbd2cSJim Jagielski 	 * Parse location string into integer values
123*b1cdbd2cSJim Jagielski 	 *
124*b1cdbd2cSJim Jagielski 	 * @param loc
125*b1cdbd2cSJim Jagielski 	 *            e.g. A1
126*b1cdbd2cSJim Jagielski 	 * @return
127*b1cdbd2cSJim Jagielski 	 */
parseLocation(String loc)128*b1cdbd2cSJim Jagielski 	public static int[] parseLocation(String loc) {
129*b1cdbd2cSJim Jagielski 		int i = 0;
130*b1cdbd2cSJim Jagielski 		for (; i < loc.length(); i++) {
131*b1cdbd2cSJim Jagielski 			char c = loc.charAt(i);
132*b1cdbd2cSJim Jagielski 			if (c >= '0' && c <= '9')
133*b1cdbd2cSJim Jagielski 				break;
134*b1cdbd2cSJim Jagielski 		}
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 		String col = loc.substring(0, i);
137*b1cdbd2cSJim Jagielski 		String row = loc.substring(i);
138*b1cdbd2cSJim Jagielski 		int sC = toIntColumnNo(col);
139*b1cdbd2cSJim Jagielski 		int sR = Integer.parseInt(row);
140*b1cdbd2cSJim Jagielski 		return new int[] { sC, sR };
141*b1cdbd2cSJim Jagielski 	}
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 	/**
144*b1cdbd2cSJim Jagielski 	 * Parse range string into integer values
145*b1cdbd2cSJim Jagielski 	 *
146*b1cdbd2cSJim Jagielski 	 * @param range
147*b1cdbd2cSJim Jagielski 	 *            e.g. A3:F9
148*b1cdbd2cSJim Jagielski 	 * @return
149*b1cdbd2cSJim Jagielski 	 */
parseRange(String range)150*b1cdbd2cSJim Jagielski 	public static int[] parseRange(String range) {
151*b1cdbd2cSJim Jagielski 		int dotIndex = range.indexOf(".");
152*b1cdbd2cSJim Jagielski 		if (dotIndex != -1) {
153*b1cdbd2cSJim Jagielski 			range = range.substring(dotIndex + 1);
154*b1cdbd2cSJim Jagielski 		}
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 		String[] locs = range.split(":");
157*b1cdbd2cSJim Jagielski 		int[] ret = new int[4];
158*b1cdbd2cSJim Jagielski 		int[] start = parseLocation(locs[0]);
159*b1cdbd2cSJim Jagielski 		ret[0] = start[0];
160*b1cdbd2cSJim Jagielski 		ret[1] = start[1];
161*b1cdbd2cSJim Jagielski 		if (locs.length == 1) {
162*b1cdbd2cSJim Jagielski 			ret[2] = start[0];
163*b1cdbd2cSJim Jagielski 			ret[3] = start[1];
164*b1cdbd2cSJim Jagielski 		} else {
165*b1cdbd2cSJim Jagielski 			int[] end = parseLocation(locs[1]);
166*b1cdbd2cSJim Jagielski 			ret[2] = end[0];
167*b1cdbd2cSJim Jagielski 			ret[3] = end[1];
168*b1cdbd2cSJim Jagielski 		}
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 		return ret;
171*b1cdbd2cSJim Jagielski 	}
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 	/**
174*b1cdbd2cSJim Jagielski 	 * Get the text at the given cells. If the cell is a formula, return the
175*b1cdbd2cSJim Jagielski 	 * result rather than the formula. Note:
176*b1cdbd2cSJim Jagielski 	 *
177*b1cdbd2cSJim Jagielski 	 * @param range
178*b1cdbd2cSJim Jagielski 	 *            e.g. A3:D9
179*b1cdbd2cSJim Jagielski 	 * @return
180*b1cdbd2cSJim Jagielski 	 */
getCellTexts(String range)181*b1cdbd2cSJim Jagielski 	public static String[][] getCellTexts(String range) {
182*b1cdbd2cSJim Jagielski 		selectRange(range);
183*b1cdbd2cSJim Jagielski 		int[] intRange = parseRange(range);
184*b1cdbd2cSJim Jagielski 		int rowCount = intRange[3] - intRange[1] + 1;
185*b1cdbd2cSJim Jagielski 		int colCount = intRange[2] - intRange[0] + 1;
186*b1cdbd2cSJim Jagielski 		String[][] texts = new String[rowCount][colCount];
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 		app.setClipboard("$$$$");
189*b1cdbd2cSJim Jagielski 		typeKeys("<$copy>");
190*b1cdbd2cSJim Jagielski 		sleep(1);
191*b1cdbd2cSJim Jagielski 		String text = app.getClipboard();
192*b1cdbd2cSJim Jagielski 		StringTokenizer tokenizer = new StringTokenizer(text, "\"\t\n", true);
193*b1cdbd2cSJim Jagielski 		int state = 0;
194*b1cdbd2cSJim Jagielski 		String cellContent = "";
195*b1cdbd2cSJim Jagielski 		int r = 0, c = 0;
196*b1cdbd2cSJim Jagielski 		while (tokenizer.hasMoreTokens()) {
197*b1cdbd2cSJim Jagielski 			String token = tokenizer.nextToken();
198*b1cdbd2cSJim Jagielski 			switch (state) {
199*b1cdbd2cSJim Jagielski 			case 0:
200*b1cdbd2cSJim Jagielski 				if ("\"".equals(token)) {
201*b1cdbd2cSJim Jagielski 					state = 1;
202*b1cdbd2cSJim Jagielski 				} else if ("\t".equals(token)) {
203*b1cdbd2cSJim Jagielski 					texts[r][c] = cellContent;
204*b1cdbd2cSJim Jagielski 					cellContent = "";
205*b1cdbd2cSJim Jagielski 					c++;
206*b1cdbd2cSJim Jagielski 				} else if ("\n".equals(token)) {
207*b1cdbd2cSJim Jagielski 					if (cellContent.endsWith("\r"))
208*b1cdbd2cSJim Jagielski 						cellContent = cellContent.substring(0, cellContent.length() - 1);
209*b1cdbd2cSJim Jagielski 					texts[r][c] = cellContent;
210*b1cdbd2cSJim Jagielski 					cellContent = "";
211*b1cdbd2cSJim Jagielski 					c = 0;
212*b1cdbd2cSJim Jagielski 					r++;
213*b1cdbd2cSJim Jagielski 				} else {
214*b1cdbd2cSJim Jagielski 					cellContent += token;
215*b1cdbd2cSJim Jagielski 				}
216*b1cdbd2cSJim Jagielski 				break;
217*b1cdbd2cSJim Jagielski 			case 1:
218*b1cdbd2cSJim Jagielski 				if ("\"".equals(token)) {
219*b1cdbd2cSJim Jagielski 					state = 0;
220*b1cdbd2cSJim Jagielski 				} else {
221*b1cdbd2cSJim Jagielski 					cellContent += token;
222*b1cdbd2cSJim Jagielski 				}
223*b1cdbd2cSJim Jagielski 				break;
224*b1cdbd2cSJim Jagielski 			}
225*b1cdbd2cSJim Jagielski 		}
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 		LOG.info("Text of range [" + range + "]:\n" + arrayToString(texts));
228*b1cdbd2cSJim Jagielski 		return texts;
229*b1cdbd2cSJim Jagielski 	}
230*b1cdbd2cSJim Jagielski 
arrayToString(Object array)231*b1cdbd2cSJim Jagielski 	private static String arrayToString(Object array) {
232*b1cdbd2cSJim Jagielski 		if (array == null)
233*b1cdbd2cSJim Jagielski 			return "null";
234*b1cdbd2cSJim Jagielski 		if (!array.getClass().isArray())
235*b1cdbd2cSJim Jagielski 			return array.toString();
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski 		int len = Array.getLength(array);
238*b1cdbd2cSJim Jagielski 		String ret = "{";
239*b1cdbd2cSJim Jagielski 		for (int i = 0; i < len; i++) {
240*b1cdbd2cSJim Jagielski 			Object el = Array.get(array, i);
241*b1cdbd2cSJim Jagielski 			if (el == null) {
242*b1cdbd2cSJim Jagielski 				ret += "null";
243*b1cdbd2cSJim Jagielski 			} else if (el.getClass().isArray()) {
244*b1cdbd2cSJim Jagielski 				ret += arrayToString(el);
245*b1cdbd2cSJim Jagielski 			} else {
246*b1cdbd2cSJim Jagielski 				ret += "\"" + el + "\"";
247*b1cdbd2cSJim Jagielski 			}
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 			if (i + 1 != len)
250*b1cdbd2cSJim Jagielski 				ret += ",";
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 		}
253*b1cdbd2cSJim Jagielski 		ret += "}";
254*b1cdbd2cSJim Jagielski 		return ret;
255*b1cdbd2cSJim Jagielski 	}
256*b1cdbd2cSJim Jagielski }