/* ************************************************************************
qxwebdriver-java
http://github.com/qooxdoo/qxwebdriver-java
Copyright:
2012-2013 1&1 Internet AG, Germany, http://www.1und1.de
License:
LGPL: http://www.gnu.org/licenses/lgpl.html
EPL: http://www.eclipse.org/org/documents/epl-v10.php
See the license.txt file in the project's top-level directory for details.
Authors:
* Daniel Wagner (danielwagner)
************************************************************************ */
package org.oneandone.qxwebdriver.ui.table;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.oneandone.qxwebdriver.By;
import org.oneandone.qxwebdriver.QxWebDriver;
import org.oneandone.qxwebdriver.ui.Scrollable;
import org.oneandone.qxwebdriver.ui.Widget;
import org.oneandone.qxwebdriver.ui.core.WidgetImpl;
import org.oneandone.qxwebdriver.ui.table.pane.Scroller;
import org.openqa.selenium.WebElement;
public class Table extends WidgetImpl implements Scrollable {
public Table(WebElement element, QxWebDriver webDriver) {
super(element, webDriver);
}
public List<String> getHeaderLabels() {
List<WebElement> children = getHeaderCells();
List<String> labels = new ArrayList<String>();
Iterator<WebElement> itr = children.iterator();
while (itr.hasNext()) {
WebElement child = itr.next();
WebElement label = child.findElement(By.xpath("div[not(contains(@style, 'background-image'))]"));
Widget labelWidget = driver.getWidgetForElement(label);
labels.add((String) labelWidget.getPropertyValue("value"));
//labels.add(label.getText());
}
return labels;
}
protected List<WebElement> getHeaderCells() {
Widget header = findWidget(By.qxh("*/qx.ui.table.pane.Header"));
List<WebElement> cells = header
.getContentElement()
.findElements(
By.xpath("div[starts-with(@class, 'qx-table-header-cell')]"));
return cells;
}
public Widget getHeaderCell(String label) {
List<WebElement> children = getHeaderCells();
Iterator<WebElement> itr = children.iterator();
while (itr.hasNext()) {
WebElement child = itr.next();
if (label.equals(child.getText())) {
return driver.getWidgetForElement(child);
}
}
return null;
}
public Widget getHeaderCell(int index) {
List<WebElement> children = getHeaderCells();
int i = -1;
Iterator<WebElement> itr = children.iterator();
while (itr.hasNext()) {
i++;
WebElement child = itr.next();
if (i == index) {
return driver.getWidgetForElement(child);
}
}
return null;
}
public Widget getColumnMenuButton() {
Widget scroller = getScroller();
WebElement button = scroller.getContentElement().findElement(By.xpath("div/div[contains(@class, 'qx-table-header-column-button')]"));
return driver.getWidgetForElement(button);
}
public Scroller getScroller() {
return (Scroller) findWidget(By.qxh("*/qx.ui.table.pane.Scroller"));
}
@Override
public void scrollTo(String direction, Integer position) {
getScroller().scrollTo(direction, position);
}
@Override
public Widget scrollToChild(String direction, org.openqa.selenium.By locator) {
return getScroller().scrollToChild(direction, locator);
}
@Override
public Long getMaximum(String direction) {
return getScroller().getMaximum(direction);
}
@Override
public Long getScrollPosition(String direction) {
return getScroller().getScrollPosition(direction);
}
public WebElement scrollToRow(Integer rowIndex) {
return getScroller().scrollToRow(rowIndex);
}
public WebElement getCellByText(String text) {
String cellPath = "//div[contains(@class, 'qooxdoo-table-cell') and text()='" + text + "']";
scrollToChild("y", org.openqa.selenium.By.xpath(cellPath));
return findElement(org.openqa.selenium.By.xpath(cellPath));
}
public List<HashMap> getSelectedRanges() {
String json = (String) jsRunner.runScript("getTableSelectedRanges", contentElement);
JSONParser parser = new JSONParser();
List<HashMap> ranges = null;
Object obj;
try {
obj = parser.parse(json);
JSONArray array = (JSONArray) obj;
ranges = new ArrayList<HashMap>();
Iterator<JSONObject> itr = array.iterator();
while (itr.hasNext()) {
JSONObject rangeMap = itr.next();
HashMap<String, Long> range = new HashMap<String, Long>();
range.put("minIndex", (Long) rangeMap.get("minIndex"));
range.put("maxIndex", (Long) rangeMap.get("maxIndex"));
ranges.add(range);
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ranges;
}
public Widget getCellEditor() {
Widget focusIndicator = getScroller().findWidget(By.qxh("qx.ui.table.pane.Clipper/qx.ui.table.pane.FocusIndicator"));
Widget editor = focusIndicator.findWidget(By.qxh("child[0]"));
if (editor.getClassname().equals("qx.ui.container.Composite")) {
editor = editor.findWidget(By.qxh("child[0]"));
}
return editor;
}
public Long getRowCount() {
Long result = (Long) jsRunner.runScript("getRowCount",
contentElement);
return result;
}
public Long getColumnCount() {
Long result = (Long) jsRunner.runScript("getColumnCount",
contentElement);
return result;
}
}