source: java/main/src/main/java/com/framsticks/gui/Gui.java @ 87

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

HIGHLIGHTS:

  • FramsClass? and contained Param are now immutable classes (like String),

which allows to refer to them concurrently without synchronization
(which for example in turn simplifies GUI management)

  • also make Path immutable (which was earlier only assumed)
  • add global cache for FramsClasses? created solely and automatically

on base of Java classes.

representations basing on given FramsClass?

  • above changes greatly improved GUI responsivness during browsing
  • furtherly improve Param class hierarchy
  • allow to inject actions on state changes into MultiParamLoader?
  • add more tests

CHANGELOG:

Add StatusListener? to MultiParamLoader?.

Minor refactorization in MultiParamLoader?.

First step with auto append.

Add SchemaTest?.

Improve Registry.

Clean up in Registry.

Work out Registry.

Use annotations for Param.

Fix ListChange?.

Improve fluent interface of the FramsClassBuilder?.

Done caching of ReflectionAccess?.Backend

Fix hashCode of Pair.

A step on a way to cache ReflectionAccess?.Backend

Make SimpleAbstractAccess?.framsClass a final field.

Add static cache for FramsClasses? based on java.

Only classes created strictly and automatically
based on java classes are using this cache.

Make all Params immutable.

Many improvement to make Param immutable.

Make PrimitiveParam? generic type.

Several changes to make Param immutable.

Make FramsClass? immutable.

Another improvement to Path immutability.

Several improvements to Path.

Improve PathTest?.

Configurarable MutabilityDetector?.

File size: 4.2 KB
Line 
1package com.framsticks.gui;
2
3import java.awt.Dimension;
4import java.util.Collection;
5import java.util.Map;
6
7import javax.swing.Box;
8import javax.swing.BoxLayout;
9import javax.swing.JLabel;
10import javax.swing.JPanel;
11
12import org.apache.log4j.Logger;
13
14import com.framsticks.gui.controls.CheckBoxControl;
15import com.framsticks.gui.controls.Control;
16import com.framsticks.gui.controls.EnumControl;
17import com.framsticks.gui.controls.EventControl;
18import com.framsticks.gui.controls.ProcedureControl;
19import com.framsticks.gui.controls.SliderControl;
20import com.framsticks.gui.controls.TextAreaControl;
21import com.framsticks.gui.controls.TextFieldControl;
22import com.framsticks.params.CompositeParam;
23import com.framsticks.params.Param;
24import com.framsticks.params.PrimitiveParam;
25import com.framsticks.params.types.BinaryParam;
26import com.framsticks.params.types.BooleanParam;
27import com.framsticks.params.types.ColorParam;
28import com.framsticks.params.types.DecimalParam;
29import com.framsticks.params.types.EnumParam;
30import com.framsticks.params.types.EventParam;
31import com.framsticks.params.types.FloatParam;
32import com.framsticks.params.types.ProcedureParam;
33import com.framsticks.params.types.StringParam;
34import com.framsticks.params.types.UniversalParam;
35import com.framsticks.util.lang.Strings;
36
37public final class Gui {
38
39        private static final Logger log = Logger.getLogger(Gui.class.getName());
40
41        private Gui() {
42        }
43
44        public static Control createComponentForText(PrimitiveParam<?> valueParam) {
45                if (valueParam.getMin(Object.class) != null) {
46                        return new TextAreaControl(valueParam);
47                }
48                return new TextFieldControl(valueParam);
49        }
50
51        public static Control createSuitable(Param param) {
52
53                if (param instanceof EnumParam) {
54                        return new EnumControl((EnumParam) param);
55                }
56                if (param instanceof BooleanParam) {
57                        return new CheckBoxControl((BooleanParam) param);
58                }
59                if (param instanceof DecimalParam) {
60                        DecimalParam decimalParam = (DecimalParam)param;
61                        if (decimalParam.getMin(Integer.class) != null && decimalParam.getMax(Integer.class) != null) {
62                                return new SliderControl(decimalParam);
63                        }
64                        return createComponentForText(decimalParam);
65                }
66                if (param instanceof FloatParam) {
67                        FloatParam floatParam = (FloatParam)param;
68                        if (floatParam.getMin(Double.class) != null && floatParam.getMax(Double.class) != null) {
69                                return new SliderControl(floatParam);
70                        }
71                        return createComponentForText(floatParam);
72                }
73                if (param instanceof StringParam) {
74                        return createComponentForText((StringParam)param);
75                }
76                if (param instanceof ProcedureParam) {
77                        return new ProcedureControl((ProcedureParam)param);
78                }
79                if (param instanceof BinaryParam) {
80                        return createComponentForText((BinaryParam)param);
81                }
82                if (param instanceof ColorParam) {
83                        return createComponentForText((ColorParam) param);
84                }
85                if (param instanceof UniversalParam) {
86                        return new TextAreaControl((UniversalParam)param);
87                }
88                if (param instanceof EventParam) {
89                        return new EventControl((EventParam)param);
90                }
91                return null;
92        }
93
94        public static void fillWithControls(JPanel panel, Collection<Param> params, Map<Param, Control> components) {
95                for (Param param : params) {
96                        if (param.isUserHidden()) {
97                                continue;
98                        }
99                        assert !(param instanceof CompositeParam);
100                        Control control = Gui.createSuitable(param);
101                        if (control == null) {
102                                log.error("component for param " + param + " of type " + param.getClass().getSimpleName() + " was not added");
103                                continue;
104                        }
105                        log.debug("add component for " + param);
106                        JPanel line = new JPanel();
107                        line.setLayout(new BoxLayout(line, BoxLayout.LINE_AXIS));
108                        line.setAlignmentX(JPanel.LEFT_ALIGNMENT);
109                        JLabel label = new JLabel(Strings.notEmpty(param.getName()) ? param.getName() : "? (" + param.getId() + ")");
110                        label.setToolTipText(control.getToolTipText());
111                        label.setHorizontalAlignment(JLabel.RIGHT);
112                        Dimension labelSize = new Dimension(150, 30);
113                        label.setMaximumSize(labelSize);
114                        label.setMinimumSize(labelSize);
115                        label.setPreferredSize(labelSize);
116                        line.add(label);
117                        line.add(Box.createRigidArea(new Dimension(8, 0)));
118                        line.add(control);
119                        line.revalidate();
120                        panel.add(line);
121                        panel.add(Box.createRigidArea(new Dimension(0, 8)));
122                        //component.setAlignmentX(LEFT_ALIGNMENT);
123                        components.put(param, control);
124                }
125
126        }
127}
Note: See TracBrowser for help on using the repository browser.