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.datatransfer.DataFlavor;
26 import java.awt.datatransfer.Transferable;
27 import java.awt.datatransfer.UnsupportedFlavorException;
28 import java.beans.PropertyVetoException;
29 import java.io.IOException;
30
31 import javax.swing.JComponent;
32
33 import com.cosylab.gui.displayers.DisplayerParameters;
34 import com.cosylab.gui.util.AbstractDisplayerParametersTransferHandler;
35
36 import de.desy.acop.transport.ConnectionParameters;
37
38
39
40
41
42
43
44 public abstract class AbstractMDPTransferHandler extends AbstractDisplayerParametersTransferHandler{
45
46 private static final long serialVersionUID = 4277524441131938702L;
47
48 public AbstractMDPTransferHandler(JComponent comp, boolean reciveEnabled, boolean exportEnabled, DataFlavor[] f, boolean resetFlavors) {
49 super(comp, reciveEnabled, exportEnabled, f, resetFlavors);
50 }
51
52
53
54
55 @Override
56 public Object getTransferData(DataFlavor flavor)
57 throws UnsupportedFlavorException, IOException {
58 if (flavor instanceof AcopDisplayerParametersFlavor) {
59 return exportMultipleDisplayerParameters();
60 } else if (flavor instanceof ConnectionParametersFlavor) {
61 AcopDisplayerParameters[] p = exportMultipleDisplayerParameters();
62 if (p != null) {
63 ConnectionParameters[] param = new ConnectionParameters[p.length];
64 for (int i = 0; i < param.length; i++) {
65 param[i] = p[i].getConnectionParameters();
66 }
67 return param;
68 } else {
69 return null;
70 }
71 } else if (flavor.isFlavorTextType()) {
72 AcopDisplayerParameters[] p = exportMultipleDisplayerParameters();
73 StringBuilder s= new StringBuilder(32*p.length);
74
75 if (0<p.length) {
76 s.append(p[0].getConnectionParameters().getRemoteName());
77 }
78 for (int i = 1; i < p.length; i++) {
79 s.append("\n");
80 s.append(p[i].getConnectionParameters().getRemoteName());
81 }
82
83 return s.toString();
84 }
85 return super.getTransferData(flavor);
86
87 }
88
89 protected abstract AcopDisplayerParameters[] exportMultipleDisplayerParameters();
90
91 protected AcopDisplayerParameters convertParameters(AcopDisplayerParameters adp) {
92 return adp;
93 }
94
95 protected AcopDisplayerParameters convertParameters(ConnectionParameters adp) {
96 return new AcopDisplayerParameters(adp);
97 }
98
99
100 @Override
101 protected boolean importString(String string) throws PropertyVetoException {
102 ConnectionParameters cp = new ConnectionParameters(string);
103 return importDisplayerParameters(new AcopDisplayerParameters[]{new AcopDisplayerParameters(cp)});
104 }
105
106
107
108
109 @Override
110 protected boolean importDisplayerParameters(DisplayerParameters[] dp) throws PropertyVetoException {
111 try {
112 if (!(dp instanceof AcopDisplayerParameters[])) {
113 throw new UnsupportedOperationException("Cannot import displayer parameters of type '" + dp.getClass() + "'!");
114 }
115 AcopDisplayerParameters[] adp = (AcopDisplayerParameters[]) dp;
116
117 for (int i = 0; i < adp.length; i++) {
118 setParametersToDisplayer(displayer,adp[i]);
119 }
120 return true;
121 } catch (Exception e) {
122 e.printStackTrace();
123 }
124 return false;
125
126 }
127
128
129
130
131 @Override
132 public boolean importData(JComponent comp, Transferable t) {
133 try {
134 if (t.isDataFlavorSupported(AcopDisplayerParametersFlavor.FLAVOR)) {
135 Object drop = t.getTransferData(AcopDisplayerParametersFlavor.FLAVOR);
136
137 AcopDisplayerParameters[] p = null;
138 if (drop instanceof AcopDisplayerParameters) {
139 p = new AcopDisplayerParameters[]{(AcopDisplayerParameters)drop};
140 } else if (drop instanceof AcopDisplayerParameters[]) {
141 p= (AcopDisplayerParameters[])drop;
142 }
143
144 if (p != null) {
145 for (int i = 0; i < p.length; i++) {
146 AcopDisplayerParameters a = convertParameters(p[i]);
147 if (a!=null) {
148 importDisplayerParameters(new AcopDisplayerParameters[]{a});
149 }
150 }
151 return true;
152 }
153
154 return true;
155 }
156 } catch (Exception e) {
157 e.printStackTrace();
158 }
159 try {
160 if (t.isDataFlavorSupported(ConnectionParametersFlavor.FLAVOR)) {
161 Object drop = t.getTransferData(ConnectionParametersFlavor.FLAVOR);
162
163 ConnectionParameters[] cp=null;
164
165 if (drop instanceof ConnectionParameters) {
166 cp= new ConnectionParameters[]{(ConnectionParameters)drop};
167 } else if (drop instanceof ConnectionParameters[]) {
168 cp= (ConnectionParameters[])drop;
169 }
170 if (cp != null) {
171 for (int i = 0; i < cp.length; i++) {
172 AcopDisplayerParameters a = convertParameters(cp[i]);
173 if (a!=null) {
174 importDisplayerParameters(new AcopDisplayerParameters[]{a});
175 }
176 }
177 return true;
178 }
179 }
180 } catch (Exception e) {
181 e.printStackTrace();
182 }
183
184 return super.importData(comp,t);
185 }
186
187 protected DisplayerParameters exportDisplayerParameters() {
188 DisplayerParameters[] d = exportMultipleDisplayerParameters();
189
190 int i = selectParameters(displayer,d);
191 if (i<0) {
192 return null;
193 }
194 return d[i];
195 }
196
197
198
199
200
201 @Override
202 protected DisplayerParameters[] castParameters(Object... parameters) {
203 if (parameters instanceof AcopDisplayerParameters[]) {
204 return (AcopDisplayerParameters[])parameters.getClass().cast(parameters);
205 } else if (parameters.length == 1) {
206 if (parameters[0] instanceof AcopDisplayerParameters[]) {
207 return (AcopDisplayerParameters[]) parameters[0];
208 } else if (parameters[0] instanceof AcopDisplayerParameters) {
209 return new AcopDisplayerParameters[] {(AcopDisplayerParameters)parameters[0]};
210 }
211 }
212 return super.castParameters(parameters);
213 }
214
215 }