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.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   * Abstract base class for TransferHandlers which handle AcopMultipleDisplayerParameters.
40   * @author <a href="mailto:jaka.bobnar@cosylab.com">Jaka Bobnar</a>
41   * @version $Id: Templates.xml,v 1.10 2004/01/13 16:17:13 jbobnar Exp $
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  	/* (non-Javadoc)
53  	 * @see com.cosylab.gui.components.util.CosyTransferHandler#getTransferData(java.awt.datatransfer.DataFlavor)
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 	/* (non-Javadoc)
107 	 * @see com.cosylab.gui.util.DisplayerParametersTransferHandler#importDisplayerParameters(com.cosylab.gui.displayers.DisplayerParameters[])
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 	/* (non-Javadoc)
129 	 * @see com.cosylab.gui.util.DisplayerParametersTransferHandler#importData(javax.swing.JComponent, java.awt.datatransfer.Transferable)
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 //		return d[0];
190 		int i = selectParameters(displayer,d);
191 		if (i<0) {
192 			return null;
193 		}
194 		return d[i];
195 	}
196 	
197 	/*
198 	 * (non-Javadoc)
199 	 * @see com.cosylab.gui.util.DisplayerParametersTransferHandler#castParameters(java.lang.Object[])
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 }