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.gui.components.SliderSetMode;
33 import com.cosylab.gui.components.Slider.Button;
34 import com.cosylab.gui.components.util.IconHelper;
35 import com.cosylab.util.CommonException;
36
37 import de.desy.acop.displayers.AcopSlider;
38 import de.desy.acop.transport.AccessMode;
39 import de.desy.acop.transport.ConnectionParameters;
40
41 public class SliderExample {
42
43 public static void main(String[] args) {
44
45 //How to connect slider to a remote property?
46 //First we create an instance of the AcopSlider object.
47 AcopSlider slider = new AcopSlider();
48 //We require ConnectionParameters which describe the remote property
49 ConnectionParameters parameters = new ConnectionParameters("TINE",
50 "context", "server", "device", "property", AccessMode.POLL, 1000);
51 //These parameters describe a remote property 'context/server/device/property'
52 //in the TINE control system. We will request a constant monitoring,
53 //therefore AccessMode.POLL was used. Polling rate is set to 1000 milliseconds,
54 //which means that value on the slider will be updated every 1000 milliseconds.
55 //Parameters are then attached to the slider. Connection is created automatically.
56 try {
57 slider.setConnectionParameters(parameters);
58 } catch (CommonException e) {
59 e.printStackTrace();
60 } catch (PropertyVetoException e) {
61 e.printStackTrace();
62 }
63 //If no exception occurred, slider should show the remote value.
64
65
66 //The slider will set the value on the property each time when a user
67 //drags the slider thumb. We want to avoid the overload and only change the
68 //value when one releases the thumb.
69 slider.setSetMode(SliderSetMode.SET_ON_RELEASE);
70 //Or we can use a set button to send values. In this case a value will be
71 //sent only after the set button will be pressed. The current thumb position will
72 //be set.
73 slider.setSetMode(SliderSetMode.SET_MANUAL);
74
75
76 //The navigation buttons are moving thumb in too small steps. We want to change
77 //the '+' button command to change the value for 2% of the total slider extent
78 //If (slider max - slider min = 500) then 2% of this is 10.
79 slider.setBitStepRelative(true);
80 slider.setBitStep(2.0);
81 //Or we want to explicitly define that the thumb should move for 11 points
82 //when the button is pressed
83 slider.setBitStepRelative(false);
84 slider.setBitStep(11);
85 //Similarly we can program the the 'forward' and 'fastForward' buttons. We want
86 //the forward button to move the thumb for 32.1 units and the fast forward for
87 //53.8 units
88 slider.setSmallStepRelative(false);
89 slider.setSmallStep(32.1);
90 slider.setLargeStepRelative(false);
91 slider.setLargeStep(53.8);
92
93 //The incoming values are too large (large exponents) and have a large extent.
94 //We want to show values in more readable form. Let us show the logarithm of
95 //the value. For this we will use a logarithmic converter with logarithm base 10:
96 LogarithmicConverter logConverter = new LogarithmicConverter(10);
97 try {
98 slider.setConverter(logConverter);
99 } catch (PropertyVetoException e) {
100 e.printStackTrace();
101 }
102 //Instead of real value 'x' slider will now show log_10(x).
103 //Similarly we can shift the values to be comparable with some other property.
104 //We will use linear converter:
105 LinearConverter linConverter = new LinearConverter(5,4);
106 try {
107 slider.setConverter(linConverter);
108 } catch (PropertyVetoException e) {
109 e.printStackTrace();
110 }
111 //Instead of value 'x' slider will now show 5 x + 4. We can even combine both
112 //converters into a single one.
113 try {
114 ConverterChain chain = new ConverterChain(new Converter[]{logConverter, linConverter});
115 slider.setConverter(chain);
116 } catch (PropertyVetoException e) {
117 e.printStackTrace();
118 }
119 //Slider will now show 5 (log_10(x)) + 4.
120
121 //If slider is used to show a value that changes because of a 3rd party,
122 //we don't want the slider thumb to be out of sync each time the value
123 //changes, but want the thumb to move together with the slider. We will
124 //set the automatic synchronization with 5 seconds time
125 slider.setAutoSynchronize(true);
126 slider.setAutoSynchronizeDelay(5000);
127 //or if we don't want to change the values at all (just use the slider
128 //as a monitor displayer) we can put slider in read only mode
129 slider.setEditable(false);
130 //Or we can set slider to use only one thumb to present a value. In this
131 //case the trailer shadow will not be painted. The thumb of the slider can
132 //be dragged to any position and that value will be set on the slider.
133 //However, when response is received from the connection point, the thumb
134 //will move to the actual value of the property.
135 slider.setSyncButtonVisible(false);
136
137 //Let's say that we have good settings on the properties, but would like to
138 //fine tune it. However, if tuning produces worse results than the current
139 //state of the machine we want to restore the value. First we have to
140 //store the value. This can be done in two way: one can store the current
141 //slider readback value
142 slider.storeValue();
143 //or explicitely define a value
144 slider.setStoredValue(100.);
145 //At any later time we can restore the value to the last stored value
146 slider.restoreValue();
147 //We can also enable store and restore buttons which can be used in runtime
148 //to store or restore the value. The store button will always store current
149 //readback value.
150 slider.setStorageButtonsVisible(true);
151
152 //Slider will display ticks along the slider line according to the space
153 //available. If one is not satisfied with automatic tick configurations,
154 //ticks can be explicitely defined. First we have to provide which values
155 //will be marked as major ticks
156 slider.setMajorTicks(new double[]{0,20,40,60,80,100});
157 //Then we define which of these major ticks will have value labels printed
158 slider.setMajorTickLabels(new double[]{0,40,60,100});
159 //At last we define, the step of the minor ticks (distance between two minor
160 //ticks)
161 slider.setMinorTicksStep(5);
162
163 //Slider can operate in continuous mode, meaning that on button press
164 //and hold, value will be automatically incremented/decremented
165 //accordig to the step defined by which button is used.
166 //ContinuousModeDelayTime time defines the initial delay time in
167 //milliseconds between button press and first automatic repetition.
168 //ContinuousModeRepeatTime defines the time interval in milliseconds
169 //between two repetitions.
170 //If ContinuousControlVisible is set to false, user will not be able
171 //to engage or disengage auto incrementation/decremtnation, but the
172 //mode of operation will remain.
173
174 slider.setContinuousModeDelayTime(1000);
175 slider.setContinuousModeRepeatTime(100);
176
177 slider.setContinuousModeEnabled(true);
178 slider.setContinuousControlVisible(true);
179
180 //When setting the value on the slider, the position of the slider will
181 //show the exact value as set by the data source or through UI, even if
182 //the provided value does not fall to the tick printed on the slider.
183 //If one want the slider to snap to the tick value, snap to ticks option
184 //can be switched on.
185 slider.setSnapToTicks(true);
186
187 //TooltipText
188 //String provided will be set as tooltip text to the surrounding
189 //area not regarding button and other similar control components.
190 slider.setToolTipText("Value");
191
192 //Button icons
193 //Navigation button icons can be changed, by supplying the button
194 //enumeration and Icon object.
195 slider.setButtonIcon(Button.BIT_DECREMENT, IconHelper.createIcon("icons/navigation/ArrowLeft16.gif"));
196
197 //Button text
198 //Navigation button text can be changed or added, by supplying the
199 //button enumeration and string containing the desired text.
200
201 slider.setButtonText(Button.BIT_DECREMENT, "Bit decrement");
202
203 //Other properties of the slider can also simply be adjusted by calling the
204 //appropriate setter methods. These properties include maximum/minimum value
205 //background/foreground color, title etc.:
206 slider.setMaximum(100);
207 slider.setMinimum(5.2);
208 slider.setBackground(Color.RED);
209 slider.setForeground(Color.GREEN);
210 }
211 }