001 /* 002 * Created on Jul 18, 2008 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 005 * the License. You may obtain a copy of the License at 006 * 007 * http://www.apache.org/licenses/LICENSE-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 010 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 011 * specific language governing permissions and limitations under the License. 012 * 013 * Copyright @2008-2010 the original author or authors. 014 */ 015 package org.fest.swing.fixture; 016 017 import java.awt.Component; 018 019 import org.fest.swing.core.*; 020 import org.fest.swing.driver.ComponentDriver; 021 import org.fest.swing.timing.Timeout; 022 023 /** 024 * A generic component fixture providing basic keyboard and mouse input operations. Useful as a base class for 025 * specialized fixtures providing higher level input operations for custom components. 026 * <p> 027 * Example: 028 * 029 * <pre> 030 * public class MyWidget extends JComponent { 031 * ... 032 * public void paintComponent(Graphics g) { 033 * ... 034 * } 035 * ... 036 * } 037 * 038 * public class MyWidgetFixture extends GenericComponentFixture<MyWidget> { 039 * public MyWidgetFixture(Robot robot, MyWidget target) { 040 * super(robot, target); 041 * } 042 * 043 * public void clickAndDrag(Point start, Point end) { 044 * robot.pressMouse(target, start); 045 * robot.moveMouse(target, end); 046 * robot.releaseAllMouseButtons(); 047 * } 048 * } 049 * 050 * </pre> 051 * 052 * </p> 053 * @param <T> the type of <code>Component</code> that this fixture can manage. 054 * 055 * @author <a href="mailto:simeon.fitch@mseedsoft.com">Simeon H.K. Fitch</a> 056 */ 057 public abstract class GenericComponentFixture<T extends Component> extends ComponentFixture<T> implements 058 CommonComponentFixture { 059 060 /** Delegate for constructing and passing input operations to Robot. */ 061 private ComponentDriver driver; 062 063 /** 064 * Creates a new <code>{@link GenericComponentFixture}</code>. 065 * @param robot performs simulation of user events on the given target component. 066 * @param target the target <code>Component</code> to be managed by this fixture. 067 * @throws NullPointerException if <code>robot</code> is <code>null</code>. 068 * @throws NullPointerException if <code>target</code> is <code>null</code>. 069 */ 070 public GenericComponentFixture(Robot robot, T target) { 071 this(robot, new ComponentDriver(robot), target); 072 } 073 074 /** 075 * Creates a new <code>{@link GenericComponentFixture}</code> using a provided driver. 076 * @param robot performs simulation of user events on the given target component. 077 * @param driver provided driver to handle input requests. 078 * @param target the target <code>Component</code> to be managed by this fixture. 079 * @throws NullPointerException if <code>robot</code> is <code>null</code>. 080 * @throws NullPointerException if <code>driver</code> is <code>null</code>. 081 * @throws NullPointerException if <code>target</code> is <code>null</code>. 082 */ 083 public GenericComponentFixture(Robot robot, ComponentDriver driver, T target) { 084 super(robot, target); 085 driver(driver); 086 } 087 088 /** 089 * Sets the <code>{@link ComponentDriver}</code> to be used by this fixture. 090 * @param newDriver the new <code>ComponentDriver</code>. 091 * @throws NullPointerException if the given driver is <code>null</code>. 092 */ 093 protected final void driver(ComponentDriver newDriver) { 094 validateNotNull(newDriver); 095 this.driver = newDriver; 096 } 097 098 /** 099 * Returns the <code>{@link ComponentDriver}</code> used by this fixture. 100 * @return the driver used by this fixture. 101 */ 102 protected final ComponentDriver driver() { 103 return driver; 104 } 105 106 /** {@inheritDoc} */ 107 public GenericComponentFixture<T> click() { 108 driver.click(target); 109 return this; 110 } 111 112 /** {@inheritDoc} */ 113 public GenericComponentFixture<T> click(MouseButton button) { 114 driver.click(target, button); 115 return this; 116 } 117 118 /** {@inheritDoc} */ 119 public GenericComponentFixture<T> click(MouseClickInfo mouseClickInfo) { 120 driver.click(target, mouseClickInfo); 121 return this; 122 } 123 124 /** {@inheritDoc} */ 125 public GenericComponentFixture<T> doubleClick() { 126 driver.doubleClick(target); 127 return this; 128 } 129 130 131 /** {@inheritDoc} */ 132 public GenericComponentFixture<T> rightClick() { 133 driver.rightClick(target); 134 return this; 135 } 136 137 /** {@inheritDoc} */ 138 public GenericComponentFixture<T> focus() { 139 driver.focus(target); 140 return this; 141 } 142 143 /** {@inheritDoc} */ 144 public GenericComponentFixture<T> pressAndReleaseKey(KeyPressInfo keyPressInfo) { 145 driver.pressAndReleaseKey(target, keyPressInfo); 146 return this; 147 } 148 149 /** {@inheritDoc} */ 150 public GenericComponentFixture<T> pressAndReleaseKeys(int... keyCodes) { 151 driver.pressAndReleaseKeys(target, keyCodes); 152 return this; 153 } 154 155 /** {@inheritDoc} */ 156 public GenericComponentFixture<T> pressKey(int keyCode) { 157 driver.pressKey(target, keyCode); 158 return this; 159 } 160 161 /** {@inheritDoc} */ 162 public GenericComponentFixture<T> releaseKey(int keyCode) { 163 driver.releaseKey(target, keyCode); 164 return this; 165 } 166 167 /** {@inheritDoc} */ 168 public GenericComponentFixture<T> requireEnabled() { 169 driver.requireEnabled(target); 170 return this; 171 } 172 173 /** {@inheritDoc} */ 174 public GenericComponentFixture<T> requireEnabled(Timeout timeout) { 175 driver.requireEnabled(target, timeout); 176 return this; 177 } 178 179 /** {@inheritDoc} */ 180 public GenericComponentFixture<T> requireDisabled() { 181 driver.requireDisabled(target); 182 return this; 183 } 184 185 /** {@inheritDoc} */ 186 public GenericComponentFixture<T> requireVisible() { 187 driver.requireVisible(target); 188 return this; 189 } 190 191 /** {@inheritDoc} */ 192 public GenericComponentFixture<T> requireNotVisible() { 193 driver.requireNotVisible(target); 194 return this; 195 } 196 197 /** {@inheritDoc} */ 198 public GenericComponentFixture<T> requireFocused() { 199 driver.requireFocused(target); 200 return this; 201 } 202 }