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