1
2
3
4
5 package com.eviware.soapui.support.propertyexpansion;
6
7 import java.awt.datatransfer.DataFlavor;
8 import java.awt.datatransfer.Transferable;
9 import java.awt.dnd.DropTargetDragEvent;
10 import java.awt.dnd.DropTargetDropEvent;
11 import java.awt.dnd.DropTargetEvent;
12 import java.awt.dnd.DropTargetListener;
13
14 import javax.swing.text.JTextComponent;
15
16 import com.eviware.soapui.SoapUI;
17 import com.eviware.soapui.model.propertyexpansion.PropertyExpansionImpl;
18 import com.eviware.soapui.model.propertyexpansion.PropertyExpansionUtils;
19 import com.eviware.soapui.model.tree.nodes.PropertyTreeNode.PropertyModelItem;
20 import com.eviware.soapui.support.UISupport;
21 import com.eviware.soapui.support.xml.JXEditTextArea;
22 import com.eviware.soapui.support.xml.XmlUtils;
23
24 public final class PropertyExpansionDropTarget implements DropTargetListener
25 {
26 private final PropertyExpansionTarget target;
27
28 public PropertyExpansionDropTarget( PropertyExpansionTarget target )
29 {
30 this.target = target;
31 }
32
33 public void dragEnter( DropTargetDragEvent dtde )
34 {
35 if( !isAcceptable( dtde.getTransferable() ) )
36 dtde.rejectDrag();
37 }
38
39 public void dragExit( DropTargetEvent dtde )
40 {
41 if( dtde.getDropTargetContext().getComponent() instanceof JTextComponent )
42 ((JTextComponent)dtde.getDropTargetContext().getComponent()).getCaret().setVisible( false );
43 else if( dtde.getDropTargetContext().getComponent() instanceof JXEditTextArea )
44 ((JXEditTextArea)dtde.getDropTargetContext().getComponent()).setCaretVisible( false );
45 }
46
47 public void dragOver( DropTargetDragEvent dtde )
48 {
49 if( !isAcceptable( dtde.getTransferable() ) )
50 dtde.rejectDrag();
51
52 if( dtde.getDropTargetContext().getComponent() instanceof JTextComponent )
53 {
54 JTextComponent textField = ( JTextComponent ) dtde.getDropTargetContext().getComponent();
55 int pos = textField.viewToModel( dtde.getLocation() );
56 if( pos != -1 )
57 {
58 textField.setCaretPosition( pos );
59 textField.getCaret().setVisible( true );
60 }
61 }
62
63 if( dtde.getDropTargetContext().getComponent() instanceof JXEditTextArea )
64 {
65 JXEditTextArea textField = ( JXEditTextArea ) dtde.getDropTargetContext().getComponent();
66 int pos = textField.pointToOffset( dtde.getLocation() );
67 if( pos != -1 )
68 {
69 textField.setCaretPosition( pos );
70 textField.setCaretVisible( true );
71 }
72 }
73
74 dtde.acceptDrag( dtde.getDropAction() );
75 }
76
77 public void drop( DropTargetDropEvent dtde )
78 {
79 if( !isAcceptable( dtde.getTransferable() ) )
80 dtde.rejectDrop();
81 else
82 {
83 try
84 {
85 Transferable transferable = dtde.getTransferable();
86 Object transferData = transferable.getTransferData( transferable.getTransferDataFlavors()[0] );
87 if( transferData instanceof PropertyModelItem )
88 {
89 dtde.acceptDrop( dtde.getDropAction() );
90 PropertyModelItem modelItem = ( PropertyModelItem ) transferData;
91
92 String xpath = modelItem.getXPath();
93 if( xpath == null && XmlUtils.seemsToBeXml( modelItem.getProperty().getValue() ))
94 {
95 xpath = UISupport.selectXPath( "Create PropertyExpansion", "Select XPath below",
96 modelItem.getProperty().getValue(), null );
97
98 if( xpath != null )
99 xpath = XmlUtils.removeXPathNamespaceDeclarations( xpath );
100 }
101
102 target.insertPropertyExpansion( new PropertyExpansionImpl( modelItem.getProperty(), xpath ), dtde.getLocation() );
103
104 dtde.dropComplete( true );
105 }
106 }
107 catch( Exception e )
108 {
109 SoapUI.logError( e );
110 }
111
112 if( dtde.getDropTargetContext().getComponent() instanceof JTextComponent )
113 ((JTextComponent)dtde.getDropTargetContext().getComponent()).getCaret().setVisible( false );
114 else if( dtde.getDropTargetContext().getComponent() instanceof JXEditTextArea )
115 ((JXEditTextArea)dtde.getDropTargetContext().getComponent()).setCaretVisible( false );
116 }
117 }
118
119 public void dropActionChanged( DropTargetDragEvent dtde )
120 {
121 }
122
123 public boolean isAcceptable( Transferable transferable )
124 {
125 DataFlavor[] flavors = transferable.getTransferDataFlavors();
126 for( int i = 0; i < flavors.length; i++ )
127 {
128 DataFlavor flavor = flavors[i];
129 if( flavor.isMimeTypeEqual( DataFlavor.javaJVMLocalObjectMimeType ) )
130 {
131 try
132 {
133 Object modelItem = transferable.getTransferData( flavor );
134 if( modelItem instanceof PropertyModelItem )
135 {
136 return PropertyExpansionUtils.canExpandProperty( target.getContextModelItem(),
137 ((PropertyModelItem)modelItem).getProperty() );
138 }
139 }
140 catch( Exception ex )
141 {
142 SoapUI.logError( ex );
143 }
144 }
145 }
146
147 return false;
148 }
149 }