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.demo.example;
24  
25  import java.awt.Color;
26  import java.beans.PropertyVetoException;
27  
28  import com.cosylab.gui.adapters.Converter;
29  import com.cosylab.gui.adapters.ConverterChain;
30  import com.cosylab.gui.adapters.LinearConverter;
31  import com.cosylab.gui.adapters.LogarithmicConverter;
32  import com.cosylab.util.CommonException;
33  
34  import de.desy.acop.displayers.AcopTable;
35  import de.desy.acop.displayers.table.AcopTableParameters;
36  import de.desy.acop.displayers.table.TableColumnType;
37  import de.desy.acop.transport.AccessMode;
38  import de.desy.acop.transport.ConnectionParameters;
39  
40  public class TableExample {
41  
42  	public static void main(String[] args) {
43  		//How to connect table with remote properties?
44  		//First we create an instance of the AcopTable object.
45  		AcopTable table = new AcopTable();
46  		
47  		//Let's make a table which displays the names and values of a multi-channel
48  		//array or spectrum. For this we will require two columns, which will be 
49  		//specified by two AcopTableParameters. For each of these parameters
50  		//we have to define connection points. Therefore we have to create 
51  		//ConnectionParameters which specify this array:
52  		ConnectionParameters connectionParameters = new ConnectionParameters("TINE",
53  				"context", "server", "device", "property", AccessMode.POLL, 1000);
54  		//These parameters describe a remote property 'context/server/device/property'
55  		//in the TINE control system. We will request a constant monitoring,
56  		//therefore AccessMode.POLL was used. Polling rate is set to 1000 milliseconds,
57  		//which means that value on the table will be updated every 1000 milliseconds.
58  		//Now we make AcopTableParameters. First for the names of the devices.
59  		AcopTableParameters namesParameters = new AcopTableParameters(
60  				connectionParameters, TableColumnType.NAME, "Devices");
61  		//Here we used a TableColumnType.NAME. Now we have to create parameters for
62  		//the values, where we use the TableColumnType.VALUE
63  		AcopTableParameters valuesParameters = new AcopTableParameters(
64  				connectionParameters, TableColumnType.VALUE, "Values");
65  		//We could also display all values as bits by using TableColumnType.BIT.
66  		//When making a column with names we could also use TableColumnType.STRING.
67  		//However, when dealing with static names (devices names do not change in time)
68  		//it is better to use the NAME type. STRING type could be used when monitoring
69  		//a channel with string values.
70  		
71  		//Parameters are then attached to the table. Connection is created automatically.
72  		try {
73  			table.setDisplayerParameters(new AcopTableParameters[]{
74  					namesParameters, valuesParameters});
75  		} catch (CommonException e1) {
76  			e1.printStackTrace();
77  		} catch (PropertyVetoException e1) {
78  			e1.printStackTrace();
79  		}
80  		//If no exception occurred, table should show the remote value.
81  		
82  		//Anytime we can add additional columns displaying any channel we want.
83  		//Let's say that we want to display a channel but we want the values of that
84  		//channel are too large to be readable. We can use logarithmic converter
85  		//and instead of 'x' the table will show 'log_10(x)'.
86  		ConnectionParameters cp = new ConnectionParameters("TINE",
87  				"context", "server", "device", "property", AccessMode.POLL, 1000);
88  		LogarithmicConverter logConverter = new LogarithmicConverter(10);
89  		AcopTableParameters atp = new AcopTableParameters(cp, 
90  				TableColumnType.VALUE, logConverter, "Log(value)");
91  		try {
92  			table.addDisplayerParameters(atp);
93  		} catch (PropertyVetoException e) {
94  			e.printStackTrace();
95  		} catch (CommonException e) {
96  			e.printStackTrace();
97  		}
98  		//Instead of logarithmic converter we can also choose LinearConverter,
99  		//MultiplierConverter, ExponentialConverter or PotentialConverter. We can also
100 		//construct a chain of converter combining different mathematical operations:
101 		try {
102 			LinearConverter linConverter = new LinearConverter(5,4);
103 			ConverterChain chain = new ConverterChain(new Converter[]{logConverter, linConverter});
104 			AcopTableParameters atp1 = new AcopTableParameters(cp, 
105 					TableColumnType.VALUE, chain, "5 (log_10(value)) + 4");
106 			table.addDisplayerParameters(atp1);
107 		} catch (PropertyVetoException e) {
108 			e.printStackTrace();
109 		} catch (CommonException e) {
110 			e.printStackTrace();
111 		}
112 		//The fourth column in the table will now show 5 (log_10(x)) + 4.
113 		
114 		//Table can show any number of rows one desires. If we are monitoring
115 		//a channel which originally has 50 devices, but we are only interested
116 		//in the first 10, we set the number of rows.
117 		table.setNumberOfRows(10);
118 
119 		//In runtime we can by default drag the columns around, allowing us to
120 		//rearrange the table when we want to put two separated columns together.
121 		//We can decide that the user will not be allowed to do that.
122 		table.setReorderingAllowed(false);
123 				
124 		//We can also set background/foreground colors.
125 		table.setBackground(Color.BLUE);
126 		table.setForeground(Color.WHITE);
127 	}
128 }