1
2
3
4
5
6
7
8
9
10
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
45
46
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 }