1   /*
2    * Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton,
3    * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
4    *
5    * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
6    * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
7    * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
8    * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
9    * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
10   * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
11   * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
12   * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
13   * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
14   * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
15   * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
16   * OR MODIFICATIONS.
17   * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
18   * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
19   * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
20   * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
21   */
22  
23  package debugTest;
24  
25  import java.awt.GridBagConstraints;
26  import java.awt.GridBagLayout;
27  import java.awt.Insets;
28  import java.awt.datatransfer.DataFlavor;
29  import java.awt.datatransfer.Transferable;
30  import java.awt.datatransfer.UnsupportedFlavorException;
31  import java.awt.event.MouseAdapter;
32  import java.awt.event.MouseEvent;
33  import java.io.IOException;
34  import java.io.Serializable;
35  
36  import javax.swing.JComponent;
37  import javax.swing.JFrame;
38  import javax.swing.JLabel;
39  import javax.swing.JPanel;
40  import javax.swing.JTextField;
41  import javax.swing.TransferHandler;
42  
43  import de.desy.acop.transport.AccessMode;
44  
45  public class DnDPanel extends JPanel {
46  
47  	public class AcopMetaInfo implements Serializable {
48  		public String device;
49  		public String property;
50  		public AccessMode accessMode;
51  		public int accessRate;
52  		
53  		public AcopMetaInfo() {
54  		}
55  		
56  		public AcopMetaInfo(String d, String p, AccessMode am, int ar) {
57  			device=d;
58  			property=p;
59  			accessMode=am;
60  			accessRate=ar;
61  		}
62  		
63  		/* (non-Javadoc)
64  		 * @see java.lang.Object#toString()
65  		 */
66  		@Override
67  		public String toString() {
68  			return "AcopMetaInfo={d='"+device+"',p='"+property+"',am='"+accessMode+"',ar='"+accessRate+"'}";
69  		}
70  	}
71  	
72  	DataFlavor flavor= new DataFlavor(AcopMetaInfo.class,"Acop Meta Info Flavor");
73  	
74  	class AcopInfoLabel extends JLabel {
75  		AcopMetaInfo info;
76  		
77  		public AcopInfoLabel() {
78  			setTransferHandler(new TransferHandler() {
79  			
80  				@Override
81  				public boolean importData(JComponent comp, Transferable t) {
82  					try {
83  					if (t.isDataFlavorSupported(flavor)) {
84  						Object o=t.getTransferData(flavor);
85  						setInfo((AcopMetaInfo)o);
86  						return true;
87  					}
88  					if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
89  						setInfo(new AcopMetaInfo(
90  								getInfo().device,
91  								t.getTransferData(DataFlavor.stringFlavor).toString(),
92  								getInfo().accessMode,
93  								getInfo().accessRate));
94  						return true;
95  					}
96  					} catch (Exception e) {
97  						e.printStackTrace();
98  					}
99  					return false;
100 				}
101 			
102 				@Override
103 				protected Transferable createTransferable(JComponent c) {
104 					return new Transferable() {
105 					
106 						public Object getTransferData(DataFlavor flavor)
107 								throws UnsupportedFlavorException, IOException {
108 							if (flavor.isFlavorSerializedObjectType() && flavor.getRepresentationClass().equals(AcopMetaInfo.class)) {
109 								return getInfo();
110 							}
111 							if (flavor.isFlavorTextType()) {
112 								return getInfo().toString();
113 							}
114 							throw new UnsupportedFlavorException(flavor);
115 						}
116 					
117 						public boolean isDataFlavorSupported(DataFlavor flavor) {
118 							return ((flavor.isFlavorSerializedObjectType() && flavor.getRepresentationClass().equals(AcopMetaInfo.class)) || flavor.isFlavorTextType());
119 						}
120 					
121 						public DataFlavor[] getTransferDataFlavors() {
122 							return new DataFlavor[]{flavor,DataFlavor.stringFlavor};
123 						}
124 					};
125 				}
126 			
127 				@Override
128 				public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
129 					for (int i = 0; i < transferFlavors.length; i++) {
130 						if ((flavor.isFlavorSerializedObjectType() && flavor.getRepresentationClass().equals(AcopMetaInfo.class)) || transferFlavors[i].isFlavorTextType()) {
131 							return true;
132 						}
133 					}
134 					return false;
135 				}
136 				@Override
137 				public int getSourceActions(JComponent c) {
138 					return TransferHandler.COPY;
139 				}
140 			
141 			});
142 			addMouseListener(new MouseAdapter() {
143 			
144 				@Override
145 				public void mousePressed(MouseEvent e) {
146 					getTransferHandler().exportAsDrag(AcopInfoLabel.this,e,TransferHandler.COPY);
147 				}
148 			
149 			});
150 		}
151 
152 		public AcopMetaInfo getInfo() {
153 			return info;
154 		}
155 
156 		public void setInfo(AcopMetaInfo info) {
157 			this.info = info;
158 			setText(info.toString());
159 		}
160 		
161 	}
162 	
163 
164 	private JTextField field;
165 	private AcopInfoLabel label;
166 	
167 	
168 	
169 	public DnDPanel() {
170 		super();
171 		initialize();
172 	}
173 	
174 	
175 
176 	private void initialize() {
177 		
178 		setLayout(new GridBagLayout());
179 		
180 		field= new JTextField();
181 		field.setText("Some text.");
182 		field.setDragEnabled(true);
183 		
184 		label = new AcopInfoLabel();
185 		label.setInfo(new AcopMetaInfo("DEV01","ORB.X",AccessMode.READ,1000));
186 
187 		add(field, new GridBagConstraints(0,0,1,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(4,4,4,4),0,0));
188 		add(label, new GridBagConstraints(0,1,1,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(4,4,4,4),0,0));
189 	}
190 
191 
192 
193 	/**
194 	 * @param args
195 	 */
196 	public static void main(String[] args) {
197 		try {
198 			
199 			JFrame f= new JFrame();
200 			f.setContentPane(new DnDPanel());
201 			f.setSize(500,100);
202 			f.setVisible(true);
203 			
204 		} catch (Exception e) {
205 			e.printStackTrace();
206 		}
207 	}
208 
209 }