View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2008 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 ModelItemDropHandler<ModelItem>
23  {
24  	private final Class<T1> sourceClass;
25  	private final Class<T2> targetClass;
26  
27  	protected AbstractModelItemDropHandler( Class<T1> sourceClass, Class<T2> targetClass ) 
28  	{
29  		this.sourceClass = sourceClass;
30  		this.targetClass = targetClass;
31  	}
32  	
33  	@SuppressWarnings("unchecked")
34  	public boolean canDrop( ModelItem source, ModelItem target, int dropAction, int dropType )
35  	{
36  		try
37  		{
38  			if( sourceClass.isAssignableFrom( source.getClass() ) && 
39  				 targetClass.isAssignableFrom( target.getClass() ))
40  			{
41  				T1 sourceItem = ( T1 ) source;
42  				T2 targetItem = ( T2 ) target;
43  				
44  //				System.out.println( "in canDrop for " + sourceItem.getClass().getName() + " to "
45  //							+ targetItem.getClass().getName() );
46  				
47  				if( (dropAction & DnDConstants.ACTION_COPY) != 0 )
48  					return canCopy( sourceItem, targetItem, dropType );
49  				
50  				if( (dropAction & DnDConstants.ACTION_MOVE) != 0 )
51  					return canMove( sourceItem, targetItem, dropType );
52  			}
53  		}
54  		catch( Exception e )
55  		{
56  			SoapUI.logError( e );
57  		}
58  		
59  		return false;
60  	}
61  	
62  	private boolean canMove( T1 sourceItem, T2 targetItem, int dropType )
63  	{
64  		switch( dropType)
65  		{
66  			case DropType.BEFORE : return canMoveBefore( sourceItem, targetItem );
67  			case DropType.AFTER : return canMoveAfter( sourceItem, targetItem );
68  			case DropType.ON : return canMoveOn( sourceItem, targetItem );
69  		}
70  		
71  		return false;
72  	}
73  
74  	private boolean canCopy( T1 sourceItem, T2 targetItem, int dropType )
75  	{
76  		switch( dropType)
77  		{
78  			case DropType.BEFORE : return canCopyBefore( sourceItem, targetItem );
79  			case DropType.AFTER : return canCopyAfter( sourceItem, targetItem );
80  			case DropType.ON : return canCopyOn( sourceItem, targetItem );
81  		}
82  		
83  		return false;
84  	}
85  
86  	abstract boolean canCopyBefore( T1 source, T2 target );
87  	
88  	abstract boolean canMoveBefore( T1 source, T2 target );
89  	
90  	abstract boolean canMoveOn( T1 source, T2 target );
91  	
92  	abstract boolean canCopyOn( T1 source, T2 target );
93  	
94  	abstract boolean copyBefore( T1 source, T2 target );
95  	
96  	abstract boolean moveBefore( T1 source, T2 target );
97  	
98  	abstract boolean moveOn( T1 source, T2 target );
99  	
100 	abstract boolean canCopyAfter( T1 source, T2 target );
101 	
102 	abstract boolean canMoveAfter( T1 source, T2 target );
103 	
104 	abstract boolean copyAfter( T1 source, T2 target );
105 	
106 	abstract boolean copyOn( T1 source, T2 target );
107 	
108 	abstract boolean moveAfter( T1 source, T2 target );
109 	
110 	abstract String getCopyBeforeInfo( T1 source, T2 target );
111 
112 	abstract String getMoveBeforeInfo( T1 source, T2 target );
113 	
114 	abstract String getCopyOnInfo( T1 source, T2 target );
115 
116 	abstract String getMoveOnInfo( T1 source, T2 target );
117 	
118 	abstract String getCopyAfterInfo( T1 source, T2 target );
119 
120 	abstract String getMoveAfterInfo( T1 source, T2 target );
121 	
122 	@SuppressWarnings("unchecked")
123 	public String getDropInfo( ModelItem source, ModelItem target, int dropAction, int dropType )
124 	{
125 		try
126 		{
127 			if( sourceClass.isAssignableFrom( source.getClass() ) && 
128 				 targetClass.isAssignableFrom( target.getClass() ))
129 			{
130 				T1 sourceItem = ( T1 ) source;
131 				T2 targetItem = ( T2 ) target;
132 				
133 				if( (dropAction & DnDConstants.ACTION_COPY) != 0 )
134 					return getCopyInfo( sourceItem, targetItem, dropType );
135 				
136 				if( (dropAction & DnDConstants.ACTION_MOVE) != 0 )
137 					return getMoveInfo( sourceItem, targetItem, dropType );
138 			}
139 		}
140 		catch( Exception e )
141 		{
142 			SoapUI.logError( e );
143 		}
144 			
145 		return null;
146 	}
147 
148 	private String getMoveInfo( T1 sourceItem, T2 targetItem, int dropType )
149 	{
150 		switch( dropType )
151 		{
152 			case DropType.BEFORE : return getMoveBeforeInfo( sourceItem, targetItem );
153 			case DropType.AFTER : return getMoveAfterInfo( sourceItem, targetItem );
154 			case DropType.ON : return getMoveOnInfo( sourceItem, targetItem );
155 		}
156 		
157 		return null;
158 	}
159 
160 	private String getCopyInfo( T1 sourceItem, T2 targetItem, int dropType )
161 	{
162 		switch( dropType )
163 		{
164 			case DropType.BEFORE : return getCopyBeforeInfo( sourceItem, targetItem );
165 			case DropType.AFTER : return getCopyAfterInfo( sourceItem, targetItem );
166 			case DropType.ON : return getCopyOnInfo( sourceItem, targetItem );
167 		}
168 		
169 		return null;
170 	}
171 
172 	@SuppressWarnings("unchecked")
173 	public boolean drop( ModelItem source, ModelItem target, int dropAction, int dropType )
174 	{
175 		try
176 		{
177 			if( sourceClass.isAssignableFrom( source.getClass() ) && 
178 				 targetClass.isAssignableFrom( target.getClass() ))
179 			{
180 				T1 sourceItem = ( T1 ) source;
181 				T2 targetItem = ( T2 ) target;
182 				
183 				if( (dropAction & DnDConstants.ACTION_COPY) != 0 && canCopy( sourceItem, targetItem, dropType ) )
184 					return copy( sourceItem, targetItem, dropType );
185 				
186 				if( (dropAction & DnDConstants.ACTION_MOVE) != 0 && canMove( sourceItem, targetItem, dropType ) )
187 					return move( sourceItem, targetItem, dropType );
188 			}
189 		}
190 		catch( Exception e )
191 		{
192 			SoapUI.logError( e );
193 		}
194 			
195 		return false;
196 	}
197 
198 	private boolean move( T1 sourceItem, T2 targetItem, int dropType )
199 	{
200 		switch( dropType )
201 		{
202 			case DropType.BEFORE : return moveBefore( sourceItem, targetItem );
203 			case DropType.AFTER : return moveAfter( sourceItem, targetItem );
204 			case DropType.ON : return moveOn( sourceItem, targetItem );
205 		}
206 		
207 		return false;
208 	}
209 
210 	private boolean copy( T1 sourceItem, T2 targetItem, int dropType )
211 	{
212 		switch( dropType )
213 		{
214 			case DropType.BEFORE : return copyBefore( sourceItem, targetItem );
215 			case DropType.AFTER : return copyAfter( sourceItem, targetItem );
216 			case DropType.ON : return copyOn( sourceItem, targetItem );
217 		}
218 		
219 		return false;
220 	}
221 
222 }