34
34
import java .awt .dnd .DragGestureEvent ;
35
35
import java .awt .dnd .DragGestureListener ;
36
36
import java .awt .dnd .DragSource ;
37
+ import java .awt .dnd .DragSourceAdapter ;
38
+ import java .awt .dnd .DragSourceDropEvent ;
37
39
import java .awt .dnd .DropTarget ;
38
40
import java .awt .dnd .DropTargetAdapter ;
39
41
import java .awt .dnd .DropTargetDragEvent ;
@@ -53,12 +55,12 @@ public class HeaderComponent extends JPanel implements DragGestureListener {
53
55
Icon icon ;
54
56
55
57
JLabel displayedNumber ;
56
-
58
+
57
59
Title displayedHeaderTitle ;
58
-
60
+
59
61
JPanel headerContent ;
60
62
TextArea textArea ;
61
-
63
+
62
64
JPopupMenu popupMenu ;
63
65
64
66
Color backgroundColor ;
@@ -69,18 +71,22 @@ public class HeaderComponent extends JPanel implements DragGestureListener {
69
71
static final Color FOCUS_COLOR = new Color (214 , 220 , 229 );
70
72
static final Color DND_TARGET_HOVERCOLOR = new Color (143 , 170 , 220 );
71
73
static final Color DND_TARGET_COLOR = new Color (180 , 199 , 231 );
72
-
74
+
73
75
protected Header connectedHeader ;
74
76
public static JPanel parentContainer ;
75
77
76
78
JPanel dropPanel ;
77
-
79
+
80
+ static volatile DropTargetListenerHeaderComponents lastDropTarget = null ;
78
81
JLabel dropUp ;
79
82
JLabel dropDown ;
80
83
JLabel dropSub ;
81
84
JPanel dropUpPanel ;
82
85
JPanel dropDownPanel ;
83
86
JPanel dropSubPanel ;
87
+ DropTargetListenerHeaderComponents dropUpTarget ;
88
+ DropTargetListenerHeaderComponents dropDownTarget ;
89
+ DropTargetListenerHeaderComponents dropSubTarget ;
84
90
85
91
/**
86
92
* Constructor for the HeaderComponent. Displays the whole Container with
@@ -113,6 +119,10 @@ public HeaderComponent(Color backgroundColor, Header connectedHeader) {
113
119
DragSource ds = new DragSource ();
114
120
ds .createDefaultDragGestureRecognizer (this , DnDConstants .ACTION_MOVE , this );
115
121
122
+ HeaderComponentDragSourceAdapter dragSourceAdapter = new HeaderComponentDragSourceAdapter ();
123
+ ds .addDragSourceMotionListener (dragSourceAdapter );
124
+ ds .addDragSourceListener (dragSourceAdapter );
125
+
116
126
generateAddingActions ();
117
127
generateShiftingActions ();
118
128
@@ -211,12 +221,16 @@ public void dragOver(DropTargetDragEvent dtde) {
211
221
enterAction ();
212
222
}
213
223
214
- private void enterAction () {
224
+ private void enterAction () {
225
+ //remove the DnDTargetElements from last HoveredElement.
226
+ //and now set the current to the lastDropTarget.
227
+ if (lastDropTarget != null ) { lastDropTarget .removeDnDTargetElements ();}
228
+ lastDropTarget = dropUpTarget ;
215
229
setSize (getWidth (), dropPanel .getHeight ());
216
230
remove (headerTitle );
217
231
add (dropPanel , BorderLayout .CENTER );
218
232
repaint ();
219
- revalidate ();
233
+ revalidate ();
220
234
}
221
235
222
236
@ Override
@@ -910,9 +924,9 @@ private void setUpDropElements() {
910
924
dropPanel .setVisible (true );
911
925
912
926
// Sets the panels as drop Targets
913
- new DropTargetListenerHeaderComponents (dropUpPanel , Direction .UP );
914
- new DropTargetListenerHeaderComponents (dropDownPanel , Direction .DOWN );
915
- new DropTargetListenerHeaderComponents (dropSubPanel , Direction .SUB );
927
+ dropUpTarget = new DropTargetListenerHeaderComponents (dropUpPanel , Direction .UP );
928
+ dropDownTarget = new DropTargetListenerHeaderComponents (dropDownPanel , Direction .DOWN );
929
+ dropSubTarget = new DropTargetListenerHeaderComponents (dropSubPanel , Direction .SUB );
916
930
}
917
931
918
932
/**
@@ -929,6 +943,15 @@ public void dragGestureRecognized(DragGestureEvent dge) {
929
943
dge .startDrag (cursor , new TransferableHeaderComponent (component ));
930
944
}
931
945
946
+ private class HeaderComponentDragSourceAdapter extends DragSourceAdapter {
947
+ @ Override
948
+ public void dragDropEnd (DragSourceDropEvent dsde ) {
949
+ //CleanUp, if the user dropped wrong and the dropTargets Were not removed yet.
950
+ if (!dsde .getDropSuccess () && lastDropTarget != null ){
951
+ lastDropTarget .removeDnDTargetElements ();
952
+ }
953
+ }
954
+ }
932
955
private class DropTargetListenerHeaderComponents extends DropTargetAdapter {
933
956
private JPanel target ;
934
957
private Direction direction ;
@@ -943,7 +966,7 @@ public DropTargetListenerHeaderComponents(JPanel target, Direction direction) {
943
966
* Removes the Drag and Drop Target Element, for example when the user is not in
944
967
* the Header anymore
945
968
*/
946
- private void removeDnDTargetElements () {
969
+ protected void removeDnDTargetElements () {
947
970
remove (dropPanel );
948
971
add (headerTitle , BorderLayout .CENTER );
949
972
repaint ();
@@ -1056,7 +1079,7 @@ public void dragOver(DropTargetDragEvent dtde) {
1056
1079
}
1057
1080
1058
1081
@ Override
1059
- public void dragEnter (DropTargetDragEvent dtde ) {
1082
+ public void dragEnter (DropTargetDragEvent dtde ) {
1060
1083
setUpHoverColor ();
1061
1084
}
1062
1085
@@ -1164,3 +1187,4 @@ else if (flavor.equals(DataFlavor.stringFlavor))
1164
1187
throw new UnsupportedFlavorException (flavor );
1165
1188
}
1166
1189
}
1190
+
0 commit comments