View Javadoc

1   /*
2    * Copyright (c) 2003-2008 by Cosylab d. d.
3    *
4    * This file is part of CosyBeans.
5    *
6    * CosyBeans is free software: you can redistribute it and/or modify
7    * it under the terms of the GNU General Public License as published by
8    * the Free Software Foundation, either version 3 of the License, or
9    * (at your option) any later version.
10   *
11   * CosyBeans is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU General Public License for more details.
15   *
16   * You should have received a copy of the GNU General Public License
17   * along with CosyBeans.  If not, see <http://www.gnu.org/licenses/>.
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   * <code>DisplayerParametersTransferHandler</code> is a TransferHandler for
43   * DisplayerParametersAcceptors and MultipleParametersAcceptors.
44   * 
45   * @author tkusterle
46   * @depreacated use {@link DefaultDisplayerParametersTransferHandler} instead
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  	/* (non-Javadoc)
70  	 * @see com.cosylab.gui.components.util.CosyTransferHandler#getTransferData(java.awt.datatransfer.DataFlavor)
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 	/* (non-Javadoc)
111 	 * @see com.cosylab.gui.components.util.CosyTransferHandler#getTransferDataFlavors()
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 	/* (non-Javadoc)
122 	 * @see javax.swing.TransferHandler#importData(javax.swing.JComponent, java.awt.datatransfer.Transferable)
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 	 * @param dp
162 	 * @throws PropertyVetoException 
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 					//do nothing
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 	 * Returns the displayer.
221 	 * @return Returns the displayer.
222 	 */
223 	public Displayer getDisplayer() {
224 		return displayer;
225 	}
226 	
227 	/**
228 	 * Returns the displayer.
229 	 * @return Returns the displayer.
230 	 */
231 	public MultipleDisplayer getMultipleDisplayer() {
232 		return mDisplayer;
233 	}
234 	
235 	/*
236 	 * (non-Javadoc)
237 	 * @see com.cosylab.gui.components.util.CosyTransferHandler#canImport(javax.swing.JComponent, java.awt.datatransfer.DataFlavor[])
238 	 */
239 	@Override
240 	public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
241 		return super.canImport(comp, transferFlavors) & !isDragging;
242 	}
243 }