// Copyright 2012 Georg-August-Universität Göttingen, Germany
//
// Licensed 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 de.ugoe.cs.autoquest.plugin.html.eventcore;
import java.util.Map;
import java.util.logging.Level;
import de.ugoe.cs.autoquest.eventcore.IEventType;
import de.ugoe.cs.autoquest.eventcore.gui.IInteraction;
import de.ugoe.cs.autoquest.eventcore.gui.KeyboardFocusChange;
import de.ugoe.cs.autoquest.eventcore.gui.MouseButtonInteraction;
import de.ugoe.cs.autoquest.eventcore.gui.MouseClick;
import de.ugoe.cs.autoquest.eventcore.gui.MouseDoubleClick;
import de.ugoe.cs.autoquest.eventcore.gui.Scroll;
import de.ugoe.cs.autoquest.eventcore.gui.TextInput;
import de.ugoe.cs.autoquest.eventcore.gui.ValueSelection;
import de.ugoe.cs.autoquest.eventcore.guimodel.ICheckBox;
import de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement;
import de.ugoe.cs.autoquest.eventcore.guimodel.IRadioButton;
import de.ugoe.cs.autoquest.eventcore.guimodel.ITextArea;
import de.ugoe.cs.autoquest.eventcore.guimodel.ITextField;
import de.ugoe.cs.util.console.Console;
/**
*
* TODO comment
*
*
* @author Patrick Harms
* @author Fabian Glaser
*/
public class HTMLEventTypeFactory {
/** */
private static HTMLEventTypeFactory instance = new HTMLEventTypeFactory();
/**
*
* TODO: comment
*
*
*/
private HTMLEventTypeFactory() {}
/**
*
* TODO: comment
*
*
* @return
*/
public static HTMLEventTypeFactory getInstance() {
return instance;
}
/**
*
* TODO: comment
*
*
* @param eventName
* @param eventParameters
* @return
*/
public IEventType getEventType(String eventName, Map eventParameters,
IGUIElement guiElement) {
IInteraction result = null;
if ("onscroll".equals(eventName)) {
int[] coordinates =
getCoordinateParameter("scrollX", "scrollY", eventName, eventParameters);
result = new Scroll(coordinates[0], coordinates[1]);
}
else if ("onclick".equals(eventName)) {
int[] coordinates = getCoordinateParameter("X", "Y", eventName, eventParameters);
result =
new MouseClick(MouseButtonInteraction.Button.LEFT, coordinates[0], coordinates[1]);
}
else if ("ondblclick".equals(eventName)) {
int[] coordinates = getCoordinateParameter("X", "Y", eventName, eventParameters);
result = new MouseDoubleClick
(MouseButtonInteraction.Button.LEFT, coordinates[0], coordinates[1]);
}
else if ("onchange".equals(eventName)) {
String value = eventParameters.get("selectedValue");
if ((guiElement instanceof ITextArea) || (guiElement instanceof ITextField)) {
result = new TextInput(value, null);
}
else if ((guiElement instanceof IRadioButton) || (guiElement instanceof ICheckBox)) {
result = new ValueSelection(value);
}
else {
throw new IllegalArgumentException("can not handle onchange events on GUI " +
"elements of type " + guiElement.getClass());
}
}
else if ("onfocus".equals(eventName)) {
result = new KeyboardFocusChange();
}
else if ("onunload".equals(eventName) || "onbeforeunload".equals(eventName) ||
"onpagehide".equals(eventName) || "onpageshow".equals(eventName) ||
"onsubmit".equals(eventName) || "onselect".equals(eventName) ||
"onreset".equals(eventName))
{
Console.traceln(Level.FINE, "Ignored event name \"" + eventName + "\"");
}
else {
throw new IllegalArgumentException("unknown event name: \"" + eventName + "\"");
}
return result;
}
/**
*
* TODO: comment
*
*
* @param eventName
* @param eventParameters
* @return
*/
private int[] getCoordinateParameter(String xParamName,
String yParamName,
String eventName,
Map eventParameters)
{
String xCoord = eventParameters.get(xParamName);
if (xCoord == null) {
throw new IllegalArgumentException
("eventParameters do not contain " + xParamName + " coordinate.");
}
String yCoord = eventParameters.get(yParamName);
if (yCoord == null) {
throw new IllegalArgumentException
("eventParameters do not contain " + yParamName + " coordinate.");
}
try {
return new int[]
{ Integer.parseInt(xCoord), Integer.parseInt(yCoord) };
}
catch (NumberFormatException e) {
throw new IllegalArgumentException("the coordinates provided by an " + eventName +
" event are no numbers");
}
}
}