View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2010 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
11   */
12  
13  package com.eviware.soapui.support.dnd.handlers;
14  
15  import java.awt.dnd.DnDConstants;
16  
17  import com.eviware.soapui.SoapUI;
18  import com.eviware.soapui.model.ModelItem;
19  import com.eviware.soapui.support.dnd.DropType;
20  import com.eviware.soapui.support.dnd.ModelItemDropHandler;
21  
22  public abstract class AbstractModelItemDropHandler<T1 extends ModelItem, T2 extends ModelItem> implements
23  		ModelItemDropHandler<ModelItem>
24  {
25  	private final Class<T1> sourceClass;
26  	private final Class<T2> targetClass;
27  
28  	protected AbstractModelItemDropHandler( Class<T1> sourceClass, Class<T2> targetClass )
29  	{
30  		this.sourceClass = sourceClass;
31  		this.targetClass = targetClass;
32  	}
33  
34  	@SuppressWarnings( "unchecked" )
35  	public boolean canDrop( ModelItem source, ModelItem target, int dropAction, int dropType )
36  	{
37  		try
38  		{
39  			if( sourceClass.isAssignableFrom( source.getClass() ) && targetClass.isAssignableFrom( target.getClass() ) )
40  			{
41  				T1 sourceItem = ( T1 )source;
42  				T2 targetItem = ( T2 )target;
43  
44  				// System.out.println( "in canDrop for " +
45  				// sourceItem.getClass().getName() + " to "
46  				// + targetItem.getClass().getName() );
47  
48  				if( ( dropAction & DnDConstants.ACTION_COPY ) != 0 )
49  					return canCopy( sourceItem, targetItem, dropType );
50  
51  				if( ( dropAction & DnDConstants.ACTION_MOVE ) != 0 )
52  					return canMove( sourceItem, targetItem, dropType );
53  			}
54  		}
55  		catch( Exception e )
56  		{
57  			SoapUI.logError( e );
58  		}
59  
60  		return false;
61  	}
62  
63  	private boolean canMove( T1 sourceItem, T2 targetItem, int dropType )
64  	{
65  		switch( dropType )
66  		{
67  		case DropType.BEFORE :
68  			return canMoveBefore( sourceItem, targetItem );
69  		case DropType.AFTER :
70  			return canMoveAfter( sourceItem, targetItem );
71  		case DropType.ON :
72  			return canMoveOn( sourceItem, targetItem );
73  		}
74  
75  		return false;
76  	}
77  
78  	private boolean canCopy( T1 sourceItem, T2 targetItem, int dropType )
79  	{
80  		switch( dropType )
81  		{
82  		case DropType.BEFORE :
83  			return canCopyBefore( sourceItem, targetItem );
84  		case DropType.AFTER :
85  			return canCopyAfter( sourceItem, targetItem );
86  		case DropType.ON :
87  			return canCopyOn( sourceItem, targetItem );
88  		}
89  
90  		return false;
91  	}
92  
93  	abstract boolean canCopyBefore( T1 source, T2 target );
94  
95  	abstract boolean canMoveBefore( T1 source, T2 target );
96  
97  	abstract boolean canMoveOn( T1 source, T2 target );
98  
99  	abstract boolean canCopyOn( T1 source, T2 target );
100 
101 	abstract boolean copyBefore( T1 source, T2 target );
102 
103 	abstract boolean moveBefore( T1 source, T2 target );
104 
105 	abstract boolean moveOn( T1 source, T2 target );
106 
107 	abstract boolean canCopyAfter( T1 source, T2 target );
108 
109 	abstract boolean canMoveAfter( T1 source, T2 target );
110 
111 	abstract boolean copyAfter( T1 source, T2 target );
112 
113 	abstract boolean copyOn( T1 source, T2 target );
114 
115 	abstract boolean moveAfter( T1 source, T2 target );
116 
117 	abstract String getCopyBeforeInfo( T1 source, T2 target );
118 
119 	abstract String getMoveBeforeInfo( T1 source, T2 target );
120 
121 	abstract String getCopyOnInfo( T1 source, T2 target );
122 
123 	abstract String getMoveOnInfo( T1 source, T2 target );
124 
125 	abstract String getCopyAfterInfo( T1 source, T2 target );
126 
127 	abstract String getMoveAfterInfo( T1 source, T2 target );
128 
129 	@SuppressWarnings( "unchecked" )
130 	public String getDropInfo( ModelItem source, ModelItem target, int dropAction, int dropType )
131 	{
132 		try
133 		{
134 			if( sourceClass.isAssignableFrom( source.getClass() ) && targetClass.isAssignableFrom( target.getClass() ) )
135 			{
136 				T1 sourceItem = ( T1 )source;
137 				T2 targetItem = ( T2 )target;
138 
139 				if( ( dropAction & DnDConstants.ACTION_COPY ) != 0 )
140 					return getCopyInfo( sourceItem, targetItem, dropType );
141 
142 				if( ( dropAction & DnDConstants.ACTION_MOVE ) != 0 )
143 					return getMoveInfo( sourceItem, targetItem, dropType );
144 			}
145 		}
146 		catch( Exception e )
147 		{
148 			SoapUI.logError( e );
149 		}
150 
151 		return null;
152 	}
153 
154 	private String getMoveInfo( T1 sourceItem, T2 targetItem, int dropType )
155 	{
156 		switch( dropType )
157 		{
158 		case DropType.BEFORE :
159 			return getMoveBeforeInfo( sourceItem, targetItem );
160 		case DropType.AFTER :
161 			return getMoveAfterInfo( sourceItem, targetItem );
162 		case DropType.ON :
163 			return getMoveOnInfo( sourceItem, targetItem );
164 		}
165 
166 		return null;
167 	}
168 
169 	private String getCopyInfo( T1 sourceItem, T2 targetItem, int dropType )
170 	{
171 		switch( dropType )
172 		{
173 		case DropType.BEFORE :
174 			return getCopyBeforeInfo( sourceItem, targetItem );
175 		case DropType.AFTER :
176 			return getCopyAfterInfo( sourceItem, targetItem );
177 		case DropType.ON :
178 			return getCopyOnInfo( sourceItem, targetItem );
179 		}
180 
181 		return null;
182 	}
183 
184 	@SuppressWarnings( "unchecked" )
185 	public boolean drop( ModelItem source, ModelItem target, int dropAction, int dropType )
186 	{
187 		try
188 		{
189 			if( sourceClass.isAssignableFrom( source.getClass() ) && targetClass.isAssignableFrom( target.getClass() ) )
190 			{
191 				T1 sourceItem = ( T1 )source;
192 				T2 targetItem = ( T2 )target;
193 
194 				if( ( dropAction & DnDConstants.ACTION_COPY ) != 0 && canCopy( sourceItem, targetItem, dropType ) )
195 					return copy( sourceItem, targetItem, dropType );
196 
197 				if( ( dropAction & DnDConstants.ACTION_MOVE ) != 0 && canMove( sourceItem, targetItem, dropType ) )
198 					return move( sourceItem, targetItem, dropType );
199 			}
200 		}
201 		catch( Exception e )
202 		{
203 			SoapUI.logError( e );
204 		}
205 
206 		return false;
207 	}
208 
209 	private boolean move( T1 sourceItem, T2 targetItem, int dropType )
210 	{
211 		switch( dropType )
212 		{
213 		case DropType.BEFORE :
214 			return moveBefore( sourceItem, targetItem );
215 		case DropType.AFTER :
216 			return moveAfter( sourceItem, targetItem );
217 		case DropType.ON :
218 			return moveOn( sourceItem, targetItem );
219 		}
220 
221 		return false;
222 	}
223 
224 	private boolean copy( T1 sourceItem, T2 targetItem, int dropType )
225 	{
226 		switch( dropType )
227 		{
228 		case DropType.BEFORE :
229 			return copyBefore( sourceItem, targetItem );
230 		case DropType.AFTER :
231 			return copyAfter( sourceItem, targetItem );
232 		case DropType.ON :
233 			return copyOn( sourceItem, targetItem );
234 		}
235 
236 		return false;
237 	}
238 
239 }