001 /* 002 * Created on Feb 1, 2008 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 005 * in compliance with 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 010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 011 * or implied. See the License for the specific language governing permissions and limitations under 012 * the License. 013 * 014 * Copyright @2008-2010 the original author or authors. 015 */ 016 package org.fest.swing.driver; 017 018 import static org.fest.swing.core.MouseButton.LEFT_BUTTON; 019 import static org.fest.swing.exception.ActionFailedException.actionFailure; 020 import static org.fest.swing.timing.Pause.pause; 021 import static org.fest.swing.util.Platform.isMacintosh; 022 import static org.fest.swing.util.Platform.isWindows; 023 import static org.fest.swing.util.TimeoutWatch.startWatchWithTimeoutOf; 024 025 import java.awt.*; 026 027 import org.fest.swing.annotation.RunsInEDT; 028 import org.fest.swing.core.*; 029 import org.fest.swing.core.Robot; 030 import org.fest.swing.exception.ActionFailedException; 031 import org.fest.swing.util.TimeoutWatch; 032 033 /** 034 * Understands drag and drop. 035 * 036 * @author Alex Ruiz 037 * 038 * @deprecated use <code>{@link ComponentDragAndDrop}</code> instead. This class will be removed in version 2.0. 039 */ 040 @Deprecated 041 public class DragAndDrop { 042 043 private final Robot robot; 044 045 /** 046 * Creates a new </code>{@link DragAndDrop}</code>. 047 * @param robot the robot to use to simulate user input. 048 * @deprecated use <code>{@link ComponentDragAndDrop}</code> instead. 049 */ 050 @Deprecated 051 public DragAndDrop(Robot robot) { 052 this.robot = robot; 053 } 054 055 /** Number of pixels traversed before a drag starts. */ 056 public static final int DRAG_THRESHOLD = isWindows() || isMacintosh() ? 10 : 16; 057 058 /** 059 * Performs a drag action at the given point. 060 * @param target the target component. 061 * @param where the point where to start the drag action. 062 * @deprecated use <code>{@link ComponentDragAndDrop}</code> instead. 063 */ 064 @RunsInEDT 065 @Deprecated public void drag(Component target, Point where) { 066 robot.pressMouse(target, where, LEFT_BUTTON); 067 int dragDelay = settings().dragDelay(); 068 if (dragDelay > delayBetweenEvents()) pause(dragDelay); 069 mouseMove(target, where.x, where.y); 070 robot.waitForIdle(); 071 } 072 073 @Deprecated private void mouseMove(Component target, int x, int y) { 074 if (isWindows() || isMacintosh()) { 075 mouseMoveOnWindowsAndMacintosh(target, x, y); 076 return; 077 } 078 mouseMove(target, 079 point(x + DRAG_THRESHOLD / 2, y + DRAG_THRESHOLD / 2), 080 point(x + DRAG_THRESHOLD, y + DRAG_THRESHOLD), 081 point(x + DRAG_THRESHOLD / 2, y + DRAG_THRESHOLD / 2), 082 point(x, y) 083 ); 084 } 085 086 @RunsInEDT 087 @Deprecated private void mouseMoveOnWindowsAndMacintosh(Component target, int x, int y) { 088 Dimension size = target.getSize(); 089 int dx = distance(x, size.width); 090 int dy = distance(y, size.height); 091 if (dx == 0 && dy == 0) dx = DRAG_THRESHOLD; 092 mouseMove(target, 093 point(x + dx / 4, y + dy / 4), 094 point(x + dx / 2, y + dy / 2), 095 point(x + dx, y + dy), 096 point(x + dx + 1, y + dy) 097 ); 098 } 099 100 @Deprecated private int distance(int coordinate, int dimension) { 101 return coordinate + DRAG_THRESHOLD < dimension ? DRAG_THRESHOLD : 0; 102 } 103 104 @Deprecated private Point point(int x, int y) { return new Point(x, y); } 105 106 /** 107 * Ends a drag operation, releasing the mouse button over the given target location. 108 * <p> 109 * This method is tuned for native drag/drop operations, so if you get odd behavior, you might try using a simple 110 * <code>{@link Robot#moveMouse(Component, int, int)}</code> and <code>{@link Robot#releaseMouseButtons()}</code>. 111 * @param target the target component. 112 * @param where the point where the drag operation ends. 113 * @throws ActionFailedException if there is no drag action in effect. 114 * @deprecated use <code>{@link ComponentDragAndDrop}</code> instead. 115 */ 116 @RunsInEDT 117 @Deprecated public void drop(Component target, Point where) { 118 dragOver(target, where); 119 TimeoutWatch watch = startWatchWithTimeoutOf(settings().eventPostingDelay() * 4); 120 while (!robot.isDragging()) { 121 if (watch.isTimeOut()) throw actionFailure("There is no drag in effect"); 122 pause(); 123 } 124 int dropDelay = settings().dropDelay(); 125 int delayBetweenEvents = delayBetweenEvents(); 126 if (dropDelay > delayBetweenEvents) pause(dropDelay - delayBetweenEvents); 127 robot.releaseMouseButtons(); 128 robot.waitForIdle(); 129 } 130 131 @Deprecated private int delayBetweenEvents() { 132 return settings().delayBetweenEvents(); 133 } 134 135 @Deprecated private Settings settings() { 136 return robot.settings(); 137 } 138 139 /** 140 * Move the mouse appropriately to get from the source to the destination. Enter/exit events will be generated where 141 * appropriate. 142 * @param target the target component. 143 * @param where the point to drag over. 144 * @deprecated use <code>{@link ComponentDragAndDrop}</code> instead. 145 */ 146 @Deprecated public void dragOver(Component target, Point where) { 147 dragOver(target, where.x, where.y); 148 } 149 150 @Deprecated private void dragOver(Component target, int x, int y) { 151 robot.moveMouse(target, x - 4, y); 152 robot.moveMouse(target, x, y); 153 } 154 155 @Deprecated private void mouseMove(Component target, Point...points) { 156 for (Point p : points) robot.moveMouse(target, p.x, p.y); 157 } 158 }