You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by tv...@apache.org on 2009/05/12 23:04:03 UTC

svn commit: r774083 - /incubator/pivot/trunk/tutorials/src/pivot/tutorials/Demo.java

Author: tvolkert
Date: Tue May 12 21:04:03 2009
New Revision: 774083

URL: http://svn.apache.org/viewvc?rev=774083&view=rev
Log:
Restructured tutorials demo to use named inner classes as opposed to anonymous inner classes

Modified:
    incubator/pivot/trunk/tutorials/src/pivot/tutorials/Demo.java

Modified: incubator/pivot/trunk/tutorials/src/pivot/tutorials/Demo.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/tutorials/src/pivot/tutorials/Demo.java?rev=774083&r1=774082&r2=774083&view=diff
==============================================================================
--- incubator/pivot/trunk/tutorials/src/pivot/tutorials/Demo.java (original)
+++ incubator/pivot/trunk/tutorials/src/pivot/tutorials/Demo.java Tue May 12 21:04:03 2009
@@ -96,600 +96,618 @@
         }
     }
 
-    private Window window = null;
+    private class ButtonsRollupStateHandler extends RollupStateHandler {
+        @Load(name="buttons.wtkx")
+        private Component component;
 
-    @Load(name="demo.wtkx") private Component content;
-    @Bind(property="content") private Rollup buttonsRollup;
-    @Bind(property="content") private Rollup listsRollup;
-    @Bind(property="content") private Rollup textRollup;
-    @Bind(property="content") private Rollup calendarsRollup;
-    @Bind(property="content") private Rollup navigationRollup;
-    @Bind(property="content") private Rollup splittersRollup;
-    @Bind(property="content") private Rollup menusRollup;
-    @Bind(property="content") private Rollup metersRollup;
-    @Bind(property="content") private Rollup spinnersRollup;
-    @Bind(property="content") private Rollup tablesRollup;
-    @Bind(property="content") private Rollup treesRollup;
-    @Bind(property="content") private Rollup dragDropRollup;
-    @Bind(property="content") private Rollup alertsRollup;
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
+            }
 
-    public static void main(String[] args) {
-        DesktopApplicationContext.main(Demo.class, args);
+            return Vote.APPROVE;
+        }
     }
 
-    @SuppressWarnings("unchecked")
-    public void startup(final Display display, Dictionary<String, String> properties) throws Exception {
-        // NOTE This is commented out because it takes a non-negligible amount
-        // of time to execute
-        /*
-        TerraTheme terraTheme = (TerraTheme)Theme.getTheme();
-        URL schemeLocation = TerraTheme.class.getResource("TerraTheme_default.json");
-        terraTheme.loadScheme(schemeLocation);
-        */
-
-        bind();
+    private class ListsRollupStateHandler extends RollupStateHandler {
+        @Load(name="lists.wtkx") private Component component;
+        @Bind(property="component") private ListView editableListView;
+        @Bind(property="component") private ListView iconListView;
+        @Bind(property="component") private ListView checkedListView;
+
+        @SuppressWarnings("unchecked")
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
+
+                List<ListItem> listData = (List<ListItem>)editableListView.getListData();
+                listData.setComparator(new Comparator<ListItem>() {
+                    public int compare(ListItem listItem1, ListItem listItem2) {
+                        String text1 = listItem1.getText();
+                        String text2 = listItem2.getText();
+                        return text1.compareToIgnoreCase(text2);
+                    }
+                });
 
-        buttonsRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="buttons.wtkx")
-            private Component component;
-
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
-                }
+                iconListView.setItemDisabled(3, true);
+                iconListView.setItemDisabled(4, true);
 
-                return Vote.APPROVE;
+                checkedListView.setItemChecked(0, true);
+                checkedListView.setItemChecked(2, true);
+                checkedListView.setItemChecked(3, true);
             }
-        });
 
-        listsRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="lists.wtkx") private Component component;
-            @Bind(property="component") private ListView editableListView;
-            @Bind(property="component") private ListView iconListView;
-            @Bind(property="component") private ListView checkedListView;
-
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
-
-                    List<ListItem> listData = (List<ListItem>)editableListView.getListData();
-                    listData.setComparator(new Comparator<ListItem>() {
-                        public int compare(ListItem listItem1, ListItem listItem2) {
-                            String text1 = listItem1.getText();
-                            String text2 = listItem2.getText();
-                            return text1.compareToIgnoreCase(text2);
-                        }
-                    });
+            return Vote.APPROVE;
+        }
+    }
+
+    private class TextRollupStateHandler extends RollupStateHandler {
+        @Load(name="text.wtkx") private Component component;
+        @Bind(property="component") private TextArea textArea;
+
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
 
-                    iconListView.setItemDisabled(3, true);
-                    iconListView.setItemDisabled(4, true);
+                PlainTextSerializer plainTextSerializer = new PlainTextSerializer("UTF-8");
+                InputStream inputStream = getClass().getResourceAsStream("text_area.txt");
 
-                    checkedListView.setItemChecked(0, true);
-                    checkedListView.setItemChecked(2, true);
-                    checkedListView.setItemChecked(3, true);
+                Document document = null;
+                try {
+                    document = plainTextSerializer.readObject(inputStream);
+                } catch(Exception exception) {
+                    System.out.println(exception);
                 }
 
-                return Vote.APPROVE;
-            }
-        });
+                textArea.setDocument(document);
 
-        textRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="text.wtkx") private Component component;
-            @Bind(property="component") private TextArea textArea;
+                final WatermarkDecorator watermarkDecorator = new WatermarkDecorator("Preview");
+                watermarkDecorator.setOpacity(0.1f);
+                watermarkDecorator.setFont(watermarkDecorator.getFont().deriveFont(Font.BOLD, 24));
 
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
+                textArea.getDecorators().add(watermarkDecorator);
 
-                    PlainTextSerializer plainTextSerializer = new PlainTextSerializer("UTF-8");
-                    InputStream inputStream = getClass().getResourceAsStream("text_area.txt");
+                textArea.getComponentStateListeners().add(new ComponentStateListener() {
+                    public void enabledChanged(Component component) {
+                        // No-op
+                    }
 
-                    Document document = null;
-                    try {
-                        document = plainTextSerializer.readObject(inputStream);
-                    } catch(Exception exception) {
-                        System.out.println(exception);
+                    public void focusedChanged(Component component, boolean temporary) {
+                        component.getDecorators().remove(watermarkDecorator);
+                        component.getComponentStateListeners().remove(this);
                     }
+                });
+            }
 
-                    textArea.setDocument(document);
+            return Vote.APPROVE;
+        }
+    }
 
-                    final WatermarkDecorator watermarkDecorator = new WatermarkDecorator("Preview");
-                    watermarkDecorator.setOpacity(0.1f);
-                    watermarkDecorator.setFont(watermarkDecorator.getFont().deriveFont(Font.BOLD, 24));
+    private class CalendarsRollupStateHandler extends RollupStateHandler {
+        @Load(name="calendars.wtkx") private Component component;
 
-                    textArea.getDecorators().add(watermarkDecorator);
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
+            }
 
-                    textArea.getComponentStateListeners().add(new ComponentStateListener() {
-                        public void enabledChanged(Component component) {
-                            // No-op
-                        }
+            return Vote.APPROVE;
+        }
+    }
 
-                        public void focusedChanged(Component component, boolean temporary) {
-                            component.getDecorators().remove(watermarkDecorator);
-                            component.getComponentStateListeners().remove(this);
-                        }
-                    });
-                }
+    private class NavigationRollupStateHandler extends RollupStateHandler {
+        @Load(name="navigation.wtkx") private Component component;
 
-                return Vote.APPROVE;
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
             }
-        });
 
-        calendarsRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="calendars.wtkx") private Component component;
+            return Vote.APPROVE;
+        }
+    }
 
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
-                }
+    private class SplittersRollupStateHandler extends RollupStateHandler {
+        @Load(name="splitters.wtkx") private Component component;
 
-                return Vote.APPROVE;
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
             }
-        });
 
-        navigationRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="navigation.wtkx") private Component component;
+            return Vote.APPROVE;
+        }
+    }
 
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
-                }
+    private class MenusRollupStateHandler extends RollupStateHandler {
+        @Load(name="menus.wtkx") private Component component;
+        @Bind(property="component") private ImageView menuImageView;
 
-                return Vote.APPROVE;
-            }
-        });
+        @Bind(property="component", name="menubar.helpAboutMenuItem")
+        private Menu.Item helpAboutMenuItem;
 
-        splittersRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="splitters.wtkx") private Component component;
+        @Load(name="menu_popup.wtkx") private MenuPopup menuPopup;
 
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
+        {   new Action("selectImageAction") {
+                public String getDescription() {
+                    return "Select Image Action";
                 }
 
-                return Vote.APPROVE;
-            }
-        });
+                public void perform() {
+                    Button.Group imageMenuGroup = Button.getGroup("imageMenuGroup");
+                    Button selectedItem = imageMenuGroup.getSelection();
 
-        menusRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="menus.wtkx") private Component component;
-            @Bind(property="component") private ImageView menuImageView;
+                    String imageName = (String)selectedItem.getUserData();
 
-            @Bind(property="component", name="menubar.helpAboutMenuItem")
-            private Menu.Item helpAboutMenuItem;
+                    ClassLoader classLoader = ThreadUtilities.getClassLoader();
+                    URL imageURL = classLoader.getResource(imageName);
 
-            @Load(name="menu_popup.wtkx") private MenuPopup menuPopup;
+                    // If the image has not been added to the resource cache yet,
+                    // add it
+                    Image image = (Image)ApplicationContext.getResourceCache().get(imageURL);
 
-            {   new Action("selectImageAction") {
-                    public String getDescription() {
-                        return "Select Image Action";
+                    if (image == null) {
+                        image = Image.load(imageURL);
+                        ApplicationContext.getResourceCache().put(imageURL, image);
                     }
 
-                    public void perform() {
-                        Button.Group imageMenuGroup = Button.getGroup("imageMenuGroup");
-                        Button selectedItem = imageMenuGroup.getSelection();
+                    // Update the image
+                    menuImageView.setImage(image);
+                }
+            };
+        }
 
-                        String imageName = (String)selectedItem.getUserData();
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
+
+                menuImageView.getComponentMouseButtonListeners().add(new ComponentMouseButtonListener.Adapter() {
+                    @Override
+                    public boolean mouseDown(Component component, Mouse.Button button, int x, int y) {
+                        if (button == Mouse.Button.RIGHT
+                            || (button == Mouse.Button.LEFT
+                                && Keyboard.isPressed(Keyboard.Modifier.CTRL))) {
+                            menuPopup.open(window, component.mapPointToAncestor(display, x, y));
+                        }
 
-                        ClassLoader classLoader = ThreadUtilities.getClassLoader();
-                        URL imageURL = classLoader.getResource(imageName);
+                        return false;
+                    }
+                });
 
-                        // If the image has not been added to the resource cache yet,
-                        // add it
-                        Image image = (Image)ApplicationContext.getResourceCache().get(imageURL);
+                helpAboutMenuItem.getButtonPressListeners().add(new ButtonPressListener() {
+                    public void buttonPressed(Button button) {
+                        handleAbout();
+                    }
+                });
+            }
 
-                        if (image == null) {
-                            image = Image.load(imageURL);
-                            ApplicationContext.getResourceCache().put(imageURL, image);
-                        }
+            return Vote.APPROVE;
+        }
+    }
 
-                        // Update the image
-                        menuImageView.setImage(image);
+    private class MetersRollupStateHandler extends RollupStateHandler {
+        @Load(name="meters.wtkx") private Component component;
+        @Bind(property="component") private ActivityIndicator activityIndicator1;
+        @Bind(property="component") private ActivityIndicator activityIndicator2;
+        @Bind(property="component") private ActivityIndicator activityIndicator3;
+
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
+
+                metersRollup.getRollupStateListeners().add(new RollupStateListener() {
+                    public Vote previewExpandedChange(Rollup rollup) {
+                        return Vote.APPROVE;
                     }
-                };
-            }
 
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
-
-                    menuImageView.getComponentMouseButtonListeners().add(new ComponentMouseButtonListener.Adapter() {
-                        @Override
-                        public boolean mouseDown(Component component, Mouse.Button button, int x, int y) {
-                            if (button == Mouse.Button.RIGHT
-                                || (button == Mouse.Button.LEFT
-                                    && Keyboard.isPressed(Keyboard.Modifier.CTRL))) {
-                                menuPopup.open(window, component.mapPointToAncestor(display, x, y));
-                            }
+                    public void expandedChangeVetoed(Rollup rollup, Vote reason) {
+                        // No-op
+                    }
 
-                            return false;
-                        }
-                    });
+                    public void expandedChanged(Rollup rollup) {
+                        activityIndicator1.setActive(rollup.isExpanded());
+                        activityIndicator2.setActive(rollup.isExpanded());
+                        activityIndicator3.setActive(rollup.isExpanded());
+                    }
+                });
+}
 
-                    helpAboutMenuItem.getButtonPressListeners().add(new ButtonPressListener() {
-                        public void buttonPressed(Button button) {
-                            handleAbout();
-                        }
-                    });
-                }
+            return Vote.APPROVE;
+        }
+    }
 
-                return Vote.APPROVE;
-            }
-        });
+    private class SpinnersRollupStateHandler extends RollupStateHandler {
+        @Load(name="spinners.wtkx") private Component component;
 
-        metersRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="meters.wtkx") private Component component;
-            @Bind(property="component") private ActivityIndicator activityIndicator1;
-            @Bind(property="component") private ActivityIndicator activityIndicator2;
-            @Bind(property="component") private ActivityIndicator activityIndicator3;
-
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
-
-                    metersRollup.getRollupStateListeners().add(new RollupStateListener() {
-                        public Vote previewExpandedChange(Rollup rollup) {
-                            return Vote.APPROVE;
-                        }
+        @Bind(property="component") private Spinner numericSpinner;
+        @Bind(property="component") private Spinner dateSpinner;
 
-                        public void expandedChangeVetoed(Rollup rollup, Vote reason) {
-                            // No-op
-                        }
+        @Bind(property="component") private Slider redSlider;
+        @Bind(property="component") private Slider greenSlider;
+        @Bind(property="component") private Slider blueSlider;
+        @Bind(property="component") private Border colorBorder;
+
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
+
+                initializeNumericSpinner(numericSpinner);
+                initializeDateSpinner(dateSpinner);
+
+                SliderValueListener sliderValueListener = new SliderValueListener() {
+                    public void valueChanged(Slider slider, int previousValue) {
+                        Color color = new Color(redSlider.getValue(), greenSlider.getValue(),
+                            blueSlider.getValue());
+                        colorBorder.getStyles().put("backgroundColor", color);
+                    }
+                };
 
-                        public void expandedChanged(Rollup rollup) {
-                            activityIndicator1.setActive(rollup.isExpanded());
-                            activityIndicator2.setActive(rollup.isExpanded());
-                            activityIndicator3.setActive(rollup.isExpanded());
-                        }
-                    });
-}
+                redSlider.getSliderValueListeners().add(sliderValueListener);
+                greenSlider.getSliderValueListeners().add(sliderValueListener);
+                blueSlider.getSliderValueListeners().add(sliderValueListener);
 
-                return Vote.APPROVE;
+                Color color = new Color(redSlider.getValue(), greenSlider.getValue(),
+                    blueSlider.getValue());
+                colorBorder.getStyles().put("backgroundColor", color);
             }
-        });
-
-        spinnersRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="spinners.wtkx") private Component component;
 
-            @Bind(property="component") private Spinner numericSpinner;
-            @Bind(property="component") private Spinner dateSpinner;
-
-            @Bind(property="component") private Slider redSlider;
-            @Bind(property="component") private Slider greenSlider;
-            @Bind(property="component") private Slider blueSlider;
-            @Bind(property="component") private Border colorBorder;
-
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
-
-                    initializeNumericSpinner(numericSpinner);
-                    initializeDateSpinner(dateSpinner);
-
-                    SliderValueListener sliderValueListener = new SliderValueListener() {
-                        public void valueChanged(Slider slider, int previousValue) {
-                            Color color = new Color(redSlider.getValue(), greenSlider.getValue(),
-                                blueSlider.getValue());
-                            colorBorder.getStyles().put("backgroundColor", color);
-                        }
-                    };
+            return Vote.APPROVE;
+        }
+    }
 
-                    redSlider.getSliderValueListeners().add(sliderValueListener);
-                    greenSlider.getSliderValueListeners().add(sliderValueListener);
-                    blueSlider.getSliderValueListeners().add(sliderValueListener);
-
-                    Color color = new Color(redSlider.getValue(), greenSlider.getValue(),
-                        blueSlider.getValue());
-                    colorBorder.getStyles().put("backgroundColor", color);
-                }
+    private class TablesRollupStateHandler extends RollupStateHandler {
+        @Load(name="tables.wtkx") private Component component;
+        @Bind(property="component") private TableView sortableTableView;
+        @Bind(property="component") private TableView customTableView;
+        @Bind(property="component") private TableViewHeader sortableTableViewHeader;
+
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
+
+                // Set table header data
+                TableView.ColumnSequence columns = sortableTableView.getColumns();
+                columns.get(0).setHeaderData(new TableViewHeaderData("#"));
+                columns.get(1).setHeaderData(new TableViewHeaderData("A"));
+                columns.get(2).setHeaderData(new TableViewHeaderData("B"));
+                columns.get(3).setHeaderData(new TableViewHeaderData("C"));
+                columns.get(4).setHeaderData(new TableViewHeaderData("D"));
+
+                // Populate table
+                ArrayList<Object> tableData = new ArrayList<Object>();
+
+                for (int i = 0; i < 10000; i++) {
+                    TableRow tableRow = new TableRow();
+
+                    tableRow.put("i", i);
+                    tableRow.put("a", (int)Math.round(Math.random() * 10));
+                    tableRow.put("b", (int)Math.round(Math.random() * 100));
+                    tableRow.put("c", (int)Math.round(Math.random() * 1000));
+                    tableRow.put("d", (int)Math.round(Math.random() * 10000));
+
+                    tableData.add(tableRow);
+                }
+
+                sortableTableView.setTableData(tableData);
+
+                // Install header press listener
+                sortableTableViewHeader.getTableViewHeaderPressListeners().add(new TableView.SortHandler());
+
+                customTableView.getComponentMouseButtonListeners().add(new ComponentMouseButtonListener.Adapter() {
+                    @Override
+                    @SuppressWarnings("unchecked")
+                    public boolean mouseClick(Component component, Mouse.Button button, int x, int y, int count) {
+                       if (button == Mouse.Button.LEFT) {
+                           List<CustomTableRow> customTableData =
+                               (List<CustomTableRow>)customTableView.getTableData();
+
+                          int columnIndex = customTableView.getColumnAt(x);
+                          if (columnIndex == 0) {
+                             int rowIndex = customTableView.getRowAt(y);
+                             CustomTableRow row = customTableData.get(rowIndex);
+
+                             row.setA(!row.getA());
+                             customTableData.update(rowIndex, row);
+                          }
+                       }
 
-                return Vote.APPROVE;
+                       return false;
+                    }
+                });
             }
-        });
 
-        tablesRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="tables.wtkx") private Component component;
-            @Bind(property="component") private TableView sortableTableView;
-            @Bind(property="component") private TableView customTableView;
-            @Bind(property="component") private TableViewHeader sortableTableViewHeader;
-
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
-
-                    // Set table header data
-                    TableView.ColumnSequence columns = sortableTableView.getColumns();
-                    columns.get(0).setHeaderData(new TableViewHeaderData("#"));
-                    columns.get(1).setHeaderData(new TableViewHeaderData("A"));
-                    columns.get(2).setHeaderData(new TableViewHeaderData("B"));
-                    columns.get(3).setHeaderData(new TableViewHeaderData("C"));
-                    columns.get(4).setHeaderData(new TableViewHeaderData("D"));
-
-                    // Populate table
-                    ArrayList<Object> tableData = new ArrayList<Object>();
-
-                    for (int i = 0; i < 10000; i++) {
-                        TableRow tableRow = new TableRow();
-
-                        tableRow.put("i", i);
-                        tableRow.put("a", (int)Math.round(Math.random() * 10));
-                        tableRow.put("b", (int)Math.round(Math.random() * 100));
-                        tableRow.put("c", (int)Math.round(Math.random() * 1000));
-                        tableRow.put("d", (int)Math.round(Math.random() * 10000));
-
-                        tableData.add(tableRow);
-                    }
-
-                    sortableTableView.setTableData(tableData);
-
-                    // Install header press listener
-                    sortableTableViewHeader.getTableViewHeaderPressListeners().add(new TableView.SortHandler());
-
-                    customTableView.getComponentMouseButtonListeners().add(new ComponentMouseButtonListener.Adapter() {
-                        @Override
-                        public boolean mouseClick(Component component, Mouse.Button button, int x, int y, int count) {
-                           if (button == Mouse.Button.LEFT) {
-                               List<CustomTableRow> customTableData =
-                                   (List<CustomTableRow>)customTableView.getTableData();
-
-                              int columnIndex = customTableView.getColumnAt(x);
-                              if (columnIndex == 0) {
-                                 int rowIndex = customTableView.getRowAt(y);
-                                 CustomTableRow row = customTableData.get(rowIndex);
-
-                                 row.setA(!row.getA());
-                                 customTableData.update(rowIndex, row);
-                              }
-                           }
+            return Vote.APPROVE;
+        }
+    }
 
-                           return false;
-                        }
-                    });
-                }
+    private class TreesRollupStateHandler extends RollupStateHandler {
+        @Load(name="trees.wtkx") private Component component;
+        @Bind(property="component") private TreeView editableTreeView;
+
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
 
-                return Vote.APPROVE;
+                TreeBranch treeData = (TreeBranch)editableTreeView.getTreeData();
+                treeData.setComparator(new TreeNodeComparator());
             }
-        });
 
-        treesRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="trees.wtkx") private Component component;
-            @Bind(property="component") private TreeView editableTreeView;
+            return Vote.APPROVE;
+        }
+    }
 
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
+    private class DragDropRollupStateHandler extends RollupStateHandler {
+        @Load(name="dragdrop.wtkx") private Component component;
+        @Bind(property="component") private ImageView imageView1;
+        @Bind(property="component") private ImageView imageView2;
+        @Bind(property="component") private ImageView imageView3;
+
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
+
+                DragSource imageDragSource = new DragSource() {
+                    private Image image = null;
+                    private Point offset = null;
+                    private LocalManifest content = null;
+
+                    public boolean beginDrag(Component component, int x, int y) {
+                        ImageView imageView = (ImageView)component;
+                        image = imageView.getImage();
+
+                        if (image != null) {
+                            imageView.setImage((Image)null);
+                            content = new LocalManifest();
+                            content.putImage(image);
+                            offset = new Point(x - (imageView.getWidth() - image.getWidth()) / 2,
+                                y - (imageView.getHeight() - image.getHeight()) / 2);
+                        }
 
-                    TreeBranch treeData = (TreeBranch)editableTreeView.getTreeData();
-                    treeData.setComparator(new TreeNodeComparator());
-                }
+                        return (image != null);
+                    }
 
-                return Vote.APPROVE;
-            }
-        });
+                    public void endDrag(Component component, DropAction dropAction) {
+                        if (dropAction == null) {
+                            ImageView imageView = (ImageView)component;
+                            imageView.setImage(image);
+                        }
 
-        dragDropRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="dragdrop.wtkx") private Component component;
-            @Bind(property="component") private ImageView imageView1;
-            @Bind(property="component") private ImageView imageView2;
-            @Bind(property="component") private ImageView imageView3;
-
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
-
-                    DragSource imageDragSource = new DragSource() {
-                        private Image image = null;
-                        private Point offset = null;
-                        private LocalManifest content = null;
+                        image = null;
+                        offset = null;
+                        content = null;
+                    }
 
-                        public boolean beginDrag(Component component, int x, int y) {
-                            ImageView imageView = (ImageView)component;
-                            image = imageView.getImage();
+                    public boolean isNative() {
+                        return false;
+                    }
 
-                            if (image != null) {
-                                imageView.setImage((Image)null);
-                                content = new LocalManifest();
-                                content.putImage(image);
-                                offset = new Point(x - (imageView.getWidth() - image.getWidth()) / 2,
-                                    y - (imageView.getHeight() - image.getHeight()) / 2);
-                            }
+                    public LocalManifest getContent() {
+                        return content;
+                    }
 
-                            return (image != null);
-                        }
+                    public Visual getRepresentation() {
+                        return image;
+                    }
 
-                        public void endDrag(Component component, DropAction dropAction) {
-                            if (dropAction == null) {
-                                ImageView imageView = (ImageView)component;
-                                imageView.setImage(image);
-                            }
+                    public Point getOffset() {
+                        return offset;
+                    }
 
-                            image = null;
-                            offset = null;
-                            content = null;
-                        }
+                    public int getSupportedDropActions() {
+                        return DropAction.MOVE.getMask();
+                    }
+                };
 
-                        public boolean isNative() {
-                            return false;
+                DropTarget imageDropTarget = new DropTarget() {
+                    public DropAction dragEnter(Component component, Manifest dragContent,
+                        int supportedDropActions, DropAction userDropAction) {
+                        DropAction dropAction = null;
+
+                        ImageView imageView = (ImageView)component;
+                        if (imageView.getImage() == null
+                            && dragContent.containsImage()
+                            && DropAction.MOVE.isSelected(supportedDropActions)) {
+                            dropAction = DropAction.MOVE;
+                            component.getStyles().put("backgroundColor", "#f0e68c");
                         }
 
-                        public LocalManifest getContent() {
-                            return content;
-                        }
+                        return dropAction;
+                    }
 
-                        public Visual getRepresentation() {
-                            return image;
-                        }
+                    public void dragExit(Component component) {
+                        component.getStyles().put("backgroundColor", null);
+                    }
 
-                        public Point getOffset() {
-                            return offset;
-                        }
+                    public DropAction dragMove(Component component, Manifest dragContent,
+                        int supportedDropActions, int x, int y, DropAction userDropAction) {
+                        return (dragContent.containsImage() ? DropAction.MOVE : null);
+                    }
 
-                        public int getSupportedDropActions() {
-                            return DropAction.MOVE.getMask();
-                        }
-                    };
+                    public DropAction userDropActionChange(Component component, Manifest dragContent,
+                        int supportedDropActions, int x, int y, DropAction userDropAction) {
+                        return (dragContent.containsImage() ? DropAction.MOVE : null);
+                    }
 
-                    DropTarget imageDropTarget = new DropTarget() {
-                        public DropAction dragEnter(Component component, Manifest dragContent,
-                            int supportedDropActions, DropAction userDropAction) {
-                            DropAction dropAction = null;
+                    public DropAction drop(Component component, Manifest dragContent,
+                        int supportedDropActions, int x, int y, DropAction userDropAction) {
+                        DropAction dropAction = null;
 
+                        if (dragContent.containsImage()) {
                             ImageView imageView = (ImageView)component;
-                            if (imageView.getImage() == null
-                                && dragContent.containsImage()
-                                && DropAction.MOVE.isSelected(supportedDropActions)) {
+                            try {
+                                imageView.setImage(dragContent.getImage());
                                 dropAction = DropAction.MOVE;
-                                component.getStyles().put("backgroundColor", "#f0e68c");
+                            } catch(IOException exception) {
+                                System.err.println(exception);
                             }
-
-                            return dropAction;
                         }
 
-                        public void dragExit(Component component) {
-                            component.getStyles().put("backgroundColor", null);
-                        }
+                        dragExit(component);
 
-                        public DropAction dragMove(Component component, Manifest dragContent,
-                            int supportedDropActions, int x, int y, DropAction userDropAction) {
-                            return (dragContent.containsImage() ? DropAction.MOVE : null);
-                        }
+                        return dropAction;
+                    }
+                };
 
-                        public DropAction userDropActionChange(Component component, Manifest dragContent,
-                            int supportedDropActions, int x, int y, DropAction userDropAction) {
-                            return (dragContent.containsImage() ? DropAction.MOVE : null);
-                        }
+                imageView1.setDragSource(imageDragSource);
+                imageView1.setDropTarget(imageDropTarget);
+
+                imageView2.setDragSource(imageDragSource);
+                imageView2.setDropTarget(imageDropTarget);
+
+                imageView3.setDragSource(imageDragSource);
+                imageView3.setDropTarget(imageDropTarget);
+            }
+
+            return Vote.APPROVE;
+        }
+    }
 
-                        public DropAction drop(Component component, Manifest dragContent,
-                            int supportedDropActions, int x, int y, DropAction userDropAction) {
-                            DropAction dropAction = null;
-
-                            if (dragContent.containsImage()) {
-                                ImageView imageView = (ImageView)component;
-                                try {
-                                    imageView.setImage(dragContent.getImage());
-                                    dropAction = DropAction.MOVE;
-                                } catch(IOException exception) {
-                                    System.err.println(exception);
-                                }
+    private class AlertsRollupStateHandler extends RollupStateHandler {
+        @Load(name="alerts.wtkx") private Component component;
+        @Bind(property="component") private PushButton alertButton;
+        @Bind(property="component") private PushButton promptButton;
+
+        public Vote previewExpandedChange(Rollup rollup) {
+            if (component == null) {
+                bind();
+                rollup.setContent(component);
+
+                alertButton.getButtonPressListeners().add(new ButtonPressListener() {
+                    public void buttonPressed(Button button) {
+                        Button.Group messageTypeGroup = Button.getGroup("messageType");
+                        Button selection = messageTypeGroup.getSelection();
+
+                        Map<String, ?> userData = JSONSerializer.parseMap((String)selection.getUserData());
+                        String messageType = (String)userData.get("type");
+
+                        if (messageType.equals("custom")) {
+                            ArrayList<String> options = new ArrayList<String>();
+                            options.add("OK");
+                            options.add("Cancel");
+
+                            Component body = null;
+                            WTKXSerializer wtkxSerializer = new WTKXSerializer();
+                            try {
+                                body = (Component)wtkxSerializer.readObject("pivot/tutorials/alert.wtkx");
+                            } catch(Exception exception) {
+                                System.out.println(exception);
                             }
 
-                            dragExit(component);
+                            Alert alert = new Alert(MessageType.QUESTION, "Please select your favorite icon:",
+                                options, body);
+                            alert.setTitle("Select Icon");
+                            alert.setSelectedOption(0);
+                            alert.getDecorators().update(0, new ReflectionDecorator());
+
+                            alert.open(window);
+                        } else {
+                            String message = (String)userData.get("message");
+                            Alert.alert(MessageType.decode(messageType), message, window);
+                        }
+                    }
+                });
+
+                promptButton.getButtonPressListeners().add(new ButtonPressListener() {
+                    public void buttonPressed(Button button) {
+                        Button.Group messageTypeGroup = Button.getGroup("messageType");
+                        Button selection = messageTypeGroup.getSelection();
+
+                        Map<String, ?> userData = JSONSerializer.parseMap((String)selection.getUserData());
+                        String messageType = (String)userData.get("type");
+
+                        if (messageType.equals("custom")) {
+                            ArrayList<String> options = new ArrayList<String>();
+                            options.add("OK");
+                            options.add("Cancel");
+
+                            Component body = null;
+                            WTKXSerializer wtkxSerializer = new WTKXSerializer();
+                            try {
+                                body = (Component)wtkxSerializer.readObject("pivot/tutorials/alert.wtkx");
+                            } catch(Exception exception) {
+                                System.out.println(exception);
+                            }
 
-                            return dropAction;
+                            Prompt prompt = new Prompt(MessageType.QUESTION, "Please select your favorite icon:",
+                                options, body);
+                            prompt.setTitle("Select Icon");
+                            prompt.setSelectedOption(0);
+                            prompt.getDecorators().update(0, new ReflectionDecorator());
+
+                            prompt.open(window);
+                        } else {
+                            String message = (String)userData.get("message");
+                            Prompt.prompt(MessageType.decode(messageType), message, window);
                         }
-                    };
+                    }
+                });
+            }
 
-                    imageView1.setDragSource(imageDragSource);
-                    imageView1.setDropTarget(imageDropTarget);
+            return Vote.APPROVE;
+        }
+    }
 
-                    imageView2.setDragSource(imageDragSource);
-                    imageView2.setDropTarget(imageDropTarget);
+    private Display display = null;
+    private Window window = null;
 
-                    imageView3.setDragSource(imageDragSource);
-                    imageView3.setDropTarget(imageDropTarget);
-                }
+    @Load(name="demo.wtkx") private Component content;
+    @Bind(property="content") private Rollup buttonsRollup;
+    @Bind(property="content") private Rollup listsRollup;
+    @Bind(property="content") private Rollup textRollup;
+    @Bind(property="content") private Rollup calendarsRollup;
+    @Bind(property="content") private Rollup navigationRollup;
+    @Bind(property="content") private Rollup splittersRollup;
+    @Bind(property="content") private Rollup menusRollup;
+    @Bind(property="content") private Rollup metersRollup;
+    @Bind(property="content") private Rollup spinnersRollup;
+    @Bind(property="content") private Rollup tablesRollup;
+    @Bind(property="content") private Rollup treesRollup;
+    @Bind(property="content") private Rollup dragDropRollup;
+    @Bind(property="content") private Rollup alertsRollup;
 
-                return Vote.APPROVE;
-            }
-        });
+    public static void main(String[] args) {
+        DesktopApplicationContext.main(Demo.class, args);
+    }
 
-        alertsRollup.getRollupStateListeners().add(new RollupStateHandler() {
-            @Load(name="alerts.wtkx") private Component component;
-            @Bind(property="component") private PushButton alertButton;
-            @Bind(property="component") private PushButton promptButton;
-
-            public Vote previewExpandedChange(Rollup rollup) {
-                if (component == null) {
-                    bind();
-                    rollup.setContent(component);
-
-                    alertButton.getButtonPressListeners().add(new ButtonPressListener() {
-                        public void buttonPressed(Button button) {
-                            Button.Group messageTypeGroup = Button.getGroup("messageType");
-                            Button selection = messageTypeGroup.getSelection();
-
-                            Map<String, ?> userData = JSONSerializer.parseMap((String)selection.getUserData());
-                            String messageType = (String)userData.get("type");
-
-                            if (messageType.equals("custom")) {
-                                ArrayList<String> options = new ArrayList<String>();
-                                options.add("OK");
-                                options.add("Cancel");
-
-                                Component body = null;
-                                WTKXSerializer wtkxSerializer = new WTKXSerializer();
-                                try {
-                                    body = (Component)wtkxSerializer.readObject("pivot/tutorials/alert.wtkx");
-                                } catch(Exception exception) {
-                                    System.out.println(exception);
-                                }
-
-                                Alert alert = new Alert(MessageType.QUESTION, "Please select your favorite icon:",
-                                    options, body);
-                                alert.setTitle("Select Icon");
-                                alert.setSelectedOption(0);
-                                alert.getDecorators().update(0, new ReflectionDecorator());
-
-                                alert.open(window);
-                            } else {
-                                String message = (String)userData.get("message");
-                                Alert.alert(MessageType.decode(messageType), message, window);
-                            }
-                        }
-                    });
+    @SuppressWarnings("unchecked")
+    public void startup(final Display display, Dictionary<String, String> properties) throws Exception {
+        // NOTE This is commented out because it takes a non-negligible amount
+        // of time to execute
+        /*
+        TerraTheme terraTheme = (TerraTheme)Theme.getTheme();
+        URL schemeLocation = TerraTheme.class.getResource("TerraTheme_default.json");
+        terraTheme.loadScheme(schemeLocation);
+        */
 
-                    promptButton.getButtonPressListeners().add(new ButtonPressListener() {
-                        public void buttonPressed(Button button) {
-                            Button.Group messageTypeGroup = Button.getGroup("messageType");
-                            Button selection = messageTypeGroup.getSelection();
-
-                            Map<String, ?> userData = JSONSerializer.parseMap((String)selection.getUserData());
-                            String messageType = (String)userData.get("type");
-
-                            if (messageType.equals("custom")) {
-                                ArrayList<String> options = new ArrayList<String>();
-                                options.add("OK");
-                                options.add("Cancel");
-
-                                Component body = null;
-                                WTKXSerializer wtkxSerializer = new WTKXSerializer();
-                                try {
-                                    body = (Component)wtkxSerializer.readObject("pivot/tutorials/alert.wtkx");
-                                } catch(Exception exception) {
-                                    System.out.println(exception);
-                                }
-
-                                Prompt prompt = new Prompt(MessageType.QUESTION, "Please select your favorite icon:",
-                                    options, body);
-                                prompt.setTitle("Select Icon");
-                                prompt.setSelectedOption(0);
-                                prompt.getDecorators().update(0, new ReflectionDecorator());
-
-                                prompt.open(window);
-                            } else {
-                                String message = (String)userData.get("message");
-                                Prompt.prompt(MessageType.decode(messageType), message, window);
-                            }
-                        }
-                    });
-                }
+        this.display = display;
 
-                return Vote.APPROVE;
-            }
+        bind();
 
-        });
+        buttonsRollup.getRollupStateListeners().add(new ButtonsRollupStateHandler());
+        listsRollup.getRollupStateListeners().add(new ListsRollupStateHandler());
+        textRollup.getRollupStateListeners().add(new TextRollupStateHandler());
+        calendarsRollup.getRollupStateListeners().add(new CalendarsRollupStateHandler());
+        navigationRollup.getRollupStateListeners().add(new NavigationRollupStateHandler());
+        splittersRollup.getRollupStateListeners().add(new SplittersRollupStateHandler());
+        menusRollup.getRollupStateListeners().add(new MenusRollupStateHandler());
+        metersRollup.getRollupStateListeners().add(new MetersRollupStateHandler());
+        spinnersRollup.getRollupStateListeners().add(new SpinnersRollupStateHandler());
+        tablesRollup.getRollupStateListeners().add(new TablesRollupStateHandler());
+        treesRollup.getRollupStateListeners().add(new TreesRollupStateHandler());
+        dragDropRollup.getRollupStateListeners().add(new DragDropRollupStateHandler());
+        alertsRollup.getRollupStateListeners().add(new AlertsRollupStateHandler());
 
         window = new Window();
         window.setTitle("Pivot Demo");