1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package de.desy.acop.displayers.tools;
24
25 import java.awt.Component;
26 import java.awt.datatransfer.DataFlavor;
27 import java.awt.datatransfer.Transferable;
28 import java.awt.datatransfer.UnsupportedFlavorException;
29 import java.beans.PropertyChangeEvent;
30 import java.beans.PropertyVetoException;
31 import java.io.IOException;
32
33 import javax.swing.JComponent;
34
35 import com.cosylab.gui.displayers.DisplayerParameters;
36 import com.cosylab.gui.displayers.DoubleDisplayer;
37 import com.cosylab.gui.util.DefaultDisplayerParametersTransferHandler;
38 import com.cosylab.gui.util.DisplayerParametersFlavor;
39 import com.cosylab.introspection.BeanIntrospector;
40
41 import de.desy.acop.displayers.selector.ChannelSelector;
42 import de.desy.acop.displayers.selector.SelectorUtilities;
43 import de.desy.acop.transport.ConnectionParameters;
44
45
46
47
48
49
50
51
52
53 public class AcopDisplayerTransferHandler extends DefaultDisplayerParametersTransferHandler {
54
55 private static final long serialVersionUID = -8218250806158424887L;
56
57
58
59
60
61
62
63 public AcopDisplayerTransferHandler(AcopDisplayer comp) {
64 super(comp, true, true, new DataFlavor[]{AcopDisplayerParametersFlavor.FLAVOR,
65 DisplayerParametersFlavor.FLAVOR,ConnectionParametersFlavor.FLAVOR,
66 DataFlavor.stringFlavor}, true);
67 }
68
69
70
71
72
73 @Override
74 protected DisplayerParameters exportDisplayerParameters() {
75 AcopDisplayer disp = (AcopDisplayer)displayer;
76 ConnectionParameters parameters = disp.getConnectionParameters();
77 int index = disp.getArrayIndex();
78 if (disp instanceof DoubleDisplayer) {
79 return new AcopDisplayerParameters(parameters, index,
80 ((DoubleDisplayer)disp).getMinimum(),((DoubleDisplayer)disp).getMaximum(),
81 ((DoubleDisplayer)disp).getUnits(),((DoubleDisplayer)disp).getFormat(),disp.getConverter());
82 }
83 else return new AcopDisplayerParameters(parameters, index, disp.getConverter());
84 }
85
86
87
88
89 @Override
90 public Object getTransferData(DataFlavor flavor)
91 throws UnsupportedFlavorException, IOException {
92 if (flavor instanceof AcopDisplayerParametersFlavor) {
93 return new AcopDisplayerParameters[]{
94 (AcopDisplayerParameters) exportDisplayerParameters()};
95 } else if (flavor instanceof ConnectionParametersFlavor) {
96 return new ConnectionParameters[]{
97 ((AcopDisplayerParameters) exportDisplayerParameters()).getConnectionParameters()};
98 } else if (flavor.isFlavorTextType()) {
99 return ((AcopDisplayerParameters) exportDisplayerParameters()).getConnectionParameters().getRemoteName();
100 } else {
101 return super.getTransferData(flavor);
102 }
103
104
105 }
106
107
108
109
110
111 @Override
112 public boolean importData(JComponent comp, Transferable t) {
113 try {
114 if (t.isDataFlavorSupported(AcopDisplayerParametersFlavor.FLAVOR)) {
115 Object[] drop = (Object[]) t.getTransferData(AcopDisplayerParametersFlavor.FLAVOR);
116 DisplayerParameters[] dp = null;
117 dp = castParameters(drop);
118 if (dp!=null) {
119 return importDisplayerParameters(dp);
120 }
121 } else if (t.isDataFlavorSupported(ConnectionParametersFlavor.FLAVOR)) {
122 Object drop = t.getTransferData(ConnectionParametersFlavor.FLAVOR);
123
124 if (drop != null) {
125 ConnectionParameters[] cp = null;
126 if (drop instanceof ConnectionParameters) {
127 cp = new ConnectionParameters[]{(ConnectionParameters)drop};
128 } else if (drop instanceof ConnectionParameters[]) {
129 cp = (ConnectionParameters[])drop;
130 } else {
131 return super.importData(comp, t);
132 }
133
134 AcopDisplayerParameters[] param = new AcopDisplayerParameters[cp.length];
135 for (int i = 0; i < param.length; i++) {
136 param[i] = new AcopDisplayerParameters(cp[i]);
137 }
138
139 return importDisplayerParameters(param);
140 }
141 }
142 return super.importData(comp, t);
143 } catch (Exception e) {
144 e.printStackTrace();
145 }
146 return false;
147
148 }
149
150
151
152
153
154 @Override
155 protected boolean importString(String string) throws PropertyVetoException {
156 if (string.indexOf('\n') > 0) {
157 return false;
158 }
159 try {
160 ConnectionParameters cp = new ConnectionParameters(string);
161 return importDisplayerParameters(new AcopDisplayerParameters[]{new AcopDisplayerParameters(cp)});
162 } catch (IllegalArgumentException e) {
163 return false;
164 }
165
166 }
167
168
169
170
171
172 @Override
173 protected DisplayerParameters[] castParameters(Object... parameters) {
174 if (parameters instanceof AcopDisplayerParameters[]) {
175 return (AcopDisplayerParameters[])parameters.getClass().cast(parameters);
176 } else if (parameters.length == 1) {
177 if (parameters[0] instanceof AcopDisplayerParameters[]) {
178 return (AcopDisplayerParameters[]) parameters[0];
179 } else if (parameters[0] instanceof AcopDisplayerParameters) {
180 return new AcopDisplayerParameters[] {(AcopDisplayerParameters)parameters[0]};
181 }
182 }
183 return super.castParameters(parameters);
184 }
185
186 protected int selectChannelIndex(ConnectionParameters cp) {
187 int length = SelectorUtilities.getSequenceLength(cp);
188 if (length==1) {
189 return 1;
190 }
191 return ChannelSelector.selectChannelDialog((Component) displayer, length, ((AcopDisplayer)displayer).getArrayIndex());
192 }
193
194
195
196
197
198 @Override
199 public boolean setParametersToDisplayer(Object disp, DisplayerParameters parameters) throws PropertyVetoException {
200 if (!(parameters instanceof AcopDisplayerParameters))
201 super.setParametersToDisplayer(disp, parameters);
202
203 String[] n= parameters.getNames();
204 Object[] o= parameters.getValues();
205
206 ConnectionParameters cp = null;
207 int index = -1;
208 for (int i = 0; i < n.length ; i++) {
209 if (AcopDisplayer.CONNECTION_PARAMETERS_PROPERTY.equals(n[i])) {
210 cp = (ConnectionParameters) o[i];
211 if (SelectorUtilities.isChannel(cp)) {
212 index = 0;
213 } else {
214 index = selectChannelIndex(cp);
215 }
216 }
217 }
218 try {
219 BeanIntrospector.setPropertyValue(disp,AcopDisplayer.CONNECTION_PARAMETERS_PROPERTY,cp);
220 BeanIntrospector.setPropertyValue(disp, "arrayIndex", index);
221 } catch (Exception e) {
222 throw new PropertyVetoException("Property '" +AcopDisplayer.CONNECTION_PARAMETERS_PROPERTY +"' not set: "+e.getMessage(),new PropertyChangeEvent(disp,AcopDisplayer.CONNECTION_PARAMETERS_PROPERTY,null,cp));
223 }
224
225 for (int i = 0; i < n.length; i++) {
226 if (!AcopDisplayer.CONNECTION_PARAMETERS_PROPERTY.equals(n[i]) && o[i]!=null && (!(o[i] instanceof Double) || !((Double)o[i]).isNaN())) {
227 try {
228 BeanIntrospector.setPropertyValue(disp,n[i],o[i]);
229 } catch(NoSuchMethodException e) {
230
231 } catch (Exception e) {
232 throw new PropertyVetoException("Property '"+n[i]+"' not set: "+e.getMessage(),new PropertyChangeEvent(disp,n[i],null,o[i]));
233 }
234 }
235 }
236 return true;
237 }
238 }