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 java.awt.Frame.*; 018 import static org.fest.swing.driver.ComponentStateValidator.validateIsEnabledAndShowing; 019 import static org.fest.swing.driver.WindowLikeContainerLocations.iconifyLocationOf; 020 import static org.fest.swing.driver.WindowLikeContainerLocations.maximizeLocationOf; 021 import static org.fest.swing.edt.GuiActionRunner.execute; 022 import static org.fest.swing.exception.ActionFailedException.actionFailure; 023 024 import java.awt.*; 025 026 import org.fest.swing.annotation.RunsInEDT; 027 import org.fest.swing.annotation.ThreadSafeAction; 028 import org.fest.swing.core.Robot; 029 import org.fest.swing.edt.GuiQuery; 030 import org.fest.swing.exception.ActionFailedException; 031 032 /** 033 * Understands functional testing of <code>{@link Frame}</code>s: 034 * <ul> 035 * <li>user input simulation</li> 036 * <li>state verification</li> 037 * <li>property value query</li> 038 * </ul> 039 * This class is intended for internal use only. Please use the classes in the package 040 * <code>{@link org.fest.swing.fixture}</code> in your tests. 041 * 042 * @author Alex Ruiz 043 * @author Yvonne Wang 044 */ 045 public class FrameDriver extends WindowDriver { 046 047 /** 048 * Creates a new </code>{@link FrameDriver}</code>. 049 * @param robot the robot to use to simulate user input. 050 */ 051 public FrameDriver(Robot robot) { 052 super(robot); 053 } 054 055 /** 056 * Iconifies the given <code>{@link Frame}</code>. 057 * @param frame the given <code>Frame</code>. 058 * @throws IllegalStateException if the <code>Frame</code> is not enabled. 059 * @throws IllegalStateException if the <code>Frame</code> is not showing on the screen. 060 */ 061 @RunsInEDT 062 public void iconify(Frame frame) { 063 moveMouseIgnoringAnyError(frame, iconifyInfo(frame)); 064 robot.waitForIdle(); 065 updateFrameExtendedState(frame, ICONIFIED); 066 } 067 068 @RunsInEDT 069 private static Point iconifyInfo(final Frame frame) { 070 return execute(new GuiQuery<Point>() { 071 protected Point executeInEDT() { 072 validateIsEnabledAndShowing(frame); 073 return iconifyLocationOf(frame); 074 } 075 }); 076 } 077 078 /** 079 * Deiconifies the given <code>{@link Frame}</code>. 080 * @param frame the given <code>Frame</code>. 081 * @throws IllegalStateException if the <code>Frame</code> is not enabled. 082 * @throws IllegalStateException if the <code>Frame</code> is not showing on the screen. 083 */ 084 @RunsInEDT 085 public void deiconify(Frame frame) { 086 assertIsEnabledAndShowing(frame); 087 updateFrameExtendedState(frame, NORMAL); 088 } 089 090 /** 091 * Normalizes the given <code>{@link Frame}</code>. 092 * @param frame the given <code>Frame</code>. 093 * @throws IllegalStateException if the <code>Frame</code> is not enabled. 094 * @throws IllegalStateException if the <code>Frame</code> is not showing on the screen. 095 */ 096 @RunsInEDT 097 public void normalize(Frame frame) { 098 assertIsEnabledAndShowing(frame); 099 updateFrameExtendedState(frame, NORMAL); 100 } 101 102 /** 103 * Makes the <code>{@link Frame}</code> full size. 104 * @param frame the target <code>Frame</code>. 105 * @throws IllegalStateException if the <code>Frame</code> is not enabled. 106 * @throws IllegalStateException if the <code>Frame</code> is not showing on the screen. 107 * @throws ActionFailedException if the operating system does not support maximizing frames. 108 */ 109 @RunsInEDT 110 public void maximize(Frame frame) { 111 moveMouseIgnoringAnyError(frame, maximizeInfo(frame)); 112 if (!supportsMaximize(Toolkit.getDefaultToolkit())) 113 throw actionFailure("Platform does not support maximizing frames"); 114 updateFrameExtendedState(frame, MAXIMIZED_BOTH); 115 } 116 117 @RunsInEDT 118 private static Point maximizeInfo(final Frame frame) { 119 return execute(new GuiQuery<Point>() { 120 protected Point executeInEDT() { 121 validateIsEnabledAndShowing(frame); 122 return maximizeLocationOf(frame); 123 } 124 }); 125 } 126 127 @ThreadSafeAction 128 private void updateFrameExtendedState(Frame frame, int state) { 129 frame.setExtendedState(state); 130 } 131 132 private static boolean supportsMaximize(Toolkit toolkit) { 133 return toolkit.isFrameStateSupported(MAXIMIZED_BOTH); 134 } 135 }