View Javadoc

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