org.richfaces.fragment.calendar.TimeSpinner Maven / Gradle / Ivy
/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.fragment.calendar;
import org.jboss.arquillian.graphene.Graphene;
import org.jboss.arquillian.graphene.fragment.Root;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.richfaces.fragment.calendar.TimeEditor.SetValueBy;
import org.richfaces.fragment.common.TextInputComponentImpl;
import org.richfaces.fragment.common.Utils;
/**
* Abstract class for spinner component.
* @author Jiri Stefek
* @param type of value
*/
public abstract class TimeSpinner {
@Root
private WebElement root;
@FindBy(css = "input.rf-cal-sp-inp")
private TextInputComponentImpl input;
@FindBy(className = "rf-cal-sp-up")
private WebElement buttonUpElement;
@FindBy(className = "rf-cal-sp-down")
private WebElement buttonDownElement;
public WebElement getButtonDownElement() {
return buttonDownElement;
}
public WebElement getButtonUpElement() {
return buttonUpElement;
}
public TextInputComponentImpl getInput() {
return input;
}
/**
* Returns value set in this spinner
* @return
*/
public abstract T getValue();
protected boolean isSameValueAreadySet(T value) {
return getValue().equals(value);
}
public boolean isVisible() {
return Utils.isVisible(getRootElement());
}
public void setValueBy(T value, SetValueBy by) {
switch (by) {
case BUTTONS:
setValueByButtons(value);
break;
case TYPING:
setValueByTyping(value);
break;
default:
throw new RuntimeException("Unknown switch.");
}
}
/**
* Sets spinner's value by clicking on the buttons
* @param value value to be set
*/
public abstract void setValueByButtons(T value);
/**
* Sets spinner value by direct input writing
* @param value value to be set
*/
public void setValueByTyping(T value) {
if (!isSameValueAreadySet(value)) {
getInput().clear().sendKeys(value.toString());
}
}
public void waitUntilIsVisible() {
Graphene.waitModel().withMessage("Waiting for time spinner to be visible.").until().element(getRootElement()).is().visible();
}
/**
* @return the root
*/
protected WebElement getRootElement() {
return root;
}
public static class TimeSpinner60 extends TimeSpinner {
private final int maxValue;
public TimeSpinner60() {
this(60);
}
public TimeSpinner60(int maxValue) {
this.maxValue = maxValue;
}
@Override
public Integer getValue() {
return getInput().getIntValue();
}
@Override
public void setValueByButtons(Integer value) {
if (!isSameValueAreadySet(value)) {
int actual = getValue();
int difference = actual - value;
int optimizedDifference = (difference < 0 ? maxValue + difference : difference - maxValue);
optimizedDifference = (Math.abs(optimizedDifference) > Math.abs(difference) ? difference : optimizedDifference);
if (optimizedDifference < 0) {
clickUp(optimizedDifference);
} else if (optimizedDifference > 0) {
clickDown(optimizedDifference);
}
}
}
private void clickUp(int times) {
for (int i = 0; i > times; i--) {
getButtonUpElement().click();
}
}
private void clickDown(int times) {
for (int i = 0; i < times; i++) {
getButtonDownElement().click();
}
}
}
public static class TimeSpinner12 extends TimeSpinner60 {
public TimeSpinner12() {
super(12);
}
}
public static class TimeSpinner24 extends TimeSpinner60 {
public TimeSpinner24() {
super(24);
}
}
public static class TimeSignSpinner extends TimeSpinner {
@Override
public TimeSign getValue() {
return TimeSign.valueOf(getInput().getStringValue().toUpperCase());
}
@Override
public void setValueByButtons(TimeSign value) {
if (!isSameValueAreadySet(value)) {
getButtonDownElement().click();
if (!getValue().equals(value)) {
throw new RuntimeException("The time sign spinner should contain only 2 values: am, pm");
}
}
}
}
public static enum TimeSign {
AM,
PM;
}
}