View Javadoc

1   /*
2    *  soapUI Pro, copyright (C) 2007 eviware software ab 
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 }