001 /* 002 * Created on Jan 27, 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.driver; 016 017 import static org.fest.swing.driver.ComponentStateValidator.validateIsEnabledAndShowing; 018 import static org.fest.swing.driver.WindowLikeContainerLocations.closeLocationOf; 019 import static org.fest.swing.edt.GuiActionRunner.execute; 020 021 import java.awt.*; 022 023 import org.fest.swing.annotation.RunsInEDT; 024 import org.fest.swing.core.Robot; 025 import org.fest.swing.edt.GuiQuery; 026 import org.fest.swing.edt.GuiTask; 027 import org.fest.swing.exception.ActionFailedException; 028 029 /** 030 * Understands functional testing of <code>{@link Window}</code>s: 031 * <ul> 032 * <li>user input simulation</li> 033 * <li>state verification</li> 034 * <li>property value query</li> 035 * </ul> 036 * This class is intended for internal use only. Please use the classes in the package 037 * <code>{@link org.fest.swing.fixture}</code> in your tests. 038 * 039 * @author Alex Ruiz 040 */ 041 public class WindowDriver extends ContainerDriver { 042 043 /** 044 * Creates a new </code>{@link WindowDriver}</code>. 045 * @param robot the robot to use to simulate user input. 046 */ 047 public WindowDriver(Robot robot) { 048 super(robot); 049 } 050 051 /** 052 * Resizes the <code>{@link Window}</code> horizontally. 053 * @param w the target <code>Window</code>. 054 * @param width the width that the <code>Window</code> should have after being resized. 055 * @throws ActionFailedException if the <code>Window</code> is not enabled. 056 * @throws ActionFailedException if the <code>Window</code> is not resizable by the user. 057 * @throws ActionFailedException if the <code>Window</code> is not showing on the screen. 058 */ 059 @RunsInEDT 060 public void resizeWidthTo(Window w, int width) { 061 resizeWidth(w, width); 062 } 063 064 /** 065 * Resizes the <code>{@link Window}</code> vertically. 066 * @param w the target <code>Window</code>. 067 * @param height the height that the <code>Window</code> should have after being resized. 068 * @throws ActionFailedException if the <code>Window</code> is not enabled. 069 * @throws ActionFailedException if the <code>Window</code> is not resizable by the user. 070 * @throws ActionFailedException if the <code>Window</code> is not showing on the screen. 071 */ 072 @RunsInEDT 073 public void resizeHeightTo(Window w, int height) { 074 resizeHeight(w, height); 075 } 076 077 /** 078 * Resizes the <code>{@link Window}</code> to the given size. 079 * @param w the target <code>Window</code>. 080 * @param size the size to resize the <code>Window</code> to. 081 * @throws ActionFailedException if the <code>Window</code> is not enabled. 082 * @throws ActionFailedException if the <code>Window</code> is not resizable by the user. 083 * @throws ActionFailedException if the <code>Window</code> is not showing on the screen. 084 */ 085 @RunsInEDT 086 public void resizeTo(Window w, Dimension size) { 087 resize(w, size.width, size.height); 088 } 089 090 /** 091 * Moves the <code>{@link Window}</code> to the given location. 092 * @param w the target <code>Window</code>. 093 * @param where the location to move the <code>Window</code> to. 094 * @throws ActionFailedException if the <code>Window</code> is not enabled. 095 * @throws ActionFailedException if the <code>Window</code> is not movable by the user. 096 * @throws ActionFailedException if the <code>Window</code> is not showing on the screen. 097 */ 098 public void moveTo(Window w, Point where) { 099 move(w, where.x, where.y); 100 } 101 102 /** 103 * Closing the <code>{@link Window}</code>. 104 * @param w the target <code>Window</code>. 105 * @throws ActionFailedException if the <code>Window</code> is not enabled. 106 * @throws ActionFailedException if the <code>Window</code> is not showing on the screen. 107 */ 108 @RunsInEDT 109 public void close(Window w) { 110 moveMouseIgnoringAnyError(w, closeInfo(w)); 111 robot.close(w); 112 } 113 114 @RunsInEDT 115 private static Point closeInfo(final Window w) { 116 return execute(new GuiQuery<Point>() { 117 protected Point executeInEDT() { 118 validateIsEnabledAndShowing(w); 119 return closeLocationOf(w); 120 } 121 }); 122 } 123 124 /** 125 * Shows the <code>{@link Window}</code>. 126 * @param w the target <code>Window</code>. 127 */ 128 @RunsInEDT 129 public void show(Window w) { 130 robot.showWindow(w); 131 } 132 133 /** 134 * Shows the <code>{@link Window}</code>, resized to the given size. 135 * @param w the target <code>Window</code>. 136 * @param size the size to resize the <code>Window</code> to. 137 */ 138 @RunsInEDT 139 public void show(Window w, Dimension size) { 140 robot.showWindow(w, size); 141 } 142 143 /** 144 * If the given <code>{@link Window}</code> is visible, brings it to the front and may make it the focused one. 145 * @param w the target <code>Window</code>. 146 */ 147 @RunsInEDT 148 public void moveToFront(Window w) { 149 doMoveToFront(w); 150 robot.waitForIdle(); 151 } 152 153 @RunsInEDT 154 private static void doMoveToFront(final Window w) { 155 execute(new GuiTask() { 156 protected void executeInEDT() { 157 w.toFront(); 158 } 159 }); 160 } 161 162 /** 163 * If the given <code>{@link Window}</code> is visible, sends it to the back and may cause it to lose focus or 164 * activation if it is the focused or active. 165 * @param w the target <code>Window</code>. 166 */ 167 @RunsInEDT 168 public void moveToBack(Window w) { 169 doMoveToBack(w); 170 robot.waitForIdle(); 171 } 172 173 @RunsInEDT 174 private static void doMoveToBack(final Window w) { 175 execute(new GuiTask() { 176 protected void executeInEDT() { 177 w.toBack(); 178 } 179 }); 180 } 181 }