/*
* Created on Dec 19, 2007
*
* 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.
*
* Copyright @2007-2013 the original author or authors.
*/
package org.fest.swing.core;
import static java.lang.Math.max;
import static java.lang.Math.min;
import static org.fest.swing.core.ComponentLookupScope.DEFAULT;
import static org.fest.swing.util.Platform.isOSX;
import static org.fest.swing.util.Platform.isWindows;
import static org.fest.swing.util.Platform.isX11;
import javax.annotation.Nonnull;
import org.fest.util.VisibleForTesting;
/**
* FEST-Swing configuration settings.
*
* @author Alex Ruiz
*/
public class Settings {
private static final int DEFAULT_DELAY = 30000;
private ComponentLookupScope componentLookupScope;
private int timeoutToBeVisible;
private int timeoutToFindPopup;
private int timeoutToFindSubMenu;
private int delayBetweenEvents;
private int dragDelay;
private int dropDelay;
private int eventPostingDelay;
private int idleTimeout;
private java.awt.Robot robot;
public Settings() {
timeoutToBeVisible(DEFAULT_DELAY);
timeoutToFindPopup(DEFAULT_DELAY);
timeoutToFindSubMenu(100);
delayBetweenEvents(60);
dragDelay(0);
dropDelay(0);
eventPostingDelay(100);
componentLookupScope(DEFAULT);
idleTimeout(10000);
}
void attachTo(@Nonnull java.awt.Robot newRobot) {
robot = newRobot;
if (delayBetweenEvents < 0) {
delayBetweenEvents = this.robot.getAutoDelay();
} else {
updateRobotAutoDelay();
}
}
@VisibleForTesting
@Nonnull java.awt.Robot robot() {
return robot;
}
/**
* @return a value representing the millisecond count in between generated events. The default is 60 milliseconds.
*/
public int delayBetweenEvents() {
return delayBetweenEvents;
}
/**
* Updates the value representing the millisecond count in between generated events. Usually just set to 100-200 if
* you want to slow down the playback to simulate actual user input. The default is 60 milliseconds.
* <p>
* To change the speed of a GUI test, you need to change the values of both {@code delayBetweenEvents} and
* {@code eventPostingDelay}.
* </p>
*
* @param ms the millisecond count in between generated events. It should be between -1 and 60000.
* @see #eventPostingDelay(int)
*/
public void delayBetweenEvents(int ms) {
delayBetweenEvents = valueToUpdate(ms, -1, 60000);
if (robot != null) {
updateRobotAutoDelay();
}
}
private void updateRobotAutoDelay() {
robot.setAutoDelay(delayBetweenEvents);
}
/**
* @return the number of milliseconds to wait for an AWT or Swing {@code Component} to be visible. The default value
* is 30,000 milliseconds.
*/
public int timeoutToBeVisible() {
return timeoutToBeVisible;
}
/**
* Updates the number of milliseconds to wait for an AWT or Swing {@code Component} to be visible. The default value
* is 30,000 milliseconds.
*
* @param ms the time in milliseconds. It should be between 0 and 60000.
*/
public void timeoutToBeVisible(int ms) {
timeoutToBeVisible = valueToUpdate(ms, 0, 60000);
}
/**
* @return the number of milliseconds to wait before failing to find a pop-up menu that should appear. The default
* value is 30000 milliseconds.
*/
public int timeoutToFindPopup() {
return timeoutToFindPopup;
}
/**
* Updates the number of milliseconds to wait before failing to find a pop-up menu that should appear. The default
* value is 30000 milliseconds.
*
* @param ms the time in milliseconds. It should be between 0 and 60000.
*/
public void timeoutToFindPopup(int ms) {
timeoutToFindPopup = valueToUpdate(ms, 0, 60000);
}
/**
* @return the number of milliseconds to wait for a sub-menu to appear. The default value is 100 milliseconds.
* @since 1.2
*/
public int timeoutToFindSubMenu() {
return timeoutToFindSubMenu;
}
/**
* Updates the number of milliseconds to wait for a sub-menu to appear. The default value is 100 milliseconds.
*
* @param ms the time in milliseconds. It should be between 0 and 10000.
* @since 1.2
*/
public void timeoutToFindSubMenu(int ms) {
timeoutToFindSubMenu = valueToUpdate(ms, 0, 10000);
}
/**
* @return the number of milliseconds to wait between a pressing a mouse button and moving the mouse. The default
* value for Mac OS X or the X11 Windowing system is 100 milliseconds. For other platforms, the default value
* is 0.
*/
public int dragDelay() {
return dragDelay;
}
/**
* Updates the number of milliseconds to wait between a pressing a mouse button and moving the mouse. The default
* value for Mac OS X or the X11 Windowing system is 100 milliseconds. For other platforms, the default value is 0.
*
* @param ms the time in milliseconds. For Mac OS X or the X11 Windowing system, the minimum value is 100. For other
* platforms the minimum value is 0. The maximum value for all platforms is 60000.
*/
public void dragDelay(int ms) {
int min = isX11() || isOSX() ? 100 : 0;
dragDelay = valueToUpdate(ms, min, 60000);
}
/**
* @return the number of milliseconds before checking for idle. The default value is 100 milliseconds.
*/
public int eventPostingDelay() {
return eventPostingDelay;
}
/**
* <p>
* Updates the number of milliseconds before checking for idle. This allows the system a little time to put a native
* event onto the AWT event queue. The default value is 100 milliseconds.
* </p>
*
* <p>
* To change the speed of a GUI test, you need to change the values of both {@code delayBetweenEvents} and
* {@code eventPostingDelay}.
* </p>
*
* @param ms the time in milliseconds. It should be between 0 and 1000.
* @see #delayBetweenEvents(int)
*/
public void eventPostingDelay(int ms) {
eventPostingDelay = valueToUpdate(ms, 0, 1000);
}
/**
* @return the number of milliseconds between the final mouse movement and mouse release to ensure drop ends. The
* default value for Windows is 200. For other platforms, the default value is 0.
*/
public int dropDelay() {
return dropDelay;
}
/**
* Updates the number of milliseconds between the final mouse movement and mouse release to ensure drop ends. The
* default value for Windows is 200. For other platforms, the default value is 0.
*
* @param ms the time in milliseconds. For Windows, the minimum value is 200. For other platforms, the minimum value
* is 0. The maximum value for all platforms is 60000.
*/
public void dropDelay(int ms) {
int min = isWindows() ? 200 : 0;
dropDelay = valueToUpdate(ms, min, 60000);
}
/**
* @return the scope of AWT or Swing {@code Component} lookups. This setting only affects the classes in the package
* {@code org.fest.swing.fixture}. The default value is {@link ComponentLookupScope#DEFAULT}.
*/
public @Nonnull ComponentLookupScope componentLookupScope() {
return componentLookupScope;
}
/**
* Updates the scope of AWT or Swing {@code Component} lookups. This setting only affects the classes in the package
* {@code org.fest.swing.fixture}. The default value is {@link ComponentLookupScope#DEFAULT}.
*
* @param scope the new value for the scope.
*/
public void componentLookupScope(@Nonnull ComponentLookupScope scope) {
componentLookupScope = scope;
}
/**
* @return the time (in milliseconds) to wait for an idle AWT event queue. The default value is 10000 milliseconds.
*/
public int idleTimeout() {
return idleTimeout;
}
/**
* Updates the time (in milliseconds) to wait for an idle AWT event queue.
*
* @param ms the new time. The value should be equal to or greater than zero.
*/
public void idleTimeout(int ms) {
this.idleTimeout = valueToUpdate(ms, 0, Integer.MAX_VALUE);
}
private int valueToUpdate(int value, int min, int max) {
return max(min, min(max, value));
}
}