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.selector;
24  
25  import java.awt.GridBagConstraints;
26  import java.awt.GridBagLayout;
27  import java.awt.Insets;
28  import java.awt.event.ActionEvent;
29  import java.awt.event.ActionListener;
30  import java.beans.PropertyChangeEvent;
31  import java.beans.PropertyChangeListener;
32  
33  import javax.swing.JButton;
34  import javax.swing.JPanel;
35  import javax.swing.event.ListSelectionEvent;
36  import javax.swing.event.ListSelectionListener;
37  
38  import com.cosylab.gui.components.util.RunnerHelper;
39  
40  import de.desy.acop.displayers.AcopTrendChart;
41  import de.desy.acop.displayers.chart.HistoryParameters;
42  import de.desy.acop.displayers.chart.TrendSelector;
43  import de.desy.acop.displayers.tools.AcopDisplayer;
44  import de.desy.acop.displayers.tools.AcopGraphHistoryParameters;
45  import de.desy.acop.displayers.tools.AcopGraphParameters;
46  import de.desy.acop.transport.ConnectionParameters;
47  
48  /**
49   * 
50   * <code>TrendChartConnectionCustomizer</code> is a connection customizer
51   * which handles <code>AcopGraphHistoryParameters</code>.
52   * 
53   * @author Tilen Kusterle, Cosylab
54   * @see AcopGraphHistoryParameters
55   */
56  public class TrendChartConnectionCustomizer extends ChartConnectionCustomizer {
57  	
58  	public static void main(String[] args) {
59  		RunnerHelper.runComponent(new TrendChartConnectionCustomizer(), 800,400);
60  	}
61  	
62  	private static final long serialVersionUID = 1L;
63  	
64  	private TrendSelector trendSelector;
65  	private JPanel trendPanel;
66  	private JButton suggestButton;
67  	private JButton applyButton;
68  	private SelectorGUI selector;
69  	
70  	/**
71  	 * Constructs a new TrendChartConnectionCustomizer.
72  	 *
73  	 */
74  	public TrendChartConnectionCustomizer() {
75  		super();
76  		JPanel p = new JPanel(new GridBagLayout());
77  		p.add(getTrendPanel(), new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0),0,0));
78  		getCustomizerTabbedPane().add(p, "History", 0);
79  		
80  		getSelectorGUI().addSelectorGUIListener(new SelectorGUIListener() {
81  
82  			public void selectionChanged(SelectorGUIEvent e) {
83  				setToTrendSelector(getSelectorGUI().getConnectionParameters(), null);
84  			}});
85  		getSelectorGUI().addPropertyChangeListener(AcopDisplayer.CONNECTION_PARAMETERS_PROPERTY,new PropertyChangeListener() {
86  			public void propertyChange(PropertyChangeEvent e) {
87  				setToTrendSelector(getSelectorGUI().getConnectionParameters(), null);
88  			}
89  		});
90  		getSelectionList().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
91  
92  			public void valueChanged(ListSelectionEvent e) {
93  				int sel = getSelectionList().getSelectedIndex();
94          		if (sel >= 0) {
95          			AcopGraphHistoryParameters parameters = (AcopGraphHistoryParameters) getSelectionList().getModel().getElementAt(sel);
96          			HistoryParameters hp = parameters.getHistoryParameters();
97          			getTrendSelector().setHistoryParameters(hp);
98          			if (hp != null) getTrendSelector().setHistoryEnabled(true);
99          			else getTrendSelector().setHistoryEnabled(false);
100         		} else {
101         			getTrendSelector().setHistoryParameters(null);
102         			getTrendSelector().setHistoryEnabled(false);
103         		}
104 				
105 			}});
106 	}
107 	
108 	/*
109 	 * (non-Javadoc)
110 	 * @see de.desy.acop.displayers.selector.MultipleConnectionCustomizer#getSelectorGUI()
111 	 */
112 	@Override
113 	protected SelectorGUI getSelectorGUI() {
114 		if (selector == null) {
115 			selector = new SelectorGUI();
116 			selector.addSelectorGUIListener(new SelectorGUIListener() {
117 				public void selectionChanged(SelectorGUIEvent e) {
118 					getAddButton().setEnabled(SelectorUtilities.isConnectionParametersValid(selector.getConnectionParameters()));
119 				}
120 			});
121 			selector.addPropertyChangeListener(AcopDisplayer.CONNECTION_PARAMETERS_PROPERTY,new PropertyChangeListener() {
122 				public void propertyChange(PropertyChangeEvent e) {
123 					getAddButton().setEnabled(SelectorUtilities.isConnectionParametersValid(selector.getConnectionParameters()));
124 				}
125 			});
126 		}
127 		
128 	    return selector;
129     }
130 	
131 	private JPanel getTrendPanel() {
132 		if (trendPanel == null) {
133 			trendPanel = new JPanel(new GridBagLayout());
134 			trendPanel.add(getTrendSelector(), new GridBagConstraints(0,0,2,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(1,1,1,1),0,0));
135 			trendPanel.add(getSuggestButton(), new GridBagConstraints(0,1,1,1,1,0,GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(1,1,1,3),0,0));
136 			trendPanel.add(getApplyButton(), new GridBagConstraints(1,1,1,1,1,0,GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(1,3,1,1),0,0));
137 		}
138 
139 		return trendPanel;
140 	}
141 	
142 	private JButton getSuggestButton() {
143 		if (suggestButton == null) {
144 			suggestButton = new JButton("Suggest Default");
145 			suggestButton.addActionListener(new ActionListener() {
146 				public void actionPerformed(ActionEvent e) {
147 					int sel = getSelectionList().getSelectedIndex();
148 	        		if (sel >= 0) {
149 	        			AcopGraphHistoryParameters parameters = (AcopGraphHistoryParameters) getSelectionList().getModel().getElementAt(sel);
150 	        			HistoryParameters hp = parameters.getHistoryParameters();
151 	        			getTrendSelector().setHistoryParameters(hp);
152 	        			setToTrendSelector(parameters.getConnectionParameters(), hp);
153 	        		} else {
154 	        			setToTrendSelector(getSelectorGUI().getConnectionParameters(), null);
155 	        		}
156 				}});
157 		}
158 
159 		return suggestButton;
160 	}
161 	
162 	private TrendSelector getTrendSelector() {
163     	if (trendSelector == null) {
164 			trendSelector = new TrendSelector();
165 		}
166 		return trendSelector;
167     }
168 
169 	/* (non-Javadoc)
170 	 * @see de.desy.acop.displayers.selector.ChartConnectionCustomizer#getSettingsPanel()
171 	 */
172 	@Override
173 	protected MultipleDisplayerAbstractSettingsPanel<AcopGraphParameters> getSettingsPanel() {
174 		GraphCustomizerPanel gcp = (GraphCustomizerPanel) super.getSettingsPanel();
175 		gcp.toggleTrendControls(false);
176 		return gcp;
177 	}
178 
179 	/* (non-Javadoc)
180 	 * @see de.desy.acop.displayers.selector.ChartConnectionCustomizer#generateParameters()
181 	 */
182 	@Override
183 	protected AcopGraphParameters generateParameters() {
184 		AcopGraphParameters agp = super.generateParameters();
185 		agp.deriveWith(getTrendSelector().getSelectedIndex());
186 		return new AcopGraphHistoryParameters(agp, getTrendSelector().getHistoryParameters());
187 	}
188 	
189 	private void setToTrendSelector(ConnectionParameters cp, HistoryParameters hp) {
190 		if (hp == null) {
191 			getTrendSelector().setHistoryParameters(
192 					cp.getDeviceContext(),
193 					"HISTORY",
194 					cp.getDeviceName(),
195 					cp.getDeviceProperty());
196 		}
197 		else {
198 			getTrendSelector().setHistoryParameters(hp);
199 		}
200 		if (SelectorUtilities.isConnectionParametersValid(cp)) {
201 			getTrendSelector().setIndexMax(SelectorUtilities.getSequenceLength(cp)-1);
202 		}
203 		if (hp != null) getTrendSelector().setSelectedIndex(hp.getHistoryIndex());
204 		getApplyButton().setEnabled(selectedParameters != null);
205 	}
206 	
207 	@Override
208 	protected void setSelectedParameters(AcopGraphParameters selected) {
209 		super.setSelectedParameters(selected);
210 		if (selected instanceof AcopGraphHistoryParameters) {
211 			setToTrendSelector(((AcopGraphHistoryParameters)selected).getConnectionParameters(),
212 					((AcopGraphHistoryParameters)selected).getHistoryParameters());
213 		}
214 	}
215 	
216 	private JButton getApplyButton() {
217 		if (applyButton == null) {
218 			applyButton = new JButton("Apply");
219 			applyButton.addActionListener(new ActionListener() {
220 				public void actionPerformed(ActionEvent e) {
221 					if (selectedParameters != null) {
222 						if (selectedParameters instanceof AcopGraphHistoryParameters) {
223 							((AcopGraphHistoryParameters)selectedParameters).setHistoryParameters(getTrendSelector().getHistoryParameters());
224 						} else {
225 							selectedParameters.putParameter("historyParameters",getTrendSelector().getHistoryParameters());
226 						}
227 						if (getDisplayer() instanceof AcopTrendChart) {
228 							((AcopTrendChart)getDisplayer()).reloadHistory(selectedParameters);
229 						}
230 					}
231 				}
232 			});
233 		}
234 		return applyButton;
235 	}
236 }