You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by sm...@apache.org on 2011/12/24 17:07:40 UTC

svn commit: r1222994 [8/11] - in /pivot/trunk: core/test/org/apache/pivot/beans/test/ demos/src/org/apache/pivot/demos/memorygame/ demos/src/org/apache/pivot/demos/memorygame/img/ demos/src/org/apache/pivot/demos/roweditor/ demos/www/ etc/ examples/src...

Modified: pivot/trunk/tutorials/src/org/apache/pivot/tutorials/bxmlexplorer/tools/ComponentInspectorSkin.java
URL: http://svn.apache.org/viewvc/pivot/trunk/tutorials/src/org/apache/pivot/tutorials/bxmlexplorer/tools/ComponentInspectorSkin.java?rev=1222994&r1=1222993&r2=1222994&view=diff
==============================================================================
--- pivot/trunk/tutorials/src/org/apache/pivot/tutorials/bxmlexplorer/tools/ComponentInspectorSkin.java (original)
+++ pivot/trunk/tutorials/src/org/apache/pivot/tutorials/bxmlexplorer/tools/ComponentInspectorSkin.java Sat Dec 24 16:07:37 2011
@@ -1,1355 +1,1355 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License,
- * Version 2.0 (the "License"); you may not use this file except in
- * compliance with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.pivot.tutorials.bxmlexplorer.tools;
-
-import java.awt.Color;
-
-import org.apache.pivot.collections.ArrayList;
-import org.apache.pivot.collections.Dictionary;
-import org.apache.pivot.collections.HashMap;
-import org.apache.pivot.util.CalendarDate;
-import org.apache.pivot.wtk.BoxPane;
-import org.apache.pivot.wtk.Button;
-import org.apache.pivot.wtk.ButtonStateListener;
-import org.apache.pivot.wtk.CalendarButton;
-import org.apache.pivot.wtk.CalendarButtonSelectionListener;
-import org.apache.pivot.wtk.Checkbox;
-import org.apache.pivot.wtk.ColorChooserButton;
-import org.apache.pivot.wtk.ColorChooserButtonSelectionListener;
-import org.apache.pivot.wtk.Component;
-import org.apache.pivot.wtk.ComponentStateListener;
-import org.apache.pivot.wtk.CornerRadii;
-import org.apache.pivot.wtk.Dimensions;
-import org.apache.pivot.wtk.FlowPane;
-import org.apache.pivot.wtk.Form;
-import org.apache.pivot.wtk.Insets;
-import org.apache.pivot.wtk.Label;
-import org.apache.pivot.wtk.Limits;
-import org.apache.pivot.wtk.ListButton;
-import org.apache.pivot.wtk.ListButtonSelectionListener;
-import org.apache.pivot.wtk.MessageType;
-import org.apache.pivot.wtk.Orientation;
-import org.apache.pivot.wtk.Point;
-import org.apache.pivot.wtk.Prompt;
-import org.apache.pivot.wtk.ScrollBar.Scope;
-import org.apache.pivot.wtk.Span;
-import org.apache.pivot.wtk.TextInput;
-import org.apache.pivot.wtk.Window;
-import org.apache.pivot.wtk.skin.ContainerSkin;
-import org.apache.pivot.wtk.validation.DoubleValidator;
-import org.apache.pivot.wtk.validation.FloatValidator;
-import org.apache.pivot.wtk.validation.IntValidator;
-
-abstract class ComponentInspectorSkin extends ContainerSkin implements ComponentInspectorListener {
-    // Container for the control components
-    protected Form form = new Form();
-
-    // Maps key to corresponding control component
-    private HashMap<String, Component> controls = new HashMap<String, Component>();
-
-    @Override
-    public void install(Component component) {
-        super.install(component);
-
-        ComponentInspector componentInspector = (ComponentInspector)component;
-
-        componentInspector.getComponentInspectorListeners().add(this);
-        componentInspector.add(form);
-
-        sourceChanged(componentInspector, null);
-    }
-
-    @Override
-    public int getPreferredWidth(int height) {
-        return form.getPreferredWidth(height);
-    }
-
-    @Override
-    public int getPreferredHeight(int width) {
-        return form.getPreferredHeight(width);
-    }
-
-    @Override
-    public Dimensions getPreferredSize() {
-        return form.getPreferredSize();
-    }
-
-    @Override
-    public void layout() {
-        form.setLocation(0, 0);
-        form.setSize(getWidth(), getHeight());
-    }
-
-    @Override
-    public void sourceChanged(ComponentInspector componentInspector, Component previousSource) {
-        // No-op
-    }
-
-    /**
-     * Adds a new control component to the specified form section. The component
-     * will control the specified property.
-     *
-     * @param dictionary
-     * The property dictionary
-     *
-     * @param key
-     * The property key
-     *
-     * @param type
-     * The type of the property
-     *
-     * @param section
-     * The form section
-     *
-     * @throws IllegalArgumentException
-     * If the form section does not belong to this skin's form
-     */
-    @SuppressWarnings("unchecked")
-    protected void addControl(Dictionary<String, Object> dictionary, String key,
-        Class<?> type, Form.Section section) {
-        if (section.getForm() != form) {
-            throw new IllegalArgumentException("section does not belong to form.");
-        }
-
-        Component control = null;
-
-        if (type == Boolean.TYPE) {
-            control = addBooleanControl(dictionary, key, section);
-        } else if (type == Integer.TYPE) {
-            control = addIntControl(dictionary, key, section);
-        } else if (type == Float.TYPE) {
-            control = addFloatControl(dictionary, key, section);
-        } else if (type == Double.TYPE) {
-            control = addDoubleControl(dictionary, key, section);
-        } else if (type == String.class) {
-            control = addStringControl(dictionary, key, section);
-        } else if (type.isEnum()) {
-            control = addEnumControl(dictionary, key, (Class<? extends Enum<?>>)type, section);
-        } else if (type == Point.class) {
-            control = addPointControl(dictionary, key, section);
-        } else if (type == Dimensions.class) {
-            control = addDimensionsControl(dictionary, key, section);
-        } else if (type == Limits.class) {
-            control = addLimitsControl(dictionary, key, section);
-        } else if (type == Insets.class) {
-            control = addInsetsControl(dictionary, key, section);
-        } else if (type == Span.class) {
-            control = addSpanControl(dictionary, key, section);
-        } else if (type == CornerRadii.class) {
-            control = addCornerRadiiControl(dictionary, key, section);
-        } else if (type == Scope.class) {
-            control = addScopeControl(dictionary, key, section);
-        } else if (type == Color.class) {
-            control = addColorControl(dictionary, key, section);
-        } else if (type == CalendarDate.class) {
-            control = addCalendarDateControl(dictionary, key, section);
-        }
-
-        if (control != null) {
-            controls.put(key, control);
-        }
-    }
-
-    /**
-     * Removes all control components from this skin's form.
-     */
-    protected void clearControls() {
-        for (Form.Section section : form.getSections()) {
-            section.remove(0, section.getLength());
-        }
-
-        controls.clear();
-    }
-
-    /**
-     * Updates the control component associated with the specified property to
-     * the appropriate state based on the property value.
-     *
-     * @param dictionary
-     * The property dictionary
-     *
-     * @param key
-     * The property key
-     *
-     * @param type
-     * The type of the property
-     */
-    protected void updateControl(Dictionary<String, Object> dictionary, String key, Class<?> type) {
-        if (type == Boolean.TYPE) {
-            updateBooleanControl(dictionary, key);
-        } else if (type == Integer.TYPE) {
-            updateIntControl(dictionary, key);
-        } else if (type == Float.TYPE) {
-            updateFloatControl(dictionary, key);
-        } else if (type == Double.TYPE) {
-            updateDoubleControl(dictionary, key);
-        } else if (type == String.class) {
-            updateStringControl(dictionary, key);
-        } else if (type.isEnum()) {
-            updateEnumControl(dictionary, key);
-        } else if (type == Point.class) {
-            updatePointControl(dictionary, key);
-        } else if (type == Dimensions.class) {
-            updateDimensionsControl(dictionary, key);
-        } else if (type == Limits.class) {
-            updateLimitsControl(dictionary, key);
-        } else if (type == Span.class) {
-            updateSpanControl(dictionary, key);
-        } else if (type == Scope.class) {
-            updateScopeControl(dictionary, key);
-        } else if (type == Color.class) {
-            updateColorControl(dictionary, key);
-        } else if (type == CalendarDate.class) {
-            updateCalendarDateControl(dictionary, key);
-        }
-    }
-
-    private Component addBooleanControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        boolean value = (Boolean)dictionary.get(key);
-
-        Checkbox checkbox = new Checkbox();
-        checkbox.setSelected(value);
-        section.add(checkbox);
-        Form.setLabel(checkbox, key);
-
-        checkbox.getButtonStateListeners().add(new ButtonStateListener() {
-            private boolean updating = false;
-
-            @Override
-            public void stateChanged(Button button, Button.State previousState) {
-                if (!updating) {
-                    updating = true;
-                    try {
-                        dictionary.put(key, button.isSelected());
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, button.getWindow());
-                        button.setState(previousState);
-                    } finally {
-                        updating = false;
-                    }
-                }
-            }
-        });
-
-        return checkbox;
-    }
-
-    private void updateBooleanControl(Dictionary<String, Object> dictionary, String key) {
-        Checkbox checkbox = (Checkbox)controls.get(key);
-
-        if (checkbox != null) {
-            boolean value = (Boolean)dictionary.get(key);
-            checkbox.setSelected(value);
-        }
-    }
-
-    private static Component addIntControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        int value = (Integer)dictionary.get(key);
-
-        TextInput textInput = new TextInput();
-        textInput.setTextSize(10);
-        textInput.setMaximumLength(10);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(value));
-        section.add(textInput);
-        Form.setLabel(textInput, key);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-
-                    try {
-                        dictionary.put(key, Integer.parseInt(textInput.getText()));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        int value = (Integer)dictionary.get(key);
-                        textInput.setText(String.valueOf(value));
-                    }
-                }
-            }
-        });
-
-        return textInput;
-    }
-
-    private void updateIntControl(Dictionary<String, Object> dictionary, String key) {
-        TextInput textInput = (TextInput)controls.get(key);
-
-        if (textInput != null) {
-            int value = (Integer)dictionary.get(key);
-            textInput.setText(String.valueOf(value));
-        }
-    }
-
-    private static Component addFloatControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        float value = (Float)dictionary.get(key);
-
-        TextInput textInput = new TextInput();
-        textInput.setTextSize(10);
-        textInput.setValidator(new FloatValidator());
-        textInput.setText(String.valueOf(value));
-        section.add(textInput);
-        Form.setLabel(textInput, key);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-
-                    try {
-                        dictionary.put(key, Float.parseFloat(textInput.getText()));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        float value = (Float)dictionary.get(key);
-                        textInput.setText(String.valueOf(value));
-                    }
-                }
-            }
-        });
-
-        return textInput;
-    }
-
-    private void updateFloatControl(Dictionary<String, Object> dictionary, String key) {
-        TextInput textInput = (TextInput)controls.get(key);
-
-        if (textInput != null) {
-            float value = (Float)dictionary.get(key);
-            textInput.setText(String.valueOf(value));
-        }
-    }
-
-    private static Component addDoubleControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        double value = (Double)dictionary.get(key);
-
-        TextInput textInput = new TextInput();
-        textInput.setTextSize(14);
-        textInput.setValidator(new DoubleValidator());
-        textInput.setText(String.valueOf(value));
-        section.add(textInput);
-        Form.setLabel(textInput, key);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-
-                    try {
-                        dictionary.put(key, Double.parseDouble(textInput.getText()));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        double value = (Double)dictionary.get(key);
-                        textInput.setText(String.valueOf(value));
-                    }
-                }
-            }
-        });
-
-        return textInput;
-    }
-
-    private void updateDoubleControl(Dictionary<String, Object> dictionary, String key) {
-        TextInput textInput = (TextInput)controls.get(key);
-
-        if (textInput != null) {
-            double value = (Double)dictionary.get(key);
-            textInput.setText(String.valueOf(value));
-        }
-    }
-
-    private static Component addStringControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        String value = (String)dictionary.get(key);
-
-        TextInput textInput = new TextInput();
-        textInput.setText(value == null ? "" : value);
-        section.add(textInput);
-        Form.setLabel(textInput, key);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-
-                    try {
-                        dictionary.put(key, textInput.getText());
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        String value = (String)dictionary.get(key);
-                        textInput.setText(value == null ? "" : value);
-                    }
-                }
-            }
-        });
-
-        return textInput;
-    }
-
-    private void updateStringControl(Dictionary<String, Object> dictionary, String key) {
-        TextInput textInput = (TextInput)controls.get(key);
-
-        if (textInput != null) {
-            String value = (String)dictionary.get(key);
-            textInput.setText(value == null ? "" : value);
-        }
-    }
-
-    private Component addEnumControl(final Dictionary<String, Object> dictionary,
-        final String key, Class<? extends Enum<?>> type, Form.Section section) {
-        Enum<?> value = (Enum<?>)dictionary.get(key);
-
-        ArrayList<Object> listData = new ArrayList<Object>();
-        listData.add(null);
-
-        Enum<?>[] enumConstants = type.getEnumConstants();
-        for (int i = 0; i < enumConstants.length; i++) {
-            listData.add(enumConstants[i]);
-        }
-
-        ListButton listButton = new ListButton();
-        listButton.setListData(listData);
-        listButton.setSelectedItem(value);
-        section.add(listButton);
-        Form.setLabel(listButton, key);
-
-        listButton.getListButtonSelectionListeners().add(new ListButtonSelectionListener.Adapter() {
-            private boolean updating = false;
-
-            @Override
-            public void selectedIndexChanged(ListButton listButton, int previousSelectedIndex) {
-                if (!updating) {
-                    updating = true;
-                    try {
-                        dictionary.put(key, listButton.getSelectedItem());
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, listButton.getWindow());
-                        listButton.setSelectedIndex(previousSelectedIndex);
-                    } finally {
-                        updating = false;
-                    }
-                }
-            }
-        });
-
-        return listButton;
-    }
-
-    private void updateEnumControl(Dictionary<String, Object> dictionary, String key) {
-        ListButton listButton = (ListButton)controls.get(key);
-
-        if (listButton != null) {
-            Enum<?> value = (Enum<?>)dictionary.get(key);
-            listButton.setSelectedItem(value);
-        }
-    }
-
-    private static Component addPointControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        Point point = (Point)dictionary.get(key);
-
-        BoxPane boxPane = new BoxPane(Orientation.VERTICAL);
-        section.add(boxPane);
-        Form.setLabel(boxPane, key);
-
-        FlowPane flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        TextInput textInput = new TextInput();
-        textInput.setTextSize(3);
-        textInput.setMaximumLength(4);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(point.x));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Point point = (Point)dictionary.get(key);
-
-                    try {
-                        int x = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Point(x, point.y));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(point.x));
-                    }
-                }
-            }
-        });
-
-        Label label = new Label("x");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(3);
-        textInput.setMaximumLength(4);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(point.y));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Point point = (Point)dictionary.get(key);
-
-                    try {
-                        int y = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Point(point.x, y));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(point.y));
-                    }
-                }
-            }
-        });
-
-        label = new Label("y");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        return boxPane;
-    }
-
-    private void updatePointControl(Dictionary<String, Object> dictionary, String key) {
-        BoxPane boxPane = (BoxPane)controls.get(key);
-
-        if (boxPane != null) {
-            Point point = (Point)dictionary.get(key);
-
-            TextInput xTextInput = (TextInput)((FlowPane)boxPane.get(0)).get(0);
-            TextInput yTextInput = (TextInput)((FlowPane)boxPane.get(1)).get(0);
-
-            xTextInput.setText(String.valueOf(point.x));
-            yTextInput.setText(String.valueOf(point.y));
-        }
-    }
-
-    private static Component addDimensionsControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        Dimensions dimensions = (Dimensions)dictionary.get(key);
-
-        BoxPane boxPane = new BoxPane(Orientation.VERTICAL);
-        section.add(boxPane);
-        Form.setLabel(boxPane, key);
-
-        FlowPane flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        TextInput textInput = new TextInput();
-        textInput.setTextSize(4);
-        textInput.setMaximumLength(5);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(dimensions.width));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Dimensions dimensions = (Dimensions)dictionary.get(key);
-
-                    try {
-                        int width = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Dimensions(width, dimensions.height));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(dimensions.width));
-                    }
-                }
-            }
-        });
-
-        Label label = new Label("width");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(4);
-        textInput.setMaximumLength(5);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(dimensions.height));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Dimensions dimensions = (Dimensions)dictionary.get(key);
-
-                    try {
-                        int height = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Dimensions(dimensions.width, height));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(dimensions.height));
-                    }
-                }
-            }
-        });
-
-        label = new Label("height");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        return boxPane;
-    }
-
-    private void updateDimensionsControl(Dictionary<String, Object> dictionary, String key) {
-        BoxPane boxPane = (BoxPane)controls.get(key);
-
-        if (boxPane != null) {
-            Dimensions dimensions = (Dimensions)dictionary.get(key);
-
-            TextInput widthTextInput = (TextInput)((FlowPane)boxPane.get(0)).get(0);
-            TextInput heightTextInput = (TextInput)((FlowPane)boxPane.get(1)).get(0);
-
-            widthTextInput.setText(String.valueOf(dimensions.width));
-            heightTextInput.setText(String.valueOf(dimensions.height));
-        }
-    }
-
-    private static Component addLimitsControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        Limits limits = (Limits)dictionary.get(key);
-
-        BoxPane boxPane = new BoxPane(Orientation.VERTICAL);
-        section.add(boxPane);
-        Form.setLabel(boxPane, key);
-
-        FlowPane flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        TextInput textInput = new TextInput();
-        textInput.setTextSize(10);
-        textInput.setMaximumLength(10);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(limits.minimum));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Limits limits = (Limits)dictionary.get(key);
-
-                    try {
-                        int min = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Limits(min, limits.maximum));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(limits.minimum));
-                    }
-                }
-            }
-        });
-
-        Label label = new Label("min");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(10);
-        textInput.setMaximumLength(10);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(limits.maximum));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Limits limits = (Limits)dictionary.get(key);
-
-                    try {
-                        int max = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Limits(limits.minimum, max));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(limits.maximum));
-                    }
-                }
-            }
-        });
-
-        label = new Label("max");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        return boxPane;
-    }
-
-    private void updateLimitsControl(Dictionary<String, Object> dictionary, String key) {
-        BoxPane boxPane = (BoxPane)controls.get(key);
-
-        if (boxPane != null) {
-            Limits limits = (Limits)dictionary.get(key);
-
-            TextInput minTextInput = (TextInput)((FlowPane)boxPane.get(0)).get(0);
-            TextInput maxTextInput = (TextInput)((FlowPane)boxPane.get(1)).get(0);
-
-            minTextInput.setText(String.valueOf(limits.minimum));
-            maxTextInput.setText(String.valueOf(limits.maximum));
-        }
-    }
-
-    private static Component addInsetsControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        Insets insets = (Insets)dictionary.get(key);
-
-        BoxPane boxPane = new BoxPane(Orientation.VERTICAL);
-        section.add(boxPane);
-        Form.setLabel(boxPane, key);
-
-        FlowPane flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        TextInput textInput = new TextInput();
-        textInput.setTextSize(4);
-        textInput.setMaximumLength(4);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(insets.top));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Insets insets = (Insets)dictionary.get(key);
-
-                    try {
-                        int top = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Insets(top, insets.left, insets.bottom,
-                            insets.right));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(insets.top));
-                    }
-                }
-            }
-        });
-
-        Label label = new Label("top");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(4);
-        textInput.setMaximumLength(4);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(insets.left));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Insets insets = (Insets)dictionary.get(key);
-
-                    try {
-                        int left = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Insets(insets.top, left, insets.bottom,
-                            insets.right));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(insets.left));
-                    }
-                }
-            }
-        });
-
-        label = new Label("left");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(4);
-        textInput.setMaximumLength(4);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(insets.bottom));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Insets insets = (Insets)dictionary.get(key);
-
-                    try {
-                        int bottom = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Insets(insets.top, insets.left, bottom,
-                            insets.right));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(insets.bottom));
-                    }
-                }
-            }
-        });
-
-        label = new Label("bottom");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(4);
-        textInput.setMaximumLength(4);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(insets.right));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Insets insets = (Insets)dictionary.get(key);
-
-                    try {
-                        int right = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Insets(insets.top, insets.left, insets.bottom,
-                            right));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(insets.right));
-                    }
-                }
-            }
-        });
-
-        label = new Label("right");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        return boxPane;
-    }
-
-    private static Component addSpanControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        Span span = (Span)dictionary.get(key);
-
-        BoxPane boxPane = new BoxPane(Orientation.VERTICAL);
-        section.add(boxPane);
-        Form.setLabel(boxPane, key);
-
-        FlowPane flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        TextInput textInput = new TextInput();
-        textInput.setTextSize(10);
-        textInput.setMaximumLength(10);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(span == null ? "" : String.valueOf(span.start));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Span span = (Span)dictionary.get(key);
-
-                    try {
-                        int start = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Span(start, span == null ? start : span.end));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(span == null ? "" : String.valueOf(span.start));
-                    }
-                }
-            }
-        });
-
-        Label label = new Label("start");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(10);
-        textInput.setMaximumLength(10);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(span == null ? "" : String.valueOf(span.end));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Span span = (Span)dictionary.get(key);
-
-                    try {
-                        int end = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Span(span == null ? end : span.start, end));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(span == null ? "" : String.valueOf(span.end));
-                    }
-                }
-            }
-        });
-
-        label = new Label("end");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        return boxPane;
-    }
-
-    private void updateSpanControl(Dictionary<String, Object> dictionary, String key) {
-        BoxPane boxPane = (BoxPane)controls.get(key);
-
-        if (boxPane != null) {
-            Span span = (Span)dictionary.get(key);
-
-            TextInput startTextInput = (TextInput)((FlowPane)boxPane.get(0)).get(0);
-            TextInput endTextInput = (TextInput)((FlowPane)boxPane.get(1)).get(0);
-
-            startTextInput.setText(span == null ? "" : String.valueOf(span.start));
-            endTextInput.setText(span == null ? "" : String.valueOf(span.end));
-        }
-    }
-
-    private static Component addCornerRadiiControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        CornerRadii cornerRadii = (CornerRadii)dictionary.get(key);
-
-        BoxPane boxPane = new BoxPane(Orientation.VERTICAL);
-        section.add(boxPane);
-        Form.setLabel(boxPane, key);
-
-        FlowPane flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        TextInput textInput = new TextInput();
-        textInput.setTextSize(4);
-        textInput.setMaximumLength(4);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(cornerRadii.topLeft));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    CornerRadii cornerRadii = (CornerRadii)dictionary.get(key);
-
-                    try {
-                        int topLeft = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new CornerRadii(topLeft, cornerRadii.topRight,
-                            cornerRadii.bottomLeft, cornerRadii.bottomRight));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(cornerRadii.topLeft));
-                    }
-                }
-            }
-        });
-
-        Label label = new Label("topLeft");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(4);
-        textInput.setMaximumLength(4);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(cornerRadii.topRight));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    CornerRadii cornerRadii = (CornerRadii)dictionary.get(key);
-
-                    try {
-                        int topRight = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new CornerRadii(cornerRadii.topLeft, topRight,
-                            cornerRadii.bottomLeft, cornerRadii.bottomRight));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(cornerRadii.topRight));
-                    }
-                }
-            }
-        });
-
-        label = new Label("topRight");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(4);
-        textInput.setMaximumLength(4);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(cornerRadii.bottomLeft));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    CornerRadii cornerRadii = (CornerRadii)dictionary.get(key);
-
-                    try {
-                        int bottomLeft = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new CornerRadii(cornerRadii.topLeft,
-                            cornerRadii.topRight, bottomLeft, cornerRadii.bottomRight));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(cornerRadii.bottomLeft));
-                    }
-                }
-            }
-        });
-
-        label = new Label("bottomLeft");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(4);
-        textInput.setMaximumLength(4);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(String.valueOf(cornerRadii.bottomRight));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    CornerRadii cornerRadii = (CornerRadii)dictionary.get(key);
-
-                    try {
-                        int bottomRight = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new CornerRadii(cornerRadii.topLeft,
-                            cornerRadii.topRight, cornerRadii.bottomLeft, bottomRight));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(String.valueOf(cornerRadii.bottomRight));
-                    }
-                }
-            }
-        });
-
-        label = new Label("bottomRight");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        return boxPane;
-    }
-
-    private static Component addScopeControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        Scope scope = (Scope)dictionary.get(key);
-
-        BoxPane boxPane = new BoxPane(Orientation.VERTICAL);
-        section.add(boxPane);
-        Form.setLabel(boxPane, key);
-
-        FlowPane flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        TextInput textInput = new TextInput();
-        textInput.setTextSize(10);
-        textInput.setMaximumLength(10);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(scope == null ? "" : String.valueOf(scope.start));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Scope scope = (Scope)dictionary.get(key);
-
-                    try {
-                        int start = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Scope(start, scope == null ? start : scope.end,
-                            scope == null ? start : scope.extent));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(scope == null ? "" : String.valueOf(scope.start));
-                    }
-                }
-            }
-        });
-
-        Label label = new Label("start");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(10);
-        textInput.setMaximumLength(10);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(scope == null ? "" : String.valueOf(scope.end));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Scope scope = (Scope)dictionary.get(key);
-
-                    try {
-                        int end = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Scope(scope == null ? end : scope.start, end,
-                            scope == null ? end : scope.extent));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(scope == null ? "" : String.valueOf(scope.end));
-                    }
-                }
-            }
-        });
-
-        label = new Label("end");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        flowPane = new FlowPane();
-        flowPane.getStyles().put("alignToBaseline", true);
-        flowPane.getStyles().put("horizontalSpacing", 5);
-        boxPane.add(flowPane);
-
-        textInput = new TextInput();
-        textInput.setTextSize(10);
-        textInput.setMaximumLength(10);
-        textInput.setValidator(new IntValidator());
-        textInput.setText(scope == null ? "" : String.valueOf(scope.extent));
-        flowPane.add(textInput);
-
-        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
-            @Override
-            public void focusedChanged(Component component, Component obverseComponent) {
-                if (!component.isFocused()) {
-                    TextInput textInput = (TextInput)component;
-                    Scope scope = (Scope)dictionary.get(key);
-
-                    try {
-                        int extent = Integer.parseInt(textInput.getText());
-                        dictionary.put(key, new Scope(scope == null ? extent : scope.start,
-                            scope == null ? extent : scope.end, extent));
-                    } catch (Exception exception) {
-                        displayErrorMessage(exception, component.getWindow());
-                        textInput.setText(scope == null ? "" : String.valueOf(scope.extent));
-                    }
-                }
-            }
-        });
-
-        label = new Label("extent");
-        label.getStyles().put("font", "{italic:true}");
-        flowPane.add(label);
-
-        return boxPane;
-    }
-
-    private void updateScopeControl(Dictionary<String, Object> dictionary, String key) {
-        BoxPane boxPane = (BoxPane)controls.get(key);
-
-        if (boxPane != null) {
-            Scope scope = (Scope)dictionary.get(key);
-
-            TextInput startTextInput = (TextInput)((FlowPane)boxPane.get(0)).get(0);
-            TextInput endTextInput = (TextInput)((FlowPane)boxPane.get(1)).get(0);
-            TextInput extentTextInput = (TextInput)((FlowPane)boxPane.get(2)).get(0);
-
-            startTextInput.setText(scope == null ? "" : String.valueOf(scope.start));
-            endTextInput.setText(scope == null ? "" : String.valueOf(scope.end));
-            extentTextInput.setText(scope == null ? "" : String.valueOf(scope.extent));
-        }
-    }
-
-    private static Component addColorControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        Color color = (Color)dictionary.get(key);
-
-        ColorChooserButton colorChooserButton = new ColorChooserButton();
-        colorChooserButton.setSelectedColor(color);
-        section.add(colorChooserButton);
-        Form.setLabel(colorChooserButton, key);
-
-        colorChooserButton.getColorChooserButtonSelectionListeners().add
-            (new ColorChooserButtonSelectionListener() {
-            @Override
-            public void selectedColorChanged(ColorChooserButton colorChooserButton,
-                Color previousSelectedColor) {
-                try {
-                    dictionary.put(key, colorChooserButton.getSelectedColor());
-                } catch (Exception exception) {
-                    displayErrorMessage(exception, colorChooserButton.getWindow());
-                    dictionary.put(key, previousSelectedColor);
-                }
-            }
-        });
-
-        return colorChooserButton;
-    }
-
-    private void updateColorControl(Dictionary<String, Object> dictionary, String key) {
-        ColorChooserButton colorChooserButton = (ColorChooserButton)controls.get(key);
-
-        if (colorChooserButton != null) {
-            Color value = (Color)dictionary.get(key);
-            colorChooserButton.setSelectedColor(value);
-        }
-    }
-
-    private static Component addCalendarDateControl(final Dictionary<String, Object> dictionary,
-        final String key, Form.Section section) {
-        CalendarDate calendarDate = (CalendarDate)dictionary.get(key);
-
-        CalendarButton calendarButton = new CalendarButton();
-        calendarButton.setMinimumWidth(75);
-        calendarButton.setSelectedDate(calendarDate);
-        section.add(calendarButton);
-        Form.setLabel(calendarButton, key);
-
-        calendarButton.getCalendarButtonSelectionListeners().add
-            (new CalendarButtonSelectionListener() {
-            @Override
-            public void selectedDateChanged(CalendarButton calendarButton,
-                CalendarDate previousSelectedDate) {
-                try {
-                    dictionary.put(key, calendarButton.getSelectedDate());
-                } catch (Exception exception) {
-                    displayErrorMessage(exception, calendarButton.getWindow());
-                    dictionary.put(key, previousSelectedDate);
-                }
-            }
-        });
-
-        return calendarButton;
-    }
-
-    private void updateCalendarDateControl(Dictionary<String, Object> dictionary, String key) {
-        CalendarButton calendarButton = (CalendarButton)controls.get(key);
-
-        if (calendarButton != null) {
-            CalendarDate value = (CalendarDate)dictionary.get(key);
-            calendarButton.setSelectedDate(value);
-        }
-    }
-
-    private static void displayErrorMessage(Exception exception, Window window) {
-        String message = exception.getLocalizedMessage();
-
-        if (message == null) {
-            message = exception.getClass().getSimpleName();
-        }
-
-        Prompt.prompt(MessageType.ERROR, message, window);
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pivot.tutorials.bxmlexplorer.tools;
+
+import java.awt.Color;
+
+import org.apache.pivot.collections.ArrayList;
+import org.apache.pivot.collections.Dictionary;
+import org.apache.pivot.collections.HashMap;
+import org.apache.pivot.util.CalendarDate;
+import org.apache.pivot.wtk.BoxPane;
+import org.apache.pivot.wtk.Button;
+import org.apache.pivot.wtk.ButtonStateListener;
+import org.apache.pivot.wtk.CalendarButton;
+import org.apache.pivot.wtk.CalendarButtonSelectionListener;
+import org.apache.pivot.wtk.Checkbox;
+import org.apache.pivot.wtk.ColorChooserButton;
+import org.apache.pivot.wtk.ColorChooserButtonSelectionListener;
+import org.apache.pivot.wtk.Component;
+import org.apache.pivot.wtk.ComponentStateListener;
+import org.apache.pivot.wtk.CornerRadii;
+import org.apache.pivot.wtk.Dimensions;
+import org.apache.pivot.wtk.FlowPane;
+import org.apache.pivot.wtk.Form;
+import org.apache.pivot.wtk.Insets;
+import org.apache.pivot.wtk.Label;
+import org.apache.pivot.wtk.Limits;
+import org.apache.pivot.wtk.ListButton;
+import org.apache.pivot.wtk.ListButtonSelectionListener;
+import org.apache.pivot.wtk.MessageType;
+import org.apache.pivot.wtk.Orientation;
+import org.apache.pivot.wtk.Point;
+import org.apache.pivot.wtk.Prompt;
+import org.apache.pivot.wtk.ScrollBar.Scope;
+import org.apache.pivot.wtk.Span;
+import org.apache.pivot.wtk.TextInput;
+import org.apache.pivot.wtk.Window;
+import org.apache.pivot.wtk.skin.ContainerSkin;
+import org.apache.pivot.wtk.validation.DoubleValidator;
+import org.apache.pivot.wtk.validation.FloatValidator;
+import org.apache.pivot.wtk.validation.IntValidator;
+
+abstract class ComponentInspectorSkin extends ContainerSkin implements ComponentInspectorListener {
+    // Container for the control components
+    protected Form form = new Form();
+
+    // Maps key to corresponding control component
+    private HashMap<String, Component> controls = new HashMap<String, Component>();
+
+    @Override
+    public void install(Component component) {
+        super.install(component);
+
+        ComponentInspector componentInspector = (ComponentInspector)component;
+
+        componentInspector.getComponentInspectorListeners().add(this);
+        componentInspector.add(form);
+
+        sourceChanged(componentInspector, null);
+    }
+
+    @Override
+    public int getPreferredWidth(int height) {
+        return form.getPreferredWidth(height);
+    }
+
+    @Override
+    public int getPreferredHeight(int width) {
+        return form.getPreferredHeight(width);
+    }
+
+    @Override
+    public Dimensions getPreferredSize() {
+        return form.getPreferredSize();
+    }
+
+    @Override
+    public void layout() {
+        form.setLocation(0, 0);
+        form.setSize(getWidth(), getHeight());
+    }
+
+    @Override
+    public void sourceChanged(ComponentInspector componentInspector, Component previousSource) {
+        // No-op
+    }
+
+    /**
+     * Adds a new control component to the specified form section. The component
+     * will control the specified property.
+     *
+     * @param dictionary
+     * The property dictionary
+     *
+     * @param key
+     * The property key
+     *
+     * @param type
+     * The type of the property
+     *
+     * @param section
+     * The form section
+     *
+     * @throws IllegalArgumentException
+     * If the form section does not belong to this skin's form
+     */
+    @SuppressWarnings("unchecked")
+    protected void addControl(Dictionary<String, Object> dictionary, String key,
+        Class<?> type, Form.Section section) {
+        if (section.getForm() != form) {
+            throw new IllegalArgumentException("section does not belong to form.");
+        }
+
+        Component control = null;
+
+        if (type == Boolean.TYPE) {
+            control = addBooleanControl(dictionary, key, section);
+        } else if (type == Integer.TYPE) {
+            control = addIntControl(dictionary, key, section);
+        } else if (type == Float.TYPE) {
+            control = addFloatControl(dictionary, key, section);
+        } else if (type == Double.TYPE) {
+            control = addDoubleControl(dictionary, key, section);
+        } else if (type == String.class) {
+            control = addStringControl(dictionary, key, section);
+        } else if (type.isEnum()) {
+            control = addEnumControl(dictionary, key, (Class<? extends Enum<?>>)type, section);
+        } else if (type == Point.class) {
+            control = addPointControl(dictionary, key, section);
+        } else if (type == Dimensions.class) {
+            control = addDimensionsControl(dictionary, key, section);
+        } else if (type == Limits.class) {
+            control = addLimitsControl(dictionary, key, section);
+        } else if (type == Insets.class) {
+            control = addInsetsControl(dictionary, key, section);
+        } else if (type == Span.class) {
+            control = addSpanControl(dictionary, key, section);
+        } else if (type == CornerRadii.class) {
+            control = addCornerRadiiControl(dictionary, key, section);
+        } else if (type == Scope.class) {
+            control = addScopeControl(dictionary, key, section);
+        } else if (type == Color.class) {
+            control = addColorControl(dictionary, key, section);
+        } else if (type == CalendarDate.class) {
+            control = addCalendarDateControl(dictionary, key, section);
+        }
+
+        if (control != null) {
+            controls.put(key, control);
+        }
+    }
+
+    /**
+     * Removes all control components from this skin's form.
+     */
+    protected void clearControls() {
+        for (Form.Section section : form.getSections()) {
+            section.remove(0, section.getLength());
+        }
+
+        controls.clear();
+    }
+
+    /**
+     * Updates the control component associated with the specified property to
+     * the appropriate state based on the property value.
+     *
+     * @param dictionary
+     * The property dictionary
+     *
+     * @param key
+     * The property key
+     *
+     * @param type
+     * The type of the property
+     */
+    protected void updateControl(Dictionary<String, Object> dictionary, String key, Class<?> type) {
+        if (type == Boolean.TYPE) {
+            updateBooleanControl(dictionary, key);
+        } else if (type == Integer.TYPE) {
+            updateIntControl(dictionary, key);
+        } else if (type == Float.TYPE) {
+            updateFloatControl(dictionary, key);
+        } else if (type == Double.TYPE) {
+            updateDoubleControl(dictionary, key);
+        } else if (type == String.class) {
+            updateStringControl(dictionary, key);
+        } else if (type.isEnum()) {
+            updateEnumControl(dictionary, key);
+        } else if (type == Point.class) {
+            updatePointControl(dictionary, key);
+        } else if (type == Dimensions.class) {
+            updateDimensionsControl(dictionary, key);
+        } else if (type == Limits.class) {
+            updateLimitsControl(dictionary, key);
+        } else if (type == Span.class) {
+            updateSpanControl(dictionary, key);
+        } else if (type == Scope.class) {
+            updateScopeControl(dictionary, key);
+        } else if (type == Color.class) {
+            updateColorControl(dictionary, key);
+        } else if (type == CalendarDate.class) {
+            updateCalendarDateControl(dictionary, key);
+        }
+    }
+
+    private Component addBooleanControl(final Dictionary<String, Object> dictionary,
+        final String key, Form.Section section) {
+        boolean value = (Boolean)dictionary.get(key);
+
+        Checkbox checkbox = new Checkbox();
+        checkbox.setSelected(value);
+        section.add(checkbox);
+        Form.setLabel(checkbox, key);
+
+        checkbox.getButtonStateListeners().add(new ButtonStateListener() {
+            private boolean updating = false;
+
+            @Override
+            public void stateChanged(Button button, Button.State previousState) {
+                if (!updating) {
+                    updating = true;
+                    try {
+                        dictionary.put(key, button.isSelected());
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, button.getWindow());
+                        button.setState(previousState);
+                    } finally {
+                        updating = false;
+                    }
+                }
+            }
+        });
+
+        return checkbox;
+    }
+
+    private void updateBooleanControl(Dictionary<String, Object> dictionary, String key) {
+        Checkbox checkbox = (Checkbox)controls.get(key);
+
+        if (checkbox != null) {
+            boolean value = (Boolean)dictionary.get(key);
+            checkbox.setSelected(value);
+        }
+    }
+
+    private static Component addIntControl(final Dictionary<String, Object> dictionary,
+        final String key, Form.Section section) {
+        int value = (Integer)dictionary.get(key);
+
+        TextInput textInput = new TextInput();
+        textInput.setTextSize(10);
+        textInput.setMaximumLength(10);
+        textInput.setValidator(new IntValidator());
+        textInput.setText(String.valueOf(value));
+        section.add(textInput);
+        Form.setLabel(textInput, key);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+
+                    try {
+                        dictionary.put(key, Integer.parseInt(textInput.getText()));
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        int value = (Integer)dictionary.get(key);
+                        textInput.setText(String.valueOf(value));
+                    }
+                }
+            }
+        });
+
+        return textInput;
+    }
+
+    private void updateIntControl(Dictionary<String, Object> dictionary, String key) {
+        TextInput textInput = (TextInput)controls.get(key);
+
+        if (textInput != null) {
+            int value = (Integer)dictionary.get(key);
+            textInput.setText(String.valueOf(value));
+        }
+    }
+
+    private static Component addFloatControl(final Dictionary<String, Object> dictionary,
+        final String key, Form.Section section) {
+        float value = (Float)dictionary.get(key);
+
+        TextInput textInput = new TextInput();
+        textInput.setTextSize(10);
+        textInput.setValidator(new FloatValidator());
+        textInput.setText(String.valueOf(value));
+        section.add(textInput);
+        Form.setLabel(textInput, key);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+
+                    try {
+                        dictionary.put(key, Float.parseFloat(textInput.getText()));
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        float value = (Float)dictionary.get(key);
+                        textInput.setText(String.valueOf(value));
+                    }
+                }
+            }
+        });
+
+        return textInput;
+    }
+
+    private void updateFloatControl(Dictionary<String, Object> dictionary, String key) {
+        TextInput textInput = (TextInput)controls.get(key);
+
+        if (textInput != null) {
+            float value = (Float)dictionary.get(key);
+            textInput.setText(String.valueOf(value));
+        }
+    }
+
+    private static Component addDoubleControl(final Dictionary<String, Object> dictionary,
+        final String key, Form.Section section) {
+        double value = (Double)dictionary.get(key);
+
+        TextInput textInput = new TextInput();
+        textInput.setTextSize(14);
+        textInput.setValidator(new DoubleValidator());
+        textInput.setText(String.valueOf(value));
+        section.add(textInput);
+        Form.setLabel(textInput, key);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+
+                    try {
+                        dictionary.put(key, Double.parseDouble(textInput.getText()));
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        double value = (Double)dictionary.get(key);
+                        textInput.setText(String.valueOf(value));
+                    }
+                }
+            }
+        });
+
+        return textInput;
+    }
+
+    private void updateDoubleControl(Dictionary<String, Object> dictionary, String key) {
+        TextInput textInput = (TextInput)controls.get(key);
+
+        if (textInput != null) {
+            double value = (Double)dictionary.get(key);
+            textInput.setText(String.valueOf(value));
+        }
+    }
+
+    private static Component addStringControl(final Dictionary<String, Object> dictionary,
+        final String key, Form.Section section) {
+        String value = (String)dictionary.get(key);
+
+        TextInput textInput = new TextInput();
+        textInput.setText(value == null ? "" : value);
+        section.add(textInput);
+        Form.setLabel(textInput, key);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+
+                    try {
+                        dictionary.put(key, textInput.getText());
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        String value = (String)dictionary.get(key);
+                        textInput.setText(value == null ? "" : value);
+                    }
+                }
+            }
+        });
+
+        return textInput;
+    }
+
+    private void updateStringControl(Dictionary<String, Object> dictionary, String key) {
+        TextInput textInput = (TextInput)controls.get(key);
+
+        if (textInput != null) {
+            String value = (String)dictionary.get(key);
+            textInput.setText(value == null ? "" : value);
+        }
+    }
+
+    private Component addEnumControl(final Dictionary<String, Object> dictionary,
+        final String key, Class<? extends Enum<?>> type, Form.Section section) {
+        Enum<?> value = (Enum<?>)dictionary.get(key);
+
+        ArrayList<Object> listData = new ArrayList<Object>();
+        listData.add(null);
+
+        Enum<?>[] enumConstants = type.getEnumConstants();
+        for (int i = 0; i < enumConstants.length; i++) {
+            listData.add(enumConstants[i]);
+        }
+
+        ListButton listButton = new ListButton();
+        listButton.setListData(listData);
+        listButton.setSelectedItem(value);
+        section.add(listButton);
+        Form.setLabel(listButton, key);
+
+        listButton.getListButtonSelectionListeners().add(new ListButtonSelectionListener.Adapter() {
+            private boolean updating = false;
+
+            @Override
+            public void selectedIndexChanged(ListButton listButton, int previousSelectedIndex) {
+                if (!updating) {
+                    updating = true;
+                    try {
+                        dictionary.put(key, listButton.getSelectedItem());
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, listButton.getWindow());
+                        listButton.setSelectedIndex(previousSelectedIndex);
+                    } finally {
+                        updating = false;
+                    }
+                }
+            }
+        });
+
+        return listButton;
+    }
+
+    private void updateEnumControl(Dictionary<String, Object> dictionary, String key) {
+        ListButton listButton = (ListButton)controls.get(key);
+
+        if (listButton != null) {
+            Enum<?> value = (Enum<?>)dictionary.get(key);
+            listButton.setSelectedItem(value);
+        }
+    }
+
+    private static Component addPointControl(final Dictionary<String, Object> dictionary,
+        final String key, Form.Section section) {
+        Point point = (Point)dictionary.get(key);
+
+        BoxPane boxPane = new BoxPane(Orientation.VERTICAL);
+        section.add(boxPane);
+        Form.setLabel(boxPane, key);
+
+        FlowPane flowPane = new FlowPane();
+        flowPane.getStyles().put("alignToBaseline", true);
+        flowPane.getStyles().put("horizontalSpacing", 5);
+        boxPane.add(flowPane);
+
+        TextInput textInput = new TextInput();
+        textInput.setTextSize(3);
+        textInput.setMaximumLength(4);
+        textInput.setValidator(new IntValidator());
+        textInput.setText(String.valueOf(point.x));
+        flowPane.add(textInput);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+                    Point point = (Point)dictionary.get(key);
+
+                    try {
+                        int x = Integer.parseInt(textInput.getText());
+                        dictionary.put(key, new Point(x, point.y));
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        textInput.setText(String.valueOf(point.x));
+                    }
+                }
+            }
+        });
+
+        Label label = new Label("x");
+        label.getStyles().put("font", "{italic:true}");
+        flowPane.add(label);
+
+        flowPane = new FlowPane();
+        flowPane.getStyles().put("alignToBaseline", true);
+        flowPane.getStyles().put("horizontalSpacing", 5);
+        boxPane.add(flowPane);
+
+        textInput = new TextInput();
+        textInput.setTextSize(3);
+        textInput.setMaximumLength(4);
+        textInput.setValidator(new IntValidator());
+        textInput.setText(String.valueOf(point.y));
+        flowPane.add(textInput);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+                    Point point = (Point)dictionary.get(key);
+
+                    try {
+                        int y = Integer.parseInt(textInput.getText());
+                        dictionary.put(key, new Point(point.x, y));
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        textInput.setText(String.valueOf(point.y));
+                    }
+                }
+            }
+        });
+
+        label = new Label("y");
+        label.getStyles().put("font", "{italic:true}");
+        flowPane.add(label);
+
+        return boxPane;
+    }
+
+    private void updatePointControl(Dictionary<String, Object> dictionary, String key) {
+        BoxPane boxPane = (BoxPane)controls.get(key);
+
+        if (boxPane != null) {
+            Point point = (Point)dictionary.get(key);
+
+            TextInput xTextInput = (TextInput)((FlowPane)boxPane.get(0)).get(0);
+            TextInput yTextInput = (TextInput)((FlowPane)boxPane.get(1)).get(0);
+
+            xTextInput.setText(String.valueOf(point.x));
+            yTextInput.setText(String.valueOf(point.y));
+        }
+    }
+
+    private static Component addDimensionsControl(final Dictionary<String, Object> dictionary,
+        final String key, Form.Section section) {
+        Dimensions dimensions = (Dimensions)dictionary.get(key);
+
+        BoxPane boxPane = new BoxPane(Orientation.VERTICAL);
+        section.add(boxPane);
+        Form.setLabel(boxPane, key);
+
+        FlowPane flowPane = new FlowPane();
+        flowPane.getStyles().put("alignToBaseline", true);
+        flowPane.getStyles().put("horizontalSpacing", 5);
+        boxPane.add(flowPane);
+
+        TextInput textInput = new TextInput();
+        textInput.setTextSize(4);
+        textInput.setMaximumLength(5);
+        textInput.setValidator(new IntValidator());
+        textInput.setText(String.valueOf(dimensions.width));
+        flowPane.add(textInput);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+                    Dimensions dimensions = (Dimensions)dictionary.get(key);
+
+                    try {
+                        int width = Integer.parseInt(textInput.getText());
+                        dictionary.put(key, new Dimensions(width, dimensions.height));
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        textInput.setText(String.valueOf(dimensions.width));
+                    }
+                }
+            }
+        });
+
+        Label label = new Label("width");
+        label.getStyles().put("font", "{italic:true}");
+        flowPane.add(label);
+
+        flowPane = new FlowPane();
+        flowPane.getStyles().put("alignToBaseline", true);
+        flowPane.getStyles().put("horizontalSpacing", 5);
+        boxPane.add(flowPane);
+
+        textInput = new TextInput();
+        textInput.setTextSize(4);
+        textInput.setMaximumLength(5);
+        textInput.setValidator(new IntValidator());
+        textInput.setText(String.valueOf(dimensions.height));
+        flowPane.add(textInput);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+                    Dimensions dimensions = (Dimensions)dictionary.get(key);
+
+                    try {
+                        int height = Integer.parseInt(textInput.getText());
+                        dictionary.put(key, new Dimensions(dimensions.width, height));
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        textInput.setText(String.valueOf(dimensions.height));
+                    }
+                }
+            }
+        });
+
+        label = new Label("height");
+        label.getStyles().put("font", "{italic:true}");
+        flowPane.add(label);
+
+        return boxPane;
+    }
+
+    private void updateDimensionsControl(Dictionary<String, Object> dictionary, String key) {
+        BoxPane boxPane = (BoxPane)controls.get(key);
+
+        if (boxPane != null) {
+            Dimensions dimensions = (Dimensions)dictionary.get(key);
+
+            TextInput widthTextInput = (TextInput)((FlowPane)boxPane.get(0)).get(0);
+            TextInput heightTextInput = (TextInput)((FlowPane)boxPane.get(1)).get(0);
+
+            widthTextInput.setText(String.valueOf(dimensions.width));
+            heightTextInput.setText(String.valueOf(dimensions.height));
+        }
+    }
+
+    private static Component addLimitsControl(final Dictionary<String, Object> dictionary,
+        final String key, Form.Section section) {
+        Limits limits = (Limits)dictionary.get(key);
+
+        BoxPane boxPane = new BoxPane(Orientation.VERTICAL);
+        section.add(boxPane);
+        Form.setLabel(boxPane, key);
+
+        FlowPane flowPane = new FlowPane();
+        flowPane.getStyles().put("alignToBaseline", true);
+        flowPane.getStyles().put("horizontalSpacing", 5);
+        boxPane.add(flowPane);
+
+        TextInput textInput = new TextInput();
+        textInput.setTextSize(10);
+        textInput.setMaximumLength(10);
+        textInput.setValidator(new IntValidator());
+        textInput.setText(String.valueOf(limits.minimum));
+        flowPane.add(textInput);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+                    Limits limits = (Limits)dictionary.get(key);
+
+                    try {
+                        int min = Integer.parseInt(textInput.getText());
+                        dictionary.put(key, new Limits(min, limits.maximum));
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        textInput.setText(String.valueOf(limits.minimum));
+                    }
+                }
+            }
+        });
+
+        Label label = new Label("min");
+        label.getStyles().put("font", "{italic:true}");
+        flowPane.add(label);
+
+        flowPane = new FlowPane();
+        flowPane.getStyles().put("alignToBaseline", true);
+        flowPane.getStyles().put("horizontalSpacing", 5);
+        boxPane.add(flowPane);
+
+        textInput = new TextInput();
+        textInput.setTextSize(10);
+        textInput.setMaximumLength(10);
+        textInput.setValidator(new IntValidator());
+        textInput.setText(String.valueOf(limits.maximum));
+        flowPane.add(textInput);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+                    Limits limits = (Limits)dictionary.get(key);
+
+                    try {
+                        int max = Integer.parseInt(textInput.getText());
+                        dictionary.put(key, new Limits(limits.minimum, max));
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        textInput.setText(String.valueOf(limits.maximum));
+                    }
+                }
+            }
+        });
+
+        label = new Label("max");
+        label.getStyles().put("font", "{italic:true}");
+        flowPane.add(label);
+
+        return boxPane;
+    }
+
+    private void updateLimitsControl(Dictionary<String, Object> dictionary, String key) {
+        BoxPane boxPane = (BoxPane)controls.get(key);
+
+        if (boxPane != null) {
+            Limits limits = (Limits)dictionary.get(key);
+
+            TextInput minTextInput = (TextInput)((FlowPane)boxPane.get(0)).get(0);
+            TextInput maxTextInput = (TextInput)((FlowPane)boxPane.get(1)).get(0);
+
+            minTextInput.setText(String.valueOf(limits.minimum));
+            maxTextInput.setText(String.valueOf(limits.maximum));
+        }
+    }
+
+    private static Component addInsetsControl(final Dictionary<String, Object> dictionary,
+        final String key, Form.Section section) {
+        Insets insets = (Insets)dictionary.get(key);
+
+        BoxPane boxPane = new BoxPane(Orientation.VERTICAL);
+        section.add(boxPane);
+        Form.setLabel(boxPane, key);
+
+        FlowPane flowPane = new FlowPane();
+        flowPane.getStyles().put("alignToBaseline", true);
+        flowPane.getStyles().put("horizontalSpacing", 5);
+        boxPane.add(flowPane);
+
+        TextInput textInput = new TextInput();
+        textInput.setTextSize(4);
+        textInput.setMaximumLength(4);
+        textInput.setValidator(new IntValidator());
+        textInput.setText(String.valueOf(insets.top));
+        flowPane.add(textInput);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+                    Insets insets = (Insets)dictionary.get(key);
+
+                    try {
+                        int top = Integer.parseInt(textInput.getText());
+                        dictionary.put(key, new Insets(top, insets.left, insets.bottom,
+                            insets.right));
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        textInput.setText(String.valueOf(insets.top));
+                    }
+                }
+            }
+        });
+
+        Label label = new Label("top");
+        label.getStyles().put("font", "{italic:true}");
+        flowPane.add(label);
+
+        flowPane = new FlowPane();
+        flowPane.getStyles().put("alignToBaseline", true);
+        flowPane.getStyles().put("horizontalSpacing", 5);
+        boxPane.add(flowPane);
+
+        textInput = new TextInput();
+        textInput.setTextSize(4);
+        textInput.setMaximumLength(4);
+        textInput.setValidator(new IntValidator());
+        textInput.setText(String.valueOf(insets.left));
+        flowPane.add(textInput);
+
+        textInput.getComponentStateListeners().add(new ComponentStateListener.Adapter() {
+            @Override
+            public void focusedChanged(Component component, Component obverseComponent) {
+                if (!component.isFocused()) {
+                    TextInput textInput = (TextInput)component;
+                    Insets insets = (Insets)dictionary.get(key);
+
+                    try {
+                        int left = Integer.parseInt(textInput.getText());
+                        dictionary.put(key, new Insets(insets.top, left, insets.bottom,
+                            insets.right));
+                    } catch (Exception exception) {
+                        displayErrorMessage(exception, component.getWindow());
+                        textInput.setText(String.valueOf(insets.left));
+                    }
+                }
+            }
+        });
+
+        label = new Label("left");
+        label.getStyles().put("font", "{italic:true}");
+        flowPane.add(label);
+
+        flowPane = new FlowPane();
+        flowPane.getStyles().put("alignToBaseline", true);

[... 529 lines stripped ...]