source: java/main/src/main/java/com/framsticks/gui/controls/SliderControl.java @ 98

Last change on this file since 98 was 98, checked in by psniegowski, 11 years ago

HIGHLIGHTS:

CHANGELOG:
Get data also on tree expansion.

Use nice framstick icon for empty nodes.

Update panel after reload if it is current.

Add shallow reload procedure.

Cut Gui prefix from several tree classes.

Bring back counter of GuiTreeNode?.

Use IdentityHashMap? were it is more appriopriate.

Remove TreeListener?.

Do not use TreeListener? in GUI.

Minor change.

Done migration to GuiTreeModel?.

BrowserTest? in that version always crashes frams.linux.

Move rendering implementation into GuiAbstractNode?.

Use hand-crafted list in GuiTreeNode?.

Generally, it would be a great place for WeakIdentityHashMap?
(but there is none in Java Collection Framework).

Remove superfluous logging.

Fix bug in GuiTreeNode?.

Use IdentityHashMap? instead of HashMap?.

Improve structure update.

Filter out invalid uids in UniqueListAccess?.

Improve TreeCellRenderer?.

Add filtering in TrackConsole?.

Improve TreeModel?.

More changes.

More improvements.

More changes.

Remove TreeNode?.

Support MetaNode? in the GuiTreeModel?.

Implement more in GuiTreeModel?.

Add CompositeParam? interface to FramsClass? and AccessInterface?.

Allow access by number to UniqueList?.

Add UidComparator?.

Use TreeMap? as a default accessee in unique list.

It keeps order of keys.

Introduce classes to use with new TreeModel?.

Another step.

Migrate from TreeNode? to Node in many places.

Remove some uses of TreeNode? as DefaultMutableTreeNode?.

Remove Path from TreeNode? interface.

Remove Path from TreeNode?.

Add Path recration from node feature.

Reworking TreeCellRenderer?.

Minor change of TreeOperations? interface.

Remove last methods from TreeNode?.

Another minor step.

Do not store reference to TreeAtFrame? in TreeNode?.

Add proxy exceptionHandler to StatusBar?.

Move panels management to TreeAtFrame?.

Store localChanges in the NodeAtFrame?.

More cleanup.

Move name computing to TreeCellRenderer?.

Move tooltip and icon computations to TreeCellRenderer?.

More dispatches removed.

Remove most dispatching from TreeNode?.

TreeNode? does not actually redispatch tasks.

Make Tree embedded in Browser use SwingDispatcher?.

Make lazy binding of Tree with Dispatcher.

Minor changes.

Organizational change in AbstractTree?.

Make AbstractTree? compose from Thread instead of inherit from it.

Make SwingDispatcher? and AtOnceDispatcher? Joinable compatible.

Add ListPanelProvider?.

Improve Controls readonly and enabled handling.

Properly pass ExceptionHandlers? in more places.

Make Tree.get accept ValueParam?.

  • This is to allow access number of list elements.

Remove not needed get redirection in ClientAtServer?.

Rename tryResolve to tryGet.

Unify tryResolveAndGet into tryResolve.

Remove resolveTop from Tree interface.

Make Tree.get accept Future<Path>.

Use get to implement resolveTop also in ObjectTree?.

Unify resolveTop and get in RemoteTree?.

Another minor step.

More minor changes in tree operations.

Minor organizational changes.

In RemoteTree? first fetch info for root.

Reworking resolving.

Minor changes.

Make ListAccess? return proxy iterators (instead of creating temporary collection).

Let AccessInterface? return Iterable<Param>.

Improve resolving.

More improvements.

First working completion in ManagedConsole?.

Rename resolve to resolveTop.

This reflects the actuall functionality.

Change semantic of tryResolve and tryResolveAndGet.

File size: 5.6 KB
Line 
1package com.framsticks.gui.controls;
2
3import java.awt.BorderLayout;
4import java.awt.Dimension;
5import java.util.Hashtable;
6
7import javax.swing.Box;
8import javax.swing.BoxLayout;
9import javax.swing.JComponent;
10import javax.swing.JLabel;
11import javax.swing.JPanel;
12import javax.swing.JSlider;
13import javax.swing.JTextField;
14import javax.swing.event.ChangeEvent;
15import javax.swing.event.ChangeListener;
16
17import org.apache.log4j.Logger;
18
19import com.framsticks.params.types.DecimalParam;
20import com.framsticks.params.types.FloatParam;
21import com.framsticks.params.types.NumberParam;
22import com.framsticks.util.lang.Numbers;
23import com.framsticks.util.swing.Layout;
24
25@SuppressWarnings("serial")
26public class SliderControl extends TextControl {
27
28        private static final Logger log = Logger.getLogger(SliderControl.class.getName());
29
30        protected final JSlider slider;
31
32        protected final JTextField text;
33
34        /**
35         * Division factor used to implement float value slider.
36         */
37        private final int div = 10;
38        private JComponent changing = null;
39
40        private Class<? extends Number> valueType;
41
42        public SliderControl(NumberParam<?> param) {
43                super(param);
44                text = new JTextField();
45
46                //TODO: that factor should be done as a constant
47                this.setMaximumSize(new Dimension(Integer.MAX_VALUE, (int)(LINE_HEIGHT * 1.2)));
48
49                // ComponentUI ui = UIManager.getUI(slider);
50                // assert ui instanceof SliderUI;
51                // SliderUI sui = (SliderUI) ui;
52                // slider.setUI(sui);
53
54                slider = new JSlider();
55
56                slider.setPaintLabels(false);
57                if (param instanceof DecimalParam) {
58                        valueType = Integer.class;
59
60                        int min = param.getMin(Integer.class);
61                        int max = param.getMax(Integer.class);
62                        slider.setMinimum(min);
63                        slider.setMaximum(max);
64                        if (param.getDef(Integer.class) != null) {
65                                slider.setValue(param.getDef(Integer.class));
66                        } else {
67                                slider.setValue(min);
68                        }
69                        slider.setMajorTickSpacing((int) ((max - min) / 5));
70                        slider.setMinorTickSpacing((int) ((max - min) / 10));
71                } else if (param instanceof FloatParam) {
72                        valueType = Double.class;
73
74                        double min = param.getMin(Double.class) * div;
75                        slider.setMinimum((int) min);
76                        double max = param.getMax(Double.class) * div;
77                        double diff = max - min;
78                        slider.setMaximum((int) max);
79
80                        Hashtable<Integer, java.awt.Component> labels = new Hashtable<Integer, java.awt.Component>();
81                        int ticks = 6;
82                        for (int i = 0; i <= ticks; i++) {
83                                double val = (diff / ticks) * i + min;
84                                String label = String.format("%1$.1f", (val / 10)).replace(",",
85                                                ".");
86                                labels.put((int) val, new JLabel(label, JLabel.CENTER));
87                        }
88                        slider.setLabelTable(labels);
89                        slider.setMajorTickSpacing((int) (diff / 5));
90                        slider.setMinorTickSpacing((int) (diff / 10));
91                        if (param.getDef(Double.class) != null) {
92                                double defaultValue = param.getDef(Double.class) * div;
93                                slider.setValue((int) defaultValue);
94                        }
95                }
96                slider.setPaintLabels(true);
97                slider.setPaintTicks(true);
98
99                this.setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
100                this.setAlignmentX(Box.CENTER_ALIGNMENT);
101                this.setAlignmentY(Box.CENTER_ALIGNMENT);
102
103                JPanel sliderPanel = new JPanel();
104                // sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.LINE_AXIS));
105
106
107                Layout.fixComponentSize(text, new Dimension(90, Control.LINE_HEIGHT));
108                text.setHorizontalAlignment(JSlider.CENTER);
109
110
111                slider.addChangeListener(new ChangeListener() {
112                        @Override
113                        public void stateChanged(ChangeEvent e) {
114                                if (changing != null) {
115                                        return;
116                                }
117                                log.trace("changing " + getParam() + " with slider: " + slider.getValue());
118                                changing = slider;
119                                text.setText(convertFromSliderDomain(slider.getValue()).toString());
120                                changing = null;
121                        }
122                });
123
124                text.getDocument().addDocumentListener(createDocumentListener(new Runnable() {
125                        @Override
126                        public void run() {
127                                if (changing != null) {
128                                        return;
129                                }
130                                log.trace("changing " + getParam() + " with text: " + text.getText());
131                                changing = text;
132                                Integer i = convertToSliderDomain(convertTextToNumber());
133                                if (i != null) {
134                                        slider.setValue(i);
135                                }
136                                changing = null;
137                                notifyOfChange();
138                        }
139                }));
140
141                JPanel sVPanel = new JPanel();
142                sVPanel.setLayout(new BoxLayout(sVPanel, BoxLayout.LINE_AXIS));
143                sVPanel.add(text);
144                Layout.copyComponentDimensions(sVPanel, text);
145
146                JPanel sPanel = new JPanel();
147                sPanel.setLayout(new BoxLayout(sPanel, BoxLayout.LINE_AXIS));
148
149                sliderPanel.setLayout(new BorderLayout());
150                sliderPanel.add(slider, BorderLayout.CENTER);
151                sliderPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
152                sliderPanel.setMinimumSize(new Dimension(0, 60));
153
154                sPanel.add(sVPanel);
155                sPanel.add(sliderPanel);
156
157                this.add(sPanel);
158        }
159
160        @Override
161        public NumberParam<?> getParam() {
162                return (NumberParam<?>) param;
163        }
164
165        private Number convertFromSliderDomain(int value) {
166                if (param instanceof DecimalParam) {
167                        return value;
168                }
169                if (param instanceof FloatParam) {
170                        return (double) value / (double) div;
171                }
172                return null;
173        }
174
175        private Integer convertToSliderDomain(Number value) {
176                if (value == null) {
177                        return null;
178                }
179                if (param instanceof DecimalParam) {
180                        return (Integer) value;
181                }
182                if (param instanceof FloatParam) {
183                        return (int) ((Double) value * div);
184                }
185                return null;
186        }
187
188        private Number convertTextToNumber() {
189                return Numbers.cast(text.getText(), valueType);
190        }
191
192        @Override
193        public void pushValueToUserInterfaceImpl(Object value) {
194                if (value == null) {
195                        return;
196                }
197                text.setText(value.toString());
198        }
199
200        @Override
201        public Number pullValueFromUserInterface() {
202                return convertTextToNumber();
203        }
204
205        @Override
206        protected void updateEnabled(boolean enabled) {
207                slider.setEnabled(enabled);
208                text.setEnabled(enabled);
209        }
210
211}
Note: See TracBrowser for help on using the repository browser.