View Javadoc

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 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   * <code>AcopDisplayerTransferHandler</code> is a TransferHandler, which can handle
47   * <code>AcopDisplayer</code>s and deals with <code>AcopDisplayerParametersFlavor</code>.
48   * 
49   * @author <a href="mailto:jaka.bobnar@cosylab.com">Jaka Bobnar</a>
50   * @version $Id: Templates.xml,v 1.10 2004/01/13 16:17:13 jbobnar Exp $
51   *
52   */
53  public class AcopDisplayerTransferHandler extends DefaultDisplayerParametersTransferHandler {
54  
55  	private static final long serialVersionUID = -8218250806158424887L;
56  
57  	/**
58  	 * Constructs new AcopDisplayerTransferHandler and associates it with
59  	 * the supplied displayer.
60  	 * 
61  	 * @param comp
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  	 * (non-Javadoc)
71  	 * @see com.cosylab.gui.util.DefaultDisplayerParametersTransferHandler#exportDisplayerParameters()
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  	/* (non-Javadoc)
87  	 * @see com.cosylab.gui.components.util.CosyTransferHandler#getTransferData(java.awt.datatransfer.DataFlavor)
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 //		throw new UnsupportedFlavorException(flavor);
105 	}
106 	
107 	/*
108 	 * (non-Javadoc)
109 	 * @see com.cosylab.gui.util.AbstractDisplayerParametersTransferHandler#importData(javax.swing.JComponent, java.awt.datatransfer.Transferable)
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 	 * (non-Javadoc)
152 	 * @see com.cosylab.gui.util.AbstractDisplayerParametersTransferHandler#importString(java.lang.String)
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 	 * (non-Javadoc)
170 	 * @see com.cosylab.gui.util.AbstractDisplayerParametersTransferHandler#castParameters(java.lang.Object[])
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 	 * (non-Javadoc)
196 	 * @see com.cosylab.gui.util.AbstractDisplayerParametersTransferHandler#setParametersToDisplayer(java.lang.Object, com.cosylab.gui.displayers.DisplayerParameters)
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 					//do nothing
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 }