changeset 49495:f46bfa7a2956

8198990: Move SwingSet2 from closed to OpenJDK Reviewed-by: serb, jeff, kaddepalli
author prr
date Fri, 23 Mar 2018 13:43:39 -0700
parents 73da889306b7
children 1ea202af7a97
files make/CompileDemos.gmk src/demo/share/jfc/SwingSet2/AquaTheme.java src/demo/share/jfc/SwingSet2/BezierAnimationPanel.java src/demo/share/jfc/SwingSet2/ButtonDemo.java src/demo/share/jfc/SwingSet2/CharcoalTheme.java src/demo/share/jfc/SwingSet2/ColorChooserDemo.java src/demo/share/jfc/SwingSet2/ComboBoxDemo.java src/demo/share/jfc/SwingSet2/ContrastTheme.java src/demo/share/jfc/SwingSet2/DemoModule.java src/demo/share/jfc/SwingSet2/DirectionPanel.java src/demo/share/jfc/SwingSet2/EmeraldTheme.java src/demo/share/jfc/SwingSet2/ExampleFileView.java src/demo/share/jfc/SwingSet2/FileChooserDemo.java src/demo/share/jfc/SwingSet2/HtmlDemo.java src/demo/share/jfc/SwingSet2/InternalFrameDemo.java src/demo/share/jfc/SwingSet2/LayoutControlPanel.java src/demo/share/jfc/SwingSet2/ListDemo.java src/demo/share/jfc/SwingSet2/OptionPaneDemo.java src/demo/share/jfc/SwingSet2/Permuter.java src/demo/share/jfc/SwingSet2/ProgressBarDemo.java src/demo/share/jfc/SwingSet2/README.txt src/demo/share/jfc/SwingSet2/RubyTheme.java src/demo/share/jfc/SwingSet2/ScrollPaneDemo.java src/demo/share/jfc/SwingSet2/SliderDemo.java src/demo/share/jfc/SwingSet2/SplitPaneDemo.java src/demo/share/jfc/SwingSet2/SwingSet2.html src/demo/share/jfc/SwingSet2/SwingSet2.java src/demo/share/jfc/SwingSet2/SwingSet2Applet.java src/demo/share/jfc/SwingSet2/TabbedPaneDemo.java src/demo/share/jfc/SwingSet2/TableDemo.java src/demo/share/jfc/SwingSet2/TextAndMnemonicUtils.java src/demo/share/jfc/SwingSet2/ToolTipDemo.java src/demo/share/jfc/SwingSet2/TreeDemo.java src/demo/share/jfc/SwingSet2/resources/ant.html src/demo/share/jfc/SwingSet2/resources/bug.html src/demo/share/jfc/SwingSet2/resources/images/About.jpg src/demo/share/jfc/SwingSet2/resources/images/Octavo/CREDITS src/demo/share/jfc/SwingSet2/resources/images/Octavo/ant.jpg src/demo/share/jfc/SwingSet2/resources/images/Octavo/book.jpg src/demo/share/jfc/SwingSet2/resources/images/Octavo/bug.jpg src/demo/share/jfc/SwingSet2/resources/images/Octavo/bug2.jpg src/demo/share/jfc/SwingSet2/resources/images/Octavo/crest.jpg src/demo/share/jfc/SwingSet2/resources/images/Octavo/king.jpg src/demo/share/jfc/SwingSet2/resources/images/Octavo/micro.jpg src/demo/share/jfc/SwingSet2/resources/images/Octavo/seaweed.jpg src/demo/share/jfc/SwingSet2/resources/images/buttons/b1.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/b1d.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/b1p.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/b1r.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/b2.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/b2d.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/b2p.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/b2r.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/b3.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/b3d.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/b3p.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/b3r.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/bl.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/bldn.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/bm.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/bmdn.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/br.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/brdn.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/c.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/cb.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/cbr.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/cbrs.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/cbs.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/cdn.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/ml.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/mldn.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/mr.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/mrdn.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/rb.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/rbp.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/rbr.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/rbrs.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/rbs.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/tl.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/tldn.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/tm.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/tmdn.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/toggle.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/toggledn.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/tr.gif src/demo/share/jfc/SwingSet2/resources/images/buttons/trdn.gif src/demo/share/jfc/SwingSet2/resources/images/combobox/brenteyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/brenthair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/brentmouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/georgeseyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/georgeshair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/georgesmouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/hanseyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/hanshair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/hansmouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/howardeyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/howardhair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/howardmouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/jameseyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/jameshair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/jamesmouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/jeffeyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/jeffhair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/jeffmouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/joneyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/jonhair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/jonmouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/laraeyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/larahair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/laramouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/larryeyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/larryhair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/larrymouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/lisaeyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/lisahair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/lisamouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/michaeleyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/michaelhair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/michaelmouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/philipeyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/philiphair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/philipmouth.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/scotteyes.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/scotthair.jpg src/demo/share/jfc/SwingSet2/resources/images/combobox/scottmouth.jpg src/demo/share/jfc/SwingSet2/resources/images/filechooser/find.gif src/demo/share/jfc/SwingSet2/resources/images/filechooser/gifIcon.gif src/demo/share/jfc/SwingSet2/resources/images/filechooser/help.gif src/demo/share/jfc/SwingSet2/resources/images/filechooser/jpgIcon.jpg src/demo/share/jfc/SwingSet2/resources/images/food/apple.jpeg src/demo/share/jfc/SwingSet2/resources/images/food/apple.jpg src/demo/share/jfc/SwingSet2/resources/images/food/asparagus.gif src/demo/share/jfc/SwingSet2/resources/images/food/banana.gif src/demo/share/jfc/SwingSet2/resources/images/food/broccoli.gif src/demo/share/jfc/SwingSet2/resources/images/food/cantaloupe.gif src/demo/share/jfc/SwingSet2/resources/images/food/carrot.gif src/demo/share/jfc/SwingSet2/resources/images/food/corn.gif src/demo/share/jfc/SwingSet2/resources/images/food/grapefruit.gif src/demo/share/jfc/SwingSet2/resources/images/food/grapes.gif src/demo/share/jfc/SwingSet2/resources/images/food/kiwi.gif src/demo/share/jfc/SwingSet2/resources/images/food/onion.gif src/demo/share/jfc/SwingSet2/resources/images/food/peach.gif src/demo/share/jfc/SwingSet2/resources/images/food/pear.gif src/demo/share/jfc/SwingSet2/resources/images/food/pepper.gif src/demo/share/jfc/SwingSet2/resources/images/food/pickle.gif src/demo/share/jfc/SwingSet2/resources/images/food/pineapple.gif src/demo/share/jfc/SwingSet2/resources/images/food/raspberry.gif src/demo/share/jfc/SwingSet2/resources/images/food/strawberry.gif src/demo/share/jfc/SwingSet2/resources/images/food/tomato.gif src/demo/share/jfc/SwingSet2/resources/images/food/watermelon.gif src/demo/share/jfc/SwingSet2/resources/images/htmldemo/back.jpg src/demo/share/jfc/SwingSet2/resources/images/htmldemo/forward.jpg src/demo/share/jfc/SwingSet2/resources/images/htmldemo/header.jpg src/demo/share/jfc/SwingSet2/resources/images/list/blue.gif src/demo/share/jfc/SwingSet2/resources/images/list/cyan.gif src/demo/share/jfc/SwingSet2/resources/images/list/gray.gif src/demo/share/jfc/SwingSet2/resources/images/list/green.gif src/demo/share/jfc/SwingSet2/resources/images/list/magenta.gif src/demo/share/jfc/SwingSet2/resources/images/list/red.gif src/demo/share/jfc/SwingSet2/resources/images/list/yellow.gif src/demo/share/jfc/SwingSet2/resources/images/misc/cab.gif src/demo/share/jfc/SwingSet2/resources/images/misc/cab_small.gif src/demo/share/jfc/SwingSet2/resources/images/misc/duchess.gif src/demo/share/jfc/SwingSet2/resources/images/misc/duchess_small.gif src/demo/share/jfc/SwingSet2/resources/images/misc/duke.gif src/demo/share/jfc/SwingSet2/resources/images/misc/duke_small.gif src/demo/share/jfc/SwingSet2/resources/images/misc/toast.gif src/demo/share/jfc/SwingSet2/resources/images/misc/toast_small.gif src/demo/share/jfc/SwingSet2/resources/images/optionpane/bottle.gif src/demo/share/jfc/SwingSet2/resources/images/optionpane/ibd.gif src/demo/share/jfc/SwingSet2/resources/images/optionpane/ibu.gif src/demo/share/jfc/SwingSet2/resources/images/scrollpane/COPYRIGHT src/demo/share/jfc/SwingSet2/resources/images/scrollpane/colheader.jpg src/demo/share/jfc/SwingSet2/resources/images/scrollpane/crayons.jpg src/demo/share/jfc/SwingSet2/resources/images/scrollpane/lowerleft.jpg src/demo/share/jfc/SwingSet2/resources/images/scrollpane/rowheader.jpg src/demo/share/jfc/SwingSet2/resources/images/scrollpane/upperleft.jpg src/demo/share/jfc/SwingSet2/resources/images/scrollpane/upperright.jpg src/demo/share/jfc/SwingSet2/resources/images/splash.png src/demo/share/jfc/SwingSet2/resources/images/splitpane/README src/demo/share/jfc/SwingSet2/resources/images/splitpane/earth.jpg src/demo/share/jfc/SwingSet2/resources/images/splitpane/moon.jpg src/demo/share/jfc/SwingSet2/resources/images/tabbedpane/blake.gif src/demo/share/jfc/SwingSet2/resources/images/tabbedpane/brooke.gif src/demo/share/jfc/SwingSet2/resources/images/tabbedpane/david.gif src/demo/share/jfc/SwingSet2/resources/images/tabbedpane/ewan.gif src/demo/share/jfc/SwingSet2/resources/images/tabbedpane/ewan.jpg src/demo/share/jfc/SwingSet2/resources/images/tabbedpane/hania.jpg src/demo/share/jfc/SwingSet2/resources/images/tabbedpane/laine.jpg src/demo/share/jfc/SwingSet2/resources/images/tabbedpane/matthew.gif src/demo/share/jfc/SwingSet2/resources/images/tabbedpane/stephen.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JButton.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JColorChooser.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JComboBox.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JDesktop.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JDialog.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JEditorPane.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JFileChooser.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JList.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JMenu.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JOptionPane.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JProgressBar.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JRadioButton.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JScrollBar.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JScrollPane.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JSlider.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JSplitPane.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JTabbedPane.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JTable.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/JTree.gif src/demo/share/jfc/SwingSet2/resources/images/toolbar/ToolTip.gif src/demo/share/jfc/SwingSet2/resources/images/tooltip/cow.gif src/demo/share/jfc/SwingSet2/resources/index.html src/demo/share/jfc/SwingSet2/resources/king.html src/demo/share/jfc/SwingSet2/resources/preface.html src/demo/share/jfc/SwingSet2/resources/seaweed.html src/demo/share/jfc/SwingSet2/resources/swingset.properties src/demo/share/jfc/SwingSet2/resources/swingset_ja.properties src/demo/share/jfc/SwingSet2/resources/swingset_zh_CN.properties src/demo/share/jfc/SwingSet2/resources/title.html src/demo/share/jfc/SwingSet2/resources/tree.txt
diffstat 221 files changed, 11366 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/make/CompileDemos.gmk	Fri Mar 23 11:14:43 2018 -0700
+++ b/make/CompileDemos.gmk	Fri Mar 23 13:43:39 2018 -0700
@@ -242,6 +242,13 @@
     DEMO_SUBDIR := jfc, \
 ))
 
+$(eval $(call SetupBuildDemo, SwingSet2, \
+    DEMO_SUBDIR := jfc, \
+    EXTRA_COPY_TO_JAR := .java, \
+    EXTRA_MANIFEST_ATTR := SplashScreen-Image: resources/images/splash.png, \
+    DISABLE_SJAVAC := true, \
+))
+
 $(eval $(call SetupBuildDemo, Font2DTest, \
     DEMO_SUBDIR := jfc, \
 ))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/AquaTheme.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.plaf.*;
+import javax.swing.plaf.metal.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.*;
+
+/**
+ * This class describes a theme using "blue-green" colors.
+ *
+ * @author Steve Wilson
+ */
+public class AquaTheme extends DefaultMetalTheme {
+
+    public String getName() { return "Aqua"; }
+
+    private final ColorUIResource primary1 = new ColorUIResource(102, 153, 153);
+    private final ColorUIResource primary2 = new ColorUIResource(128, 192, 192);
+    private final ColorUIResource primary3 = new ColorUIResource(159, 235, 235);
+
+    protected ColorUIResource getPrimary1() { return primary1; }
+    protected ColorUIResource getPrimary2() { return primary2; }
+    protected ColorUIResource getPrimary3() { return primary3; }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/BezierAnimationPanel.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,331 @@
+/*
+ *
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.font.*;
+import java.awt.geom.*;
+import java.awt.image.*;
+import java.awt.event.*;
+
+/**
+ * BezierAnimationPanel
+ *
+ * @author Jim Graham
+ * @author Jeff Dinkins (removed dynamic setting changes, made swing friendly)
+ */
+class BezierAnimationPanel extends JPanel implements Runnable {
+
+    Color backgroundColor =  new Color(0,     0, 153);
+    Color outerColor      =  new Color(255, 255, 255);
+    Color gradientColorA  =  new Color(255,   0, 101);
+    Color gradientColorB  =  new Color(255, 255,   0);
+
+    boolean bgChanged = false;
+
+    GradientPaint gradient = null;
+
+    public final int NUMPTS = 6;
+
+    float animpts[] = new float[NUMPTS * 2];
+
+    float deltas[] = new float[NUMPTS * 2];
+
+    float staticpts[] = {
+         50.0f,   0.0f,
+        150.0f,   0.0f,
+        200.0f,  75.0f,
+        150.0f, 150.0f,
+         50.0f, 150.0f,
+          0.0f,  75.0f,
+    };
+
+    float movepts[] = new float[staticpts.length];
+
+    BufferedImage img;
+
+    Rectangle bounds = null;
+
+    Thread anim;
+
+    private final Object lock = new Object();
+
+    /**
+     * BezierAnimationPanel Constructor
+     */
+    public BezierAnimationPanel() {
+        addHierarchyListener(
+            new HierarchyListener() {
+               public void hierarchyChanged(HierarchyEvent e) {
+                   if(isShowing()) {
+                       start();
+                   } else {
+                       stop();
+                   }
+               }
+           }
+        );
+        setBackground(getBackgroundColor());
+    }
+
+    public boolean isOpaque() {
+        return true;
+    }
+
+    public Color getGradientColorA() {
+        return gradientColorA;
+    }
+
+    public void setGradientColorA(Color c) {
+        if(c != null) {
+            gradientColorA = c;
+        }
+    }
+
+    public Color getGradientColorB() {
+        return gradientColorB;
+    }
+
+    public void setGradientColorB(Color c) {
+        if(c != null) {
+            gradientColorB = c;
+        }
+    }
+
+    public Color getOuterColor() {
+        return outerColor;
+    }
+
+    public void setOuterColor(Color c) {
+        if(c != null) {
+            outerColor = c;
+        }
+    }
+
+    public Color getBackgroundColor() {
+        return backgroundColor;
+    }
+
+    public void setBackgroundColor(Color c) {
+        if(c != null) {
+            backgroundColor = c;
+            setBackground(c);
+            bgChanged = true;
+        }
+    }
+
+    public void start() {
+        Dimension size = getSize();
+        for (int i = 0; i < animpts.length; i += 2) {
+            animpts[i + 0] = (float) (Math.random() * size.width);
+            animpts[i + 1] = (float) (Math.random() * size.height);
+            deltas[i + 0] = (float) (Math.random() * 4.0 + 2.0);
+            deltas[i + 1] = (float) (Math.random() * 4.0 + 2.0);
+            if (animpts[i + 0] > size.width / 6.0f) {
+                deltas[i + 0] = -deltas[i + 0];
+            }
+            if (animpts[i + 1] > size.height / 6.0f) {
+                deltas[i + 1] = -deltas[i + 1];
+            }
+        }
+        anim = new Thread(this);
+        anim.setPriority(Thread.MIN_PRIORITY);
+        anim.start();
+    }
+
+    public synchronized void stop() {
+        anim = null;
+        notify();
+    }
+
+    public void animate(float[] pts, float[] deltas, int index, int limit) {
+        float newpt = pts[index] + deltas[index];
+        if (newpt <= 0) {
+            newpt = -newpt;
+            deltas[index] = (float) (Math.random() * 3.0 + 2.0);
+        } else if (newpt >= (float) limit) {
+            newpt = 2.0f * limit - newpt;
+            deltas[index] = - (float) (Math.random() * 3.0 + 2.0);
+        }
+        pts[index] = newpt;
+    }
+
+    public void run() {
+        Thread me = Thread.currentThread();
+        while (getSize().width <= 0) {
+            try {
+                anim.sleep(500);
+            } catch (InterruptedException e) {
+                return;
+            }
+        }
+
+        Graphics2D g2d = null;
+        Graphics2D BufferG2D = null;
+        Graphics2D ScreenG2D = null;
+        BasicStroke solid = new BasicStroke(9.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 9.0f);
+        GeneralPath gp = new GeneralPath(GeneralPath.WIND_NON_ZERO);
+        int rule = AlphaComposite.SRC_OVER;
+        AlphaComposite opaque = AlphaComposite.SrcOver;
+        AlphaComposite blend = AlphaComposite.getInstance(rule, 0.9f);
+        AlphaComposite set = AlphaComposite.Src;
+        int frame = 0;
+        int frametmp = 0;
+        Dimension oldSize = getSize();
+        Shape clippath = null;
+        while (anim == me) {
+            Dimension size = getSize();
+            if (size.width != oldSize.width || size.height != oldSize.height) {
+                img = null;
+                clippath = null;
+                if (BufferG2D != null) {
+                    BufferG2D.dispose();
+                    BufferG2D = null;
+                }
+                if (ScreenG2D != null) {
+                    ScreenG2D.dispose();
+                    ScreenG2D = null;
+                }
+            }
+            oldSize = size;
+
+            if (img == null) {
+                img = (BufferedImage) createImage(size.width, size.height);
+            }
+
+        if (BufferG2D == null) {
+                BufferG2D = img.createGraphics();
+                BufferG2D.setRenderingHint(RenderingHints.KEY_RENDERING,
+                                           RenderingHints.VALUE_RENDER_DEFAULT);
+                BufferG2D.setClip(clippath);
+            }
+            g2d = BufferG2D;
+
+            float[] ctrlpts;
+            for (int i = 0; i < animpts.length; i += 2) {
+                animate(animpts, deltas, i + 0, size.width);
+                animate(animpts, deltas, i + 1, size.height);
+            }
+            ctrlpts = animpts;
+            int len = ctrlpts.length;
+            gp.reset();
+            int dir = 0;
+            float prevx = ctrlpts[len - 2];
+            float prevy = ctrlpts[len - 1];
+            float curx = ctrlpts[0];
+            float cury = ctrlpts[1];
+            float midx = (curx + prevx) / 2.0f;
+            float midy = (cury + prevy) / 2.0f;
+            gp.moveTo(midx, midy);
+            for (int i = 2; i <= ctrlpts.length; i += 2) {
+                float x1 = (midx + curx) / 2.0f;
+                float y1 = (midy + cury) / 2.0f;
+                prevx = curx;
+                prevy = cury;
+                if (i < ctrlpts.length) {
+                    curx = ctrlpts[i + 0];
+                    cury = ctrlpts[i + 1];
+                } else {
+                    curx = ctrlpts[0];
+                    cury = ctrlpts[1];
+                }
+                midx = (curx + prevx) / 2.0f;
+                midy = (cury + prevy) / 2.0f;
+                float x2 = (prevx + midx) / 2.0f;
+                float y2 = (prevy + midy) / 2.0f;
+                gp.curveTo(x1, y1, x2, y2, midx, midy);
+            }
+            gp.closePath();
+
+            synchronized(lock) {
+        g2d.setComposite(set);
+            g2d.setBackground(backgroundColor);
+            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                                 RenderingHints.VALUE_ANTIALIAS_OFF);
+
+            if(bgChanged || bounds == null) {
+                bounds = new Rectangle(0, 0, getWidth(), getHeight());
+                bgChanged = false;
+            }
+
+        // g2d.clearRect(bounds.x-5, bounds.y-5, bounds.x + bounds.width + 5, bounds.y + bounds.height + 5);
+            g2d.clearRect(0, 0, getWidth(), getHeight());
+
+            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                                 RenderingHints.VALUE_ANTIALIAS_ON);
+            g2d.setColor(outerColor);
+            g2d.setComposite(opaque);
+            g2d.setStroke(solid);
+            g2d.draw(gp);
+            g2d.setPaint(gradient);
+
+            if(!bgChanged) {
+                bounds = gp.getBounds();
+            } else {
+                bounds = new Rectangle(0, 0, getWidth(), getHeight());
+                bgChanged = false;
+            }
+            gradient = new GradientPaint(bounds.x, bounds.y, gradientColorA,
+                                         bounds.x + bounds.width, bounds.y + bounds.height,
+                                         gradientColorB, true);
+            g2d.setComposite(blend);
+            g2d.fill(gp);
+        }
+            if (g2d == BufferG2D) {
+                repaint();
+            }
+            ++frame;
+            Thread.yield();
+        }
+        if (g2d != null) {
+            g2d.dispose();
+        }
+    }
+
+    public void paint(Graphics g) {
+        synchronized (lock) {
+           Graphics2D g2d = (Graphics2D) g;
+           if (img != null) {
+               g2d.setComposite(AlphaComposite.Src);
+               g2d.drawImage(img, null, 0, 0);
+           }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ButtonDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,555 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JButton, JRadioButton, JToggleButton, JCheckBox Demos
+ *
+ * @author Jeff Dinkins
+ */
+public class ButtonDemo extends DemoModule implements ChangeListener {
+
+    JTabbedPane tab;
+
+    JPanel buttonPanel = new JPanel();
+    JPanel checkboxPanel = new JPanel();
+    JPanel radioButtonPanel = new JPanel();
+    JPanel toggleButtonPanel = new JPanel();
+
+    Vector buttons = new Vector();
+    Vector checkboxes = new Vector();
+    Vector radiobuttons = new Vector();
+    Vector togglebuttons = new Vector();
+
+    Vector currentControls = buttons;
+
+    JButton button;
+    JCheckBox check;
+    JRadioButton radio;
+    JToggleButton toggle;
+
+    EmptyBorder border5 = new EmptyBorder(5,5,5,5);
+    EmptyBorder border10 = new EmptyBorder(10,10,10,10);
+
+    ItemListener buttonDisplayListener = null;
+    ItemListener buttonPadListener = null;
+
+    Insets insets0 = new Insets(0,0,0,0);
+    Insets insets10 = new Insets(10,10,10,10);
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        ButtonDemo demo = new ButtonDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * ButtonDemo Constructor
+     */
+    public ButtonDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "ButtonDemo", "toolbar/JButton.gif");
+
+        tab = new JTabbedPane();
+        tab.getModel().addChangeListener(this);
+
+        JPanel demo = getDemoPanel();
+        demo.setLayout(new BoxLayout(demo, BoxLayout.Y_AXIS));
+        demo.add(tab);
+
+        addButtons();
+        addRadioButtons();
+        addCheckBoxes();
+        // addToggleButtons();
+        currentControls = buttons;
+    }
+
+    public void addButtons() {
+        tab.addTab(getString("ButtonDemo.buttons"), buttonPanel);
+        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
+        buttonPanel.setBorder(border5);
+
+        JPanel p1 = createVerticalPanel(true);
+        p1.setAlignmentY(TOP_ALIGNMENT);
+        buttonPanel.add(p1);
+
+        // Text Buttons
+        JPanel p2 = createHorizontalPanel(false);
+        p1.add(p2);
+        p2.setBorder(new CompoundBorder(new TitledBorder(null, getString("ButtonDemo.textbuttons"),
+                                                          TitledBorder.LEFT, TitledBorder.TOP), border5));
+
+        buttons.add(p2.add(new JButton(getString("ButtonDemo.button1"))));
+        p2.add(Box.createRigidArea(HGAP10));
+
+        buttons.add(p2.add(new JButton(getString("ButtonDemo.button2"))));
+        p2.add(Box.createRigidArea(HGAP10));
+
+        buttons.add(p2.add(new JButton(getString("ButtonDemo.button3"))));
+
+
+        // Image Buttons
+        p1.add(Box.createRigidArea(VGAP30));
+        JPanel p3 = createHorizontalPanel(false);
+        p1.add(p3);
+        p3.setLayout(new BoxLayout(p3, BoxLayout.X_AXIS));
+        p3.setBorder(new TitledBorder(null, getString("ButtonDemo.imagebuttons"),
+                                         TitledBorder.LEFT, TitledBorder.TOP));
+
+        // home image button
+        String description = getString("ButtonDemo.phone");
+        button = new JButton(createImageIcon("buttons/b1.gif", description));
+        button.setPressedIcon(createImageIcon("buttons/b1p.gif", description));
+        button.setRolloverIcon(createImageIcon("buttons/b1r.gif", description));
+        button.setDisabledIcon(createImageIcon("buttons/b1d.gif", description));
+        button.setMargin(new Insets(0,0,0,0));
+        p3.add(button);
+        buttons.add(button);
+        p3.add(Box.createRigidArea(HGAP10));
+
+        // write image button
+        description = getString("ButtonDemo.write");
+        button = new JButton(createImageIcon("buttons/b2.gif", description));
+        button.setPressedIcon(createImageIcon("buttons/b2p.gif", description));
+        button.setRolloverIcon(createImageIcon("buttons/b2r.gif", description));
+        button.setDisabledIcon(createImageIcon("buttons/b2d.gif", description));
+        button.setMargin(new Insets(0,0,0,0));
+        p3.add(button);
+        buttons.add(button);
+        p3.add(Box.createRigidArea(HGAP10));
+
+        // write image button
+        description = getString("ButtonDemo.peace");
+        button = new JButton(createImageIcon("buttons/b3.gif", description));
+        button.setPressedIcon(createImageIcon("buttons/b3p.gif", description));
+        button.setRolloverIcon(createImageIcon("buttons/b3r.gif", description));
+        button.setDisabledIcon(createImageIcon("buttons/b3d.gif", description));
+        button.setMargin(new Insets(0,0,0,0));
+        p3.add(button);
+        buttons.add(button);
+
+        p1.add(Box.createVerticalGlue());
+
+        buttonPanel.add(Box.createHorizontalGlue());
+        currentControls = buttons;
+        buttonPanel.add(createControls());
+    }
+
+    public void addRadioButtons() {
+        ButtonGroup group = new ButtonGroup();
+
+        tab.addTab(getString("ButtonDemo.radiobuttons"), radioButtonPanel);
+        radioButtonPanel.setLayout(new BoxLayout(radioButtonPanel, BoxLayout.X_AXIS));
+        radioButtonPanel.setBorder(border5);
+
+        JPanel p1 = createVerticalPanel(true);
+        p1.setAlignmentY(TOP_ALIGNMENT);
+        radioButtonPanel.add(p1);
+
+        // Text Radio Buttons
+        JPanel p2 = createHorizontalPanel(false);
+        p1.add(p2);
+        p2.setBorder(new CompoundBorder(
+                      new TitledBorder(
+                        null, getString("ButtonDemo.textradiobuttons"),
+                        TitledBorder.LEFT, TitledBorder.TOP), border5)
+        );
+
+        radio = (JRadioButton)p2.add(
+                new JRadioButton(getString("ButtonDemo.radio1")));
+        group.add(radio);
+        radiobuttons.add(radio);
+        p2.add(Box.createRigidArea(HGAP10));
+
+        radio = (JRadioButton)p2.add(
+                new JRadioButton(getString("ButtonDemo.radio2")));
+        group.add(radio);
+        radiobuttons.add(radio);
+        p2.add(Box.createRigidArea(HGAP10));
+
+        radio = (JRadioButton)p2.add(
+                new JRadioButton(getString("ButtonDemo.radio3")));
+        group.add(radio);
+        radiobuttons.add(radio);
+
+        // Image Radio Buttons
+        group = new ButtonGroup();
+        p1.add(Box.createRigidArea(VGAP30));
+        JPanel p3 = createHorizontalPanel(false);
+        p1.add(p3);
+        p3.setLayout(new BoxLayout(p3, BoxLayout.X_AXIS));
+        p3.setBorder(new TitledBorder(null, getString("ButtonDemo.imageradiobuttons"),
+                                         TitledBorder.LEFT, TitledBorder.TOP));
+
+        // image radio button 1
+        String description = getString("ButtonDemo.customradio");
+        String text = getString("ButtonDemo.radio1");
+        radio = new JRadioButton(text, createImageIcon("buttons/rb.gif", description));
+        radio.setPressedIcon(createImageIcon("buttons/rbp.gif", description));
+        radio.setRolloverIcon(createImageIcon("buttons/rbr.gif", description));
+        radio.setRolloverSelectedIcon(createImageIcon("buttons/rbrs.gif", description));
+        radio.setSelectedIcon(createImageIcon("buttons/rbs.gif", description));
+        radio.setMargin(new Insets(0,0,0,0));
+        group.add(radio);
+        p3.add(radio);
+        radiobuttons.add(radio);
+        p3.add(Box.createRigidArea(HGAP20));
+
+        // image radio button 2
+        text = getString("ButtonDemo.radio2");
+        radio = new JRadioButton(text, createImageIcon("buttons/rb.gif", description));
+        radio.setPressedIcon(createImageIcon("buttons/rbp.gif", description));
+        radio.setRolloverIcon(createImageIcon("buttons/rbr.gif", description));
+        radio.setRolloverSelectedIcon(createImageIcon("buttons/rbrs.gif", description));
+        radio.setSelectedIcon(createImageIcon("buttons/rbs.gif", description));
+        radio.setMargin(new Insets(0,0,0,0));
+        group.add(radio);
+        p3.add(radio);
+        radiobuttons.add(radio);
+        p3.add(Box.createRigidArea(HGAP20));
+
+        // image radio button 3
+        text = getString("ButtonDemo.radio3");
+        radio = new JRadioButton(text, createImageIcon("buttons/rb.gif", description));
+        radio.setPressedIcon(createImageIcon("buttons/rbp.gif", description));
+        radio.setRolloverIcon(createImageIcon("buttons/rbr.gif", description));
+        radio.setRolloverSelectedIcon(createImageIcon("buttons/rbrs.gif", description));
+        radio.setSelectedIcon(createImageIcon("buttons/rbs.gif", description));
+        radio.setMargin(new Insets(0,0,0,0));
+        group.add(radio);
+        radiobuttons.add(radio);
+        p3.add(radio);
+
+        // verticaly glue fills out the rest of the box
+        p1.add(Box.createVerticalGlue());
+
+        radioButtonPanel.add(Box.createHorizontalGlue());
+        currentControls = radiobuttons;
+        radioButtonPanel.add(createControls());
+    }
+
+
+    public void addCheckBoxes() {
+        tab.addTab(getString("ButtonDemo.checkboxes"), checkboxPanel);
+        checkboxPanel.setLayout(new BoxLayout(checkboxPanel, BoxLayout.X_AXIS));
+        checkboxPanel.setBorder(border5);
+
+        JPanel p1 = createVerticalPanel(true);
+        p1.setAlignmentY(TOP_ALIGNMENT);
+        checkboxPanel.add(p1);
+
+        // Text Radio Buttons
+        JPanel p2 = createHorizontalPanel(false);
+        p1.add(p2);
+        p2.setBorder(new CompoundBorder(
+                      new TitledBorder(
+                        null, getString("ButtonDemo.textcheckboxes"),
+                        TitledBorder.LEFT, TitledBorder.TOP), border5)
+        );
+
+        checkboxes.add(p2.add(new JCheckBox(getString("ButtonDemo.check1"))));
+        p2.add(Box.createRigidArea(HGAP10));
+
+        checkboxes.add(p2.add(new JCheckBox(getString("ButtonDemo.check2"))));
+        p2.add(Box.createRigidArea(HGAP10));
+
+        checkboxes.add(p2.add(new JCheckBox(getString("ButtonDemo.check3"))));
+
+        // Image Radio Buttons
+        p1.add(Box.createRigidArea(VGAP30));
+        JPanel p3 = createHorizontalPanel(false);
+        p1.add(p3);
+        p3.setLayout(new BoxLayout(p3, BoxLayout.X_AXIS));
+        p3.setBorder(new TitledBorder(null, getString("ButtonDemo.imagecheckboxes"),
+                                         TitledBorder.LEFT, TitledBorder.TOP));
+
+        // image checkbox 1
+        String description = getString("ButtonDemo.customcheck");
+        String text = getString("ButtonDemo.check1");
+        check = new JCheckBox(text, createImageIcon("buttons/cb.gif", description));
+        check.setRolloverIcon(createImageIcon("buttons/cbr.gif", description));
+        check.setRolloverSelectedIcon(createImageIcon("buttons/cbrs.gif", description));
+        check.setSelectedIcon(createImageIcon("buttons/cbs.gif", description));
+        check.setMargin(new Insets(0,0,0,0));
+        p3.add(check);
+        checkboxes.add(check);
+        p3.add(Box.createRigidArea(HGAP20));
+
+        // image checkbox 2
+        text = getString("ButtonDemo.check2");
+        check = new JCheckBox(text, createImageIcon("buttons/cb.gif", description));
+        check.setRolloverIcon(createImageIcon("buttons/cbr.gif", description));
+        check.setRolloverSelectedIcon(createImageIcon("buttons/cbrs.gif", description));
+        check.setSelectedIcon(createImageIcon("buttons/cbs.gif", description));
+        check.setMargin(new Insets(0,0,0,0));
+        p3.add(check);
+        checkboxes.add(check);
+        p3.add(Box.createRigidArea(HGAP20));
+
+        // image checkbox 3
+        text = getString("ButtonDemo.check3");
+        check = new JCheckBox(text, createImageIcon("buttons/cb.gif", description));
+        check.setRolloverIcon(createImageIcon("buttons/cbr.gif", description));
+        check.setRolloverSelectedIcon(createImageIcon("buttons/cbrs.gif", description));
+        check.setSelectedIcon(createImageIcon("buttons/cbs.gif", description));
+        check.setMargin(new Insets(0,0,0,0));
+        p3.add(check);
+        checkboxes.add(check);
+
+        // verticaly glue fills out the rest of the box
+        p1.add(Box.createVerticalGlue());
+
+        checkboxPanel.add(Box.createHorizontalGlue());
+        currentControls = checkboxes;
+        checkboxPanel.add(createControls());
+    }
+
+    public void addToggleButtons() {
+        tab.addTab(getString("ButtonDemo.togglebuttons"), toggleButtonPanel);
+    }
+
+    public JPanel createControls() {
+        JPanel controls = new JPanel() {
+            public Dimension getMaximumSize() {
+                return new Dimension(300, super.getMaximumSize().height);
+            }
+        };
+        controls.setLayout(new BoxLayout(controls, BoxLayout.Y_AXIS));
+        controls.setAlignmentY(TOP_ALIGNMENT);
+        controls.setAlignmentX(LEFT_ALIGNMENT);
+
+        JPanel buttonControls = createHorizontalPanel(true);
+        buttonControls.setAlignmentY(TOP_ALIGNMENT);
+        buttonControls.setAlignmentX(LEFT_ALIGNMENT);
+
+        JPanel leftColumn = createVerticalPanel(false);
+        leftColumn.setAlignmentX(LEFT_ALIGNMENT);
+        leftColumn.setAlignmentY(TOP_ALIGNMENT);
+
+        JPanel rightColumn = new LayoutControlPanel(this);
+
+        buttonControls.add(leftColumn);
+        buttonControls.add(Box.createRigidArea(HGAP20));
+        buttonControls.add(rightColumn);
+        buttonControls.add(Box.createRigidArea(HGAP20));
+
+        controls.add(buttonControls);
+
+        createListeners();
+
+        // Display Options
+        JLabel l = new JLabel(getString("ButtonDemo.controlpanel_label"));
+        leftColumn.add(l);
+
+        JCheckBox bordered = new JCheckBox(getString("ButtonDemo.paintborder"));
+        bordered.setActionCommand("PaintBorder");
+        bordered.setToolTipText(getString("ButtonDemo.paintborder_tooltip"));
+        bordered.setMnemonic(getMnemonic("ButtonDemo.paintborder_mnemonic"));
+        if (currentControls == buttons) {
+                bordered.setSelected(true);
+        }
+        bordered.addItemListener(buttonDisplayListener);
+        leftColumn.add(bordered);
+
+        JCheckBox focused = new JCheckBox(getString("ButtonDemo.paintfocus"));
+        focused.setActionCommand("PaintFocus");
+        focused.setToolTipText(getString("ButtonDemo.paintfocus_tooltip"));
+        focused.setMnemonic(getMnemonic("ButtonDemo.paintfocus_mnemonic"));
+        focused.setSelected(true);
+        focused.addItemListener(buttonDisplayListener);
+        leftColumn.add(focused);
+
+        JCheckBox enabled = new JCheckBox(getString("ButtonDemo.enabled"));
+        enabled.setActionCommand("Enabled");
+        enabled.setToolTipText(getString("ButtonDemo.enabled_tooltip"));
+        enabled.setSelected(true);
+        enabled.addItemListener(buttonDisplayListener);
+        enabled.setMnemonic(getMnemonic("ButtonDemo.enabled_mnemonic"));
+        leftColumn.add(enabled);
+
+        JCheckBox filled = new JCheckBox(getString("ButtonDemo.contentfilled"));
+        filled.setActionCommand("ContentFilled");
+        filled.setToolTipText(getString("ButtonDemo.contentfilled_tooltip"));
+        filled.setSelected(true);
+        filled.addItemListener(buttonDisplayListener);
+        filled.setMnemonic(getMnemonic("ButtonDemo.contentfilled_mnemonic"));
+        leftColumn.add(filled);
+
+        leftColumn.add(Box.createRigidArea(VGAP20));
+
+        l = new JLabel(getString("ButtonDemo.padamount_label"));
+        leftColumn.add(l);
+        ButtonGroup group = new ButtonGroup();
+        JRadioButton defaultPad = new JRadioButton(getString("ButtonDemo.default"));
+        defaultPad.setToolTipText(getString("ButtonDemo.default_tooltip"));
+        defaultPad.setMnemonic(getMnemonic("ButtonDemo.default_mnemonic"));
+        defaultPad.addItemListener(buttonPadListener);
+        group.add(defaultPad);
+        defaultPad.setSelected(true);
+        leftColumn.add(defaultPad);
+
+        JRadioButton zeroPad = new JRadioButton(getString("ButtonDemo.zero"));
+        zeroPad.setActionCommand("ZeroPad");
+        zeroPad.setToolTipText(getString("ButtonDemo.zero_tooltip"));
+        zeroPad.addItemListener(buttonPadListener);
+        zeroPad.setMnemonic(getMnemonic("ButtonDemo.zero_mnemonic"));
+        group.add(zeroPad);
+        leftColumn.add(zeroPad);
+
+        JRadioButton tenPad = new JRadioButton(getString("ButtonDemo.ten"));
+        tenPad.setActionCommand("TenPad");
+        tenPad.setMnemonic(getMnemonic("ButtonDemo.ten_mnemonic"));
+        tenPad.setToolTipText(getString("ButtonDemo.ten_tooltip"));
+        tenPad.addItemListener(buttonPadListener);
+        group.add(tenPad);
+        leftColumn.add(tenPad);
+
+        leftColumn.add(Box.createRigidArea(VGAP20));
+        return controls;
+    }
+
+    public void createListeners() {
+        buttonDisplayListener = new ItemListener() {
+                Component c;
+                AbstractButton b;
+
+                public void itemStateChanged(ItemEvent e) {
+                    JCheckBox cb = (JCheckBox) e.getSource();
+                    String command = cb.getActionCommand();
+                    if(command == "Enabled") {
+                        for(int i = 0; i < currentControls.size(); i++) {
+                            c = (Component) currentControls.elementAt(i);
+                            c.setEnabled(cb.isSelected());
+                            c.invalidate();
+                        }
+                    } else if(command == "PaintBorder") {
+                        c = (Component) currentControls.elementAt(0);
+                        if(c instanceof AbstractButton) {
+                            for(int i = 0; i < currentControls.size(); i++) {
+                                b = (AbstractButton) currentControls.elementAt(i);
+                                b.setBorderPainted(cb.isSelected());
+                                b.invalidate();
+                            }
+                        }
+                    } else if(command == "PaintFocus") {
+                        c = (Component) currentControls.elementAt(0);
+                        if(c instanceof AbstractButton) {
+                            for(int i = 0; i < currentControls.size(); i++) {
+                                b = (AbstractButton) currentControls.elementAt(i);
+                                b.setFocusPainted(cb.isSelected());
+                                b.invalidate();
+                            }
+                        }
+                    } else if(command == "ContentFilled") {
+                        c = (Component) currentControls.elementAt(0);
+                        if(c instanceof AbstractButton) {
+                            for(int i = 0; i < currentControls.size(); i++) {
+                                b = (AbstractButton) currentControls.elementAt(i);
+                                b.setContentAreaFilled(cb.isSelected());
+                                b.invalidate();
+                            }
+                        }
+                    }
+                    invalidate();
+                    validate();
+                    repaint();
+                }
+        };
+
+        buttonPadListener = new ItemListener() {
+                Component c;
+                AbstractButton b;
+
+                public void itemStateChanged(ItemEvent e) {
+                    // *** pad = 0
+                    int pad = -1;
+                    JRadioButton rb = (JRadioButton) e.getSource();
+                    String command = rb.getActionCommand();
+                    if(command == "ZeroPad" && rb.isSelected()) {
+                        pad = 0;
+                    } else if(command == "TenPad" && rb.isSelected()) {
+                        pad = 10;
+                    }
+
+                    for(int i = 0; i < currentControls.size(); i++) {
+                        b = (AbstractButton) currentControls.elementAt(i);
+                        if(pad == -1) {
+                            b.setMargin(null);
+                        } else if(pad == 0) {
+                            b.setMargin(insets0);
+                        } else {
+                            b.setMargin(insets10);
+                        }
+                    }
+                    invalidate();
+                    validate();
+                    repaint();
+                }
+        };
+    }
+
+    public void stateChanged(ChangeEvent e) {
+        SingleSelectionModel model = (SingleSelectionModel) e.getSource();
+        if(model.getSelectedIndex() == 0) {
+            currentControls = buttons;
+        } else if(model.getSelectedIndex() == 1) {
+            currentControls = radiobuttons;
+        } else if(model.getSelectedIndex() == 2) {
+            currentControls = checkboxes;
+        } else {
+            currentControls = togglebuttons;
+        }
+    }
+
+    public Vector getCurrentControls() {
+        return currentControls;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/CharcoalTheme.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,71 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.plaf.*;
+import javax.swing.plaf.metal.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.*;
+
+/**
+ * This class describes a theme using gray colors.
+ *
+ * @author Steve Wilson
+ */
+public class CharcoalTheme extends DefaultMetalTheme {
+
+    public String getName() { return "Charcoal"; }
+
+    private final ColorUIResource primary1 = new ColorUIResource(66, 33, 66);
+    private final ColorUIResource primary2 = new ColorUIResource(90, 86, 99);
+    private final ColorUIResource primary3 = new ColorUIResource(99, 99, 99);
+
+    private final ColorUIResource secondary1 = new ColorUIResource(0, 0, 0);
+    private final ColorUIResource secondary2 = new ColorUIResource(51, 51, 51);
+    private final ColorUIResource secondary3 = new ColorUIResource(102, 102, 102);
+
+    private final ColorUIResource black = new ColorUIResource(222, 222, 222);
+    private final ColorUIResource white = new ColorUIResource(0, 0, 0);
+
+    protected ColorUIResource getPrimary1() { return primary1; }
+    protected ColorUIResource getPrimary2() { return primary2; }
+    protected ColorUIResource getPrimary3() { return primary3; }
+
+    protected ColorUIResource getSecondary1() { return secondary1; }
+    protected ColorUIResource getSecondary2() { return secondary2; }
+    protected ColorUIResource getSecondary3() { return secondary3; }
+
+    protected ColorUIResource getBlack() { return black; }
+    protected ColorUIResource getWhite() { return white; }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ColorChooserDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,209 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JColorChooserDemo
+ *
+ * @author Jeff Dinkins
+ */
+public class ColorChooserDemo extends DemoModule {
+
+    BezierAnimationPanel bezAnim;
+    JButton outerColorButton = null;
+    JButton backgroundColorButton = null;
+    JButton gradientAButton = null;
+    JButton gradientBButton = null;
+
+    // to store the color chosen from the JColorChooser
+    private Color chosen;
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        ColorChooserDemo demo = new ColorChooserDemo(null);
+        demo.mainImpl();
+    }
+
+
+    /**
+     * ColorChooserDemo Constructor
+     */
+    public ColorChooserDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "ColorChooserDemo", "toolbar/JColorChooser.gif");
+
+        // Create the bezier animation panel to put in the center of the panel.
+        bezAnim = new BezierAnimationPanel();
+
+        outerColorButton = new JButton(getString("ColorChooserDemo.outer_line"));
+        outerColorButton.setIcon(new ColorSwatch("OuterLine", bezAnim));
+
+        backgroundColorButton = new JButton(getString("ColorChooserDemo.background"));
+        backgroundColorButton.setIcon(new ColorSwatch("Background", bezAnim));
+
+        gradientAButton = new JButton(getString("ColorChooserDemo.grad_a"));
+        gradientAButton.setIcon(new ColorSwatch("GradientA", bezAnim));
+
+        gradientBButton = new JButton(getString("ColorChooserDemo.grad_b"));
+        gradientBButton.setIcon(new ColorSwatch("GradientB", bezAnim));
+
+        ActionListener l = new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                Color current = bezAnim.getOuterColor();
+
+                if(e.getSource() == backgroundColorButton) {
+                    current = bezAnim.getBackgroundColor();
+                } else if(e.getSource() == gradientAButton) {
+                    current = bezAnim.getGradientColorA();
+                } else if(e.getSource() == gradientBButton) {
+                    current = bezAnim.getGradientColorB();
+                }
+
+                final JColorChooser chooser = new JColorChooser(current != null ?
+                                                                current :
+                                                                Color.WHITE);
+                if (getSwingSet2() != null && getSwingSet2().isDragEnabled()) {
+                    chooser.setDragEnabled(true);
+                }
+
+                chosen = null;
+                ActionListener okListener = new ActionListener() {
+                    public void actionPerformed(ActionEvent ae) {
+                        chosen = chooser.getColor();
+                    }
+                };
+
+                JDialog dialog = JColorChooser.createDialog(getDemoPanel(),
+                                                            getString("ColorChooserDemo.chooser_title"),
+                                                            true,
+                                                            chooser,
+                                                            okListener,
+                                                            null);
+
+                dialog.show();
+
+                if(e.getSource() == outerColorButton) {
+                    bezAnim.setOuterColor(chosen);
+                } else if(e.getSource() == backgroundColorButton) {
+                    bezAnim.setBackgroundColor(chosen);
+                } else if(e.getSource() == gradientAButton) {
+                    bezAnim.setGradientColorA(chosen);
+                } else {
+                    bezAnim.setGradientColorB(chosen);
+                }
+            }
+        };
+
+        outerColorButton.addActionListener(l);
+        backgroundColorButton.addActionListener(l);
+        gradientAButton.addActionListener(l);
+        gradientBButton.addActionListener(l);
+
+        // Add everything to the panel
+        JPanel p = getDemoPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
+
+        // Add control buttons
+        JPanel buttonPanel = new JPanel();
+        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
+
+        buttonPanel.add(backgroundColorButton);
+        buttonPanel.add(Box.createRigidArea(new Dimension(15, 1)));
+
+        buttonPanel.add(gradientAButton);
+        buttonPanel.add(Box.createRigidArea(new Dimension(15, 1)));
+
+        buttonPanel.add(gradientBButton);
+        buttonPanel.add(Box.createRigidArea(new Dimension(15, 1)));
+
+        buttonPanel.add(outerColorButton);
+
+        // Add the panel midway down the panel
+        p.add(Box.createRigidArea(new Dimension(1, 10)));
+        p.add(buttonPanel);
+        p.add(Box.createRigidArea(new Dimension(1, 5)));
+        p.add(bezAnim);
+    }
+
+    class ColorSwatch implements Icon {
+        String gradient;
+        BezierAnimationPanel bez;
+
+        public ColorSwatch(String g, BezierAnimationPanel b) {
+            bez = b;
+            gradient = g;
+        }
+
+        public int getIconWidth() {
+            return 11;
+        }
+
+        public int getIconHeight() {
+            return 11;
+        }
+
+        public void paintIcon(Component c, Graphics g, int x, int y) {
+            g.setColor(Color.black);
+            g.fillRect(x, y, getIconWidth(), getIconHeight());
+            if(gradient.equals("GradientA")) {
+                g.setColor(bez.getGradientColorA());
+            } else if(gradient.equals("GradientB")) {
+                g.setColor(bez.getGradientColorB());
+            } else if(gradient.equals("Background")) {
+                g.setColor(bez.getBackgroundColor());
+            } else if(gradient.equals("OuterLine")) {
+                g.setColor(bez.getOuterColor());
+            }
+            g.fillRect(x+2, y+2, getIconWidth()-4, getIconHeight()-4);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ComboBoxDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,400 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JComboBox Demo
+ *
+ * @author Jeff Dinkins
+ */
+public class ComboBoxDemo extends DemoModule implements ActionListener {
+
+    Face face;
+    JLabel faceLabel;
+
+    JComboBox hairCB;
+    JComboBox eyesCB;
+    JComboBox mouthCB;
+
+    JComboBox presetCB;
+
+    Hashtable parts = new Hashtable();
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        ComboBoxDemo demo = new ComboBoxDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * ComboBoxDemo Constructor
+     */
+    public ComboBoxDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "ComboBoxDemo", "toolbar/JComboBox.gif");
+
+        createComboBoxDemo();
+    }
+
+    public void createComboBoxDemo() {
+        JPanel demo = getDemoPanel();
+
+        JPanel demoPanel = getDemoPanel();
+        demoPanel.setLayout(new BoxLayout(demoPanel, BoxLayout.Y_AXIS));
+
+        JPanel innerPanel = new JPanel();
+        innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));
+
+        demoPanel.add(Box.createRigidArea(VGAP20));
+        demoPanel.add(innerPanel);
+        demoPanel.add(Box.createRigidArea(VGAP20));
+
+        innerPanel.add(Box.createRigidArea(HGAP20));
+
+        // Create a panel to hold buttons
+        JPanel comboBoxPanel = new JPanel() {
+                public Dimension getMaximumSize() {
+                    return new Dimension(getPreferredSize().width, super.getMaximumSize().height);
+                }
+        };
+        comboBoxPanel.setLayout(new BoxLayout(comboBoxPanel, BoxLayout.Y_AXIS));
+
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        JLabel l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.presets")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        presetCB = (JComboBox) comboBoxPanel.add(createPresetComboBox());
+        presetCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(presetCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP30));
+
+        l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.hair_description")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        hairCB = (JComboBox) comboBoxPanel.add(createHairComboBox());
+        hairCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(hairCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.eyes_description")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        eyesCB = (JComboBox) comboBoxPanel.add(createEyesComboBox());
+        eyesCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(eyesCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.mouth_description")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        mouthCB = (JComboBox) comboBoxPanel.add(createMouthComboBox());
+        mouthCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(mouthCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        // Fill up the remaining space
+        comboBoxPanel.add(new JPanel(new BorderLayout()));
+
+        // Create and place the Face.
+
+        face = new Face();
+        JPanel facePanel = new JPanel();
+        facePanel.setLayout(new BorderLayout());
+        facePanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
+
+        faceLabel = new JLabel(face);
+        facePanel.add(faceLabel, BorderLayout.CENTER);
+        // Indicate that the face panel is controlled by the hair, eyes and
+        // mouth combo boxes.
+        Object [] controlledByObjects = new Object[3];
+        controlledByObjects[0] = hairCB;
+        controlledByObjects[1] = eyesCB;
+        controlledByObjects[2] = mouthCB;
+        AccessibleRelation controlledByRelation =
+            new AccessibleRelation(AccessibleRelation.CONTROLLED_BY_PROPERTY,
+                                   controlledByObjects);
+        facePanel.getAccessibleContext().getAccessibleRelationSet().add(controlledByRelation);
+
+        // Indicate that the hair, eyes and mouth combo boxes are controllers
+        // for the face panel.
+        AccessibleRelation controllerForRelation =
+            new AccessibleRelation(AccessibleRelation.CONTROLLER_FOR_PROPERTY,
+                                   facePanel);
+        hairCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
+        eyesCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
+        mouthCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
+
+        // add buttons and image panels to inner panel
+        innerPanel.add(comboBoxPanel);
+        innerPanel.add(Box.createRigidArea(HGAP30));
+        innerPanel.add(facePanel);
+        innerPanel.add(Box.createRigidArea(HGAP20));
+
+        // load up the face parts
+        addFace("brent",     getString("ComboBoxDemo.brent"));
+        addFace("georges",   getString("ComboBoxDemo.georges"));
+        addFace("hans",      getString("ComboBoxDemo.hans"));
+        addFace("howard",    getString("ComboBoxDemo.howard"));
+        addFace("james",     getString("ComboBoxDemo.james"));
+        addFace("jeff",      getString("ComboBoxDemo.jeff"));
+        addFace("jon",       getString("ComboBoxDemo.jon"));
+        addFace("lara",      getString("ComboBoxDemo.lara"));
+        addFace("larry",     getString("ComboBoxDemo.larry"));
+        addFace("lisa",      getString("ComboBoxDemo.lisa"));
+        addFace("michael",   getString("ComboBoxDemo.michael"));
+        addFace("philip",    getString("ComboBoxDemo.philip"));
+        addFace("scott",     getString("ComboBoxDemo.scott"));
+
+        // set the default face
+        presetCB.setSelectedIndex(0);
+    }
+
+    void addFace(String name, String i18n_name) {
+        ImageIcon i;
+        String i18n_hair = getString("ComboBoxDemo.hair");
+        String i18n_eyes = getString("ComboBoxDemo.eyes");
+        String i18n_mouth = getString("ComboBoxDemo.mouth");
+
+        parts.put(i18n_name, name); // i18n name lookup
+        parts.put(name, i18n_name); // reverse name lookup
+
+        i = createImageIcon("combobox/" + name + "hair.jpg", i18n_name + i18n_hair);
+        parts.put(name +  "hair", i);
+
+        i = createImageIcon("combobox/" + name + "eyes.jpg", i18n_name + i18n_eyes);
+        parts.put(name +  "eyes", i);
+
+        i = createImageIcon("combobox/" + name + "mouth.jpg", i18n_name + i18n_mouth);
+        parts.put(name +  "mouth", i);
+    }
+
+    Face getFace() {
+        return face;
+    }
+
+    JComboBox createHairComboBox() {
+        JComboBox cb = new JComboBox();
+        fillComboBox(cb);
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    JComboBox createEyesComboBox() {
+        JComboBox cb = new JComboBox();
+        fillComboBox(cb);
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    JComboBox createNoseComboBox() {
+        JComboBox cb = new JComboBox();
+        fillComboBox(cb);
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    JComboBox createMouthComboBox() {
+        JComboBox cb = new JComboBox();
+        fillComboBox(cb);
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    JComboBox createPresetComboBox() {
+        JComboBox cb = new JComboBox();
+        cb.addItem(getString("ComboBoxDemo.preset1"));
+        cb.addItem(getString("ComboBoxDemo.preset2"));
+        cb.addItem(getString("ComboBoxDemo.preset3"));
+        cb.addItem(getString("ComboBoxDemo.preset4"));
+        cb.addItem(getString("ComboBoxDemo.preset5"));
+        cb.addItem(getString("ComboBoxDemo.preset6"));
+        cb.addItem(getString("ComboBoxDemo.preset7"));
+        cb.addItem(getString("ComboBoxDemo.preset8"));
+        cb.addItem(getString("ComboBoxDemo.preset9"));
+        cb.addItem(getString("ComboBoxDemo.preset10"));
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    void fillComboBox(JComboBox cb) {
+        cb.addItem(getString("ComboBoxDemo.brent"));
+        cb.addItem(getString("ComboBoxDemo.georges"));
+        cb.addItem(getString("ComboBoxDemo.hans"));
+        cb.addItem(getString("ComboBoxDemo.howard"));
+        cb.addItem(getString("ComboBoxDemo.james"));
+        cb.addItem(getString("ComboBoxDemo.jeff"));
+        cb.addItem(getString("ComboBoxDemo.jon"));
+        cb.addItem(getString("ComboBoxDemo.lara"));
+        cb.addItem(getString("ComboBoxDemo.larry"));
+        cb.addItem(getString("ComboBoxDemo.lisa"));
+        cb.addItem(getString("ComboBoxDemo.michael"));
+        cb.addItem(getString("ComboBoxDemo.philip"));
+        cb.addItem(getString("ComboBoxDemo.scott"));
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        if(e.getSource() == hairCB) {
+            String name = (String) parts.get((String) hairCB.getSelectedItem());
+            face.setHair((ImageIcon) parts.get(name + "hair"));
+            faceLabel.repaint();
+        } else if(e.getSource() == eyesCB) {
+            String name = (String) parts.get((String) eyesCB.getSelectedItem());
+            face.setEyes((ImageIcon) parts.get(name + "eyes"));
+            faceLabel.repaint();
+        } else if(e.getSource() == mouthCB) {
+            String name = (String) parts.get((String) mouthCB.getSelectedItem());
+            face.setMouth((ImageIcon) parts.get(name + "mouth"));
+            faceLabel.repaint();
+        } else if(e.getSource() == presetCB) {
+            String hair = null;
+            String eyes = null;
+            String mouth = null;
+            switch(presetCB.getSelectedIndex()) {
+               case 0:
+                   hair = (String) parts.get("philip");
+                   eyes = (String) parts.get("howard");
+                   mouth = (String) parts.get("jeff");
+                   break;
+               case 1:
+                   hair = (String) parts.get("jeff");
+                   eyes = (String) parts.get("larry");
+                   mouth = (String) parts.get("philip");
+                   break;
+               case 2:
+                   hair = (String) parts.get("howard");
+                   eyes = (String) parts.get("scott");
+                   mouth = (String) parts.get("hans");
+                   break;
+               case 3:
+                   hair = (String) parts.get("philip");
+                   eyes = (String) parts.get("jeff");
+                   mouth = (String) parts.get("hans");
+                   break;
+               case 4:
+                   hair = (String) parts.get("brent");
+                   eyes = (String) parts.get("jon");
+                   mouth = (String) parts.get("scott");
+                   break;
+               case 5:
+                   hair = (String) parts.get("lara");
+                   eyes = (String) parts.get("larry");
+                   mouth = (String) parts.get("lisa");
+                   break;
+               case 6:
+                   hair = (String) parts.get("james");
+                   eyes = (String) parts.get("philip");
+                   mouth = (String) parts.get("michael");
+                   break;
+               case 7:
+                   hair = (String) parts.get("philip");
+                   eyes = (String) parts.get("lisa");
+                   mouth = (String) parts.get("brent");
+                   break;
+               case 8:
+                   hair = (String) parts.get("james");
+                   eyes = (String) parts.get("philip");
+                   mouth = (String) parts.get("jon");
+                   break;
+               case 9:
+                   hair = (String) parts.get("lara");
+                   eyes = (String) parts.get("jon");
+                   mouth = (String) parts.get("scott");
+                   break;
+            }
+            if(hair != null) {
+                hairCB.setSelectedItem(hair);
+                eyesCB.setSelectedItem(eyes);
+                mouthCB.setSelectedItem(mouth);
+                faceLabel.repaint();
+            }
+        }
+    }
+
+    class Face implements Icon {
+        ImageIcon hair;
+        ImageIcon eyes;
+        ImageIcon mouth;
+
+        void setHair(ImageIcon i) {
+            hair = i;
+        }
+
+        void setEyes(ImageIcon i) {
+            eyes = i;
+        }
+
+        void setMouth(ImageIcon i) {
+            mouth = i;
+        }
+
+        public void paintIcon(Component c, Graphics g, int x, int y) {
+            int height = y;
+            x = c.getWidth()/2 - getIconWidth()/2;
+
+            if(hair != null) {
+                hair.paintIcon(c, g, x, height);   height += hair.getIconHeight();
+            }
+
+            if(eyes != null) {
+                eyes.paintIcon(c, g, x, height);   height += eyes.getIconHeight();
+            }
+
+            if(mouth != null) {
+                mouth.paintIcon(c, g, x, height);
+            }
+        }
+
+        public int getIconWidth() {
+            return 344;
+        }
+
+        public int getIconHeight() {
+            return 455;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ContrastTheme.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,100 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.plaf.*;
+import javax.swing.plaf.basic.*;
+import javax.swing.plaf.metal.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.*;
+
+/**
+ * This class describes a higher-contrast Metal Theme.
+ *
+ * @author Michael C. Albers
+ */
+
+public class ContrastTheme extends DefaultMetalTheme {
+
+    public String getName() { return "Contrast"; }
+
+    private final ColorUIResource primary1 = new ColorUIResource(0, 0, 0);
+    private final ColorUIResource primary2 = new ColorUIResource(204, 204, 204);
+    private final ColorUIResource primary3 = new ColorUIResource(255, 255, 255);
+    private final ColorUIResource primaryHighlight = new ColorUIResource(102,102,102);
+
+    private final ColorUIResource secondary2 = new ColorUIResource(204, 204, 204);
+    private final ColorUIResource secondary3 = new ColorUIResource(255, 255, 255);
+    private final ColorUIResource controlHighlight = new ColorUIResource(102,102,102);
+
+    protected ColorUIResource getPrimary1() { return primary1; }
+    protected ColorUIResource getPrimary2() { return primary2; }
+    protected ColorUIResource getPrimary3() { return primary3; }
+    public ColorUIResource getPrimaryControlHighlight() { return primaryHighlight;}
+
+    protected ColorUIResource getSecondary2() { return secondary2; }
+    protected ColorUIResource getSecondary3() { return secondary3; }
+    public ColorUIResource getControlHighlight() { return super.getSecondary3(); }
+
+    public ColorUIResource getFocusColor() { return getBlack(); }
+
+    public ColorUIResource getTextHighlightColor() { return getBlack(); }
+    public ColorUIResource getHighlightedTextColor() { return getWhite(); }
+
+    public ColorUIResource getMenuSelectedBackground() { return getBlack(); }
+    public ColorUIResource getMenuSelectedForeground() { return getWhite(); }
+    public ColorUIResource getAcceleratorForeground() { return getBlack(); }
+    public ColorUIResource getAcceleratorSelectedForeground() { return getWhite(); }
+
+
+    public void addCustomEntriesToTable(UIDefaults table) {
+
+        Border blackLineBorder = new BorderUIResource(new LineBorder( getBlack() ));
+
+        Object textBorder = new BorderUIResource( new CompoundBorder(
+                                                       blackLineBorder,
+                                                       new BasicBorders.MarginBorder()));
+
+        table.put( "ToolTip.border", blackLineBorder);
+        table.put( "TitledBorder.border", blackLineBorder);
+
+        table.put( "TextField.border", textBorder);
+        table.put( "PasswordField.border", textBorder);
+        table.put( "TextArea.border", textBorder);
+        table.put( "TextPane.border", textBorder);
+        table.put( "EditorPane.border", textBorder);
+
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/DemoModule.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,229 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * A generic SwingSet2 demo module
+ *
+ * @author Jeff Dinkins
+ */
+public class DemoModule extends JApplet {
+
+    // The preferred size of the demo
+    private int PREFERRED_WIDTH = 680;
+    private int PREFERRED_HEIGHT = 600;
+
+    Border loweredBorder = new CompoundBorder(new SoftBevelBorder(SoftBevelBorder.LOWERED),
+                                              new EmptyBorder(5,5,5,5));
+
+    // Premade convenience dimensions, for use wherever you need 'em.
+    public static Dimension HGAP2 = new Dimension(2,1);
+    public static Dimension VGAP2 = new Dimension(1,2);
+
+    public static Dimension HGAP5 = new Dimension(5,1);
+    public static Dimension VGAP5 = new Dimension(1,5);
+
+    public static Dimension HGAP10 = new Dimension(10,1);
+    public static Dimension VGAP10 = new Dimension(1,10);
+
+    public static Dimension HGAP15 = new Dimension(15,1);
+    public static Dimension VGAP15 = new Dimension(1,15);
+
+    public static Dimension HGAP20 = new Dimension(20,1);
+    public static Dimension VGAP20 = new Dimension(1,20);
+
+    public static Dimension HGAP25 = new Dimension(25,1);
+    public static Dimension VGAP25 = new Dimension(1,25);
+
+    public static Dimension HGAP30 = new Dimension(30,1);
+    public static Dimension VGAP30 = new Dimension(1,30);
+
+    private SwingSet2 swingset = null;
+    private JPanel panel = null;
+    private String resourceName = null;
+    private String iconPath = null;
+    private String sourceCode = null;
+
+    public DemoModule(SwingSet2 swingset) {
+        this(swingset, null, null);
+    }
+
+    public DemoModule(SwingSet2 swingset, String resourceName, String iconPath) {
+        UIManager.put("swing.boldMetal", Boolean.FALSE);
+        panel = new JPanel();
+        panel.setLayout(new BorderLayout());
+
+        this.resourceName = resourceName;
+        this.iconPath = iconPath;
+        this.swingset = swingset;
+
+        loadSourceCode();
+    }
+
+    public String getResourceName() {
+        return resourceName;
+    }
+
+    public JPanel getDemoPanel() {
+        return panel;
+    }
+
+    public SwingSet2 getSwingSet2() {
+        return swingset;
+    }
+
+
+    public String getString(String key) {
+
+        if (getSwingSet2() != null) {
+            return getSwingSet2().getString(key);
+        }else{
+            return "nada";
+        }
+    }
+
+    public char getMnemonic(String key) {
+        return (getString(key)).charAt(0);
+    }
+
+    public ImageIcon createImageIcon(String filename, String description) {
+        if(getSwingSet2() != null) {
+            return getSwingSet2().createImageIcon(filename, description);
+        } else {
+            String path = "/resources/images/" + filename;
+            return new ImageIcon(getClass().getResource(path), description);
+        }
+    }
+
+
+    public String getSourceCode() {
+        return sourceCode;
+    }
+
+    public void loadSourceCode() {
+        if(getResourceName() != null) {
+            String filename = getResourceName() + ".java";
+            sourceCode = new String("<html><body bgcolor=\"#ffffff\"><pre>");
+            InputStream is;
+            InputStreamReader isr;
+            URL url;
+
+            try {
+                url = getClass().getResource(filename);
+                is = url.openStream();
+                isr = new InputStreamReader(is, "UTF-8");
+                BufferedReader reader = new BufferedReader(isr);
+
+                // Read one line at a time, htmlize using super-spiffy
+                // html java code formating utility from www.CoolServlets.com
+                String line = reader.readLine();
+                while(line != null) {
+                    sourceCode += line + " \n ";
+                    line = reader.readLine();
+                }
+                sourceCode += new String("</pre></body></html>");
+            } catch (Exception ex) {
+                sourceCode = "Could not load file: " + filename;
+            }
+        }
+    }
+
+    public String getName() {
+        return getString(getResourceName() + ".name");
+    };
+
+    public Icon getIcon() {
+        return createImageIcon(iconPath, getResourceName() + ".name");
+    };
+
+    public String getToolTip() {
+        return getString(getResourceName() + ".tooltip");
+    };
+
+    public void mainImpl() {
+        JFrame frame = new JFrame(getName());
+        frame.getContentPane().setLayout(new BorderLayout());
+        frame.getContentPane().add(getDemoPanel(), BorderLayout.CENTER);
+        getDemoPanel().setPreferredSize(new Dimension(PREFERRED_WIDTH, PREFERRED_HEIGHT));
+        frame.pack();
+        frame.show();
+    }
+
+    public JPanel createHorizontalPanel(boolean threeD) {
+        JPanel p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
+        p.setAlignmentY(TOP_ALIGNMENT);
+        p.setAlignmentX(LEFT_ALIGNMENT);
+        if(threeD) {
+            p.setBorder(loweredBorder);
+        }
+        return p;
+    }
+
+    public JPanel createVerticalPanel(boolean threeD) {
+        JPanel p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
+        p.setAlignmentY(TOP_ALIGNMENT);
+        p.setAlignmentX(LEFT_ALIGNMENT);
+        if(threeD) {
+            p.setBorder(loweredBorder);
+        }
+        return p;
+    }
+
+    public static void main(String[] args) {
+        DemoModule demo = new DemoModule(null);
+        demo.mainImpl();
+    }
+
+    public void init() {
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(getDemoPanel(), BorderLayout.CENTER);
+    }
+
+    void updateDragEnabled(boolean dragEnabled) {}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/DirectionPanel.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,159 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.swing.*;
+import javax.swing.border.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+
+
+/**
+ * @author Jeff Dinkins
+ * @author Chester Rose
+ * @author Brian Beck
+ */
+
+public class DirectionPanel extends JPanel {
+
+    private ButtonGroup group;
+
+    public DirectionPanel(boolean enable, String selection, ActionListener l) {
+        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+        setAlignmentY(TOP_ALIGNMENT);
+        setAlignmentX(LEFT_ALIGNMENT);
+
+        Box firstThree = Box.createHorizontalBox();
+        Box secondThree = Box.createHorizontalBox();
+        Box thirdThree = Box.createHorizontalBox();
+
+        if(!enable) {
+            selection = "None";
+        }
+
+        group = new ButtonGroup();
+        DirectionButton b;
+        b = (DirectionButton) firstThree.add(new DirectionButton(  tl_dot, tldn_dot, "NW", "Sets the orientation to the North-West", l, group, selection.equals("NW")));
+        b.setEnabled(enable);
+        b = (DirectionButton) firstThree.add(new DirectionButton(  tm_dot, tmdn_dot, "N",  "Sets the orientation to the North", l, group, selection.equals("N")));
+        b.setEnabled(enable);
+        b = (DirectionButton) firstThree.add(new DirectionButton(  tr_dot, trdn_dot, "NE", "Sets the orientation to the North-East", l, group, selection.equals("NE")));
+        b.setEnabled(enable);
+        b = (DirectionButton) secondThree.add(new DirectionButton( ml_dot, mldn_dot, "W", "Sets the orientation to the West", l, group, selection.equals("W")));
+        b.setEnabled(enable);
+        b = (DirectionButton) secondThree.add(new DirectionButton( c_dot,  cdn_dot,  "C", "Sets the orientation to the Center", l, group, selection.equals("C")));
+        b.setEnabled(enable);
+        b = (DirectionButton) secondThree.add(new DirectionButton( mr_dot, mrdn_dot, "E", "Sets the orientation to the East", l, group, selection.equals("E")));
+        b.setEnabled(enable);
+        b = (DirectionButton) thirdThree.add(new DirectionButton(  bl_dot, bldn_dot, "SW", "Sets the orientation to the South-West", l, group, selection.equals("SW")));
+        b.setEnabled(enable);
+        b = (DirectionButton) thirdThree.add(new DirectionButton(  bm_dot, bmdn_dot, "S", "Sets the orientation to the South", l, group, selection.equals("S")));
+        b.setEnabled(enable);
+        b = (DirectionButton) thirdThree.add(new DirectionButton(  br_dot, brdn_dot, "SE", "Sets the orientation to the South-East", l, group, selection.equals("SE")));
+        b.setEnabled(enable);
+
+        add(firstThree);
+        add(secondThree);
+        add(thirdThree);
+    }
+
+    public String getSelection() {
+        return group.getSelection().getActionCommand();
+    }
+
+    public void setSelection( String selection  ) {
+        Enumeration e = group.getElements();
+        while( e.hasMoreElements() ) {
+            JRadioButton b = (JRadioButton)e.nextElement();
+            if( b.getActionCommand().equals(selection) ) {
+               b.setSelected(true);
+            }
+        }
+    }
+
+    // Chester's way cool layout buttons
+    public ImageIcon bl_dot   = loadImageIcon("bl.gif","bottom left layout button");
+    public ImageIcon bldn_dot = loadImageIcon("bldn.gif","selected bottom left layout button");
+    public ImageIcon bm_dot   = loadImageIcon("bm.gif","bottom middle layout button");
+    public ImageIcon bmdn_dot = loadImageIcon("bmdn.gif","selected bottom middle layout button");
+    public ImageIcon br_dot   = loadImageIcon("br.gif","bottom right layout button");
+    public ImageIcon brdn_dot = loadImageIcon("brdn.gif","selected bottom right layout button");
+    public ImageIcon c_dot    = loadImageIcon("c.gif","center layout button");
+    public ImageIcon cdn_dot  = loadImageIcon("cdn.gif","selected center layout button");
+    public ImageIcon ml_dot   = loadImageIcon("ml.gif","middle left layout button");
+    public ImageIcon mldn_dot = loadImageIcon("mldn.gif","selected middle left layout button");
+    public ImageIcon mr_dot   = loadImageIcon("mr.gif","middle right layout button");
+    public ImageIcon mrdn_dot = loadImageIcon("mrdn.gif","selected middle right layout button");
+    public ImageIcon tl_dot   = loadImageIcon("tl.gif","top left layout button");
+    public ImageIcon tldn_dot = loadImageIcon("tldn.gif","selected top left layout button");
+    public ImageIcon tm_dot   = loadImageIcon("tm.gif","top middle layout button");
+    public ImageIcon tmdn_dot = loadImageIcon("tmdn.gif","selected top middle layout button");
+    public ImageIcon tr_dot   = loadImageIcon("tr.gif","top right layout button");
+    public ImageIcon trdn_dot = loadImageIcon("trdn.gif","selected top right layout button");
+
+    public ImageIcon loadImageIcon(String filename, String description) {
+        String path = "/resources/images/buttons/" + filename;
+        return new ImageIcon(getClass().getResource(path), description);
+    }
+
+
+    public class DirectionButton extends JRadioButton {
+
+        /**
+         * A layout direction button
+         */
+        public DirectionButton(Icon icon, Icon downIcon, String direction,
+                               String description, ActionListener l,
+                               ButtonGroup group, boolean selected)
+        {
+            super();
+            this.addActionListener(l);
+            setFocusPainted(false);
+            setHorizontalTextPosition(CENTER);
+            group.add(this);
+            setIcon(icon);
+            setSelectedIcon(downIcon);
+            setActionCommand(direction);
+            getAccessibleContext().setAccessibleName(direction);
+            getAccessibleContext().setAccessibleDescription(description);
+            setSelected(selected);
+        }
+
+        public boolean isFocusTraversable() {
+            return false;
+        }
+
+        public void setBorder(Border b) {
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/EmeraldTheme.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,56 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.swing.plaf.*;
+import javax.swing.plaf.metal.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.*;
+
+/**
+ * This class describes a theme using glowing green colors.
+ *
+ * @author Jeff Dinkins
+ */
+public class EmeraldTheme extends DefaultMetalTheme {
+
+    public String getName() { return "Emerald"; }
+
+    private final ColorUIResource primary1 = new ColorUIResource(51, 142, 71);
+    private final ColorUIResource primary2 = new ColorUIResource(102, 193, 122);
+    private final ColorUIResource primary3 = new ColorUIResource(153, 244, 173);
+
+    protected ColorUIResource getPrimary1() { return primary1; }
+    protected ColorUIResource getPrimary2() { return primary2; }
+    protected ColorUIResource getPrimary3() { return primary3; }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ExampleFileView.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,176 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.swing.*;
+import javax.swing.filechooser.*;
+
+import java.io.File;
+import java.util.Hashtable;
+
+/**
+ * A convenience implementation of the FileView interface that
+ * manages name, icon, traversable, and file type information.
+ *
+ * This this implemention will work well with file systems that use
+ * "dot" extensions to indicate file type. For example: "picture.gif"
+ * as a gif image.
+ *
+ * If the java.io.File ever contains some of this information, such as
+ * file type, icon, and hidden file inforation, this implementation may
+ * become obsolete. At minimum, it should be rewritten at that time to
+ * use any new type information provided by java.io.File
+ *
+ * Example:
+ *    JFileChooser chooser = new JFileChooser();
+ *    fileView = new ExampleFileView();
+ *    fileView.putIcon("jpg", new ImageIcon("images/jpgIcon.jpg"));
+ *    fileView.putIcon("gif", new ImageIcon("images/gifIcon.gif"));
+ *    chooser.setFileView(fileView);
+ *
+ * @author Jeff Dinkins
+ */
+public class ExampleFileView extends FileView {
+    private Hashtable icons = new Hashtable(5);
+    private Hashtable fileDescriptions = new Hashtable(5);
+    private Hashtable typeDescriptions = new Hashtable(5);
+
+    /**
+     * The name of the file.  Do nothing special here. Let
+     * the system file view handle this.
+     * @see FileView#getName
+     */
+    public String getName(File f) {
+        return null;
+    }
+
+    /**
+     * Adds a human readable description of the file.
+     */
+    public void putDescription(File f, String fileDescription) {
+        fileDescriptions.put(f, fileDescription);
+    }
+
+    /**
+     * A human readable description of the file.
+     *
+     * @see FileView#getDescription
+     */
+    public String getDescription(File f) {
+        return (String) fileDescriptions.get(f);
+    };
+
+    /**
+     * Adds a human readable type description for files. Based on "dot"
+     * extension strings, e.g: ".gif". Case is ignored.
+     */
+    public void putTypeDescription(String extension, String typeDescription) {
+        typeDescriptions.put(extension, typeDescription);
+    }
+
+    /**
+     * Adds a human readable type description for files of the type of
+     * the passed in file. Based on "dot" extension strings, e.g: ".gif".
+     * Case is ignored.
+     */
+    public void putTypeDescription(File f, String typeDescription) {
+        putTypeDescription(getExtension(f), typeDescription);
+    }
+
+    /**
+     * A human readable description of the type of the file.
+     *
+     * @see FileView#getTypeDescription
+     */
+    public String getTypeDescription(File f) {
+        return (String) typeDescriptions.get(getExtension(f));
+    }
+
+    /**
+     * Convenience method that returns the "dot" extension for the
+     * given file.
+     */
+    public String getExtension(File f) {
+        String name = f.getName();
+        if(name != null) {
+            int extensionIndex = name.lastIndexOf('.');
+            if(extensionIndex < 0) {
+                return null;
+            }
+            return name.substring(extensionIndex+1).toLowerCase();
+        }
+        return null;
+    }
+
+    /**
+     * Adds an icon based on the file type "dot" extension
+     * string, e.g: ".gif". Case is ignored.
+     */
+    public void putIcon(String extension, Icon icon) {
+        icons.put(extension, icon);
+    }
+
+    /**
+     * Icon that reperesents this file. Default implementation returns
+     * null. You might want to override this to return something more
+     * interesting.
+     *
+     * @see FileView#getIcon
+     */
+    public Icon getIcon(File f) {
+        Icon icon = null;
+        String extension = getExtension(f);
+        if(extension != null) {
+            icon = (Icon) icons.get(extension);
+        }
+        return icon;
+    }
+
+    /**
+     * Whether the directory is traversable or not. Generic implementation
+     * returns true for all directories and special folders.
+     *
+     * You might want to subtype ExampleFileView to do somethimg more interesting,
+     * such as recognize compound documents directories; in such a case you might
+     * return a special icon for the directory that makes it look like a regular
+     * document, and return false for isTraversable to not allow users to
+     * descend into the directory.
+     *
+     * @see FileView#isTraversable
+     */
+    public Boolean isTraversable(File f) {
+        // if (some_reason) {
+        //    return Boolean.FALSE;
+        // }
+        return null;    // Use default from FileSystemView
+    };
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/FileChooserDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,436 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JFileChooserDemo
+ *
+ * @author Jeff Dinkins
+ */
+public class FileChooserDemo extends DemoModule {
+    JLabel theImage;
+    Icon jpgIcon;
+    Icon gifIcon;
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        FileChooserDemo demo = new FileChooserDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * FileChooserDemo Constructor
+     */
+    public FileChooserDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "FileChooserDemo", "toolbar/JFileChooser.gif");
+        createFileChooserDemo();
+    }
+
+    public void createFileChooserDemo() {
+        theImage = new JLabel("");
+        jpgIcon = createImageIcon("filechooser/jpgIcon.jpg", "jpg image");
+        gifIcon = createImageIcon("filechooser/gifIcon.gif", "gif image");
+
+        JPanel demoPanel = getDemoPanel();
+        demoPanel.setLayout(new BoxLayout(demoPanel, BoxLayout.Y_AXIS));
+
+        JPanel innerPanel = new JPanel();
+        innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));
+
+        demoPanel.add(Box.createRigidArea(VGAP20));
+        demoPanel.add(innerPanel);
+        demoPanel.add(Box.createRigidArea(VGAP20));
+
+        innerPanel.add(Box.createRigidArea(HGAP20));
+
+        // Create a panel to hold buttons
+        JPanel buttonPanel = new JPanel() {
+            public Dimension getMaximumSize() {
+                return new Dimension(getPreferredSize().width, super.getMaximumSize().height);
+            }
+        };
+        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
+
+        buttonPanel.add(Box.createRigidArea(VGAP15));
+        buttonPanel.add(createPlainFileChooserButton());
+        buttonPanel.add(Box.createRigidArea(VGAP15));
+        buttonPanel.add(createPreviewFileChooserButton());
+        buttonPanel.add(Box.createRigidArea(VGAP15));
+        buttonPanel.add(createCustomFileChooserButton());
+        buttonPanel.add(Box.createVerticalGlue());
+
+        // Create a panel to hold the image
+        JPanel imagePanel = new JPanel();
+        imagePanel.setLayout(new BorderLayout());
+        imagePanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
+        JScrollPane scroller = new JScrollPane(theImage);
+        scroller.getVerticalScrollBar().setUnitIncrement(10);
+        scroller.getHorizontalScrollBar().setUnitIncrement(10);
+        imagePanel.add(scroller, BorderLayout.CENTER);
+
+        // add buttons and image panels to inner panel
+        innerPanel.add(buttonPanel);
+        innerPanel.add(Box.createRigidArea(HGAP30));
+        innerPanel.add(imagePanel);
+        innerPanel.add(Box.createRigidArea(HGAP20));
+    }
+
+    public JFileChooser createFileChooser() {
+        // create a filechooser
+        JFileChooser fc = new JFileChooser();
+        if (getSwingSet2() != null && getSwingSet2().isDragEnabled()) {
+            fc.setDragEnabled(true);
+        }
+
+        // set the current directory to be the images directory
+        File swingFile = new File("resources/images/About.jpg");
+        if(swingFile.exists()) {
+            fc.setCurrentDirectory(swingFile);
+            fc.setSelectedFile(swingFile);
+        }
+
+        return fc;
+    }
+
+
+    public JButton createPlainFileChooserButton() {
+        Action a = new AbstractAction(getString("FileChooserDemo.plainbutton")) {
+            public void actionPerformed(ActionEvent e) {
+                JFileChooser fc = createFileChooser();
+
+                // show the filechooser
+                int result = fc.showOpenDialog(getDemoPanel());
+
+                // if we selected an image, load the image
+                if(result == JFileChooser.APPROVE_OPTION) {
+                    loadImage(fc.getSelectedFile().getPath());
+                }
+            }
+        };
+        return createButton(a);
+    }
+
+    public JButton createPreviewFileChooserButton() {
+        Action a = new AbstractAction(getString("FileChooserDemo.previewbutton")) {
+            public void actionPerformed(ActionEvent e) {
+                JFileChooser fc = createFileChooser();
+
+                // Add filefilter & fileview
+                javax.swing.filechooser.FileFilter filter = createFileFilter(
+                    getString("FileChooserDemo.filterdescription"),
+                    "jpg", "gif");
+                ExampleFileView fileView = new ExampleFileView();
+                fileView.putIcon("jpg", jpgIcon);
+                fileView.putIcon("gif", gifIcon);
+                fc.setFileView(fileView);
+                fc.addChoosableFileFilter(filter);
+                fc.setFileFilter(filter);
+
+                // add preview accessory
+                fc.setAccessory(new FilePreviewer(fc));
+
+                // show the filechooser
+                int result = fc.showOpenDialog(getDemoPanel());
+
+                // if we selected an image, load the image
+                if(result == JFileChooser.APPROVE_OPTION) {
+                    loadImage(fc.getSelectedFile().getPath());
+                }
+            }
+        };
+        return createButton(a);
+    }
+
+    JDialog dialog;
+    JFileChooser fc;
+
+    private javax.swing.filechooser.FileFilter createFileFilter(
+            String description, String...extensions) {
+        description = createFileNameFilterDescriptionFromExtensions(
+                    description, extensions);
+        return new FileNameExtensionFilter(description, extensions);
+    }
+
+    private String createFileNameFilterDescriptionFromExtensions(
+            String description, String[] extensions) {
+        String fullDescription = (description == null) ?
+                "(" : description + " (";
+        // build the description from the extension list
+        fullDescription += "." + extensions[0];
+        for (int i = 1; i < extensions.length; i++) {
+            fullDescription += ", .";
+            fullDescription += extensions[i];
+        }
+        fullDescription += ")";
+        return fullDescription;
+    }
+
+    public JButton createCustomFileChooserButton() {
+        Action a = new AbstractAction(getString("FileChooserDemo.custombutton")) {
+            public void actionPerformed(ActionEvent e) {
+                fc = createFileChooser();
+
+                // Add filefilter & fileview
+                javax.swing.filechooser.FileFilter filter = createFileFilter(
+                    getString("FileChooserDemo.filterdescription"),
+                    "jpg", "gif");
+                ExampleFileView fileView = new ExampleFileView();
+                fileView.putIcon("jpg", jpgIcon);
+                fileView.putIcon("gif", gifIcon);
+                fc.setFileView(fileView);
+                fc.addChoosableFileFilter(filter);
+
+                // add preview accessory
+                fc.setAccessory(new FilePreviewer(fc));
+
+                // remove the approve/cancel buttons
+                fc.setControlButtonsAreShown(false);
+
+                // make custom controls
+                //wokka
+                JPanel custom = new JPanel();
+                custom.setLayout(new BoxLayout(custom, BoxLayout.Y_AXIS));
+                custom.add(Box.createRigidArea(VGAP10));
+                JLabel description = new JLabel(getString("FileChooserDemo.description"));
+                description.setAlignmentX(JLabel.CENTER_ALIGNMENT);
+                custom.add(description);
+                custom.add(Box.createRigidArea(VGAP10));
+                custom.add(fc);
+
+                Action okAction = createOKAction();
+                fc.addActionListener(okAction);
+
+                JPanel buttons = new JPanel();
+                buttons.setLayout(new BoxLayout(buttons, BoxLayout.X_AXIS));
+                buttons.add(Box.createRigidArea(HGAP10));
+                buttons.add(createImageButton(createFindAction()));
+                buttons.add(Box.createRigidArea(HGAP10));
+                buttons.add(createButton(createAboutAction()));
+                buttons.add(Box.createRigidArea(HGAP10));
+                buttons.add(createButton(okAction));
+                buttons.add(Box.createRigidArea(HGAP10));
+                buttons.add(createButton(createCancelAction()));
+                buttons.add(Box.createRigidArea(HGAP10));
+                buttons.add(createImageButton(createHelpAction()));
+                buttons.add(Box.createRigidArea(HGAP10));
+
+                custom.add(buttons);
+                custom.add(Box.createRigidArea(VGAP10));
+
+                // show the filechooser
+                Frame parent = (Frame) SwingUtilities.getAncestorOfClass(Frame.class, getDemoPanel());
+                dialog = new JDialog(parent, getString("FileChooserDemo.dialogtitle"), true);
+                dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+                dialog.getContentPane().add(custom, BorderLayout.CENTER);
+                dialog.pack();
+                dialog.setLocationRelativeTo(getDemoPanel());
+                dialog.show();
+            }
+        };
+        return createButton(a);
+    }
+
+    public Action createAboutAction() {
+        return new AbstractAction(getString("FileChooserDemo.about")) {
+            public void actionPerformed(ActionEvent e) {
+                File file = fc.getSelectedFile();
+                String text;
+                if(file == null) {
+                    text = getString("FileChooserDemo.nofileselected");
+                } else {
+                    text = "<html>" + getString("FileChooserDemo.thefile");
+                    text += "<br><font color=green>" + file.getName() + "</font><br>";
+                    text += getString("FileChooserDemo.isprobably") + "</html>";
+                }
+                JOptionPane.showMessageDialog(getDemoPanel(), text);
+            }
+        };
+    }
+
+    public Action createOKAction() {
+        return new AbstractAction(getString("FileChooserDemo.ok")) {
+            public void actionPerformed(ActionEvent e) {
+                dialog.dispose();
+                if (!e.getActionCommand().equals(JFileChooser.CANCEL_SELECTION)
+                    && fc.getSelectedFile() != null) {
+
+                    loadImage(fc.getSelectedFile().getPath());
+                }
+            }
+        };
+    }
+
+    public Action createCancelAction() {
+        return new AbstractAction(getString("FileChooserDemo.cancel")) {
+            public void actionPerformed(ActionEvent e) {
+                dialog.dispose();
+            }
+        };
+    }
+
+    public Action createFindAction() {
+        Icon icon = createImageIcon("filechooser/find.gif", getString("FileChooserDemo.find"));
+        return new AbstractAction("", icon) {
+            public void actionPerformed(ActionEvent e) {
+                String result = JOptionPane.showInputDialog(getDemoPanel(), getString("FileChooserDemo.findquestion"));
+                if (result != null) {
+                    JOptionPane.showMessageDialog(getDemoPanel(), getString("FileChooserDemo.findresponse"));
+                }
+            }
+        };
+    }
+
+    public Action createHelpAction() {
+        Icon icon = createImageIcon("filechooser/help.gif", getString("FileChooserDemo.help"));
+        return new AbstractAction("", icon) {
+            public void actionPerformed(ActionEvent e) {
+                JOptionPane.showMessageDialog(getDemoPanel(), getString("FileChooserDemo.helptext"));
+            }
+        };
+    }
+
+    class MyImageIcon extends ImageIcon {
+        public MyImageIcon(String filename) {
+            super(filename);
+        };
+        public synchronized void paintIcon(Component c, Graphics g, int x, int y) {
+            g.setColor(Color.white);
+            g.fillRect(0,0, c.getWidth(), c.getHeight());
+            if(getImageObserver() == null) {
+                g.drawImage(
+                    getImage(),
+                    c.getWidth()/2 - getIconWidth()/2,
+                    c.getHeight()/2 - getIconHeight()/2,
+                    c
+                );
+            } else {
+                g.drawImage(
+                    getImage(),
+                    c.getWidth()/2 - getIconWidth()/2,
+                    c.getHeight()/2 - getIconHeight()/2,
+                    getImageObserver()
+                );
+            }
+        }
+    }
+
+    public void loadImage(String filename) {
+        theImage.setIcon(new MyImageIcon(filename));
+    }
+
+    public JButton createButton(Action a) {
+        JButton b = new JButton(a) {
+            public Dimension getMaximumSize() {
+                int width = Short.MAX_VALUE;
+                int height = super.getMaximumSize().height;
+                return new Dimension(width, height);
+            }
+        };
+        return b;
+    }
+
+    public JButton createImageButton(Action a) {
+        JButton b = new JButton(a);
+        b.setMargin(new Insets(0,0,0,0));
+        return b;
+    }
+}
+
+class FilePreviewer extends JComponent implements PropertyChangeListener {
+    ImageIcon thumbnail = null;
+
+    public FilePreviewer(JFileChooser fc) {
+        setPreferredSize(new Dimension(100, 50));
+        fc.addPropertyChangeListener(this);
+        setBorder(new BevelBorder(BevelBorder.LOWERED));
+    }
+
+    public void loadImage(File f) {
+        if (f == null) {
+            thumbnail = null;
+        } else {
+            ImageIcon tmpIcon = new ImageIcon(f.getPath());
+            if(tmpIcon.getIconWidth() > 90) {
+                thumbnail = new ImageIcon(
+                    tmpIcon.getImage().getScaledInstance(90, -1, Image.SCALE_DEFAULT));
+            } else {
+                thumbnail = tmpIcon;
+            }
+        }
+    }
+
+    public void propertyChange(PropertyChangeEvent e) {
+        String prop = e.getPropertyName();
+        if(prop == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) {
+            if(isShowing()) {
+                loadImage((File) e.getNewValue());
+                repaint();
+            }
+        }
+    }
+
+    public void paint(Graphics g) {
+        super.paint(g);
+        if(thumbnail != null) {
+            int x = getWidth()/2 - thumbnail.getIconWidth()/2;
+            int y = getHeight()/2 - thumbnail.getIconHeight()/2;
+            if(y < 0) {
+                y = 0;
+            }
+
+            if(x < 5) {
+                x = 5;
+            }
+            thumbnail.paintIcon(this, g, x, y);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/HtmlDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,129 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.text.html.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * Html Demo
+ *
+ * @author Jeff Dinkins
+ */
+public class HtmlDemo extends DemoModule {
+
+    JEditorPane html;
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        HtmlDemo demo = new HtmlDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * HtmlDemo Constructor
+     */
+    public HtmlDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "HtmlDemo", "toolbar/JEditorPane.gif");
+
+        try {
+            URL url = null;
+            // System.getProperty("user.dir") +
+            // System.getProperty("file.separator");
+            String path = null;
+            try {
+                path = "/resources/index.html";
+                url = getClass().getResource(path);
+            } catch (Exception e) {
+                System.err.println("Failed to open " + path);
+                url = null;
+            }
+
+            if(url != null) {
+                html = new JEditorPane(url);
+                html.setEditable(false);
+                html.addHyperlinkListener(createHyperLinkListener());
+
+                JScrollPane scroller = new JScrollPane();
+                JViewport vp = scroller.getViewport();
+                vp.add(html);
+                getDemoPanel().add(scroller, BorderLayout.CENTER);
+            }
+        } catch (MalformedURLException e) {
+            System.out.println("Malformed URL: " + e);
+        } catch (IOException e) {
+            System.out.println("IOException: " + e);
+        }
+    }
+
+    public HyperlinkListener createHyperLinkListener() {
+        return new HyperlinkListener() {
+            public void hyperlinkUpdate(HyperlinkEvent e) {
+                if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
+                    if (e instanceof HTMLFrameHyperlinkEvent) {
+                        ((HTMLDocument)html.getDocument()).processHTMLFrameHyperlinkEvent(
+                            (HTMLFrameHyperlinkEvent)e);
+                    } else {
+                        try {
+                            html.setPage(e.getURL());
+                        } catch (IOException ioe) {
+                            System.out.println("IOE: " + ioe);
+                        }
+                    }
+                }
+            }
+        };
+    }
+
+    void updateDragEnabled(boolean dragEnabled) {
+        html.setDragEnabled(dragEnabled);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/InternalFrameDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,342 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * Internal Frames Demo
+ *
+ * @author Jeff Dinkins
+ */
+public class InternalFrameDemo extends DemoModule {
+    int windowCount = 0;
+    JDesktopPane desktop = null;
+
+    ImageIcon icon1, icon2, icon3, icon4;
+    ImageIcon smIcon1, smIcon2, smIcon3, smIcon4;
+
+    public Integer FIRST_FRAME_LAYER  = new Integer(1);
+    public Integer DEMO_FRAME_LAYER   = new Integer(2);
+    public Integer PALETTE_LAYER     = new Integer(3);
+
+    public int FRAME0_X        = 15;
+    public int FRAME0_Y        = 280;
+
+    public int FRAME0_WIDTH    = 320;
+    public int FRAME0_HEIGHT   = 230;
+
+    public int FRAME_WIDTH     = 225;
+    public int FRAME_HEIGHT    = 150;
+
+    public int PALETTE_X      = 375;
+    public int PALETTE_Y      = 20;
+
+    public int PALETTE_WIDTH  = 260;
+    public int PALETTE_HEIGHT = 260;
+
+    JCheckBox windowResizable   = null;
+    JCheckBox windowClosable    = null;
+    JCheckBox windowIconifiable = null;
+    JCheckBox windowMaximizable = null;
+
+    JTextField windowTitleField = null;
+    JLabel windowTitleLabel = null;
+
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        InternalFrameDemo demo = new InternalFrameDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * InternalFrameDemo Constructor
+     */
+    public InternalFrameDemo(SwingSet2 swingset) {
+        super(swingset, "InternalFrameDemo", "toolbar/JDesktop.gif");
+
+        // preload all the icons we need for this demo
+        icon1 = createImageIcon("misc/toast.gif", getString("InternalFrameDemo.toast"));
+        icon2 = createImageIcon("misc/duke.gif", getString("InternalFrameDemo.duke"));
+        icon3 = createImageIcon("misc/duchess.gif",  getString("InternalFrameDemo.duchess"));
+        icon4 = createImageIcon("misc/cab.gif",  getString("InternalFrameDemo.cab"));
+
+        smIcon1 = createImageIcon("misc/toast_small.gif", getString("InternalFrameDemo.toast"));
+        smIcon2 = createImageIcon("misc/duke_small.gif", getString("InternalFrameDemo.duke"));
+        smIcon3 = createImageIcon("misc/duchess_small.gif",  getString("InternalFrameDemo.duchess"));
+        smIcon4 = createImageIcon("misc/cab_small.gif",  getString("InternalFrameDemo.cab"));
+
+        // Create the desktop pane
+        desktop = new JDesktopPane();
+        getDemoPanel().add(desktop, BorderLayout.CENTER);
+
+        // Create the "frame maker" palette
+        createInternalFramePalette();
+
+        // Create an initial internal frame to show
+        JInternalFrame frame1 = createInternalFrame(icon1, FIRST_FRAME_LAYER, 1, 1);
+        frame1.setBounds(FRAME0_X, FRAME0_Y, FRAME0_WIDTH, FRAME0_HEIGHT);
+
+        // Create four more starter windows
+        createInternalFrame(icon1, DEMO_FRAME_LAYER, FRAME_WIDTH, FRAME_HEIGHT);
+        createInternalFrame(icon3, DEMO_FRAME_LAYER, FRAME_WIDTH, FRAME_HEIGHT);
+        createInternalFrame(icon4, DEMO_FRAME_LAYER, FRAME_WIDTH, FRAME_HEIGHT);
+        createInternalFrame(icon2, DEMO_FRAME_LAYER, FRAME_WIDTH, FRAME_HEIGHT);
+    }
+
+
+
+    /**
+     * Create an internal frame and add a scrollable imageicon to it
+     */
+    public JInternalFrame createInternalFrame(Icon icon, Integer layer, int width, int height) {
+        JInternalFrame jif = new JInternalFrame();
+
+        if(!windowTitleField.getText().equals(getString("InternalFrameDemo.frame_label"))) {
+            jif.setTitle(windowTitleField.getText() + "  ");
+        } else {
+            jif = new JInternalFrame(getString("InternalFrameDemo.frame_label") + " " + windowCount + "  ");
+        }
+
+        // set properties
+        jif.setClosable(windowClosable.isSelected());
+        jif.setMaximizable(windowMaximizable.isSelected());
+        jif.setIconifiable(windowIconifiable.isSelected());
+        jif.setResizable(windowResizable.isSelected());
+
+        jif.setBounds(20*(windowCount%10), 20*(windowCount%10), width, height);
+        jif.setContentPane(new ImageScroller(this, icon, 0, windowCount));
+
+        windowCount++;
+
+        desktop.add(jif, layer);
+
+        // Set this internal frame to be selected
+
+        try {
+            jif.setSelected(true);
+        } catch (java.beans.PropertyVetoException e2) {
+        }
+
+        jif.show();
+
+        return jif;
+    }
+
+    public JInternalFrame createInternalFramePalette() {
+        JInternalFrame palette = new JInternalFrame(
+            getString("InternalFrameDemo.palette_label")
+        );
+        palette.putClientProperty("JInternalFrame.isPalette", Boolean.TRUE);
+        palette.getContentPane().setLayout(new BorderLayout());
+        palette.setBounds(PALETTE_X, PALETTE_Y, PALETTE_WIDTH, PALETTE_HEIGHT);
+        palette.setResizable(true);
+        palette.setIconifiable(true);
+        desktop.add(palette, PALETTE_LAYER);
+
+        // *************************************
+        // * Create create frame maker buttons *
+        // *************************************
+        JButton b1 = new JButton(smIcon1);
+        JButton b2 = new JButton(smIcon2);
+        JButton b3 = new JButton(smIcon3);
+        JButton b4 = new JButton(smIcon4);
+
+        // add frame maker actions
+        b1.addActionListener(new ShowFrameAction(this, icon1));
+        b2.addActionListener(new ShowFrameAction(this, icon2));
+        b3.addActionListener(new ShowFrameAction(this, icon3));
+        b4.addActionListener(new ShowFrameAction(this, icon4));
+
+        // add frame maker buttons to panel
+        JPanel p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
+
+        JPanel buttons1 = new JPanel();
+        buttons1.setLayout(new BoxLayout(buttons1, BoxLayout.X_AXIS));
+
+        JPanel buttons2 = new JPanel();
+        buttons2.setLayout(new BoxLayout(buttons2, BoxLayout.X_AXIS));
+
+        buttons1.add(b1);
+        buttons1.add(Box.createRigidArea(HGAP15));
+        buttons1.add(b2);
+
+        buttons2.add(b3);
+        buttons2.add(Box.createRigidArea(HGAP15));
+        buttons2.add(b4);
+
+        p.add(Box.createRigidArea(VGAP10));
+        p.add(buttons1);
+        p.add(Box.createRigidArea(VGAP15));
+        p.add(buttons2);
+        p.add(Box.createRigidArea(VGAP10));
+
+        palette.getContentPane().add(p, BorderLayout.NORTH);
+
+        // ************************************
+        // * Create frame property checkboxes *
+        // ************************************
+        p = new JPanel() {
+            Insets insets = new Insets(10,15,10,5);
+            public Insets getInsets() {
+                return insets;
+            }
+        };
+        p.setLayout(new GridLayout(1,2));
+
+
+        Box box = new Box(BoxLayout.Y_AXIS);
+        windowResizable   = new JCheckBox(getString("InternalFrameDemo.resizable_label"), true);
+        windowIconifiable = new JCheckBox(getString("InternalFrameDemo.iconifiable_label"), true);
+
+        box.add(Box.createGlue());
+        box.add(windowResizable);
+        box.add(windowIconifiable);
+        box.add(Box.createGlue());
+        p.add(box);
+
+        box = new Box(BoxLayout.Y_AXIS);
+        windowClosable    = new JCheckBox(getString("InternalFrameDemo.closable_label"), true);
+        windowMaximizable = new JCheckBox(getString("InternalFrameDemo.maximizable_label"), true);
+
+        box.add(Box.createGlue());
+        box.add(windowClosable);
+        box.add(windowMaximizable);
+        box.add(Box.createGlue());
+        p.add(box);
+
+        palette.getContentPane().add(p, BorderLayout.CENTER);
+
+
+        // ************************************
+        // *   Create Frame title textfield   *
+        // ************************************
+        p = new JPanel() {
+            Insets insets = new Insets(0,0,10,0);
+            public Insets getInsets() {
+                return insets;
+            }
+        };
+
+        windowTitleField = new JTextField(getString("InternalFrameDemo.frame_label"));
+        windowTitleLabel = new JLabel(getString("InternalFrameDemo.title_text_field_label"));
+
+        p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
+        p.add(Box.createRigidArea(HGAP5));
+        p.add(windowTitleLabel, BorderLayout.WEST);
+        p.add(Box.createRigidArea(HGAP5));
+        p.add(windowTitleField, BorderLayout.CENTER);
+        p.add(Box.createRigidArea(HGAP5));
+
+        palette.getContentPane().add(p, BorderLayout.SOUTH);
+
+        palette.show();
+
+        return palette;
+    }
+
+
+    class ShowFrameAction extends AbstractAction {
+        InternalFrameDemo demo;
+        Icon icon;
+
+
+        public ShowFrameAction(InternalFrameDemo demo, Icon icon) {
+            this.demo = demo;
+            this.icon = icon;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            demo.createInternalFrame(icon,
+                                     getDemoFrameLayer(),
+                                     getFrameWidth(),
+                                     getFrameHeight()
+            );
+        }
+    }
+
+    public int getFrameWidth() {
+        return FRAME_WIDTH;
+    }
+
+    public int getFrameHeight() {
+        return FRAME_HEIGHT;
+    }
+
+    public Integer getDemoFrameLayer() {
+        return DEMO_FRAME_LAYER;
+    }
+
+    class ImageScroller extends JScrollPane {
+
+        public ImageScroller(InternalFrameDemo demo, Icon icon, int layer, int count) {
+            super();
+            JPanel p = new JPanel();
+            p.setBackground(Color.white);
+            p.setLayout(new BorderLayout() );
+
+            p.add(new JLabel(icon), BorderLayout.CENTER);
+
+            getViewport().add(p);
+            getHorizontalScrollBar().setUnitIncrement(10);
+            getVerticalScrollBar().setUnitIncrement(10);
+        }
+
+        public Dimension getMinimumSize() {
+            return new Dimension(25, 25);
+        }
+
+    }
+
+    void updateDragEnabled(boolean dragEnabled) {
+        windowTitleField.setDragEnabled(dragEnabled);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/LayoutControlPanel.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,334 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.swing.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+
+/*
+ * The LayoutControlPanel contains controls for setting an
+ * AbstractButton's horizontal and vertical text position and
+ * horizontal and vertical alignment.
+ */
+
+public class LayoutControlPanel extends JPanel implements SwingConstants {
+
+    private boolean  absolutePositions;
+    private DirectionPanel textPosition = null;
+    private DirectionPanel labelAlignment = null;
+    private ButtonDemo demo = null;
+
+    // private ComponentOrientChanger componentOrientChanger = null;
+
+    LayoutControlPanel(ButtonDemo demo) {
+        this.demo = demo;
+
+        // this.componentOrientationChanger = componentOrientationChanger;
+
+        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+        setAlignmentX(LEFT_ALIGNMENT);
+        setAlignmentY(TOP_ALIGNMENT);
+
+        JLabel l;
+
+        // If SwingSet has a ComponentOrientationChanger, then include control
+        // for choosing between absolute and relative positioning.  This will
+        // only happen when we're running on JDK 1.2 or above.
+        //
+        // if(componentOrientationChanger != null ) {
+        //     l = new JLabel("Positioning:");
+        //     add(l);
+        //
+        //    ButtonGroup group = new ButtonGroup();
+        //    PositioningListener positioningListener = new PositioningListener();
+        //    JRadioButton absolutePos = new JRadioButton("Absolute");
+        //    absolutePos.setMnemonic('a');
+        //    absolutePos.setToolTipText("Text/Content positioning is independant of line direction");
+        //    group.add(absolutePos);
+        //    absolutePos.addItemListener(positioningListener);
+        //    add(absolutePos);
+        //
+        //    JRadioButton relativePos = new JRadioButton("Relative");
+        //    relativePos.setMnemonic('r');
+        //    relativePos.setToolTipText("Text/Content positioning depends on line direction.");
+        //    group.add(relativePos);
+        //    relativePos.addItemListener(positioningListener);
+        //    add(relativePos);
+        //
+        //    add(Box.createRigidArea(demo.VGAP20));
+        //
+        //    absolutePositions = false;
+        //    relativePos.setSelected(true);
+        //
+        //    componentOrientationChanger.addActionListener( new OrientationChangeListener() );
+        //} else {
+            absolutePositions = true;
+        //}
+
+        textPosition = new DirectionPanel(true, "E", new TextPositionListener());
+        labelAlignment = new DirectionPanel(true, "C", new LabelAlignmentListener());
+
+        // Make sure the controls' text position and label alignment match
+        // the initial value of the associated direction panel.
+        for(int i = 0; i < demo.getCurrentControls().size(); i++) {
+            Component c = (Component) demo.getCurrentControls().elementAt(i);
+            setPosition(c, RIGHT, CENTER);
+            setAlignment(c,CENTER,CENTER);
+        }
+
+        l = new JLabel(demo.getString("LayoutControlPanel.textposition_label"));
+        add(l);
+        add(textPosition);
+
+        add(Box.createRigidArea(demo.VGAP20));
+
+        l = new JLabel(demo.getString("LayoutControlPanel.contentalignment_label"));
+        add(l);
+        add(labelAlignment);
+
+        add(Box.createGlue());
+    }
+
+
+    class OrientationChangeListener implements ActionListener {
+        public void actionPerformed( ActionEvent e ) {
+            if( !e.getActionCommand().equals("OrientationChanged") ){
+                return;
+            }
+            if( absolutePositions ){
+                return;
+            }
+
+            String currentTextPosition = textPosition.getSelection();
+            if( currentTextPosition.equals("NW") )
+                textPosition.setSelection("NE");
+            else if( currentTextPosition.equals("NE") )
+                textPosition.setSelection("NW");
+            else if( currentTextPosition.equals("E") )
+                textPosition.setSelection("W");
+            else if( currentTextPosition.equals("W") )
+                textPosition.setSelection("E");
+            else if( currentTextPosition.equals("SE") )
+                textPosition.setSelection("SW");
+            else if( currentTextPosition.equals("SW") )
+                textPosition.setSelection("SE");
+
+            String currentLabelAlignment = labelAlignment.getSelection();
+            if( currentLabelAlignment.equals("NW") )
+                labelAlignment.setSelection("NE");
+            else if( currentLabelAlignment.equals("NE") )
+                labelAlignment.setSelection("NW");
+            else if( currentLabelAlignment.equals("E") )
+                labelAlignment.setSelection("W");
+            else if( currentLabelAlignment.equals("W") )
+                labelAlignment.setSelection("E");
+            else if( currentLabelAlignment.equals("SE") )
+                labelAlignment.setSelection("SW");
+            else if( currentLabelAlignment.equals("SW") )
+                labelAlignment.setSelection("SE");
+        }
+    }
+
+    class PositioningListener implements ItemListener {
+
+        public void itemStateChanged(ItemEvent e) {
+            JRadioButton rb = (JRadioButton) e.getSource();
+            if(rb.getText().equals("Absolute") && rb.isSelected()) {
+                absolutePositions = true;
+            } else if(rb.getText().equals("Relative") && rb.isSelected()) {
+                absolutePositions = false;
+            }
+
+            for(int i = 0; i < demo.getCurrentControls().size(); i++) {
+                Component c = (Component) demo.getCurrentControls().elementAt(i);
+                int hPos, vPos, hAlign, vAlign;
+                if( c instanceof AbstractButton ) {
+                   hPos = ((AbstractButton)c).getHorizontalTextPosition();
+                   vPos = ((AbstractButton)c).getVerticalTextPosition();
+                   hAlign = ((AbstractButton)c).getHorizontalAlignment();
+                   vAlign = ((AbstractButton)c).getVerticalAlignment();
+                } else if( c instanceof JLabel ) {
+                   hPos = ((JLabel)c).getHorizontalTextPosition();
+                   vPos = ((JLabel)c).getVerticalTextPosition();
+                   hAlign = ((JLabel)c).getHorizontalAlignment();
+                   vAlign = ((JLabel)c).getVerticalAlignment();
+                } else {
+                    continue;
+                }
+                setPosition(c, hPos, vPos);
+                setAlignment(c, hAlign, vAlign);
+            }
+
+            demo.invalidate();
+            demo.validate();
+            demo.repaint();
+        }
+    };
+
+
+    // Text Position Listener
+    class TextPositionListener implements ActionListener {
+        public void actionPerformed(ActionEvent e) {
+            JRadioButton rb = (JRadioButton) e.getSource();
+            if(!rb.isSelected()) {
+                return;
+            }
+            String cmd = rb.getActionCommand();
+            int hPos, vPos;
+            if(cmd.equals("NW")) {
+                    hPos = LEFT; vPos = TOP;
+            } else if(cmd.equals("N")) {
+                    hPos = CENTER; vPos = TOP;
+            } else if(cmd.equals("NE")) {
+                    hPos = RIGHT; vPos = TOP;
+            } else if(cmd.equals("W")) {
+                    hPos = LEFT; vPos = CENTER;
+            } else if(cmd.equals("C")) {
+                    hPos = CENTER; vPos = CENTER;
+            } else if(cmd.equals("E")) {
+                    hPos = RIGHT; vPos = CENTER;
+            } else if(cmd.equals("SW")) {
+                    hPos = LEFT; vPos = BOTTOM;
+            } else if(cmd.equals("S")) {
+                    hPos = CENTER; vPos = BOTTOM;
+            } else /*if(cmd.equals("SE"))*/ {
+                    hPos = RIGHT; vPos = BOTTOM;
+            }
+            for(int i = 0; i < demo.getCurrentControls().size(); i++) {
+                Component c = (Component) demo.getCurrentControls().elementAt(i);
+                setPosition(c, hPos, vPos);
+            }
+            demo.invalidate();
+            demo.validate();
+            demo.repaint();
+        }
+    };
+
+
+    // Label Alignment Listener
+    class LabelAlignmentListener implements  ActionListener {
+        public void actionPerformed(ActionEvent e) {
+            JRadioButton rb = (JRadioButton) e.getSource();
+            if(!rb.isSelected()) {
+                return;
+            }
+            String cmd = rb.getActionCommand();
+            int hPos, vPos;
+            if(cmd.equals("NW")) {
+                    hPos = LEFT; vPos = TOP;
+            } else if(cmd.equals("N")) {
+                    hPos = CENTER; vPos = TOP;
+            } else if(cmd.equals("NE")) {
+                    hPos = RIGHT; vPos = TOP;
+            } else if(cmd.equals("W")) {
+                    hPos = LEFT; vPos = CENTER;
+            } else if(cmd.equals("C")) {
+                    hPos = CENTER; vPos = CENTER;
+            } else if(cmd.equals("E")) {
+                    hPos = RIGHT; vPos = CENTER;
+            } else if(cmd.equals("SW")) {
+                    hPos = LEFT; vPos = BOTTOM;
+            } else if(cmd.equals("S")) {
+                    hPos = CENTER; vPos = BOTTOM;
+            } else /*if(cmd.equals("SE"))*/ {
+                    hPos = RIGHT; vPos = BOTTOM;
+            }
+            for(int i = 0; i < demo.getCurrentControls().size(); i++) {
+                Component c = (Component) demo.getCurrentControls().elementAt(i);
+                setAlignment(c,hPos,vPos);
+                c.invalidate();
+            }
+            demo.invalidate();
+            demo.validate();
+            demo.repaint();
+        }
+    };
+
+    // Position
+    void setPosition(Component c, int hPos, int vPos) {
+        boolean ltr = true;
+        ltr = c.getComponentOrientation().isLeftToRight();
+        if( absolutePositions ) {
+            if( hPos == LEADING ) {
+                hPos = ltr ? LEFT : RIGHT;
+            } else if( hPos == TRAILING ) {
+                hPos = ltr ? RIGHT : LEFT;
+            }
+        } else {
+            if( hPos == LEFT ) {
+                hPos = ltr ? LEADING : TRAILING;
+            } else if( hPos == RIGHT ) {
+                hPos = ltr ? TRAILING : LEADING;
+            }
+        }
+        if(c instanceof AbstractButton) {
+            AbstractButton x = (AbstractButton) c;
+            x.setHorizontalTextPosition(hPos);
+            x.setVerticalTextPosition(vPos);
+        } else if(c instanceof JLabel) {
+            JLabel x = (JLabel) c;
+            x.setHorizontalTextPosition(hPos);
+            x.setVerticalTextPosition(vPos);
+        }
+    }
+
+    void setAlignment(Component c, int hPos, int vPos) {
+        boolean ltr = true;
+        ltr = c.getComponentOrientation().isLeftToRight();
+        if( absolutePositions ) {
+            if( hPos == LEADING ) {
+                hPos = ltr ? LEFT : RIGHT;
+            } else if( hPos == TRAILING ) {
+                hPos = ltr ? RIGHT : LEFT;
+            }
+        } else {
+            if( hPos == LEFT ) {
+                hPos = ltr ? LEADING : TRAILING;
+            } else if( hPos == RIGHT ) {
+                hPos = ltr ? TRAILING : LEADING;
+            }
+        }
+        if(c instanceof AbstractButton) {
+            AbstractButton x = (AbstractButton) c;
+            x.setHorizontalAlignment(hPos);
+            x.setVerticalAlignment(vPos);
+        } else if(c instanceof JLabel) {
+            JLabel x = (JLabel) c;
+            x.setHorizontalAlignment(hPos);
+            x.setVerticalAlignment(vPos);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ListDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,379 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * List Demo. This demo shows that it is not
+ * always necessary to have an array of objects
+ * as big as the size of the list stored.
+ *
+ * Indeed, in this example, there is no array
+ * kept for the list data, rather it is generated
+ * on the fly as only those elements are needed.
+ *
+ * @author Jeff Dinkins
+ */
+public class ListDemo extends DemoModule {
+    JList list;
+
+    JPanel prefixList;
+    JPanel suffixList;
+
+    Action prefixAction;
+    Action suffixAction;
+
+    GeneratedListModel listModel;
+
+    Vector checkboxes = new Vector();
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        ListDemo demo = new ListDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * ListDemo Constructor
+     */
+    public ListDemo(SwingSet2 swingset) {
+        super(swingset, "ListDemo", "toolbar/JList.gif");
+
+        loadImages();
+
+        JLabel description = new JLabel(getString("ListDemo.description"));
+        getDemoPanel().add(description, BorderLayout.NORTH);
+
+        JPanel centerPanel = new JPanel();
+        centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.X_AXIS));
+        centerPanel.add(Box.createRigidArea(HGAP10));
+        getDemoPanel().add(centerPanel, BorderLayout.CENTER);
+
+        JPanel listPanel = new JPanel();
+        listPanel.setLayout(new BoxLayout(listPanel, BoxLayout.Y_AXIS));
+        listPanel.add(Box.createRigidArea(VGAP10));
+
+        centerPanel.add(listPanel);
+        centerPanel.add(Box.createRigidArea(HGAP30));
+
+        // Create the list
+        list = new JList();
+        list.setCellRenderer(new CompanyLogoListCellRenderer());
+        listModel = new GeneratedListModel(this);
+        list.setModel(listModel);
+
+        // Set the preferred row count. This affects the preferredSize
+        // of the JList when it's in a scrollpane.
+        list.setVisibleRowCount(22);
+
+        // Add list to a scrollpane
+        JScrollPane scrollPane = new JScrollPane(list);
+        listPanel.add(scrollPane);
+        listPanel.add(Box.createRigidArea(VGAP10));
+
+        // Add the control panel (holds the prefix/suffix list and prefix/suffix checkboxes)
+        centerPanel.add(createControlPanel());
+
+        // create prefixes and suffixes
+        addPrefix("Tera", true);
+        addPrefix("Micro", false);
+        addPrefix("Southern", false);
+        addPrefix("Net", true);
+        addPrefix("YoYo", true);
+        addPrefix("Northern", false);
+        addPrefix("Tele", false);
+        addPrefix("Eastern", false);
+        addPrefix("Neo", false);
+        addPrefix("Digi", false);
+        addPrefix("National", false);
+        addPrefix("Compu", true);
+        addPrefix("Meta", true);
+        addPrefix("Info", false);
+        addPrefix("Western", false);
+        addPrefix("Data", false);
+        addPrefix("Atlantic", false);
+        addPrefix("Advanced", false);
+        addPrefix("Euro", false);
+        addPrefix("Pacific", false);
+        addPrefix("Mobile", false);
+        addPrefix("In", false);
+        addPrefix("Computa", false);
+        addPrefix("Digital", false);
+        addPrefix("Analog", false);
+
+        addSuffix("Tech", true);
+        addSuffix("Soft", true);
+        addSuffix("Telecom", true);
+        addSuffix("Solutions", false);
+        addSuffix("Works", true);
+        addSuffix("Dyne", false);
+        addSuffix("Services", false);
+        addSuffix("Vers", false);
+        addSuffix("Devices", false);
+        addSuffix("Software", false);
+        addSuffix("Serv", false);
+        addSuffix("Systems", true);
+        addSuffix("Dynamics", true);
+        addSuffix("Net", false);
+        addSuffix("Sys", false);
+        addSuffix("Computing", false);
+        addSuffix("Scape", false);
+        addSuffix("Com", false);
+        addSuffix("Ware", false);
+        addSuffix("Widgets", false);
+        addSuffix("Media", false);
+        addSuffix("Computer", false);
+        addSuffix("Hardware", false);
+        addSuffix("Gizmos", false);
+        addSuffix("Concepts", false);
+    }
+
+    void updateDragEnabled(boolean dragEnabled) {
+        list.setDragEnabled(dragEnabled);
+    }
+
+    public JPanel createControlPanel() {
+        JPanel controlPanel = new JPanel() {
+            Insets insets = new Insets(0, 4, 10, 10);
+            public Insets getInsets() {
+                return insets;
+            }
+        };
+        controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.X_AXIS));
+
+        JPanel prefixPanel = new JPanel();
+        prefixPanel.setLayout(new BoxLayout(prefixPanel, BoxLayout.Y_AXIS));
+        prefixPanel.add(new JLabel(getString("ListDemo.prefixes")));
+
+        JPanel suffixPanel = new JPanel();
+        suffixPanel.setLayout(new BoxLayout(suffixPanel, BoxLayout.Y_AXIS));
+        suffixPanel.add(new JLabel(getString("ListDemo.suffixes")));
+
+        prefixList = new JPanel() {
+            Insets insets = new Insets(0, 4, 0, 0);
+            public Insets getInsets() {
+                return insets;
+            }
+        };
+        prefixList.setLayout(new BoxLayout(prefixList, BoxLayout.Y_AXIS));
+        JScrollPane scrollPane = new JScrollPane(prefixList);
+        scrollPane.getVerticalScrollBar().setUnitIncrement(10);
+        prefixPanel.add(scrollPane);
+        prefixPanel.add(Box.createRigidArea(HGAP10));
+
+        suffixList = new JPanel() {
+            Insets insets = new Insets(0, 4, 0, 0);
+            public Insets getInsets() {
+                return insets;
+            }
+        };
+        suffixList.setLayout(new BoxLayout(suffixList, BoxLayout.Y_AXIS));
+        scrollPane = new JScrollPane(suffixList);
+        scrollPane.getVerticalScrollBar().setUnitIncrement(10);
+        suffixPanel.add(scrollPane);
+        suffixPanel.add(Box.createRigidArea(HGAP10));
+
+        controlPanel.add(prefixPanel);
+        controlPanel.add(Box.createRigidArea(HGAP15));
+        controlPanel.add(suffixPanel);
+        return controlPanel;
+    }
+
+    private FocusListener listFocusListener = new FocusAdapter() {
+        public void focusGained(FocusEvent e) {
+            JComponent c = (JComponent)e.getComponent();
+            c.scrollRectToVisible(new Rectangle(0, 0, c.getWidth(), c.getHeight()));
+        }
+    };
+
+    public void addPrefix(String prefix, boolean selected) {
+        if(prefixAction == null) {
+            prefixAction = new UpdatePrefixListAction(listModel);
+        }
+        final JCheckBox cb = (JCheckBox) prefixList.add(new JCheckBox(prefix));
+        checkboxes.addElement(cb);
+        cb.setSelected(selected);
+        cb.addActionListener(prefixAction);
+        if(selected) {
+            listModel.addPrefix(prefix);
+        }
+        cb.addFocusListener(listFocusListener);
+    }
+
+    public void addSuffix(String suffix, boolean selected) {
+        if(suffixAction == null) {
+            suffixAction = new UpdateSuffixListAction(listModel);
+        }
+        final JCheckBox cb = (JCheckBox) suffixList.add(new JCheckBox(suffix));
+        checkboxes.addElement(cb);
+        cb.setSelected(selected);
+        cb.addActionListener(suffixAction);
+        if(selected) {
+            listModel.addSuffix(suffix);
+        }
+        cb.addFocusListener(listFocusListener);
+    }
+
+    class UpdatePrefixListAction extends AbstractAction {
+        GeneratedListModel listModel;
+        protected UpdatePrefixListAction(GeneratedListModel listModel) {
+            this.listModel = listModel;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            JCheckBox cb = (JCheckBox) e.getSource();
+            if(cb.isSelected()) {
+                listModel.addPrefix(cb.getText());
+            } else {
+                listModel.removePrefix(cb.getText());
+            }
+        }
+    }
+
+    class UpdateSuffixListAction extends AbstractAction {
+        GeneratedListModel listModel;
+        protected UpdateSuffixListAction(GeneratedListModel listModel) {
+            this.listModel = listModel;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            JCheckBox cb = (JCheckBox) e.getSource();
+            if(cb.isSelected()) {
+                listModel.addSuffix(cb.getText());
+            } else {
+                listModel.removeSuffix(cb.getText());
+            }
+        }
+    }
+
+
+    class GeneratedListModel extends AbstractListModel {
+        ListDemo demo;
+        Permuter permuter;
+
+        public Vector prefix = new Vector();
+        public Vector suffix = new Vector();
+
+        public GeneratedListModel (ListDemo demo) {
+            this.demo = demo;
+        }
+
+        private void update() {
+            permuter = new Permuter(getSize());
+            fireContentsChanged(this, 0, getSize());
+        }
+
+        public void addPrefix(String s) {
+            if(!prefix.contains(s)) {
+                prefix.addElement(s);
+                update();
+            }
+        }
+
+        public void removePrefix(String s) {
+            prefix.removeElement(s);
+            update();
+        }
+
+        public void addSuffix(String s) {
+            if(!suffix.contains(s)) {
+                suffix.addElement(s);
+                update();
+            }
+        }
+
+        public void removeSuffix(String s) {
+            suffix.removeElement(s);
+            update();
+        }
+
+        public int getSize() {
+            return prefix.size() * suffix.size();
+        }
+
+        public Object getElementAt(int index) {
+            if(permuter == null) {
+                update();
+            }
+            // morph the index to another int -- this has the benefit of
+            // causing the list to look random.
+            int j = permuter.map(index);
+            int ps = prefix.size();
+            int ss = suffix.size();
+            return (String) prefix.elementAt(j%ps) + (String) suffix.elementAt((j/ps)%ss);
+        }
+    }
+
+    ImageIcon images[] = new ImageIcon[7];
+    void loadImages() {
+            images[0] = createImageIcon("list/red.gif",  getString("ListDemo.red"));
+            images[1] = createImageIcon("list/blue.gif",  getString("ListDemo.blue"));
+            images[2] = createImageIcon("list/yellow.gif",  getString("ListDemo.yellow"));
+            images[3] = createImageIcon("list/green.gif",  getString("ListDemo.green"));
+            images[4] = createImageIcon("list/gray.gif",  getString("ListDemo.gray"));
+            images[5] = createImageIcon("list/cyan.gif",  getString("ListDemo.cyan"));
+            images[6] = createImageIcon("list/magenta.gif",  getString("ListDemo.magenta"));
+    }
+
+    class CompanyLogoListCellRenderer extends DefaultListCellRenderer {
+       public Component getListCellRendererComponent(
+            JList list,
+            Object value,
+            int index,
+            boolean isSelected,
+            boolean cellHasFocus)
+        {
+            Component retValue = super.getListCellRendererComponent(
+                list, value, index, isSelected, cellHasFocus
+            );
+            setIcon(images[index%7]);
+            return retValue;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/OptionPaneDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,231 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JOptionPaneDemo
+ *
+ * @author Jeff Dinkins
+ */
+public class OptionPaneDemo extends DemoModule {
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        OptionPaneDemo demo = new OptionPaneDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * OptionPaneDemo Constructor
+     */
+    public OptionPaneDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "OptionPaneDemo", "toolbar/JOptionPane.gif");
+
+        JPanel demo = getDemoPanel();
+
+        demo.setLayout(new BoxLayout(demo, BoxLayout.X_AXIS));
+
+        JPanel bp = new JPanel() {
+            public Dimension getMaximumSize() {
+                return new Dimension(getPreferredSize().width, super.getMaximumSize().height);
+            }
+        };
+        bp.setLayout(new BoxLayout(bp, BoxLayout.Y_AXIS));
+
+        bp.add(Box.createRigidArea(VGAP30));
+        bp.add(Box.createRigidArea(VGAP30));
+
+        bp.add(createInputDialogButton());      bp.add(Box.createRigidArea(VGAP15));
+        bp.add(createWarningDialogButton());    bp.add(Box.createRigidArea(VGAP15));
+        bp.add(createMessageDialogButton());    bp.add(Box.createRigidArea(VGAP15));
+        bp.add(createComponentDialogButton());  bp.add(Box.createRigidArea(VGAP15));
+        bp.add(createConfirmDialogButton());    bp.add(Box.createVerticalGlue());
+
+        demo.add(Box.createHorizontalGlue());
+        demo.add(bp);
+        demo.add(Box.createHorizontalGlue());
+    }
+
+    public JButton createWarningDialogButton() {
+        Action a = new AbstractAction(getString("OptionPaneDemo.warningbutton")) {
+            public void actionPerformed(ActionEvent e) {
+                JOptionPane.showMessageDialog(
+                    getDemoPanel(),
+                    getString("OptionPaneDemo.warningtext"),
+                    getString("OptionPaneDemo.warningtitle"),
+                    JOptionPane.WARNING_MESSAGE
+                );
+            }
+        };
+        return createButton(a);
+    }
+
+    public JButton createMessageDialogButton() {
+        Action a = new AbstractAction(getString("OptionPaneDemo.messagebutton")) {
+            URL img = getClass().getResource("/resources/images/optionpane/bottle.gif");
+            String imagesrc = "<img src=\"" + img + "\" width=\"284\" height=\"100\">";
+            String message = getString("OptionPaneDemo.messagetext");
+            public void actionPerformed(ActionEvent e) {
+                JOptionPane.showMessageDialog(
+                    getDemoPanel(),
+                    "<html>" + imagesrc + "<br><center>" + message + "</center><br></html>"
+                );
+            }
+        };
+        return createButton(a);
+    }
+
+    public JButton createConfirmDialogButton() {
+        Action a = new AbstractAction(getString("OptionPaneDemo.confirmbutton")) {
+            public void actionPerformed(ActionEvent e) {
+                int result = JOptionPane.showConfirmDialog(getDemoPanel(), getString("OptionPaneDemo.confirmquestion"));
+                if(result == JOptionPane.YES_OPTION) {
+                    JOptionPane.showMessageDialog(getDemoPanel(), getString("OptionPaneDemo.confirmyes"));
+                } else if(result == JOptionPane.NO_OPTION) {
+                    JOptionPane.showMessageDialog(getDemoPanel(), getString("OptionPaneDemo.confirmno"));
+                }
+            }
+        };
+        return createButton(a);
+    }
+
+    public JButton createInputDialogButton() {
+        Action a = new AbstractAction(getString("OptionPaneDemo.inputbutton")) {
+            public void actionPerformed(ActionEvent e) {
+                String result = JOptionPane.showInputDialog(getDemoPanel(), getString("OptionPaneDemo.inputquestion"));
+                if ((result != null) && (result.length() > 0)) {
+                    JOptionPane.showMessageDialog(getDemoPanel(),
+                                    result + ": " +
+                                    getString("OptionPaneDemo.inputresponse"));
+                }
+            }
+        };
+        return createButton(a);
+    }
+
+    public JButton createComponentDialogButton() {
+        Action a = new AbstractAction(getString("OptionPaneDemo.componentbutton")) {
+            public void actionPerformed(ActionEvent e) {
+                // In a ComponentDialog, you can show as many message components and
+                // as many options as you want:
+
+                // Messages
+                Object[]      message = new Object[4];
+                message[0] = getString("OptionPaneDemo.componentmessage");
+                message[1] = new JTextField(getString("OptionPaneDemo.componenttextfield"));
+
+                JComboBox cb = new JComboBox();
+                cb.addItem(getString("OptionPaneDemo.component_cb1"));
+                cb.addItem(getString("OptionPaneDemo.component_cb2"));
+                cb.addItem(getString("OptionPaneDemo.component_cb3"));
+                message[2] = cb;
+
+                message[3] = getString("OptionPaneDemo.componentmessage2");
+
+                // Options
+                String[] options = {
+                    getString("OptionPaneDemo.component_op1"),
+                    getString("OptionPaneDemo.component_op2"),
+                    getString("OptionPaneDemo.component_op3"),
+                    getString("OptionPaneDemo.component_op4"),
+                    getString("OptionPaneDemo.component_op5")
+                };
+                int result = JOptionPane.showOptionDialog(
+                    getDemoPanel(),                             // the parent that the dialog blocks
+                    message,                                    // the dialog message array
+                    getString("OptionPaneDemo.componenttitle"), // the title of the dialog window
+                    JOptionPane.DEFAULT_OPTION,                 // option type
+                    JOptionPane.INFORMATION_MESSAGE,            // message type
+                    null,                                       // optional icon, use null to use the default icon
+                    options,                                    // options string array, will be made into buttons
+                    options[3]                                  // option that should be made into a default button
+                );
+                switch(result) {
+                   case 0: // yes
+                     JOptionPane.showMessageDialog(getDemoPanel(), getString("OptionPaneDemo.component_r1"));
+                     break;
+                   case 1: // no
+                     JOptionPane.showMessageDialog(getDemoPanel(), getString("OptionPaneDemo.component_r2"));
+                     break;
+                   case 2: // maybe
+                     JOptionPane.showMessageDialog(getDemoPanel(), getString("OptionPaneDemo.component_r3"));
+                     break;
+                   case 3: // probably
+                     JOptionPane.showMessageDialog(getDemoPanel(), getString("OptionPaneDemo.component_r4"));
+                     break;
+                   default:
+                     break;
+                }
+
+            }
+        };
+        return createButton(a);
+    }
+
+    public JButton createButton(Action a) {
+        JButton b = new JButton() {
+            public Dimension getMaximumSize() {
+                int width = Short.MAX_VALUE;
+                int height = super.getMaximumSize().height;
+                return new Dimension(width, height);
+            }
+        };
+        // setting the following client property informs the button to show
+        // the action text as it's name. The default is to not show the
+        // action text.
+        b.putClientProperty("displayActionText", Boolean.TRUE);
+        b.setAction(a);
+        // b.setAlignmentX(JButton.CENTER_ALIGNMENT);
+        return b;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/Permuter.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,110 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+
+import java.util.Random;
+
+/**
+ * An object that implements a cheesy pseudorandom permutation of the integers
+ * from zero to some user-specified value. (The permutation is a linear
+ * function.)
+ *
+ * @author Josh Bloch
+ */
+class Permuter {
+    /**
+     * The size of the permutation.
+     */
+    private int modulus;
+
+    /**
+     * Nonnegative integer less than n that is relatively prime to m.
+     */
+    private int multiplier;
+
+    /**
+     * Pseudorandom nonnegative integer less than n.
+     */
+    private int addend = 22;
+
+    public Permuter(int n) {
+        if (n<0) {
+            throw new IllegalArgumentException();
+        }
+        modulus = n;
+        if (n==1) {
+            return;
+        }
+
+        // Initialize the multiplier and offset
+        multiplier = (int) Math.sqrt(n);
+        while (gcd(multiplier, n) != 1) {
+            if (++multiplier == n) {
+                multiplier = 1;
+            }
+        }
+    }
+
+    /**
+     * Returns the integer to which this permuter maps the specified integer.
+     * The specified integer must be between 0 and n-1, and the returned
+     * integer will be as well.
+     */
+    public int map(int i) {
+        return (multiplier * i + addend) % modulus;
+    }
+
+    /**
+     * Calculate GCD of a and b, which are assumed to be non-negative.
+     */
+    private static int gcd(int a, int b) {
+        while(b != 0) {
+            int tmp = a % b;
+            a = b;
+            b = tmp;
+        }
+        return a;
+    }
+
+    /**
+     * Simple test.  Takes modulus on command line and prints out permutation.
+     */
+    public static void main(String[] args) {
+        int modulus = Integer.parseInt(args[0]);
+        Permuter p = new Permuter(modulus);
+        for (int i=0; i<modulus; i++) {
+            System.out.print(p.map(i)+" ");
+        }
+        System.out.println();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ProgressBarDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,190 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JProgressBar Demo
+ *
+ * @author Jeff Dinkins
+ # @author Peter Korn (accessibility support)
+ */
+public class ProgressBarDemo extends DemoModule {
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        ProgressBarDemo demo = new ProgressBarDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * ProgressBarDemo Constructor
+     */
+    public ProgressBarDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "ProgressBarDemo", "toolbar/JProgressBar.gif");
+
+        createProgressPanel();
+    }
+
+    javax.swing.Timer timer = new javax.swing.Timer(18, createTextLoadAction());
+    Action loadAction;
+    Action stopAction;
+    JProgressBar progressBar;
+    JTextArea progressTextArea;
+
+    void updateDragEnabled(boolean dragEnabled) {
+        progressTextArea.setDragEnabled(dragEnabled);
+    }
+
+    public void createProgressPanel() {
+        getDemoPanel().setLayout(new BorderLayout());
+
+        JPanel textWrapper = new JPanel(new BorderLayout());
+        textWrapper.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
+        textWrapper.setAlignmentX(LEFT_ALIGNMENT);
+        progressTextArea = new MyTextArea();
+
+        progressTextArea.getAccessibleContext().setAccessibleName(getString("ProgressBarDemo.accessible_text_area_name"));
+        progressTextArea.getAccessibleContext().setAccessibleName(getString("ProgressBarDemo.accessible_text_area_description"));
+        textWrapper.add(new JScrollPane(progressTextArea), BorderLayout.CENTER);
+
+        getDemoPanel().add(textWrapper, BorderLayout.CENTER);
+
+        JPanel progressPanel = new JPanel();
+        getDemoPanel().add(progressPanel, BorderLayout.SOUTH);
+
+        progressBar = new JProgressBar(JProgressBar.HORIZONTAL, 0, text.length()) {
+            public Dimension getPreferredSize() {
+                return new Dimension(300, super.getPreferredSize().height);
+            }
+        };
+        progressBar.getAccessibleContext().setAccessibleName(getString("ProgressBarDemo.accessible_text_loading_progress"));
+
+        progressPanel.add(progressBar);
+        progressPanel.add(createLoadButton());
+        progressPanel.add(createStopButton());
+    }
+
+    public JButton createLoadButton() {
+        loadAction = new AbstractAction(getString("ProgressBarDemo.start_button")) {
+            public void actionPerformed(ActionEvent e) {
+                loadAction.setEnabled(false);
+                stopAction.setEnabled(true);
+                if (progressBar.getValue() == progressBar.getMaximum()) {
+                    progressBar.setValue(0);
+                    textLocation = 0;
+                    progressTextArea.setText("");
+                }
+                timer.start();
+            }
+        };
+        return createButton(loadAction);
+    }
+
+    public JButton createStopButton() {
+        stopAction = new AbstractAction(getString("ProgressBarDemo.stop_button")) {
+            public void actionPerformed(ActionEvent e) {
+                timer.stop();
+                loadAction.setEnabled(true);
+                stopAction.setEnabled(false);
+            }
+        };
+        return createButton(stopAction);
+    }
+
+    public JButton createButton(Action a) {
+        JButton b = new JButton();
+        // setting the following client property informs the button to show
+        // the action text as it's name. The default is to not show the
+        // action text.
+        b.putClientProperty("displayActionText", Boolean.TRUE);
+        b.setAction(a);
+        return b;
+    }
+
+
+    int textLocation = 0;
+
+    String text = getString("ProgressBarDemo.text");
+
+    public Action createTextLoadAction() {
+        return new AbstractAction("text load action") {
+            public void actionPerformed (ActionEvent e) {
+                if(progressBar.getValue() < progressBar.getMaximum()) {
+                    progressBar.setValue(progressBar.getValue() + 1);
+                    progressTextArea.append(text.substring(textLocation, textLocation+1));
+                    textLocation++;
+                } else {
+                        timer.stop();
+                        loadAction.setEnabled(true);
+                        stopAction.setEnabled(false);
+                }
+            }
+        };
+    }
+
+
+    class MyTextArea extends JTextArea {
+        public MyTextArea() {
+            super(null, 0, 0);
+            setEditable(false);
+            setText("");
+        }
+
+        public float getAlignmentX () {
+            return LEFT_ALIGNMENT;
+        }
+
+        public float getAlignmentY () {
+            return TOP_ALIGNMENT;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/README.txt	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,47 @@
+SwingSet2 demonstrates some of the abilities of the Swing User Interface
+Toolkit by displaying many of the components in a single showcase application.
+Use it to try out different components and features provided by Swing.
+
+
+==================================
+TO RUN SWINGSET2 AS AN APPLICATION
+==================================
+
+  java -jar SwingSet2.jar
+
+
+=============================
+TO RUN SWINGSET2 AS AN APPLET
+=============================
+
+  appletviewer SwingSet2.html
+
+=========================
+TO MODIFY/BUILD SWINGSET2
+=========================
+
+The full source for the SwingSet2 demo can be found in the "src"
+subdirectory. If you wish to play with the source code and try
+out your changes, you can compile and run in this "src" directory:
+
+  javac *.java
+  
+  java SwingSet2
+
+You may notice a difference when running SwingSet from your compiled source
+(versus running from the packaged JAR file), in that it won't show the
+splash screen. This is expected, as the splash screen is shown using the
+java.awt.SplashScreen support, which allows specifying a splash screen
+image as an attribute in the JAR's manifest file. If you'd like to see the
+splash screen with your own compiled version, you can package your classes
+into a JAR and specify the splash screen (as outlined in the java.awt.SplashScreen
+documentation) or you can specify the splash screen image on the command line:
+
+java -splash:resources/images/splash.png SwingSet2
+
+
+Note: These instructions assume that this installation's versions of the java,
+appletviewer, and javac commands are in your path.  If they aren't, then you should
+either specify the complete path to the commands or update your PATH environment
+variable as described in the installation instructions for the
+Java(TM) SE Development Kit.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/RubyTheme.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,56 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.swing.plaf.*;
+import javax.swing.plaf.metal.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.*;
+
+/**
+ * This class describes a theme using red colors.
+ *
+ * @author Jeff Dinkins
+ */
+public class RubyTheme extends DefaultMetalTheme {
+
+    public String getName() { return "Ruby"; }
+
+    private final ColorUIResource primary1 = new ColorUIResource(80, 10, 22);
+    private final ColorUIResource primary2 = new ColorUIResource(193, 10, 44);
+    private final ColorUIResource primary3 = new ColorUIResource(244, 10, 66);
+
+    protected ColorUIResource getPrimary1() { return primary1; }
+    protected ColorUIResource getPrimary2() { return primary2; }
+    protected ColorUIResource getPrimary3() { return primary3; }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ScrollPaneDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,122 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * Scroll Pane Demo
+ *
+ * @author Jeff Dinkins
+ */
+public class ScrollPaneDemo extends DemoModule {
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        ScrollPaneDemo demo = new ScrollPaneDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * ScrollPaneDemo Constructor
+     */
+    public ScrollPaneDemo(SwingSet2 swingset) {
+        super(swingset, "ScrollPaneDemo", "toolbar/JScrollPane.gif");
+
+        ImageIcon crayons = createImageIcon("scrollpane/crayons.jpg",  getString("ScrollPaneDemo.crayons"));
+        getDemoPanel().add(new ImageScroller(this, crayons), BorderLayout.CENTER);
+    }
+
+
+    /**
+     * ScrollPane class that demonstrates how to set the various column and row headers
+     * and corners.
+     */
+    class ImageScroller extends JScrollPane {
+        public ImageScroller(ScrollPaneDemo demo, Icon icon) {
+            super();
+
+            // Panel to hold the icon image
+            JPanel p = new JPanel(new BorderLayout());
+            p.add(new JLabel(icon), BorderLayout.CENTER);
+            getViewport().add(p);
+
+            // Create and add a column header to the scrollpane
+            JLabel colHeader = new JLabel(
+                demo.createImageIcon("scrollpane/colheader.jpg", getString("ScrollPaneDemo.colheader")));
+            setColumnHeaderView(colHeader);
+
+            // Create and add a row header to the scrollpane
+            JLabel rowHeader = new JLabel(
+                demo.createImageIcon("scrollpane/rowheader.jpg", getString("ScrollPaneDemo.rowheader")));
+            setRowHeaderView(rowHeader);
+
+            // Create and add the upper left corner
+            JLabel cornerUL = new JLabel(
+                demo.createImageIcon("scrollpane/upperleft.jpg", getString("ScrollPaneDemo.upperleft")));
+            setCorner(UPPER_LEFT_CORNER, cornerUL);
+
+            // Create and add the upper right corner
+            JLabel cornerUR = new JLabel(
+                demo.createImageIcon("scrollpane/upperright.jpg", getString("ScrollPaneDemo.upperright")));
+            setCorner(UPPER_RIGHT_CORNER, cornerUR);
+
+            // Create and add the lower left corner
+            JLabel cornerLL = new JLabel(
+                demo.createImageIcon("scrollpane/lowerleft.jpg", getString("ScrollPaneDemo.lowerleft")));
+            setCorner(LOWER_LEFT_CORNER, cornerLL);
+
+            JScrollBar vsb = getVerticalScrollBar();
+            JScrollBar hsb = getHorizontalScrollBar();
+
+            vsb.setValue(icon.getIconHeight());
+            hsb.setValue(icon.getIconWidth()/10);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/SliderDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,284 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JSlider Demo
+ *
+ * @author Dave Kloba
+ * @author Jeff Dinkins
+ */
+public class SliderDemo extends DemoModule {
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        SliderDemo demo = new SliderDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * SliderDemo Constructor
+     */
+    public SliderDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "SliderDemo", "toolbar/JSlider.gif");
+
+        createSliderDemo();
+    }
+
+    public void createSliderDemo() {
+        JSlider s;
+        JPanel hp;
+        JPanel vp;
+        GridLayout g;
+        JPanel tp;
+        JLabel tf;
+        ChangeListener listener;
+
+        getDemoPanel().setLayout(new BorderLayout());
+
+        tf = new JLabel(getString("SliderDemo.slidervalue"));
+        getDemoPanel().add(tf, BorderLayout.SOUTH);
+
+        tp = new JPanel();
+        g = new GridLayout(1, 2);
+        g.setHgap(5);
+        g.setVgap(5);
+        tp.setLayout(g);
+        getDemoPanel().add(tp, BorderLayout.CENTER);
+
+        listener = new SliderListener(tf);
+
+        BevelBorder border = new BevelBorder(BevelBorder.LOWERED);
+
+        hp = new JPanel();
+        hp.setLayout(new BoxLayout(hp, BoxLayout.Y_AXIS));
+        hp.setBorder(new TitledBorder(
+                        border,
+                        getString("SliderDemo.horizontal"),
+                        TitledBorder.LEFT,
+                        TitledBorder.ABOVE_TOP));
+        tp.add(hp);
+
+        vp = new JPanel();
+        vp.setLayout(new BoxLayout(vp, BoxLayout.X_AXIS));
+        vp.setBorder(new TitledBorder(
+                        border,
+                        getString("SliderDemo.vertical"),
+                        TitledBorder.LEFT,
+                        TitledBorder.ABOVE_TOP));
+        tp.add(vp);
+
+        // Horizontal Slider 1
+        JPanel p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
+        p.setBorder(new TitledBorder(getString("SliderDemo.plain")));
+        s = new JSlider(-10, 100, 20);
+        s.getAccessibleContext().setAccessibleName(getString("SliderDemo.plain"));
+        s.getAccessibleContext().setAccessibleDescription(getString("SliderDemo.a_plain_slider"));
+        s.addChangeListener(listener);
+
+        p.add(Box.createRigidArea(VGAP5));
+        p.add(s);
+        p.add(Box.createRigidArea(VGAP5));
+        hp.add(p);
+        hp.add(Box.createRigidArea(VGAP10));
+
+        // Horizontal Slider 2
+        p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
+        p.setBorder(new TitledBorder(getString("SliderDemo.majorticks")));
+        s = new JSlider(100, 1000, 400);
+        s.setPaintTicks(true);
+        s.setMajorTickSpacing(100);
+        s.getAccessibleContext().setAccessibleName(getString("SliderDemo.majorticks"));
+        s.getAccessibleContext().setAccessibleDescription(getString("SliderDemo.majorticksdescription"));
+        s.addChangeListener(listener);
+
+        p.add(Box.createRigidArea(VGAP5));
+        p.add(s);
+        p.add(Box.createRigidArea(VGAP5));
+        hp.add(p);
+        hp.add(Box.createRigidArea(VGAP10));
+
+        // Horizontal Slider 3
+        p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
+        p.setBorder(new TitledBorder(getString("SliderDemo.ticks")));
+        s = new JSlider(0, 11, 6);
+
+        s.putClientProperty("JSlider.isFilled", Boolean.TRUE );
+
+        s.setPaintTicks(true);
+        s.setMajorTickSpacing(5);
+        s.setMinorTickSpacing(1);
+
+        s.setPaintLabels( true );
+        s.setSnapToTicks( true );
+
+        s.getLabelTable().put(new Integer(11), new JLabel(new Integer(11).toString(), JLabel.CENTER));
+        s.setLabelTable( s.getLabelTable() );
+
+        s.getAccessibleContext().setAccessibleName(getString("SliderDemo.minorticks"));
+        s.getAccessibleContext().setAccessibleDescription(getString("SliderDemo.minorticksdescription"));
+
+        s.addChangeListener(listener);
+
+        p.add(Box.createRigidArea(VGAP5));
+        p.add(s);
+        p.add(Box.createRigidArea(VGAP5));
+        hp.add(p);
+        hp.add(Box.createRigidArea(VGAP10));
+
+        // Horizontal Slider 4
+        p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
+        p.setBorder(new TitledBorder(getString("SliderDemo.disabled")));
+        BoundedRangeModel brm = new DefaultBoundedRangeModel(80, 0, 0, 100);
+        s = new JSlider(brm);
+        s.setPaintTicks(true);
+        s.setMajorTickSpacing(20);
+        s.setMinorTickSpacing(5);
+        s.setEnabled(false);
+        s.getAccessibleContext().setAccessibleName(getString("SliderDemo.disabled"));
+        s.getAccessibleContext().setAccessibleDescription(getString("SliderDemo.disableddescription"));
+        s.addChangeListener(listener);
+
+        p.add(Box.createRigidArea(VGAP5));
+        p.add(s);
+        p.add(Box.createRigidArea(VGAP5));
+        hp.add(p);
+
+        //////////////////////////////////////////////////////////////////////////////
+
+        // Vertical Slider 1
+        p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
+        p.setBorder(new TitledBorder(getString("SliderDemo.plain")));
+        s = new JSlider(JSlider.VERTICAL, -10, 100, 20);
+        s.getAccessibleContext().setAccessibleName(getString("SliderDemo.plain"));
+        s.getAccessibleContext().setAccessibleDescription(getString("SliderDemo.a_plain_slider"));
+        s.addChangeListener(listener);
+        p.add(Box.createRigidArea(HGAP10));
+        p.add(s);
+        p.add(Box.createRigidArea(HGAP10));
+        vp.add(p);
+        vp.add(Box.createRigidArea(HGAP10));
+
+        // Vertical Slider 2
+        p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
+        p.setBorder(new TitledBorder(getString("SliderDemo.majorticks")));
+        s = new JSlider(JSlider.VERTICAL, 100, 1000, 400);
+
+        s.putClientProperty( "JSlider.isFilled", Boolean.TRUE );
+
+        s.setPaintTicks(true);
+        s.setMajorTickSpacing(100);
+        s.getAccessibleContext().setAccessibleName(getString("SliderDemo.majorticks"));
+        s.getAccessibleContext().setAccessibleDescription(getString("SliderDemo.majorticksdescription"));
+        s.addChangeListener(listener);
+        p.add(Box.createRigidArea(HGAP25));
+        p.add(s);
+        p.add(Box.createRigidArea(HGAP25));
+        vp.add(p);
+        vp.add(Box.createRigidArea(HGAP5));
+
+        // Vertical Slider 3
+        p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
+        p.setBorder(new TitledBorder(getString("SliderDemo.minorticks")));
+        s = new JSlider(JSlider.VERTICAL, 0, 100, 60);
+        s.setPaintTicks(true);
+        s.setMajorTickSpacing(20);
+        s.setMinorTickSpacing(5);
+
+        s.setPaintLabels( true );
+
+        s.getAccessibleContext().setAccessibleName(getString("SliderDemo.minorticks"));
+        s.getAccessibleContext().setAccessibleDescription(getString("SliderDemo.minorticksdescription"));
+
+        s.addChangeListener(listener);
+        p.add(Box.createRigidArea(HGAP10));
+        p.add(s);
+        p.add(Box.createRigidArea(HGAP10));
+        vp.add(p);
+        vp.add(Box.createRigidArea(HGAP5));
+
+        // Vertical Slider 4
+        p = new JPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
+        p.setBorder(new TitledBorder(getString("SliderDemo.disabled")));
+        s = new JSlider(JSlider.VERTICAL, 0, 100, 80);
+        s.setPaintTicks(true);
+        s.setMajorTickSpacing(20);
+        s.setMinorTickSpacing(5);
+        s.setEnabled(false);
+        s.getAccessibleContext().setAccessibleName(getString("SliderDemo.disabled"));
+        s.getAccessibleContext().setAccessibleDescription(getString("SliderDemo.disableddescription"));
+        s.addChangeListener(listener);
+        p.add(Box.createRigidArea(HGAP20));
+        p.add(s);
+        p.add(Box.createRigidArea(HGAP20));
+        vp.add(p);
+    }
+
+    class SliderListener implements ChangeListener {
+        JLabel tf;
+        public SliderListener(JLabel f) {
+            tf = f;
+        }
+        public void stateChanged(ChangeEvent e) {
+            JSlider s1 = (JSlider)e.getSource();
+            tf.setText(getString("SliderDemo.slidervalue") + s1.getValue());
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/SplitPaneDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,276 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.table.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * Split Pane demo
+ *
+ * @author Scott Violet
+ * @author Jeff Dinkins
+ */
+public class SplitPaneDemo extends DemoModule {
+
+    JSplitPane splitPane = null;
+    JLabel earth = null;
+    JLabel moon = null;
+
+    JTextField divSize;
+    JTextField earthSize;
+    JTextField moonSize;
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        SplitPaneDemo demo = new SplitPaneDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * SplitPaneDemo Constructor
+     */
+    public SplitPaneDemo(SwingSet2 swingset) {
+        super(swingset, "SplitPaneDemo", "toolbar/JSplitPane.gif");
+
+        earth = new JLabel(createImageIcon("splitpane/earth.jpg", getString("SplitPaneDemo.earth")));
+        earth.setMinimumSize(new Dimension(20, 20));
+
+        moon = new JLabel(createImageIcon("splitpane/moon.jpg", getString("SplitPaneDemo.moon")));
+        moon.setMinimumSize(new Dimension(20, 20));
+
+        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, earth, moon);
+        splitPane.setContinuousLayout(true);
+        splitPane.setOneTouchExpandable(true);
+
+        splitPane.setDividerLocation(200);
+
+        getDemoPanel().add(splitPane, BorderLayout.CENTER);
+        getDemoPanel().setBackground(Color.black);
+
+        getDemoPanel().add(createSplitPaneControls(), BorderLayout.SOUTH);
+    }
+
+    /**
+     * Creates controls to alter the JSplitPane.
+     */
+    protected JPanel createSplitPaneControls() {
+        JPanel wrapper = new JPanel();
+        ButtonGroup group = new ButtonGroup();
+        JRadioButton button;
+
+        Box buttonWrapper = new Box(BoxLayout.X_AXIS);
+
+        wrapper.setLayout(new GridLayout(0, 1));
+
+        /* Create a radio button to vertically split the split pane. */
+        button = new JRadioButton(getString("SplitPaneDemo.vert_split"));
+        button.setMnemonic(getMnemonic("SplitPaneDemo.vert_split_mnemonic"));
+        button.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
+            }
+        });
+        group.add(button);
+        buttonWrapper.add(button);
+
+        /* Create a radio button the horizontally split the split pane. */
+        button = new JRadioButton(getString("SplitPaneDemo.horz_split"));
+        button.setMnemonic(getMnemonic("SplitPaneDemo.horz_split_mnemonic"));
+        button.setSelected(true);
+        button.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
+            }
+        });
+        group.add(button);
+        buttonWrapper.add(button);
+
+        /* Create a check box as to whether or not the split pane continually
+           lays out the component when dragging. */
+        JCheckBox checkBox = new JCheckBox(getString("SplitPaneDemo.cont_layout"));
+        checkBox.setMnemonic(getMnemonic("SplitPaneDemo.cont_layout_mnemonic"));
+        checkBox.setSelected(true);
+
+        checkBox.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent e) {
+                splitPane.setContinuousLayout(
+                    ((JCheckBox)e.getSource()).isSelected());
+            }
+        });
+        buttonWrapper.add(checkBox);
+
+        /* Create a check box as to whether or not the split pane divider
+           contains the oneTouchExpandable buttons. */
+        checkBox = new JCheckBox(getString("SplitPaneDemo.one_touch_expandable"));
+        checkBox.setMnemonic(getMnemonic("SplitPaneDemo.one_touch_expandable_mnemonic"));
+        checkBox.setSelected(true);
+
+        checkBox.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent e) {
+                splitPane.setOneTouchExpandable(
+                    ((JCheckBox) e.getSource()).isSelected());
+            }
+        });
+        buttonWrapper.add(checkBox);
+        wrapper.add(buttonWrapper);
+
+        /* Create a text field to change the divider size. */
+        JPanel                   tfWrapper;
+        JLabel                   label;
+
+        divSize = new JTextField();
+        divSize.setText(new Integer(splitPane.getDividerSize()).toString());
+        divSize.setColumns(5);
+        divSize.getAccessibleContext().setAccessibleName(getString("SplitPaneDemo.divider_size"));
+        divSize.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                String  value = ((JTextField)e.getSource()).getText();
+                int newSize;
+
+                try {
+                    newSize = Integer.parseInt(value);
+                } catch (Exception ex) {
+                    newSize = -1;
+                }
+                if(newSize > 0) {
+                    splitPane.setDividerSize(newSize);
+                } else {
+                    JOptionPane.showMessageDialog(splitPane,
+                                                  getString("SplitPaneDemo.invalid_divider_size"),
+                                                  getString("SplitPaneDemo.error"),
+                                                  JOptionPane.ERROR_MESSAGE);
+                }
+            }
+        });
+        label = new JLabel(getString("SplitPaneDemo.divider_size"));
+        tfWrapper = new JPanel(new FlowLayout(FlowLayout.LEFT));
+        tfWrapper.add(label);
+        tfWrapper.add(divSize);
+        label.setLabelFor(divSize);
+        label.setDisplayedMnemonic(getMnemonic("SplitPaneDemo.divider_size_mnemonic"));
+        wrapper.add(tfWrapper);
+
+        /* Create a text field that will change the preferred/minimum size
+           of the earth component. */
+        earthSize = new JTextField(String.valueOf(earth.getMinimumSize().width));
+        earthSize.setColumns(5);
+        earthSize.getAccessibleContext().setAccessibleName(getString("SplitPaneDemo.first_component_min_size"));
+        earthSize.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                String           value = ((JTextField)e.getSource()).getText();
+                int              newSize;
+
+                try {
+                    newSize = Integer.parseInt(value);
+                } catch (Exception ex) {
+                    newSize = -1;
+                }
+                if(newSize > 10) {
+                    earth.setMinimumSize(new Dimension(newSize, newSize));
+                } else {
+                    JOptionPane.showMessageDialog(splitPane,
+                                                  getString("SplitPaneDemo.invalid_min_size") +
+                                                  getString("SplitPaneDemo.must_be_greater_than") + 10,
+                                                  getString("SplitPaneDemo.error"),
+                                                  JOptionPane.ERROR_MESSAGE);
+                }
+            }
+        });
+        label = new JLabel(getString("SplitPaneDemo.first_component_min_size"));
+        tfWrapper = new JPanel(new FlowLayout(FlowLayout.LEFT));
+        tfWrapper.add(label);
+        tfWrapper.add(earthSize);
+        label.setLabelFor(earthSize);
+        label.setDisplayedMnemonic(getMnemonic("SplitPaneDemo.first_component_min_size_mnemonic"));
+        wrapper.add(tfWrapper);
+
+        /* Create a text field that will change the preferred/minimum size
+           of the moon component. */
+        moonSize = new JTextField(String.valueOf(moon.getMinimumSize().width));
+        moonSize.setColumns(5);
+        moonSize.getAccessibleContext().setAccessibleName(getString("SplitPaneDemo.second_component_min_size"));
+        moonSize.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                String           value = ((JTextField)e.getSource()).getText();
+                int              newSize;
+
+                try {
+                    newSize = Integer.parseInt(value);
+                } catch (Exception ex) {
+                    newSize = -1;
+                }
+                if(newSize > 10) {
+                    moon.setMinimumSize(new Dimension(newSize, newSize));
+                } else {
+                    JOptionPane.showMessageDialog(splitPane,
+                                                  getString("SplitPaneDemo.invalid_min_size") +
+                                                  getString("SplitPaneDemo.must_be_greater_than") + 10,
+                                                  getString("SplitPaneDemo.error"),
+                                                  JOptionPane.ERROR_MESSAGE);
+                }
+            }
+        });
+        label = new JLabel(getString("SplitPaneDemo.second_component_min_size"));
+        tfWrapper = new JPanel(new FlowLayout(FlowLayout.LEFT));
+        tfWrapper.add(label);
+        tfWrapper.add(moonSize);
+        label.setLabelFor(moonSize);
+        label.setDisplayedMnemonic(getMnemonic("SplitPaneDemo.second_component_min_size_mnemonic"));
+        wrapper.add(tfWrapper);
+
+        return wrapper;
+    }
+
+    void updateDragEnabled(boolean dragEnabled) {
+        divSize.setDragEnabled(dragEnabled);
+        earthSize.setDragEnabled(dragEnabled);
+        moonSize.setDragEnabled(dragEnabled);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/SwingSet2.html	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+  <head>
+    <title>SwingSet demo</title>
+  </head>
+
+  <body>
+      <h1>SwingSet demo</h1>
+      <applet code=SwingSet2Applet              
+              archive="SwingSet2.jar"
+      	      width=695 height=525>
+      </applet>
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/SwingSet2.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,1367 @@
+/*
+ *
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.border.*;
+
+import javax.swing.plaf.metal.MetalTheme;
+import javax.swing.plaf.metal.OceanTheme;
+import javax.swing.plaf.metal.DefaultMetalTheme;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+
+import java.lang.reflect.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+
+/**
+ * A demo that shows all of the Swing components.
+ *
+ * @author Jeff Dinkins
+ */
+public class SwingSet2 extends JPanel {
+
+    String[] demos = {
+      "ButtonDemo",
+      "ColorChooserDemo",
+      "ComboBoxDemo",
+      "FileChooserDemo",
+      "HtmlDemo",
+      "ListDemo",
+      "OptionPaneDemo",
+      "ProgressBarDemo",
+      "ScrollPaneDemo",
+      "SliderDemo",
+      "SplitPaneDemo",
+      "TabbedPaneDemo",
+      "TableDemo",
+      "ToolTipDemo",
+      "TreeDemo"
+    };
+
+    void loadDemos() {
+        for(int i = 0; i < demos.length;) {
+            if(isApplet() && demos[i].equals("FileChooserDemo")) {
+               // don't load the file chooser demo if we are
+               // an applet
+            } else {
+               loadDemo(demos[i]);
+            }
+            i++;
+        }
+    }
+
+    // The current Look & Feel
+    private static LookAndFeelData currentLookAndFeel;
+    private static LookAndFeelData[] lookAndFeelData;
+    // List of demos
+    private ArrayList<DemoModule> demosList = new ArrayList<DemoModule>();
+
+    // The preferred size of the demo
+    private static final int PREFERRED_WIDTH = 720;
+    private static final int PREFERRED_HEIGHT = 640;
+
+    // Box spacers
+    private Dimension HGAP = new Dimension(1,5);
+    private Dimension VGAP = new Dimension(5,1);
+
+    // A place to hold on to the visible demo
+    private DemoModule currentDemo = null;
+    private JPanel demoPanel = null;
+
+    // About Box
+    private JDialog aboutBox = null;
+
+    // Status Bar
+    private JTextField statusField = null;
+
+    // Tool Bar
+    private ToggleButtonToolBar toolbar = null;
+    private ButtonGroup toolbarGroup = new ButtonGroup();
+
+    // Menus
+    private JMenuBar menuBar = null;
+    private JMenu lafMenu = null;
+    private JMenu themesMenu = null;
+    private JMenu audioMenu = null;
+    private JMenu optionsMenu = null;
+    private ButtonGroup lafMenuGroup = new ButtonGroup();
+    private ButtonGroup themesMenuGroup = new ButtonGroup();
+    private ButtonGroup audioMenuGroup = new ButtonGroup();
+
+    // Popup menu
+    private JPopupMenu popupMenu = null;
+    private ButtonGroup popupMenuGroup = new ButtonGroup();
+
+    // Used only if swingset is an application
+    private JFrame frame = null;
+
+    // Used only if swingset is an applet
+    private SwingSet2Applet applet = null;
+
+    // To debug or not to debug, that is the question
+    private boolean DEBUG = true;
+    private int debugCounter = 0;
+
+    // The tab pane that holds the demo
+    private JTabbedPane tabbedPane = null;
+
+    private JEditorPane demoSrcPane = null;
+
+
+    // contentPane cache, saved from the applet or application frame
+    Container contentPane = null;
+
+
+    // number of swingsets - for multiscreen
+    // keep track of the number of SwingSets created - we only want to exit
+    // the program when the last one has been closed.
+    private static int numSSs = 0;
+    private static Vector<SwingSet2> swingSets = new Vector<SwingSet2>();
+
+    private boolean dragEnabled = false;
+
+    public SwingSet2(SwingSet2Applet applet) {
+        this(applet, null);
+    }
+
+    /**
+     * SwingSet2 Constructor
+     */
+    public SwingSet2(SwingSet2Applet applet, GraphicsConfiguration gc) {
+
+        // Note that applet may be null if this is started as an application
+        this.applet = applet;
+
+        String lafClassName = UIManager.getLookAndFeel().getClass().getName();
+        lookAndFeelData = getInstalledLookAndFeelData();
+        currentLookAndFeel = Arrays.stream(lookAndFeelData)
+                .filter(laf -> lafClassName.equals(laf.className))
+                .findFirst().get();
+
+        if (!isApplet()) {
+            frame = createFrame(gc);
+        }
+
+        // set the layout
+        setLayout(new BorderLayout());
+
+        // set the preferred size of the demo
+        setPreferredSize(new Dimension(PREFERRED_WIDTH,PREFERRED_HEIGHT));
+
+        initializeDemo();
+        preloadFirstDemo();
+
+        showSwingSet2();
+
+        // Start loading the rest of the demo in the background
+        DemoLoadThread demoLoader = new DemoLoadThread(this);
+        demoLoader.start();
+    }
+
+
+    /**
+     * SwingSet2 Main. Called only if we're an application, not an applet.
+     */
+    public static void main(final String[] args) {
+        // must run in EDT when constructing the GUI components
+        SwingUtilities.invokeLater(() -> {
+            // Create SwingSet on the default monitor
+            UIManager.put("swing.boldMetal", Boolean.FALSE);
+            SwingSet2 swingset = new SwingSet2(null, GraphicsEnvironment.
+                                         getLocalGraphicsEnvironment().
+                                         getDefaultScreenDevice().
+                                         getDefaultConfiguration());
+        });
+    }
+
+    // *******************************************************
+    // *************** Demo Loading Methods ******************
+    // *******************************************************
+
+
+
+    public void initializeDemo() {
+        JPanel top = new JPanel();
+        top.setLayout(new BorderLayout());
+        add(top, BorderLayout.NORTH);
+
+        menuBar = createMenus();
+
+    if (isApplet()) {
+        applet.setJMenuBar(menuBar);
+    } else {
+        frame.setJMenuBar(menuBar);
+    }
+
+        // creates popup menu accessible via keyboard
+        popupMenu = createPopupMenu();
+
+        ToolBarPanel toolbarPanel = new ToolBarPanel();
+        toolbarPanel.setLayout(new BorderLayout());
+        toolbar = new ToggleButtonToolBar();
+        toolbarPanel.add(toolbar, BorderLayout.CENTER);
+        top.add(toolbarPanel, BorderLayout.SOUTH);
+        toolbarPanel.addContainerListener(toolbarPanel);
+
+        tabbedPane = new JTabbedPane();
+        add(tabbedPane, BorderLayout.CENTER);
+        tabbedPane.getModel().addChangeListener(new TabListener());
+
+        statusField = new JTextField("");
+        statusField.setEditable(false);
+        add(statusField, BorderLayout.SOUTH);
+
+        demoPanel = new JPanel();
+        demoPanel.setLayout(new BorderLayout());
+        demoPanel.setBorder(new EtchedBorder());
+        tabbedPane.addTab("Hi There!", demoPanel);
+
+        // Add html src code viewer
+        demoSrcPane = new JEditorPane("text/html", getString("SourceCode.loading"));
+        demoSrcPane.setEditable(false);
+
+        JScrollPane scroller = new JScrollPane();
+        scroller.getViewport().add(demoSrcPane);
+
+        tabbedPane.addTab(
+            getString("TabbedPane.src_label"),
+            null,
+            scroller,
+            getString("TabbedPane.src_tooltip")
+        );
+    }
+
+    DemoModule currentTabDemo = null;
+    class TabListener implements ChangeListener {
+        public void stateChanged(ChangeEvent e) {
+            SingleSelectionModel model = (SingleSelectionModel) e.getSource();
+            boolean srcSelected = model.getSelectedIndex() == 1;
+            if(currentTabDemo != currentDemo && demoSrcPane != null && srcSelected) {
+                demoSrcPane.setText(getString("SourceCode.loading"));
+                repaint();
+            }
+            if(currentTabDemo != currentDemo && srcSelected) {
+                currentTabDemo = currentDemo;
+                setSourceCode(currentDemo);
+            }
+        }
+    }
+
+
+    /**
+     * Create menus
+     */
+    public JMenuBar createMenus() {
+        JMenuItem mi;
+        // ***** create the menubar ****
+        JMenuBar menuBar = new JMenuBar();
+        menuBar.getAccessibleContext().setAccessibleName(
+            getString("MenuBar.accessible_description"));
+
+        // ***** create File menu
+        JMenu fileMenu = (JMenu) menuBar.add(new JMenu(getString("FileMenu.file_label")));
+        fileMenu.setMnemonic(getMnemonic("FileMenu.file_mnemonic"));
+        fileMenu.getAccessibleContext().setAccessibleDescription(getString("FileMenu.accessible_description"));
+
+        createMenuItem(fileMenu, "FileMenu.about_label", "FileMenu.about_mnemonic",
+                       "FileMenu.about_accessible_description", new AboutAction(this));
+
+        fileMenu.addSeparator();
+
+        createMenuItem(fileMenu, "FileMenu.open_label", "FileMenu.open_mnemonic",
+                       "FileMenu.open_accessible_description", null);
+
+        createMenuItem(fileMenu, "FileMenu.save_label", "FileMenu.save_mnemonic",
+                       "FileMenu.save_accessible_description", null);
+
+        createMenuItem(fileMenu, "FileMenu.save_as_label", "FileMenu.save_as_mnemonic",
+                       "FileMenu.save_as_accessible_description", null);
+
+
+        if(!isApplet()) {
+            fileMenu.addSeparator();
+
+            createMenuItem(fileMenu, "FileMenu.exit_label", "FileMenu.exit_mnemonic",
+                           "FileMenu.exit_accessible_description", new ExitAction(this)
+            );
+        }
+
+        // Create these menu items for the first SwingSet only.
+        if (numSSs == 0) {
+        // ***** create laf switcher menu
+        lafMenu = (JMenu) menuBar.add(new JMenu(getString("LafMenu.laf_label")));
+        lafMenu.setMnemonic(getMnemonic("LafMenu.laf_mnemonic"));
+        lafMenu.getAccessibleContext().setAccessibleDescription(
+            getString("LafMenu.laf_accessible_description"));
+
+        for (LookAndFeelData lafData : lookAndFeelData) {
+            mi = createLafMenuItem(lafMenu, lafData);
+            mi.setSelected(lafData.equals(currentLookAndFeel));
+        }
+
+        // ***** create themes menu
+        themesMenu = (JMenu) menuBar.add(new JMenu(getString("ThemesMenu.themes_label")));
+        themesMenu.setMnemonic(getMnemonic("ThemesMenu.themes_mnemonic"));
+        themesMenu.getAccessibleContext().setAccessibleDescription(
+            getString("ThemesMenu.themes_accessible_description"));
+
+        // ***** create the audio submenu under the theme menu
+        audioMenu = (JMenu) themesMenu.add(new JMenu(getString("AudioMenu.audio_label")));
+        audioMenu.setMnemonic(getMnemonic("AudioMenu.audio_mnemonic"));
+        audioMenu.getAccessibleContext().setAccessibleDescription(
+            getString("AudioMenu.audio_accessible_description"));
+
+        createAudioMenuItem(audioMenu, "AudioMenu.on_label",
+                            "AudioMenu.on_mnemonic",
+                            "AudioMenu.on_accessible_description",
+                            new OnAudioAction(this));
+
+        mi = createAudioMenuItem(audioMenu, "AudioMenu.default_label",
+                                 "AudioMenu.default_mnemonic",
+                                 "AudioMenu.default_accessible_description",
+                                 new DefaultAudioAction(this));
+        mi.setSelected(true); // This is the default feedback setting
+
+        createAudioMenuItem(audioMenu, "AudioMenu.off_label",
+                            "AudioMenu.off_mnemonic",
+                            "AudioMenu.off_accessible_description",
+                            new OffAudioAction(this));
+
+
+        // ***** create the font submenu under the theme menu
+        JMenu fontMenu = (JMenu) themesMenu.add(new JMenu(getString("FontMenu.fonts_label")));
+        fontMenu.setMnemonic(getMnemonic("FontMenu.fonts_mnemonic"));
+        fontMenu.getAccessibleContext().setAccessibleDescription(
+            getString("FontMenu.fonts_accessible_description"));
+        ButtonGroup fontButtonGroup = new ButtonGroup();
+        mi = createButtonGroupMenuItem(fontMenu, "FontMenu.plain_label",
+                "FontMenu.plain_mnemonic",
+                "FontMenu.plain_accessible_description",
+                new ChangeFontAction(this, true), fontButtonGroup);
+        mi.setSelected(true);
+        mi = createButtonGroupMenuItem(fontMenu, "FontMenu.bold_label",
+                "FontMenu.bold_mnemonic",
+                "FontMenu.bold_accessible_description",
+                new ChangeFontAction(this, false), fontButtonGroup);
+
+
+
+        // *** now back to adding color/font themes to the theme menu
+        mi = createThemesMenuItem(themesMenu, "ThemesMenu.ocean_label",
+                                              "ThemesMenu.ocean_mnemonic",
+                                              "ThemesMenu.ocean_accessible_description",
+                                              new OceanTheme());
+        mi.setSelected(true); // This is the default theme
+
+        createThemesMenuItem(themesMenu, "ThemesMenu.steel_label",
+                             "ThemesMenu.steel_mnemonic",
+                             "ThemesMenu.steel_accessible_description",
+                             new DefaultMetalTheme());
+
+        createThemesMenuItem(themesMenu, "ThemesMenu.aqua_label", "ThemesMenu.aqua_mnemonic",
+                       "ThemesMenu.aqua_accessible_description", new AquaTheme());
+
+        createThemesMenuItem(themesMenu, "ThemesMenu.charcoal_label", "ThemesMenu.charcoal_mnemonic",
+                       "ThemesMenu.charcoal_accessible_description", new CharcoalTheme());
+
+        createThemesMenuItem(themesMenu, "ThemesMenu.contrast_label", "ThemesMenu.contrast_mnemonic",
+                       "ThemesMenu.contrast_accessible_description", new ContrastTheme());
+
+        createThemesMenuItem(themesMenu, "ThemesMenu.emerald_label", "ThemesMenu.emerald_mnemonic",
+                       "ThemesMenu.emerald_accessible_description", new EmeraldTheme());
+
+        createThemesMenuItem(themesMenu, "ThemesMenu.ruby_label", "ThemesMenu.ruby_mnemonic",
+                       "ThemesMenu.ruby_accessible_description", new RubyTheme());
+
+        // Enable theme menu based on L&F
+        themesMenu.setEnabled("Metal".equals(currentLookAndFeel.name));
+
+        // ***** create the options menu
+        optionsMenu = (JMenu)menuBar.add(
+            new JMenu(getString("OptionsMenu.options_label")));
+        optionsMenu.setMnemonic(getMnemonic("OptionsMenu.options_mnemonic"));
+        optionsMenu.getAccessibleContext().setAccessibleDescription(
+            getString("OptionsMenu.options_accessible_description"));
+
+        // ***** create tool tip submenu item.
+        mi = createCheckBoxMenuItem(optionsMenu, "OptionsMenu.tooltip_label",
+                "OptionsMenu.tooltip_mnemonic",
+                "OptionsMenu.tooltip_accessible_description",
+                new ToolTipAction());
+        mi.setSelected(true);
+
+        // ***** create drag support submenu item.
+        createCheckBoxMenuItem(optionsMenu, "OptionsMenu.dragEnabled_label",
+                "OptionsMenu.dragEnabled_mnemonic",
+                "OptionsMenu.dragEnabled_accessible_description",
+                new DragSupportAction());
+
+        }
+
+
+        // ***** create the multiscreen menu, if we have multiple screens
+    if (!isApplet()) {
+        GraphicsDevice[] screens = GraphicsEnvironment.
+                                    getLocalGraphicsEnvironment().
+                                    getScreenDevices();
+        if (screens.length > 1) {
+
+            JMenu multiScreenMenu = (JMenu) menuBar.add(new JMenu(
+                                     getString("MultiMenu.multi_label")));
+
+            multiScreenMenu.setMnemonic(getMnemonic("MultiMenu.multi_mnemonic"));
+            multiScreenMenu.getAccessibleContext().setAccessibleDescription(
+             getString("MultiMenu.multi_accessible_description"));
+
+            createMultiscreenMenuItem(multiScreenMenu, MultiScreenAction.ALL_SCREENS);
+            for (int i = 0; i < screens.length; i++) {
+                createMultiscreenMenuItem(multiScreenMenu, i);
+            }
+        }
+    }
+
+        return menuBar;
+    }
+
+    /**
+     * Create a checkbox menu menu item
+     */
+    private JMenuItem createCheckBoxMenuItem(JMenu menu, String label,
+                                             String mnemonic,
+                                             String accessibleDescription,
+                                             Action action) {
+        JCheckBoxMenuItem mi = (JCheckBoxMenuItem)menu.add(
+                new JCheckBoxMenuItem(getString(label)));
+        mi.setMnemonic(getMnemonic(mnemonic));
+        mi.getAccessibleContext().setAccessibleDescription(getString(
+                accessibleDescription));
+        mi.addActionListener(action);
+        return mi;
+    }
+
+    /**
+     * Create a radio button menu menu item for items that are part of a
+     * button group.
+     */
+    private JMenuItem createButtonGroupMenuItem(JMenu menu, String label,
+                                                String mnemonic,
+                                                String accessibleDescription,
+                                                Action action,
+                                                ButtonGroup buttonGroup) {
+        JRadioButtonMenuItem mi = (JRadioButtonMenuItem)menu.add(
+                new JRadioButtonMenuItem(getString(label)));
+        buttonGroup.add(mi);
+        mi.setMnemonic(getMnemonic(mnemonic));
+        mi.getAccessibleContext().setAccessibleDescription(getString(
+                accessibleDescription));
+        mi.addActionListener(action);
+        return mi;
+    }
+
+    /**
+     * Create the theme's audio submenu
+     */
+    public JMenuItem createAudioMenuItem(JMenu menu, String label,
+                                         String mnemonic,
+                                         String accessibleDescription,
+                                         Action action) {
+        JRadioButtonMenuItem mi = (JRadioButtonMenuItem) menu.add(new JRadioButtonMenuItem(getString(label)));
+        audioMenuGroup.add(mi);
+        mi.setMnemonic(getMnemonic(mnemonic));
+        mi.getAccessibleContext().setAccessibleDescription(getString(accessibleDescription));
+        mi.addActionListener(action);
+
+        return mi;
+    }
+
+    /**
+     * Creates a generic menu item
+     */
+    public JMenuItem createMenuItem(JMenu menu, String label, String mnemonic,
+                               String accessibleDescription, Action action) {
+        JMenuItem mi = (JMenuItem) menu.add(new JMenuItem(getString(label)));
+        mi.setMnemonic(getMnemonic(mnemonic));
+        mi.getAccessibleContext().setAccessibleDescription(getString(accessibleDescription));
+        mi.addActionListener(action);
+        if(action == null) {
+            mi.setEnabled(false);
+        }
+        return mi;
+    }
+
+    /**
+     * Creates a JRadioButtonMenuItem for the Themes menu
+     */
+    public JMenuItem createThemesMenuItem(JMenu menu, String label, String mnemonic,
+                               String accessibleDescription, MetalTheme theme) {
+        JRadioButtonMenuItem mi = (JRadioButtonMenuItem) menu.add(new JRadioButtonMenuItem(getString(label)));
+        themesMenuGroup.add(mi);
+        mi.setMnemonic(getMnemonic(mnemonic));
+        mi.getAccessibleContext().setAccessibleDescription(getString(accessibleDescription));
+        mi.addActionListener(new ChangeThemeAction(this, theme));
+
+        return mi;
+    }
+
+    /**
+     * Creates a JRadioButtonMenuItem for the Look and Feel menu
+     */
+    public JMenuItem createLafMenuItem(JMenu menu, LookAndFeelData lafData) {
+        JMenuItem mi = menu.add(new JRadioButtonMenuItem(lafData.label));
+        lafMenuGroup.add(mi);
+        mi.setMnemonic(lafData.mnemonic);
+        mi.getAccessibleContext().setAccessibleDescription(lafData.accDescription);
+        mi.addActionListener(new ChangeLookAndFeelAction(this, lafData));
+        return mi;
+    }
+
+    /**
+     * Creates a multi-screen menu item
+     */
+    public JMenuItem createMultiscreenMenuItem(JMenu menu, int screen) {
+        JMenuItem mi = null;
+        if (screen == MultiScreenAction.ALL_SCREENS) {
+            mi = (JMenuItem) menu.add(new JMenuItem(getString("MultiMenu.all_label")));
+            mi.setMnemonic(getMnemonic("MultiMenu.all_mnemonic"));
+            mi.getAccessibleContext().setAccessibleDescription(getString(
+                                                                 "MultiMenu.all_accessible_description"));
+        }
+        else {
+            mi = (JMenuItem) menu.add(new JMenuItem(getString("MultiMenu.single_label") + " " +
+                                                                                                 screen));
+            mi.setMnemonic(KeyEvent.VK_0 + screen);
+            mi.getAccessibleContext().setAccessibleDescription(getString(
+                                               "MultiMenu.single_accessible_description") + " " + screen);
+
+        }
+        mi.addActionListener(new MultiScreenAction(this, screen));
+        return mi;
+    }
+
+    public JPopupMenu createPopupMenu() {
+        JPopupMenu popup = new JPopupMenu("JPopupMenu demo");
+
+        for (LookAndFeelData lafData : lookAndFeelData) {
+            createPopupMenuItem(popup, lafData);
+        }
+
+        // register key binding to activate popup menu
+        InputMap map = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
+        map.put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, InputEvent.SHIFT_MASK),
+                "postMenuAction");
+        map.put(KeyStroke.getKeyStroke(KeyEvent.VK_CONTEXT_MENU, 0), "postMenuAction");
+        getActionMap().put("postMenuAction", new ActivatePopupMenuAction(this, popup));
+
+        return popup;
+    }
+
+    /**
+     * Creates a JMenuItem for the Look and Feel popup menu
+     */
+    public JMenuItem createPopupMenuItem(JPopupMenu menu, LookAndFeelData lafData) {
+        JMenuItem mi = menu.add(new JMenuItem(lafData.label));
+        popupMenuGroup.add(mi);
+        mi.setMnemonic(lafData.mnemonic);
+        mi.getAccessibleContext().setAccessibleDescription(lafData.accDescription);
+        mi.addActionListener(new ChangeLookAndFeelAction(this, lafData));
+        return mi;
+    }
+
+
+    /**
+     * Load the first demo. This is done separately from the remaining demos
+     * so that we can get SwingSet2 up and available to the user quickly.
+     */
+    public void preloadFirstDemo() {
+        DemoModule demo = addDemo(new InternalFrameDemo(this));
+        setDemo(demo);
+    }
+
+
+    /**
+     * Add a demo to the toolbar
+     */
+    public DemoModule addDemo(DemoModule demo) {
+        demosList.add(demo);
+        if (dragEnabled) {
+            demo.updateDragEnabled(true);
+        }
+        // do the following on the gui thread
+        SwingUtilities.invokeLater(new SwingSetRunnable(this, demo) {
+            public void run() {
+                SwitchToDemoAction action = new SwitchToDemoAction(swingset, (DemoModule) obj);
+                JToggleButton tb = swingset.getToolBar().addToggleButton(action);
+                swingset.getToolBarGroup().add(tb);
+                if(swingset.getToolBarGroup().getSelection() == null) {
+                    tb.setSelected(true);
+                }
+                tb.setText(null);
+                tb.setToolTipText(((DemoModule)obj).getToolTip());
+
+                if(demos[demos.length-1].equals(obj.getClass().getName())) {
+                    setStatus(getString("Status.popupMenuAccessible"));
+                }
+
+            }
+        });
+        return demo;
+    }
+
+
+    /**
+     * Sets the current demo
+     */
+    public void setDemo(DemoModule demo) {
+        currentDemo = demo;
+
+        // Ensure panel's UI is current before making visible
+        JComponent currentDemoPanel = demo.getDemoPanel();
+        SwingUtilities.updateComponentTreeUI(currentDemoPanel);
+
+        demoPanel.removeAll();
+        demoPanel.add(currentDemoPanel, BorderLayout.CENTER);
+
+        tabbedPane.setSelectedIndex(0);
+        tabbedPane.setTitleAt(0, demo.getName());
+        tabbedPane.setToolTipTextAt(0, demo.getToolTip());
+    }
+
+
+    /**
+     * Bring up the SwingSet2 demo by showing the frame (only
+     * applicable if coming up as an application, not an applet);
+     */
+    public void showSwingSet2() {
+        if(!isApplet() && getFrame() != null) {
+            // put swingset in a frame and show it
+            JFrame f = getFrame();
+            f.setTitle(getString("Frame.title"));
+            f.getContentPane().add(this, BorderLayout.CENTER);
+            f.pack();
+
+            Rectangle screenRect = f.getGraphicsConfiguration().getBounds();
+            Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(
+                    f.getGraphicsConfiguration());
+
+            // Make sure we don't place the demo off the screen.
+            int centerWidth = screenRect.width < f.getSize().width ?
+                    screenRect.x :
+                    screenRect.x + screenRect.width/2 - f.getSize().width/2;
+            int centerHeight = screenRect.height < f.getSize().height ?
+                    screenRect.y :
+                    screenRect.y + screenRect.height/2 - f.getSize().height/2;
+
+            centerHeight = centerHeight < screenInsets.top ?
+                    screenInsets.top : centerHeight;
+
+            f.setLocation(centerWidth, centerHeight);
+            f.show();
+            numSSs++;
+            swingSets.add(this);
+        }
+    }
+
+    // *******************************************************
+    // ****************** Utility Methods ********************
+    // *******************************************************
+
+    /**
+     * Loads a demo from a classname
+     */
+    void loadDemo(String classname) {
+        setStatus(getString("Status.loading") + getString(classname + ".name"));
+        DemoModule demo = null;
+        try {
+            Class demoClass = Class.forName(classname);
+            Constructor demoConstructor = demoClass.getConstructor(new Class[]{SwingSet2.class});
+            demo = (DemoModule) demoConstructor.newInstance(new Object[]{this});
+            addDemo(demo);
+        } catch (Exception e) {
+            System.out.println("Error occurred loading demo: " + classname);
+        }
+    }
+
+    /**
+     * Determines if this is an applet or application
+     */
+    public boolean isApplet() {
+        return (applet != null);
+    }
+
+    /**
+     * Returns the applet instance
+     */
+    public SwingSet2Applet getApplet() {
+        return applet;
+    }
+
+
+    /**
+     * Returns the frame instance
+     */
+    public JFrame getFrame() {
+        return frame;
+    }
+
+    /**
+     * Returns the menubar
+     */
+    public JMenuBar getMenuBar() {
+        return menuBar;
+    }
+
+    /**
+     * Returns the toolbar
+     */
+    public ToggleButtonToolBar getToolBar() {
+        return toolbar;
+    }
+
+    /**
+     * Returns the toolbar button group
+     */
+    public ButtonGroup getToolBarGroup() {
+        return toolbarGroup;
+    }
+
+    /**
+     * Returns the content pane whether we're in an applet
+     * or application
+     */
+    public Container getContentPane() {
+        if(contentPane == null) {
+            if(getFrame() != null) {
+                contentPane = getFrame().getContentPane();
+            } else if (getApplet() != null) {
+                contentPane = getApplet().getContentPane();
+            }
+        }
+        return contentPane;
+    }
+
+    /**
+     * Create a frame for SwingSet2 to reside in if brought up
+     * as an application.
+     */
+    public static JFrame createFrame(GraphicsConfiguration gc) {
+        JFrame frame = new JFrame(gc);
+        if (numSSs == 0) {
+            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        } else {
+            WindowListener l = new WindowAdapter() {
+                public void windowClosing(WindowEvent e) {
+                    numSSs--;
+                    swingSets.remove(this);
+                }
+            };
+            frame.addWindowListener(l);
+        }
+        return frame;
+    }
+
+
+    /**
+     * Set the status
+     */
+    public void setStatus(String s) {
+        // do the following on the gui thread
+        SwingUtilities.invokeLater(new SwingSetRunnable(this, s) {
+            public void run() {
+                swingset.statusField.setText((String) obj);
+            }
+        });
+    }
+
+
+    /**
+     * This method returns a string from the demo's resource bundle.
+     */
+    public static String getString(String key) {
+        String value = null;
+        try {
+            value = TextAndMnemonicUtils.getTextAndMnemonicString(key);
+        } catch (MissingResourceException e) {
+            System.out.println("java.util.MissingResourceException: Couldn't find value for: " + key);
+        }
+        if(value == null) {
+            value = "Could not find resource: " + key + "  ";
+        }
+        return value;
+    }
+
+    void setDragEnabled(boolean dragEnabled) {
+        if (dragEnabled == this.dragEnabled) {
+            return;
+        }
+
+        this.dragEnabled = dragEnabled;
+
+        for (DemoModule dm : demosList) {
+            dm.updateDragEnabled(dragEnabled);
+        }
+
+        demoSrcPane.setDragEnabled(dragEnabled);
+    }
+
+    boolean isDragEnabled() {
+        return dragEnabled;
+    }
+
+
+    /**
+     * Returns a mnemonic from the resource bundle. Typically used as
+     * keyboard shortcuts in menu items.
+     */
+    public char getMnemonic(String key) {
+        return (getString(key)).charAt(0);
+    }
+
+    /**
+     * Creates an icon from an image contained in the "images" directory.
+     */
+    public ImageIcon createImageIcon(String filename, String description) {
+        String path = "/resources/images/" + filename;
+        return new ImageIcon(getClass().getResource(path));
+    }
+
+    /**
+     * If DEBUG is defined, prints debug information out to std ouput.
+     */
+    public void debug(String s) {
+        if(DEBUG) {
+            System.out.println((debugCounter++) + ": " + s);
+        }
+    }
+
+    /**
+     * Stores the current L&F, and calls updateLookAndFeel, below
+     */
+    public void setLookAndFeel(LookAndFeelData laf) {
+        if(!currentLookAndFeel.equals(laf)) {
+            currentLookAndFeel = laf;
+            /* The recommended way of synchronizing state between multiple
+             * controls that represent the same command is to use Actions.
+             * The code below is a workaround and will be replaced in future
+             * version of SwingSet2 demo.
+             */
+            String lafName = laf.label;
+            themesMenu.setEnabled(laf.name.equals("Metal"));
+            updateLookAndFeel();
+            for(int i=0;i<lafMenu.getItemCount();i++) {
+                JMenuItem item = lafMenu.getItem(i);
+                item.setSelected(item.getText().equals(lafName));
+            }
+        }
+    }
+
+    private void updateThisSwingSet() {
+        if (isApplet()) {
+            SwingUtilities.updateComponentTreeUI(getApplet());
+        } else {
+            JFrame frame = getFrame();
+            if (frame == null) {
+                SwingUtilities.updateComponentTreeUI(this);
+            } else {
+                SwingUtilities.updateComponentTreeUI(frame);
+            }
+        }
+
+        SwingUtilities.updateComponentTreeUI(popupMenu);
+        if (aboutBox != null) {
+            SwingUtilities.updateComponentTreeUI(aboutBox);
+        }
+    }
+
+    /**
+     * Sets the current L&F on each demo module
+     */
+    public void updateLookAndFeel() {
+        try {
+            UIManager.setLookAndFeel(currentLookAndFeel.className);
+            if (isApplet()) {
+                updateThisSwingSet();
+            } else {
+                for (SwingSet2 ss : swingSets) {
+                    ss.updateThisSwingSet();
+                }
+            }
+        } catch (Exception ex) {
+            System.out.println("Failed loading L&F: " + currentLookAndFeel);
+            System.out.println(ex);
+        }
+    }
+
+    /**
+     * Loads and puts the source code text into JEditorPane in the "Source Code" tab
+     */
+    public void setSourceCode(DemoModule demo) {
+        // do the following on the gui thread
+        SwingUtilities.invokeLater(new SwingSetRunnable(this, demo) {
+            public void run() {
+                swingset.demoSrcPane.setText(((DemoModule)obj).getSourceCode());
+                swingset.demoSrcPane.setCaretPosition(0);
+
+            }
+        });
+    }
+
+    // *******************************************************
+    // **************   ToggleButtonToolbar  *****************
+    // *******************************************************
+    static Insets zeroInsets = new Insets(1,1,1,1);
+    protected class ToggleButtonToolBar extends JToolBar {
+        public ToggleButtonToolBar() {
+            super();
+        }
+
+        JToggleButton addToggleButton(Action a) {
+            JToggleButton tb = new JToggleButton(
+                (String)a.getValue(Action.NAME),
+                (Icon)a.getValue(Action.SMALL_ICON)
+            );
+            tb.setMargin(zeroInsets);
+            tb.setText(null);
+            tb.setEnabled(a.isEnabled());
+            tb.setToolTipText((String)a.getValue(Action.SHORT_DESCRIPTION));
+            tb.setAction(a);
+            add(tb);
+            return tb;
+        }
+    }
+
+    // *******************************************************
+    // *********  ToolBar Panel / Docking Listener ***********
+    // *******************************************************
+    class ToolBarPanel extends JPanel implements ContainerListener {
+
+        public boolean contains(int x, int y) {
+            Component c = getParent();
+            if (c != null) {
+                Rectangle r = c.getBounds();
+                return (x >= 0) && (x < r.width) && (y >= 0) && (y < r.height);
+            }
+            else {
+                return super.contains(x,y);
+            }
+        }
+
+        public void componentAdded(ContainerEvent e) {
+            Container c = e.getContainer().getParent();
+            if (c != null) {
+                c.getParent().validate();
+                c.getParent().repaint();
+            }
+        }
+
+        public void componentRemoved(ContainerEvent e) {
+            Container c = e.getContainer().getParent();
+            if (c != null) {
+                c.getParent().validate();
+                c.getParent().repaint();
+            }
+        }
+    }
+
+    // *******************************************************
+    // ******************   Runnables  ***********************
+    // *******************************************************
+
+    /**
+     * Generic SwingSet2 runnable. This is intended to run on the
+     * AWT gui event thread so as not to muck things up by doing
+     * gui work off the gui thread. Accepts a SwingSet2 and an Object
+     * as arguments, which gives subtypes of this class the two
+     * "must haves" needed in most runnables for this demo.
+     */
+    class SwingSetRunnable implements Runnable {
+        protected SwingSet2 swingset;
+        protected Object obj;
+
+        public SwingSetRunnable(SwingSet2 swingset, Object obj) {
+            this.swingset = swingset;
+            this.obj = obj;
+        }
+
+        public void run() {
+        }
+    }
+
+
+    // *******************************************************
+    // ********************   Actions  ***********************
+    // *******************************************************
+
+    public class SwitchToDemoAction extends AbstractAction {
+        SwingSet2 swingset;
+        DemoModule demo;
+
+        public SwitchToDemoAction(SwingSet2 swingset, DemoModule demo) {
+            super(demo.getName(), demo.getIcon());
+            this.swingset = swingset;
+            this.demo = demo;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            swingset.setDemo(demo);
+        }
+    }
+
+    class OkAction extends AbstractAction {
+        JDialog aboutBox;
+
+        protected OkAction(JDialog aboutBox) {
+            super("OkAction");
+            this.aboutBox = aboutBox;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            aboutBox.setVisible(false);
+        }
+    }
+
+    class ChangeLookAndFeelAction extends AbstractAction {
+        SwingSet2 swingset;
+        LookAndFeelData lafData;
+        protected ChangeLookAndFeelAction(SwingSet2 swingset, LookAndFeelData lafData) {
+            super("ChangeTheme");
+            this.swingset = swingset;
+            this.lafData = lafData;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            swingset.setLookAndFeel(lafData);
+        }
+    }
+
+    class ActivatePopupMenuAction extends AbstractAction {
+        SwingSet2 swingset;
+        JPopupMenu popup;
+        protected ActivatePopupMenuAction(SwingSet2 swingset, JPopupMenu popup) {
+            super("ActivatePopupMenu");
+            this.swingset = swingset;
+            this.popup = popup;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            Dimension invokerSize = getSize();
+            Dimension popupSize = popup.getPreferredSize();
+            popup.show(swingset, (invokerSize.width - popupSize.width) / 2,
+                       (invokerSize.height - popupSize.height) / 2);
+        }
+    }
+
+    // Turns on all possible auditory feedback
+    class OnAudioAction extends AbstractAction {
+        SwingSet2 swingset;
+        protected OnAudioAction(SwingSet2 swingset) {
+            super("Audio On");
+            this.swingset = swingset;
+        }
+        public void actionPerformed(ActionEvent e) {
+            UIManager.put("AuditoryCues.playList",
+                          UIManager.get("AuditoryCues.allAuditoryCues"));
+            swingset.updateLookAndFeel();
+        }
+    }
+
+    // Turns on the default amount of auditory feedback
+    class DefaultAudioAction extends AbstractAction {
+        SwingSet2 swingset;
+        protected DefaultAudioAction(SwingSet2 swingset) {
+            super("Audio Default");
+            this.swingset = swingset;
+        }
+        public void actionPerformed(ActionEvent e) {
+            UIManager.put("AuditoryCues.playList",
+                          UIManager.get("AuditoryCues.defaultCueList"));
+            swingset.updateLookAndFeel();
+        }
+    }
+
+    // Turns off all possible auditory feedback
+    class OffAudioAction extends AbstractAction {
+        SwingSet2 swingset;
+        protected OffAudioAction(SwingSet2 swingset) {
+            super("Audio Off");
+            this.swingset = swingset;
+        }
+        public void actionPerformed(ActionEvent e) {
+            UIManager.put("AuditoryCues.playList",
+                          UIManager.get("AuditoryCues.noAuditoryCues"));
+            swingset.updateLookAndFeel();
+        }
+    }
+
+    // Turns on or off the tool tips for the demo.
+    class ToolTipAction extends AbstractAction {
+        protected ToolTipAction() {
+            super("ToolTip Control");
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            boolean status = ((JCheckBoxMenuItem)e.getSource()).isSelected();
+            ToolTipManager.sharedInstance().setEnabled(status);
+        }
+    }
+
+    class DragSupportAction extends AbstractAction {
+        protected DragSupportAction() {
+            super("DragSupport Control");
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            boolean dragEnabled = ((JCheckBoxMenuItem)e.getSource()).isSelected();
+            if (isApplet()) {
+                setDragEnabled(dragEnabled);
+            } else {
+                for (SwingSet2 ss : swingSets) {
+                    ss.setDragEnabled(dragEnabled);
+                }
+            }
+        }
+    }
+
+    class ChangeThemeAction extends AbstractAction {
+        SwingSet2 swingset;
+        MetalTheme theme;
+        protected ChangeThemeAction(SwingSet2 swingset, MetalTheme theme) {
+            super("ChangeTheme");
+            this.swingset = swingset;
+            this.theme = theme;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            MetalLookAndFeel.setCurrentTheme(theme);
+            swingset.updateLookAndFeel();
+        }
+    }
+
+    class ExitAction extends AbstractAction {
+        SwingSet2 swingset;
+        protected ExitAction(SwingSet2 swingset) {
+            super("ExitAction");
+            this.swingset = swingset;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            System.exit(0);
+        }
+    }
+
+    class AboutAction extends AbstractAction {
+        SwingSet2 swingset;
+        protected AboutAction(SwingSet2 swingset) {
+            super("AboutAction");
+            this.swingset = swingset;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            if(aboutBox == null) {
+                // JPanel panel = new JPanel(new BorderLayout());
+                JPanel panel = new AboutPanel(swingset);
+                panel.setLayout(new BorderLayout());
+
+                aboutBox = new JDialog(swingset.getFrame(), getString("AboutBox.title"), false);
+                aboutBox.setResizable(false);
+                aboutBox.getContentPane().add(panel, BorderLayout.CENTER);
+
+                // JButton button = new JButton(getString("AboutBox.ok_button_text"));
+                JPanel buttonpanel = new JPanel();
+                buttonpanel.setBorder(new javax.swing.border.EmptyBorder(0, 0, 3, 0));
+                buttonpanel.setOpaque(false);
+                JButton button = (JButton) buttonpanel.add(
+                    new JButton(getString("AboutBox.ok_button_text"))
+                );
+                panel.add(buttonpanel, BorderLayout.SOUTH);
+
+                button.addActionListener(new OkAction(aboutBox));
+            }
+            aboutBox.pack();
+            if (isApplet()) {
+                aboutBox.setLocationRelativeTo(getApplet());
+            } else {
+                aboutBox.setLocationRelativeTo(getFrame());
+            }
+            aboutBox.show();
+        }
+    }
+
+    class MultiScreenAction extends AbstractAction {
+        static final int ALL_SCREENS = -1;
+        int screen;
+        protected MultiScreenAction(SwingSet2 swingset, int screen) {
+            super("MultiScreenAction");
+            this.screen = screen;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            GraphicsDevice[] gds = GraphicsEnvironment.
+                                   getLocalGraphicsEnvironment().
+                                   getScreenDevices();
+            if (screen == ALL_SCREENS) {
+                for (int i = 0; i < gds.length; i++) {
+                    SwingSet2 swingset = new SwingSet2(null,
+                                  gds[i].getDefaultConfiguration());
+                    swingset.setDragEnabled(dragEnabled);
+                }
+            }
+            else {
+                SwingSet2 swingset = new SwingSet2(null,
+                             gds[screen].getDefaultConfiguration());
+                swingset.setDragEnabled(dragEnabled);
+            }
+        }
+    }
+
+    // *******************************************************
+    // **********************  Misc  *************************
+    // *******************************************************
+
+    class DemoLoadThread extends Thread {
+        SwingSet2 swingset;
+
+        DemoLoadThread(SwingSet2 swingset) {
+            this.swingset = swingset;
+        }
+
+        public void run() {
+            SwingUtilities.invokeLater(swingset::loadDemos);
+        }
+    }
+
+    class AboutPanel extends JPanel {
+        ImageIcon aboutimage = null;
+        SwingSet2 swingset = null;
+
+        public AboutPanel(SwingSet2 swingset) {
+            this.swingset = swingset;
+            aboutimage = swingset.createImageIcon("About.jpg", "AboutBox.accessible_description");
+            setOpaque(false);
+        }
+
+        public void paint(Graphics g) {
+            aboutimage.paintIcon(this, g, 0, 0);
+            super.paint(g);
+        }
+
+        public Dimension getPreferredSize() {
+            return new Dimension(aboutimage.getIconWidth(),
+                                 aboutimage.getIconHeight());
+        }
+    }
+
+
+    private class ChangeFontAction extends AbstractAction {
+        private SwingSet2 swingset;
+        private boolean plain;
+
+        ChangeFontAction(SwingSet2 swingset, boolean plain) {
+            super("FontMenu");
+            this.swingset = swingset;
+            this.plain = plain;
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            if (plain) {
+                UIManager.put("swing.boldMetal", Boolean.FALSE);
+            }
+            else {
+                UIManager.put("swing.boldMetal", Boolean.TRUE);
+            }
+            // Change the look and feel to force the settings to take effect.
+            updateLookAndFeel();
+        }
+    }
+
+    private static LookAndFeelData[] getInstalledLookAndFeelData() {
+        return Arrays.stream(UIManager.getInstalledLookAndFeels())
+                .map(laf -> getLookAndFeelData(laf))
+                .toArray(LookAndFeelData[]::new);
+    }
+
+    private static LookAndFeelData getLookAndFeelData(
+            UIManager.LookAndFeelInfo info) {
+        switch (info.getName()) {
+            case "Metal":
+                return new LookAndFeelData(info, "java");
+            case "Nimbus":
+                return new LookAndFeelData(info, "nimbus");
+            case "Windows":
+                return new LookAndFeelData(info, "windows");
+            case "GTK+":
+                return new LookAndFeelData(info, "gtk");
+            case "CDE/Motif":
+                return new LookAndFeelData(info, "motif");
+            case "Mac OS X":
+                return new LookAndFeelData(info, "mac");
+            default:
+                return new LookAndFeelData(info);
+        }
+    }
+
+    private static class LookAndFeelData {
+        String name;
+        String className;
+        String label;
+        char mnemonic;
+        String accDescription;
+
+        public LookAndFeelData(UIManager.LookAndFeelInfo info) {
+            this(info.getName(), info.getClassName(), info.getName(),
+                 info.getName(), info.getName());
+        }
+
+        public LookAndFeelData(UIManager.LookAndFeelInfo info, String property) {
+            this(info.getName(), info.getClassName(),
+                    getString(String.format("LafMenu.%s_label", property)),
+                    getString(String.format("LafMenu.%s_mnemonic", property)),
+                    getString(String.format("LafMenu.%s_accessible_description",
+                                    property)));
+        }
+
+        public LookAndFeelData(String name, String className, String label,
+                               String mnemonic, String accDescription) {
+            this.name = name;
+            this.className = className;
+            this.label = label;
+            this.mnemonic = mnemonic.charAt(0);
+            this.accDescription = accDescription;
+        }
+
+        @Override
+        public String toString() {
+            return className;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/SwingSet2Applet.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,78 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ *
+ *
+ * @author Jeff Dinkins
+ */
+
+public class SwingSet2Applet extends JApplet {
+    public void init() {
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(new SwingSet2(this), BorderLayout.CENTER);
+    }
+
+    public URL getURL(String filename) {
+        URL codeBase = this.getCodeBase();
+        URL url = null;
+
+        try {
+            url = new URL(codeBase, filename);
+            System.out.println(url);
+        } catch (java.net.MalformedURLException e) {
+            System.out.println("Error: badly specified URL");
+            return null;
+        }
+
+        return url;
+    }
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/TabbedPaneDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,233 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JTabbedPane Demo
+ *
+ * @author Jeff Dinkins
+ */
+public class TabbedPaneDemo extends DemoModule implements ActionListener {
+    HeadSpin spin;
+
+    JTabbedPane tabbedpane;
+
+    ButtonGroup group;
+
+    JRadioButton top;
+    JRadioButton bottom;
+    JRadioButton left;
+    JRadioButton right;
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        TabbedPaneDemo demo = new TabbedPaneDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * TabbedPaneDemo Constructor
+     */
+    public TabbedPaneDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "TabbedPaneDemo", "toolbar/JTabbedPane.gif");
+
+        // create tab position controls
+        JPanel tabControls = new JPanel();
+        tabControls.add(new JLabel(getString("TabbedPaneDemo.label")));
+        top    = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.top")));
+        left   = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.left")));
+        bottom = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.bottom")));
+        right  = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.right")));
+        getDemoPanel().add(tabControls, BorderLayout.NORTH);
+
+        group = new ButtonGroup();
+        group.add(top);
+        group.add(bottom);
+        group.add(left);
+        group.add(right);
+
+        top.setSelected(true);
+
+        top.addActionListener(this);
+        bottom.addActionListener(this);
+        left.addActionListener(this);
+        right.addActionListener(this);
+
+        // create tab
+        tabbedpane = new JTabbedPane();
+        getDemoPanel().add(tabbedpane, BorderLayout.CENTER);
+
+        String name = getString("TabbedPaneDemo.laine");
+        JLabel pix = new JLabel(createImageIcon("tabbedpane/laine.jpg", name));
+        tabbedpane.add(name, pix);
+
+        name = getString("TabbedPaneDemo.ewan");
+        pix = new JLabel(createImageIcon("tabbedpane/ewan.jpg", name));
+        tabbedpane.add(name, pix);
+
+        name = getString("TabbedPaneDemo.hania");
+        pix = new JLabel(createImageIcon("tabbedpane/hania.jpg", name));
+        tabbedpane.add(name, pix);
+
+        name = getString("TabbedPaneDemo.bounce");
+        spin = new HeadSpin();
+        tabbedpane.add(name, spin);
+
+        tabbedpane.getModel().addChangeListener(
+           new ChangeListener() {
+              public void stateChanged(ChangeEvent e) {
+                  SingleSelectionModel model = (SingleSelectionModel) e.getSource();
+                  if(model.getSelectedIndex() == tabbedpane.getTabCount()-1) {
+                      spin.go();
+                  }
+              }
+           }
+        );
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        if(e.getSource() == top) {
+            tabbedpane.setTabPlacement(JTabbedPane.TOP);
+        } else if(e.getSource() == left) {
+            tabbedpane.setTabPlacement(JTabbedPane.LEFT);
+        } else if(e.getSource() == bottom) {
+            tabbedpane.setTabPlacement(JTabbedPane.BOTTOM);
+        } else if(e.getSource() == right) {
+            tabbedpane.setTabPlacement(JTabbedPane.RIGHT);
+        }
+    }
+
+    class HeadSpin extends JComponent implements ActionListener {
+        javax.swing.Timer animator;
+
+        ImageIcon icon[] = new ImageIcon[6];
+
+        int tmpScale;
+
+        static final int numImages = 6;
+
+        double x[] = new double[numImages];
+        double y[] = new double[numImages];
+
+        int xh[] = new int[numImages];
+        int yh[] = new int[numImages];
+
+        double scale[] = new double[numImages];
+
+        public HeadSpin() {
+            setBackground(Color.black);
+            icon[0] = createImageIcon("tabbedpane/ewan.gif", getString("TabbedPaneDemo.ewan"));
+            icon[1] = createImageIcon("tabbedpane/stephen.gif", getString("TabbedPaneDemo.stephen"));
+            icon[2] = createImageIcon("tabbedpane/david.gif", getString("TabbedPaneDemo.david"));
+            icon[3] = createImageIcon("tabbedpane/matthew.gif", getString("TabbedPaneDemo.matthew"));
+            icon[4] = createImageIcon("tabbedpane/blake.gif", getString("TabbedPaneDemo.blake"));
+            icon[5] = createImageIcon("tabbedpane/brooke.gif", getString("TabbedPaneDemo.brooke"));
+
+            /*
+            for(int i = 0; i < 6; i++) {
+                x[i] = (double) rand.nextInt(500);
+                y[i] = (double) rand.nextInt(500);
+            }
+            */
+        }
+
+        public void go() {
+            animator = new javax.swing.Timer(22 + 22 + 22, this);
+            animator.start();
+        }
+
+        public void paint(Graphics g) {
+            g.setColor(getBackground());
+            g.fillRect(0, 0, getWidth(), getHeight());
+
+            for(int i = 0; i < numImages; i++) {
+                if(x[i] > 3*i) {
+                    nudge(i);
+                    squish(g, icon[i], xh[i], yh[i], scale[i]);
+                } else {
+                    x[i] += .05;
+                    y[i] += .05;
+                }
+            }
+        }
+
+        Random rand = new Random();
+
+        public void nudge(int i) {
+            x[i] += (double) rand.nextInt(1000) / 8756;
+            y[i] += (double) rand.nextInt(1000) / 5432;
+            int tmpScale = (int) (Math.abs(Math.sin(x[i])) * 10);
+            scale[i] = (double) tmpScale / 10;
+            int nudgeX = (int) (((double) getWidth()/2) * .8);
+            int nudgeY = (int) (((double) getHeight()/2) * .60);
+            xh[i] = (int) (Math.sin(x[i]) * nudgeX) + nudgeX;
+            yh[i] = (int) (Math.sin(y[i]) * nudgeY) + nudgeY;
+        }
+
+        public void squish(Graphics g, ImageIcon icon, int x, int y, double scale) {
+            if(isVisible()) {
+                g.drawImage(icon.getImage(), x, y,
+                            (int) (icon.getIconWidth()*scale),
+                            (int) (icon.getIconHeight()*scale),
+                            this);
+            }
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            if(isVisible()) {
+                repaint();
+            } else {
+                animator.stop();
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/TableDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,741 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.table.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.print.PrinterException;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+import java.text.MessageFormat;
+
+/**
+ * Table demo
+ *
+ * @author Philip Milne
+ * @author Steve Wilson
+ */
+public class TableDemo extends DemoModule {
+    JTable      tableView;
+    JScrollPane scrollpane;
+    Dimension   origin = new Dimension(0, 0);
+
+    JCheckBox   isColumnReorderingAllowedCheckBox;
+    JCheckBox   showHorizontalLinesCheckBox;
+    JCheckBox   showVerticalLinesCheckBox;
+
+    JCheckBox   isColumnSelectionAllowedCheckBox;
+    JCheckBox   isRowSelectionAllowedCheckBox;
+
+    JLabel      interCellSpacingLabel;
+    JLabel      rowHeightLabel;
+
+    JSlider     interCellSpacingSlider;
+    JSlider     rowHeightSlider;
+
+    JComboBox   selectionModeComboBox = null;
+    JComboBox   resizeModeComboBox = null;
+
+    JLabel      headerLabel;
+    JLabel      footerLabel;
+
+    JTextField  headerTextField;
+    JTextField  footerTextField;
+
+    JCheckBox   fitWidth;
+    JButton     printButton;
+
+    JPanel      controlPanel;
+    JScrollPane tableAggregate;
+
+    String path = "food/";
+
+    final int INITIAL_ROWHEIGHT = 33;
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        TableDemo demo = new TableDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * TableDemo Constructor
+     */
+    public TableDemo(SwingSet2 swingset) {
+        super(swingset, "TableDemo", "toolbar/JTable.gif");
+
+        getDemoPanel().setLayout(new BorderLayout());
+        controlPanel = new JPanel();
+        controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.X_AXIS));
+        JPanel cbPanel = new JPanel(new GridLayout(3, 2));
+        JPanel labelPanel = new JPanel(new GridLayout(2, 1)) {
+            public Dimension getMaximumSize() {
+                return new Dimension(getPreferredSize().width, super.getMaximumSize().height);
+            }
+        };
+        JPanel sliderPanel = new JPanel(new GridLayout(2, 1)) {
+            public Dimension getMaximumSize() {
+                return new Dimension(getPreferredSize().width, super.getMaximumSize().height);
+            }
+        };
+        JPanel comboPanel = new JPanel(new GridLayout(2, 1));
+        JPanel printPanel = new JPanel(new ColumnLayout());
+
+        getDemoPanel().add(controlPanel, BorderLayout.NORTH);
+        Vector relatedComponents = new Vector();
+
+
+        // check box panel
+        isColumnReorderingAllowedCheckBox = new JCheckBox(getString("TableDemo.reordering_allowed"), true);
+        isColumnReorderingAllowedCheckBox.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                boolean flag = ((JCheckBox)e.getSource()).isSelected();
+                tableView.getTableHeader().setReorderingAllowed(flag);
+                tableView.repaint();
+            }
+        });
+
+        showHorizontalLinesCheckBox = new JCheckBox(getString("TableDemo.horz_lines"), true);
+        showHorizontalLinesCheckBox.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                boolean flag = ((JCheckBox)e.getSource()).isSelected();
+                tableView.setShowHorizontalLines(flag); ;
+                tableView.repaint();
+            }
+        });
+
+        showVerticalLinesCheckBox = new JCheckBox(getString("TableDemo.vert_lines"), true);
+        showVerticalLinesCheckBox.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                boolean flag = ((JCheckBox)e.getSource()).isSelected();
+                tableView.setShowVerticalLines(flag); ;
+                tableView.repaint();
+            }
+        });
+
+        // Show that showHorizontal/Vertical controls are related
+        relatedComponents.removeAllElements();
+        relatedComponents.add(showHorizontalLinesCheckBox);
+        relatedComponents.add(showVerticalLinesCheckBox);
+        buildAccessibleGroup(relatedComponents);
+
+        isRowSelectionAllowedCheckBox = new JCheckBox(getString("TableDemo.row_selection"), true);
+        isRowSelectionAllowedCheckBox.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                boolean flag = ((JCheckBox)e.getSource()).isSelected();
+                tableView.setRowSelectionAllowed(flag); ;
+                tableView.repaint();
+            }
+        });
+
+        isColumnSelectionAllowedCheckBox = new JCheckBox(getString("TableDemo.column_selection"), false);
+        isColumnSelectionAllowedCheckBox.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                boolean flag = ((JCheckBox)e.getSource()).isSelected();
+                tableView.setColumnSelectionAllowed(flag); ;
+                tableView.repaint();
+            }
+        });
+
+        // Show that row/column selections are related
+        relatedComponents.removeAllElements();
+        relatedComponents.add(isColumnSelectionAllowedCheckBox);
+        relatedComponents.add(isRowSelectionAllowedCheckBox);
+        buildAccessibleGroup(relatedComponents);
+
+        cbPanel.add(isColumnReorderingAllowedCheckBox);
+        cbPanel.add(isRowSelectionAllowedCheckBox);
+        cbPanel.add(showHorizontalLinesCheckBox);
+        cbPanel.add(isColumnSelectionAllowedCheckBox);
+        cbPanel.add(showVerticalLinesCheckBox);
+
+
+        // label panel
+        interCellSpacingLabel = new JLabel(getString("TableDemo.intercell_spacing_colon"));
+        labelPanel.add(interCellSpacingLabel);
+
+        rowHeightLabel = new JLabel(getString("TableDemo.row_height_colon"));
+        labelPanel.add(rowHeightLabel);
+
+
+        // slider panel
+        interCellSpacingSlider = new JSlider(JSlider.HORIZONTAL, 0, 10, 1);
+        interCellSpacingSlider.getAccessibleContext().setAccessibleName(getString("TableDemo.intercell_spacing"));
+        interCellSpacingLabel.setLabelFor(interCellSpacingSlider);
+        sliderPanel.add(interCellSpacingSlider);
+        interCellSpacingSlider.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent e) {
+                int spacing = ((JSlider)e.getSource()).getValue();
+                tableView.setIntercellSpacing(new Dimension(spacing, spacing));
+                tableView.repaint();
+            }
+        });
+
+        rowHeightSlider = new JSlider(JSlider.HORIZONTAL, 5, 100, INITIAL_ROWHEIGHT);
+        rowHeightSlider.getAccessibleContext().setAccessibleName(getString("TableDemo.row_height"));
+        rowHeightLabel.setLabelFor(rowHeightSlider);
+        sliderPanel.add(rowHeightSlider);
+        rowHeightSlider.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent e) {
+                int height = ((JSlider)e.getSource()).getValue();
+                tableView.setRowHeight(height);
+                tableView.repaint();
+            }
+        });
+
+        // Show that spacing controls are related
+        relatedComponents.removeAllElements();
+        relatedComponents.add(interCellSpacingSlider);
+        relatedComponents.add(rowHeightSlider);
+        buildAccessibleGroup(relatedComponents);
+
+
+        // Create the table.
+        tableAggregate = createTable();
+        getDemoPanel().add(tableAggregate, BorderLayout.CENTER);
+
+
+        // ComboBox for selection modes.
+        JPanel selectMode = new JPanel();
+        selectMode.setLayout(new BoxLayout(selectMode, BoxLayout.X_AXIS));
+        selectMode.setBorder(new TitledBorder(getString("TableDemo.selection_mode")));
+
+
+        selectionModeComboBox = new JComboBox() {
+            public Dimension getMaximumSize() {
+                return getPreferredSize();
+            }
+        };
+        selectionModeComboBox.addItem(getString("TableDemo.single"));
+        selectionModeComboBox.addItem(getString("TableDemo.one_range"));
+        selectionModeComboBox.addItem(getString("TableDemo.multiple_ranges"));
+        selectionModeComboBox.setSelectedIndex(tableView.getSelectionModel().getSelectionMode());
+        selectionModeComboBox.addItemListener(new ItemListener() {
+            public void itemStateChanged(ItemEvent e) {
+                JComboBox source = (JComboBox)e.getSource();
+                tableView.setSelectionMode(source.getSelectedIndex());
+            }
+        });
+
+        selectMode.add(Box.createHorizontalStrut(2));
+        selectMode.add(selectionModeComboBox);
+        selectMode.add(Box.createHorizontalGlue());
+        comboPanel.add(selectMode);
+
+        // Combo box for table resize mode.
+        JPanel resizeMode = new JPanel();
+        resizeMode.setLayout(new BoxLayout(resizeMode, BoxLayout.X_AXIS));
+        resizeMode.setBorder(new TitledBorder(getString("TableDemo.autoresize_mode")));
+
+
+        resizeModeComboBox = new JComboBox() {
+            public Dimension getMaximumSize() {
+                return getPreferredSize();
+            }
+        };
+        resizeModeComboBox.addItem(getString("TableDemo.off"));
+        resizeModeComboBox.addItem(getString("TableDemo.column_boundaries"));
+        resizeModeComboBox.addItem(getString("TableDemo.subsequent_columns"));
+        resizeModeComboBox.addItem(getString("TableDemo.last_column"));
+        resizeModeComboBox.addItem(getString("TableDemo.all_columns"));
+        resizeModeComboBox.setSelectedIndex(tableView.getAutoResizeMode());
+        resizeModeComboBox.addItemListener(new ItemListener() {
+            public void itemStateChanged(ItemEvent e) {
+                JComboBox source = (JComboBox)e.getSource();
+                tableView.setAutoResizeMode(source.getSelectedIndex());
+            }
+        });
+
+        resizeMode.add(Box.createHorizontalStrut(2));
+        resizeMode.add(resizeModeComboBox);
+        resizeMode.add(Box.createHorizontalGlue());
+        comboPanel.add(resizeMode);
+
+        // print panel
+        printPanel.setBorder(new TitledBorder(getString("TableDemo.printing")));
+        headerLabel = new JLabel(getString("TableDemo.header"));
+        footerLabel = new JLabel(getString("TableDemo.footer"));
+        headerTextField = new JTextField(getString("TableDemo.headerText"), 15);
+        footerTextField = new JTextField(getString("TableDemo.footerText"), 15);
+        fitWidth = new JCheckBox(getString("TableDemo.fitWidth"), true);
+        printButton = new JButton(getString("TableDemo.print"));
+        printButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent ae) {
+                printTable();
+            }
+        });
+
+        printPanel.add(headerLabel);
+        printPanel.add(headerTextField);
+        printPanel.add(footerLabel);
+        printPanel.add(footerTextField);
+
+        JPanel buttons = new JPanel();
+        buttons.add(fitWidth);
+        buttons.add(printButton);
+
+        printPanel.add(buttons);
+
+        // Show that printing controls are related
+        relatedComponents.removeAllElements();
+        relatedComponents.add(headerTextField);
+        relatedComponents.add(footerTextField);
+        relatedComponents.add(printButton);
+        buildAccessibleGroup(relatedComponents);
+
+        // wrap up the panels and add them
+        JPanel sliderWrapper = new JPanel();
+        sliderWrapper.setLayout(new BoxLayout(sliderWrapper, BoxLayout.X_AXIS));
+        sliderWrapper.add(labelPanel);
+        sliderWrapper.add(sliderPanel);
+        sliderWrapper.add(Box.createHorizontalGlue());
+        sliderWrapper.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0));
+
+        JPanel leftWrapper = new JPanel();
+        leftWrapper.setLayout(new BoxLayout(leftWrapper, BoxLayout.Y_AXIS));
+        leftWrapper.add(cbPanel);
+        leftWrapper.add(sliderWrapper);
+
+        // add everything
+        controlPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 0));
+        controlPanel.add(leftWrapper);
+        controlPanel.add(comboPanel);
+        controlPanel.add(printPanel);
+
+        setTableControllers(); // Set accessibility information
+
+        getDemoPanel().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
+            .put(KeyStroke.getKeyStroke("ctrl P"), "print");
+
+        getDemoPanel().getActionMap().put("print", new AbstractAction() {
+            public void actionPerformed(ActionEvent ae) {
+                printTable();
+            }
+        });
+
+    } // TableDemo()
+
+    /**
+     * Sets the Accessibility MEMBER_OF property to denote that
+     * these components work together as a group. Each object
+     * is set to be a MEMBER_OF an array that contains all of
+     * the objects in the group, including itself.
+     *
+     * @param components The list of objects that are related
+     */
+    void buildAccessibleGroup(Vector components) {
+
+        AccessibleContext context = null;
+        int numComponents = components.size();
+        Object[] group = components.toArray();
+        Object object = null;
+        for (int i = 0; i < numComponents; ++i) {
+            object = components.elementAt(i);
+            if (object instanceof Accessible) {
+                context = ((Accessible)components.elementAt(i)).
+                                                 getAccessibleContext();
+                context.getAccessibleRelationSet().add(
+                    new AccessibleRelation(
+                        AccessibleRelation.MEMBER_OF, group));
+            }
+        }
+    } // buildAccessibleGroup()
+
+    /**
+     * This sets CONTROLLER_FOR on the controls that manipulate the
+     * table and CONTROLLED_BY relationships on the table to point
+     * back to the controllers.
+     */
+    private void setTableControllers() {
+
+        // Set up the relationships to show what controls the table
+        setAccessibleController(isColumnReorderingAllowedCheckBox,
+                                tableAggregate);
+        setAccessibleController(showHorizontalLinesCheckBox,
+                                tableAggregate);
+        setAccessibleController(showVerticalLinesCheckBox,
+                                tableAggregate);
+        setAccessibleController(isColumnSelectionAllowedCheckBox,
+                                tableAggregate);
+        setAccessibleController(isRowSelectionAllowedCheckBox,
+                                tableAggregate);
+        setAccessibleController(interCellSpacingSlider,
+                                tableAggregate);
+        setAccessibleController(rowHeightSlider,
+                                tableAggregate);
+        setAccessibleController(selectionModeComboBox,
+                                tableAggregate);
+        setAccessibleController(resizeModeComboBox,
+                                tableAggregate);
+    } // setTableControllers()
+
+    /**
+     * Sets up accessibility relationships to denote that one
+     * object controls another. The CONTROLLER_FOR property is
+     * set on the controller object, and the CONTROLLED_BY
+     * property is set on the target object.
+     */
+    private void setAccessibleController(JComponent controller,
+                                        JComponent target) {
+        AccessibleRelationSet controllerRelations =
+            controller.getAccessibleContext().getAccessibleRelationSet();
+        AccessibleRelationSet targetRelations =
+            target.getAccessibleContext().getAccessibleRelationSet();
+
+        controllerRelations.add(
+            new AccessibleRelation(
+                AccessibleRelation.CONTROLLER_FOR, target));
+        targetRelations.add(
+            new AccessibleRelation(
+                AccessibleRelation.CONTROLLED_BY, controller));
+    } // setAccessibleController()
+
+    public JScrollPane createTable() {
+
+        // final
+        final String[] names = {
+          getString("TableDemo.first_name"),
+          getString("TableDemo.last_name"),
+          getString("TableDemo.favorite_color"),
+          getString("TableDemo.favorite_movie"),
+          getString("TableDemo.favorite_number"),
+          getString("TableDemo.favorite_food")
+        };
+
+        ImageIcon apple        = createImageIcon("food/apple.jpg",      getString("TableDemo.apple"));
+        ImageIcon asparagus    = createImageIcon("food/asparagus.gif",  getString("TableDemo.asparagus"));
+        ImageIcon banana       = createImageIcon("food/banana.gif",     getString("TableDemo.banana"));
+        ImageIcon broccoli     = createImageIcon("food/broccoli.gif",   getString("TableDemo.broccoli"));
+        ImageIcon cantaloupe   = createImageIcon("food/cantaloupe.gif", getString("TableDemo.cantaloupe"));
+        ImageIcon carrot       = createImageIcon("food/carrot.gif",     getString("TableDemo.carrot"));
+        ImageIcon corn         = createImageIcon("food/corn.gif",       getString("TableDemo.corn"));
+        ImageIcon grapes       = createImageIcon("food/grapes.gif",     getString("TableDemo.grapes"));
+        ImageIcon grapefruit   = createImageIcon("food/grapefruit.gif", getString("TableDemo.grapefruit"));
+        ImageIcon kiwi         = createImageIcon("food/kiwi.gif",       getString("TableDemo.kiwi"));
+        ImageIcon onion        = createImageIcon("food/onion.gif",      getString("TableDemo.onion"));
+        ImageIcon pear         = createImageIcon("food/pear.gif",       getString("TableDemo.pear"));
+        ImageIcon peach        = createImageIcon("food/peach.gif",      getString("TableDemo.peach"));
+        ImageIcon pepper       = createImageIcon("food/pepper.gif",     getString("TableDemo.pepper"));
+        ImageIcon pickle       = createImageIcon("food/pickle.gif",     getString("TableDemo.pickle"));
+        ImageIcon pineapple    = createImageIcon("food/pineapple.gif",  getString("TableDemo.pineapple"));
+        ImageIcon raspberry    = createImageIcon("food/raspberry.gif",  getString("TableDemo.raspberry"));
+        ImageIcon sparegrass   = createImageIcon("food/asparagus.gif",  getString("TableDemo.sparegrass"));
+        ImageIcon strawberry   = createImageIcon("food/strawberry.gif", getString("TableDemo.strawberry"));
+        ImageIcon tomato       = createImageIcon("food/tomato.gif",     getString("TableDemo.tomato"));
+        ImageIcon watermelon   = createImageIcon("food/watermelon.gif", getString("TableDemo.watermelon"));
+
+        NamedColor aqua        = new NamedColor(new Color(127, 255, 212), getString("TableDemo.aqua"));
+        NamedColor beige       = new NamedColor(new Color(245, 245, 220), getString("TableDemo.beige"));
+        NamedColor black       = new NamedColor(Color.black, getString("TableDemo.black"));
+        NamedColor blue        = new NamedColor(new Color(0, 0, 222), getString("TableDemo.blue"));
+        NamedColor eblue       = new NamedColor(Color.blue, getString("TableDemo.eblue"));
+        NamedColor jfcblue     = new NamedColor(new Color(204, 204, 255), getString("TableDemo.jfcblue"));
+        NamedColor jfcblue2    = new NamedColor(new Color(153, 153, 204), getString("TableDemo.jfcblue2"));
+        NamedColor cybergreen  = new NamedColor(Color.green.darker().brighter(), getString("TableDemo.cybergreen"));
+        NamedColor darkgreen   = new NamedColor(new Color(0, 100, 75), getString("TableDemo.darkgreen"));
+        NamedColor forestgreen = new NamedColor(Color.green.darker(), getString("TableDemo.forestgreen"));
+        NamedColor gray        = new NamedColor(Color.gray, getString("TableDemo.gray"));
+        NamedColor green       = new NamedColor(Color.green, getString("TableDemo.green"));
+        NamedColor orange      = new NamedColor(new Color(255, 165, 0), getString("TableDemo.orange"));
+        NamedColor purple      = new NamedColor(new Color(160, 32, 240),  getString("TableDemo.purple"));
+        NamedColor red         = new NamedColor(Color.red, getString("TableDemo.red"));
+        NamedColor rustred     = new NamedColor(Color.red.darker(), getString("TableDemo.rustred"));
+        NamedColor sunpurple   = new NamedColor(new Color(100, 100, 255), getString("TableDemo.sunpurple"));
+        NamedColor suspectpink = new NamedColor(new Color(255, 105, 180), getString("TableDemo.suspectpink"));
+        NamedColor turquoise   = new NamedColor(new Color(0, 255, 255), getString("TableDemo.turquoise"));
+        NamedColor violet      = new NamedColor(new Color(238, 130, 238), getString("TableDemo.violet"));
+        NamedColor yellow      = new NamedColor(Color.yellow, getString("TableDemo.yellow"));
+
+        // Create the dummy data (a few rows of names)
+        final Object[][] data = {
+          {"Mike", "Albers",      green,       getString("TableDemo.brazil"), new Double(44.0), strawberry},
+          {"Mark", "Andrews",     blue,        getString("TableDemo.curse"), new Double(3), grapes},
+          {"Brian", "Beck",       black,       getString("TableDemo.bluesbros"), new Double(2.7182818285), raspberry},
+          {"Lara", "Bunni",       red,         getString("TableDemo.airplane"), new Double(15), strawberry},
+          {"Roger", "Brinkley",   blue,        getString("TableDemo.man"), new Double(13), peach},
+          {"Brent", "Christian",  black,       getString("TableDemo.bladerunner"), new Double(23), broccoli},
+          {"Mark", "Davidson",    darkgreen,   getString("TableDemo.brazil"), new Double(27), asparagus},
+          {"Jeff", "Dinkins",     blue,        getString("TableDemo.ladyvanishes"), new Double(8), kiwi},
+          {"Ewan", "Dinkins",     yellow,      getString("TableDemo.bugs"), new Double(2), strawberry},
+          {"Amy", "Fowler",       violet,      getString("TableDemo.reservoir"), new Double(3), raspberry},
+          {"Hania", "Gajewska",   purple,      getString("TableDemo.jules"), new Double(5), raspberry},
+          {"David", "Geary",      blue,        getString("TableDemo.pulpfiction"), new Double(3), watermelon},
+//        {"James", "Gosling",    pink,        getString("TableDemo.tennis"), new Double(21), donut},
+          {"Eric", "Hawkes",      blue,        getString("TableDemo.bladerunner"), new Double(.693), pickle},
+          {"Shannon", "Hickey",   green,       getString("TableDemo.shawshank"), new Double(2), grapes},
+          {"Earl", "Johnson",     green,       getString("TableDemo.pulpfiction"), new Double(8), carrot},
+          {"Robi", "Khan",        green,       getString("TableDemo.goodfellas"), new Double(89), apple},
+          {"Robert", "Kim",       blue,        getString("TableDemo.mohicans"), new Double(655321), strawberry},
+          {"Janet", "Koenig",     turquoise,   getString("TableDemo.lonestar"), new Double(7), peach},
+          {"Jeff", "Kesselman",   blue,        getString("TableDemo.stuntman"), new Double(17), pineapple},
+          {"Onno", "Kluyt",       orange,      getString("TableDemo.oncewest"), new Double(8), broccoli},
+          {"Peter", "Korn",       sunpurple,   getString("TableDemo.musicman"), new Double(12), sparegrass},
+
+          {"Rick", "Levenson",    black,       getString("TableDemo.harold"), new Double(1327), raspberry},
+          {"Brian", "Lichtenwalter", jfcblue,  getString("TableDemo.fifthelement"), new Double(22), pear},
+          {"Malini", "Minasandram", beige,     getString("TableDemo.joyluck"), new Double(9), corn},
+          {"Michael", "Martak",   green,       getString("TableDemo.city"), new Double(3), strawberry},
+          {"David", "Mendenhall", forestgreen, getString("TableDemo.schindlerslist"), new Double(7), peach},
+          {"Phil", "Milne",       suspectpink, getString("TableDemo.withnail"), new Double(3), banana},
+          {"Lynn", "Monsanto",    cybergreen,  getString("TableDemo.dasboot"), new Double(52), peach},
+          {"Hans", "Muller",      rustred,     getString("TableDemo.eraserhead"), new Double(0), pineapple},
+          {"Joshua", "Outwater",  blue,        getString("TableDemo.labyrinth"), new Double(3), pineapple},
+          {"Tim", "Prinzing",     blue,        getString("TableDemo.firstsight"), new Double(69), pepper},
+          {"Raj", "Premkumar",    jfcblue2,    getString("TableDemo.none"), new Double(7), broccoli},
+          {"Howard", "Rosen",     green,       getString("TableDemo.defending"), new Double(7), strawberry},
+          {"Ray", "Ryan",         black,       getString("TableDemo.buckaroo"),
+           new Double(3.141592653589793238462643383279502884197169399375105820974944), banana},
+          {"Georges", "Saab",     aqua,        getString("TableDemo.bicycle"), new Double(290), cantaloupe},
+          {"Tom", "Santos",       blue,        getString("TableDemo.spinaltap"), new Double(241), pepper},
+          {"Rich", "Schiavi",     blue,        getString("TableDemo.repoman"), new Double(0xFF), pepper},
+          {"Nancy", "Schorr",     green,       getString("TableDemo.fifthelement"), new Double(47), watermelon},
+          {"Keith", "Sprochi",    darkgreen,   getString("TableDemo.2001"), new Double(13), watermelon},
+          {"Matt", "Tucker",      eblue,       getString("TableDemo.starwars"), new Double(2), broccoli},
+          {"Dmitri", "Trembovetski", red,      getString("TableDemo.aliens"), new Double(222), tomato},
+          {"Scott", "Violet",     violet,      getString("TableDemo.raiders"), new Double(-97), banana},
+          {"Kathy", "Walrath",    darkgreen,   getString("TableDemo.thinman"), new Double(8), pear},
+          {"Nathan", "Walrath",   black,       getString("TableDemo.chusingura"), new Double(3), grapefruit},
+          {"Steve", "Wilson",     green,       getString("TableDemo.raiders"), new Double(7), onion},
+          {"Kathleen", "Zelony",  gray,        getString("TableDemo.dog"), new Double(13), grapes}
+        };
+
+        // Create a model of the data.
+        TableModel dataModel = new AbstractTableModel() {
+            public int getColumnCount() { return names.length; }
+            public int getRowCount() { return data.length;}
+            public Object getValueAt(int row, int col) {return data[row][col];}
+            public String getColumnName(int column) {return names[column];}
+            public Class getColumnClass(int c) {return getValueAt(0, c).getClass();}
+            public boolean isCellEditable(int row, int col) {return col != 5;}
+            public void setValueAt(Object aValue, int row, int column) { data[row][column] = aValue; }
+         };
+
+
+        // Create the table
+        tableView = new JTable(dataModel);
+        TableRowSorter sorter = new TableRowSorter(dataModel);
+        tableView.setRowSorter(sorter);
+
+        // Show colors by rendering them in their own color.
+        DefaultTableCellRenderer colorRenderer = new DefaultTableCellRenderer() {
+            public void setValue(Object value) {
+                if (value instanceof NamedColor) {
+                    NamedColor c = (NamedColor) value;
+                    setBackground(c);
+                    setForeground(c.getTextColor());
+                    setText(c.toString());
+                } else {
+                    super.setValue(value);
+                }
+            }
+        };
+
+        // Create a combo box to show that you can use one in a table.
+        JComboBox comboBox = new JComboBox();
+        comboBox.addItem(aqua);
+        comboBox.addItem(beige);
+        comboBox.addItem(black);
+        comboBox.addItem(blue);
+        comboBox.addItem(eblue);
+        comboBox.addItem(jfcblue);
+        comboBox.addItem(jfcblue2);
+        comboBox.addItem(cybergreen);
+        comboBox.addItem(darkgreen);
+        comboBox.addItem(forestgreen);
+        comboBox.addItem(gray);
+        comboBox.addItem(green);
+        comboBox.addItem(orange);
+        comboBox.addItem(purple);
+        comboBox.addItem(red);
+        comboBox.addItem(rustred);
+        comboBox.addItem(sunpurple);
+        comboBox.addItem(suspectpink);
+        comboBox.addItem(turquoise);
+        comboBox.addItem(violet);
+        comboBox.addItem(yellow);
+
+        TableColumn colorColumn = tableView.getColumn(getString("TableDemo.favorite_color"));
+        // Use the combo box as the editor in the "Favorite Color" column.
+        colorColumn.setCellEditor(new DefaultCellEditor(comboBox));
+
+        colorRenderer.setHorizontalAlignment(JLabel.CENTER);
+        colorColumn.setCellRenderer(colorRenderer);
+
+        tableView.setRowHeight(INITIAL_ROWHEIGHT);
+
+        scrollpane = new JScrollPane(tableView);
+        return scrollpane;
+    }
+
+    private void printTable() {
+        MessageFormat headerFmt;
+        MessageFormat footerFmt;
+        JTable.PrintMode printMode = fitWidth.isSelected() ?
+                                     JTable.PrintMode.FIT_WIDTH :
+                                     JTable.PrintMode.NORMAL;
+
+        String text;
+        text = headerTextField.getText();
+        if (text != null && text.length() > 0) {
+            headerFmt = new MessageFormat(text);
+        } else {
+            headerFmt = null;
+        }
+
+        text = footerTextField.getText();
+        if (text != null && text.length() > 0) {
+            footerFmt = new MessageFormat(text);
+        } else {
+            footerFmt = null;
+        }
+
+        try {
+            boolean status = tableView.print(printMode, headerFmt, footerFmt);
+
+            if (status) {
+                JOptionPane.showMessageDialog(tableView.getParent(),
+                                              getString("TableDemo.printingComplete"),
+                                              getString("TableDemo.printingResult"),
+                                              JOptionPane.INFORMATION_MESSAGE);
+            } else {
+                JOptionPane.showMessageDialog(tableView.getParent(),
+                                              getString("TableDemo.printingCancelled"),
+                                              getString("TableDemo.printingResult"),
+                                              JOptionPane.INFORMATION_MESSAGE);
+            }
+        } catch (PrinterException pe) {
+            String errorMessage = MessageFormat.format(getString("TableDemo.printingFailed"),
+                                                       new Object[] {pe.getMessage()});
+            JOptionPane.showMessageDialog(tableView.getParent(),
+                                          errorMessage,
+                                          getString("TableDemo.printingResult"),
+                                          JOptionPane.ERROR_MESSAGE);
+        } catch (SecurityException se) {
+            String errorMessage = MessageFormat.format(getString("TableDemo.printingFailed"),
+                                                       new Object[] {se.getMessage()});
+            JOptionPane.showMessageDialog(tableView.getParent(),
+                                          errorMessage,
+                                          getString("TableDemo.printingResult"),
+                                          JOptionPane.ERROR_MESSAGE);
+        }
+    }
+
+    class NamedColor extends Color {
+        String name;
+        public NamedColor(Color color, String name) {
+            super(color.getRGB());
+            this.name = name;
+        }
+
+        public Color getTextColor() {
+            int r = getRed();
+            int g = getGreen();
+            int b = getBlue();
+            if(r > 240 || g > 240) {
+                return Color.black;
+            } else {
+                return Color.white;
+            }
+        }
+
+        public String toString() {
+            return name;
+        }
+    }
+
+    class ColumnLayout implements LayoutManager {
+        int xInset = 5;
+        int yInset = 5;
+        int yGap = 2;
+
+        public void addLayoutComponent(String s, Component c) {}
+
+        public void layoutContainer(Container c) {
+            Insets insets = c.getInsets();
+            int height = yInset + insets.top;
+
+            Component[] children = c.getComponents();
+            Dimension compSize = null;
+            for (int i = 0; i < children.length; i++) {
+                compSize = children[i].getPreferredSize();
+                children[i].setSize(compSize.width, compSize.height);
+                children[i].setLocation( xInset + insets.left, height);
+                height += compSize.height + yGap;
+            }
+
+        }
+
+        public Dimension minimumLayoutSize(Container c) {
+            Insets insets = c.getInsets();
+            int height = yInset + insets.top;
+            int width = 0 + insets.left + insets.right;
+
+            Component[] children = c.getComponents();
+            Dimension compSize = null;
+            for (int i = 0; i < children.length; i++) {
+                compSize = children[i].getPreferredSize();
+                height += compSize.height + yGap;
+                width = Math.max(width, compSize.width + insets.left + insets.right + xInset*2);
+            }
+            height += insets.bottom;
+            return new Dimension( width, height);
+        }
+
+        public Dimension preferredLayoutSize(Container c) {
+            return minimumLayoutSize(c);
+        }
+
+        public void removeLayoutComponent(Component c) {}
+    }
+
+    void updateDragEnabled(boolean dragEnabled) {
+        tableView.setDragEnabled(dragEnabled);
+        headerTextField.setDragEnabled(dragEnabled);
+        footerTextField.setDragEnabled(dragEnabled);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/TextAndMnemonicUtils.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,193 @@
+/*
+ *
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its contributors may be used to
+ * endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.io.IOException;
+import java.util.Properties;
+import java.util.ResourceBundle;
+
+/**
+ * <code>TextAndMnemonicUtils</code> allows to extract text and mnemonic values
+ * from the unified text & mnemonic strings. For example:
+ *   LafMenu.laf.labelAndMnemonic=&Look && Feel
+ * The extracted text is "Look & Feel" and the extracted mnemonic mnemonic is "L".
+ *
+ * There are several patterns for the text and mnemonic suffixes which are used
+ * in the resource file. The patterns format is:
+ * (resource key -> unified text & mnemonic resource key).
+ *
+ * Keys that have label suffixes:
+ * (xxx_label -> xxx.labelAndMnemonic)
+ *
+ * Keys that have mnemonic suffixes:
+ * (xxx_mnemonic -> xxx.labelAndMnemonic)
+ *
+ * Keys that do not have definite suffixes:
+ * (xxx -> xxx.labelAndMnemonic)
+ *
+ * @author Alexander Scherbatiy
+ */
+public class TextAndMnemonicUtils {
+
+    // Label suffix for the text & mnemonic resource
+    private static final String LABEL_SUFFIX = ".labelAndMnemonic";
+
+    // Resource bundle for internationalized and accessible text
+    private static ResourceBundle bundle = null;
+
+    // Resource properties for the mnemonic key defenition
+    private static Properties properties = null;
+
+    static {
+        bundle = ResourceBundle.getBundle("resources.swingset");
+        properties = new Properties();
+        try {
+            properties.load(TextAndMnemonicUtils.class.getResourceAsStream("resources/swingset.properties"));
+        } catch (IOException ex) {
+            System.out.println("java.io.IOException: Couldn't load properties from: resources/swingset.properties");
+        }
+    }
+
+    /**
+     * Returns accessible and internationalized strings or mnemonics from the
+     * resource bundle. The key is converted to the text & mnemonic key.
+     *
+     * The following patterns are checked:
+     * Keys that have label suffixes:
+     * (xxx_label -> xxx.labelAndMnemonic)
+     *
+     * Keys that have mnemonic suffixes:
+     * (xxx_mnemonic -> xxx.labelAndMnemonic)
+     *
+     * Keys that do not have definite suffixes:
+     * (xxx -> xxx.labelAndMnemonic)
+     *
+     * Properties class is used to check if a key created for mnemonic exists.
+     */
+    public static String getTextAndMnemonicString(String key) {
+
+        if (key.endsWith("_label")) {
+            String compositeKey = composeKey(key, 6, LABEL_SUFFIX);
+            String textAndMnemonic = bundle.getString(compositeKey);
+            return getTextFromTextAndMnemonic(textAndMnemonic);
+        }
+
+        if (key.endsWith("_mnemonic")) {
+
+            String compositeKey = composeKey(key, 9, LABEL_SUFFIX);
+            Object value = properties.getProperty(compositeKey);
+
+            if (value != null) {
+                String textAndMnemonic = bundle.getString(compositeKey);
+                return getMnemonicFromTextAndMnemonic(textAndMnemonic);
+            }
+
+        }
+
+        String compositeKey = composeKey(key, 0, LABEL_SUFFIX);
+        Object value = properties.getProperty(compositeKey);
+
+        if (value != null) {
+            String textAndMnemonic = bundle.getString(compositeKey);
+            return getTextFromTextAndMnemonic(textAndMnemonic);
+        }
+
+        String textAndMnemonic = bundle.getString(key);
+        return getTextFromTextAndMnemonic(textAndMnemonic);
+    }
+
+    /**
+     * Convert the text & mnemonic string to text string
+     *
+     * The '&' symbol is treated as the mnemonic pointer
+     * The double "&&" symbols are treated as the single '&'
+     *
+     * For example the string "&Look && Feel" is converted to "Look & Feel"
+     */
+    public static String getTextFromTextAndMnemonic(String text) {
+
+        StringBuilder sb = new StringBuilder();
+
+        int prevIndex = 0;
+        int nextIndex = text.indexOf('&');
+        int len = text.length();
+
+        while (nextIndex != -1) {
+
+            String s = text.substring(prevIndex, nextIndex);
+            sb.append(s);
+
+            nextIndex++;
+
+            if (nextIndex != len && text.charAt(nextIndex) == '&') {
+                sb.append('&');
+                nextIndex++;
+            }
+
+            prevIndex = nextIndex;
+            nextIndex = text.indexOf('&', nextIndex + 1);
+        }
+
+        sb.append(text.substring(prevIndex, text.length()));
+        return sb.toString();
+    }
+
+    /**
+     * Convert the text & mnemonic string to mnemonic
+     *
+     * The '&' symbol is treated the mnemonic pointer
+     * The double "&&" symbols are treated as the single '&'
+     *
+     * For example the string "&Look && Feel" is converted to "L"
+     */
+    public static String getMnemonicFromTextAndMnemonic(String text) {
+        int len = text.length();
+        int index = text.indexOf('&');
+
+        while (0 <= index && index < text.length() - 1) {
+            index++;
+            if (text.charAt(index) == '&') {
+                index = text.indexOf('&', index + 1);
+            } else {
+                char c = text.charAt(index);
+                return String.valueOf(Character.toUpperCase(c));
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Removes the last n characters and adds the suffix
+     */
+    private static String composeKey(String key, int reduce, String sufix) {
+        return key.substring(0, key.length() - reduce) + sufix;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/ToolTipDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,160 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.border.*;
+import javax.swing.colorchooser.*;
+import javax.swing.filechooser.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * ToolTip Demo
+ *
+ * @author Jeff Dinkins
+ */
+public class ToolTipDemo extends DemoModule {
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        ToolTipDemo demo = new ToolTipDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * ToolTipDemo Constructor
+     */
+    public ToolTipDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "ToolTipDemo", "toolbar/ToolTip.gif");
+
+        // Set the layout manager.
+        JPanel p = getDemoPanel();
+        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
+        p.setBackground(Color.white);
+
+        // Create a Cow to put in the center of the panel.
+        Cow cow = new Cow();
+        cow.getAccessibleContext().setAccessibleName(getString("ToolTipDemo.accessible_cow"));
+
+        // Set the tooltip text. Note, for fun, we also set more tooltip text
+        // descriptions for the cow down below in the Cow.contains() method.
+        cow.setToolTipText(getString("ToolTipDemo.cow"));
+
+        // Add the cow midway down the panel
+        p.add(Box.createRigidArea(new Dimension(1, 150)));
+        p.add(cow);
+    }
+
+
+    class Cow extends JLabel {
+        Polygon cowgon = new Polygon();
+
+        public Cow() {
+            super(createImageIcon("tooltip/cow.gif", getString("ToolTipDemo.bessie")));
+            setAlignmentX(CENTER_ALIGNMENT);
+
+            // Set polygon points that define the outline of the cow.
+            cowgon.addPoint(3,20);    cowgon.addPoint(44,4);
+            cowgon.addPoint(79,15);   cowgon.addPoint(130,11);
+            cowgon.addPoint(252,5);   cowgon.addPoint(181,17);
+            cowgon.addPoint(301,45);  cowgon.addPoint(292,214);
+            cowgon.addPoint(269,209); cowgon.addPoint(266,142);
+            cowgon.addPoint(250,161); cowgon.addPoint(235,218);
+            cowgon.addPoint(203,206); cowgon.addPoint(215,137);
+            cowgon.addPoint(195,142); cowgon.addPoint(143,132);
+            cowgon.addPoint(133,189); cowgon.addPoint(160,200);
+            cowgon.addPoint(97,196);  cowgon.addPoint(107,182);
+            cowgon.addPoint(118,185); cowgon.addPoint(110,144);
+            cowgon.addPoint(59,77);   cowgon.addPoint(30,82);
+            cowgon.addPoint(30,35);   cowgon.addPoint(15,36);
+        }
+
+        boolean moo = false;
+        boolean milk = false;
+        boolean tail = false;
+
+        // Use the contains method to set the tooltip text depending
+        // on where the mouse is over the cow.
+        public boolean contains(int x, int y) {
+            if(!cowgon.contains(new Point(x, y))) {
+                return false;
+            }
+
+            if((x > 30) && (x < 60) && (y > 60) && (y < 85)) {
+                if(!moo) {
+                    setToolTipText("<html><center><font color=blue size=+2>" +
+                                   getString("ToolTipDemo.moo") + "</font></center></html>");
+                    moo = true;
+                    milk = false;
+                    tail = false;
+                }
+            } else if((x > 150) && (x < 260) && (y > 90) && (y < 145)) {
+                if(!milk) {
+                    setToolTipText("<html><center><font face=AvantGarde size=+1 color=#D2691E>" +
+                                   getString("ToolTipDemo.got_milk") + "</font></center></html>");
+                    milk = true;
+                    moo = false;
+                    tail = false;
+                }
+            } else if((x > 280) && (x < 300) && (y > 20) && (y < 175)) {
+                if(!tail) {
+                    setToolTipText("<html><em><b>" + getString("ToolTipDemo.tail") + "</b></em></html>");
+                    tail = true;
+                    moo = false;
+                    milk = false;
+                }
+            } else if(moo || milk || tail) {
+                setToolTipText(getString("ToolTipDemo.tooltip_features"));
+                moo = false;
+                tail = false;
+                milk = false;
+            }
+
+            return true;
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/TreeDemo.java	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,138 @@
+/*
+ *
+ * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.tree.*;
+import javax.accessibility.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.beans.*;
+import java.util.*;
+import java.io.*;
+import java.applet.*;
+import java.net.*;
+
+/**
+ * JTree Demo
+ *
+ * @author Jeff Dinkins
+ */
+public class TreeDemo extends DemoModule {
+
+    JTree tree;
+
+    /**
+     * main method allows us to run as a standalone demo.
+     */
+    public static void main(String[] args) {
+        TreeDemo demo = new TreeDemo(null);
+        demo.mainImpl();
+    }
+
+    /**
+     * TreeDemo Constructor
+     */
+    public TreeDemo(SwingSet2 swingset) {
+        // Set the title for this demo, and an icon used to represent this
+        // demo inside the SwingSet2 app.
+        super(swingset, "TreeDemo", "toolbar/JTree.gif");
+
+        getDemoPanel().add(createTree(), BorderLayout.CENTER);
+    }
+
+    public JScrollPane createTree() {
+        DefaultMutableTreeNode top = new DefaultMutableTreeNode(getString("TreeDemo.music"));
+        DefaultMutableTreeNode catagory = null ;
+        DefaultMutableTreeNode artist = null;
+        DefaultMutableTreeNode record = null;
+
+        // open tree data
+        URL url = getClass().getResource("/resources/tree.txt");
+
+        try {
+            // convert url to buffered string
+            InputStream is = url.openStream();
+            InputStreamReader isr = new InputStreamReader(is, "UTF-8");
+            BufferedReader reader = new BufferedReader(isr);
+
+            // read one line at a time, put into tree
+            String line = reader.readLine();
+            while(line != null) {
+                // System.out.println("reading in: ->" + line + "<-");
+                char linetype = line.charAt(0);
+                switch(linetype) {
+                   case 'C':
+                     catagory = new DefaultMutableTreeNode(line.substring(2));
+                     top.add(catagory);
+                     break;
+                   case 'A':
+                     if(catagory != null) {
+                         catagory.add(artist = new DefaultMutableTreeNode(line.substring(2)));
+                     }
+                     break;
+                   case 'R':
+                     if(artist != null) {
+                         artist.add(record = new DefaultMutableTreeNode(line.substring(2)));
+                     }
+                     break;
+                   case 'S':
+                     if(record != null) {
+                         record.add(new DefaultMutableTreeNode(line.substring(2)));
+                     }
+                     break;
+                   default:
+                     break;
+                }
+                line = reader.readLine();
+            }
+        } catch (IOException e) {
+        }
+
+        tree = new JTree(top) {
+            public Insets getInsets() {
+                return new Insets(5,5,5,5);
+            }
+        };
+
+        tree.setEditable(true);
+
+        return new JScrollPane(tree);
+    }
+
+    void updateDragEnabled(boolean dragEnabled) {
+        tree.setDragEnabled(dragEnabled);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/resources/ant.html	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,121 @@
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<h1 align="center"><br>
+  Observ. XLIX. Of an Ant or Pismire.<br>
+</h1>
+<p align="center"><img src="images/Octavo/ant.jpg" width="481" height="325"></p>
+<p align="center">&nbsp;</p>
+<blockquote> 
+  <blockquote>
+   <p><font size="4">This was a creature, more troublesom to be drawn, then any 
+      of the rest, for I could not, for a good while, think of a way to make it 
+      suffer its body to ly quiet in a natural posture; but whil'st it was alive,
+      if its feet were fetter'd in Wax or Glew, it would so twist and wind its body, 
+      that I could not any wayes get a good view of it; and if I killed it, its 
+      body was so little, that I did often spoile the shape of it, before I could 
+      throughly view it: for this is the nature of these minute Bodies, that as 
+      soon, almost, as ever their life is destroy'd, their parts immediately shrivel, 
+      and lose their beauty; and so is it also with small Plants, as I instanced 
+      before, in the description of Moss. </font></p>
+    <p><font size="4">And thence also is the reason of the variations in the beards 
+      of wild Oats, and in those of Muskgrass seed, that their bodies, being exceeding 
+      small, those small variations which are made in the surfaces of all bodies, 
+      almost upon every change of Air, especially if the body be porous, do here 
+      become sensible, where the whole body is so small, that it is almost nothing 
+      but surface; for as in vegetable substances, I see no great reason to think, 
+      that the moisture of the Aire (that, sticking to a wreath'd beard, does make 
+      it untwist) should evaporate, or exhale away, any faster then the moisture 
+      of other bodies, but rather that the avolation from, or access of moisture 
+      to, the surfaces of bodies being much the same, those bodies become most 
+      sensible of it, which have the least proportion of body to their surface. 
+      </font></p>
+    <p><font size="4">So is it also with Animal substances; the dead body of an 
+      Ant, or such little creature, does almost instantly shrivel and dry, and 
+      your object shall be quite another thing, before you can half delineate 
+      it, which proceeds not from the extraordinary exhalation, but from the small 
+      proportion of body and juices, to the usual drying of bodies in the Air, 
+      especially if warm. </font></p>
+    <p><font size="4">For which inconvenience, where I could not otherwise remove 
+      it, I thought of this expedient. I took the creature, I had design'd to delineate, 
+      and put it into a drop of very well rectified spirit of Wine, this I found 
+      would presently dispatch, as it were, the Animal, and being taken out of 
+      it, and lay'd on a paper,the spirit of Wine would immediately fly away, 
+      and leave the Animal dry, in its natural posture, or at least, in a constitution, 
+      that it might easily with a pin be plac'd, in what posture you desired to 
+      draw it, and the limbs would so remain, without either moving, or shriveling. 
+      </font></p>
+    <p><font size="4">And thus I dealt with this Ant, which I have here delineated, 
+      which was one of many, of a very large kind, that inhabited under the Roots 
+      of a Tree, from whence they would sally out in great parties, and make most 
+      grievous havock of the Flowers and Fruits, in the ambient Garden, and return back 
+      again very expertly, by the same wayes and paths they went. </font></p>
+    <p><font size="4">It was more then half the bigness of an Earwig, of a dark 
+      brown, or reddish colour, with long legs, on the hinder of which it would 
+      stand up, and raise its head as high as it could above the ground, that it 
+      might stare the further about it, just after the same manner as I have also 
+      observ'd a hunting Spider to do: and putting my finger towards them, they 
+      have at first all run towards it, till almost at it; and then they would stand 
+      round about it, at a certain distance, and smell, as it were, and consider 
+      whether they should any of them venture any further, till one more bold then 
+      the rest venturing to climb it, all the rest, if I would have suffered them, 
+      would have immediately followed : much such other seemingly rational actions 
+      I have observ'd in this little Vermine with much pleasure, which would be 
+      too long to be here related; those that desire more of them may satisfie 
+      their curiosity in Ligons History of the Barbadoes. </font></p>
+    <p><font size="4">Having insnar'd several of these into a small Box, I made 
+      choice of the tallest grown among them, and separating it from the rest, 
+      I gave it a Gill of Brandy, or Spirit of Wine, which after a while e'en knock'd 
+      him down dead drunk, so that he became moveless, though at first putting 
+      in he struggled for a pretty while very much, till at last, certain bubbles 
+      issuing out of his mouth, it ceased to move; this (because I had before found 
+      them quickly to recover again, if they were taken out presently) I suffered 
+      to lye above an hour in the Spirit; and after I had taken it out, and put 
+      its body and legs into a natural posture, remained moveless about an hour; 
+      but then, upon a sudden, as if it had been awaken out of a drunken sleep, 
+      it suddenly reviv'd and ran away; being caught, and serv'd as before, he 
+      for a while continued struggling and striving, till at last there issued 
+      several bubbles out of its mouth, and then, tanquam animam expirasset, he 
+      remained moveless for a good while ; but at length again recovering, it was 
+      again redipt, and suffered to lye some hours in the Spirit; notwithstanding 
+      which, after it had layen dry some three or four hours, it again recovered 
+      life and motion: Which kind of Experiments, if prosecuted, which they highly 
+      deserve, seem to me of no inconsiderable use towards the invention of the 
+      Latent Scheme, (as the Noble Ve rulam calls it) or the hidden, unknown Texture 
+      of Bodies. </font></p>
+    <p><font size="4">Of what Figure this Creature appear'd through the Microscope, 
+      the 32. Scheme (though not so carefully graven as it ought) will represent 
+      to the eye, namely, That it had a large head A A, at the upper end of which 
+      were two protuberant eyes, pearl'd like those of a Fly, but smaller B B; 
+      of the Nose, or foremost part, issued two horns C C, of a shape sufficiently 
+      differing from those of a blew Fly, though indeed they seem to be both the 
+      same kind of Organ, and to serve for a kind of smelling; beyond these were 
+      two indented jaws D D, which he open'd sideways, and was able to gape them 
+      asunder very wide; and the ends of them being armed with teeth, which meeting 
+      went between each other, it was able to grasp and hold a heavy body, three 
+      or four times the bulk and weight of its own body: It had only six legs, 
+      shap'd like those of a Fly, which, as I shewed before, is an Argument that 
+      it is a winged Insect, and though I could not perceive any sign of them in 
+      the middle part of its body (which seem'd to consist of three joints or pieces 
+      E F G, out of which sprung two legs, yet 'tis known that there are of them 
+      that have long wings, and fly up and down in the air. </font></p>
+    <p><font size="4">The third and last part of its body I I I was bigger and 
+      larger then the other two, unto which it was joyn'd by a very small middle, 
+      and had a kind of loose shell, or another distinct part of its body H, which 
+      seem'd to be interpos'd, and to keep the thorax and belly from touching. 
+      The whole body was cas'd over with a very strong armour, and the belly I 
+      I I was covered likewise with multitudes of small white shining brisles; 
+      the legs, horns, head, and middle parts of its body were bestruck with hairs 
+      also, but smaller and darker. </font></p>
+  </blockquote>
+  <p>&nbsp;</p>
+  <p><a href="seaweed.html"><img src="images/htmldemo/back.jpg" width="146" height="40" align="left" border="0"></a><a href="bug.html"><img src="images/htmldemo/forward.jpg" width="196" height="40" align="right" border="0"></a></p>
+  <p>&nbsp;</p>
+  <p>&nbsp;</p>
+</blockquote>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/resources/bug.html	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,128 @@
+<html>
+<head>
+<title>Untitled Document</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF">
+<br>
+<h1 align="center">Observ. LIV. Of a Louse.<br>
+</h1>
+<p align="center"><img src="images/Octavo/bug.jpg" width="516" height="445"></p>
+<p align="center">&nbsp;</p>
+<blockquote> 
+  <blockquote> 
+    <p><font size="4">This is a Creature so officious, that 'twill be known to 
+      every one at one time or other, so busie, and so impudent, that it will 
+      be intruding it self in every ones company, and so proud and aspiring withall, 
+      that it fears not to trample on the best, and affects nothing so much as 
+      a Crown; feeds and lives very high, and that makes it so saucy, as to pull 
+      any one by the ears that comes in its way, and will never be quiet till 
+      it has drawn blood: it is troubled at nothing so much as at a man that scratches 
+      his head, as knowing that man is plotting and contriving some mischief against 
+      it, and that makes it oftentime sculk into some meaner and lower place, and 
+      run behind a mans back, though it go very much against the hair; which ill 
+      conditions of it having made it better known then trusted, would exempt me 
+      from making any further description of it, did not my faithful Mercury, my 
+      Microscope, bring me other information of it. </font></p>
+    <p><font size="4">For this has discovered to me, by means of a very bright light 
+      cast on it, that it is a Creature of a very odd shape ; it has a head shap'd 
+      like that exprest in 35. Scheme marked with A, which seems almost Conical, 
+      but is a little flatted on the upper and under sides, at the biggest part 
+      of which, on either side behind the head (as it were, being the place where 
+      other Creatures ears stand) are placed its two black shining goggle eyes 
+      B B, looking backwards, and fenced round with several small cilia or hairs 
+      that incompass it, so that it seems this Creature has no very good foresight: 
+      It does not seem to have any eyelids, and therefore perhaps its eyes were 
+      so placed, that it might the better cleanse them with its forelegs; and perhaps 
+      this may be the reason, why they so much avoid and run from the light behind 
+      them, for being made to live in the shady and dark recesses of the hair, 
+      and thence probably their eye having a great aperture, the open and clear 
+      light, especially that of the Sun, must needs very much offend them; to secure 
+      these eyes from receiving any injury from the hairs through which it passes, 
+      it has two horns that grow before it, in the place where one would have thought 
+      the eyes should be; each of these C C have four joynts, which are fringed, 
+      as 'twere, with small brisles, from which to the tip of its snout D, the 
+      head seems very round and tapering, ending in a very sharp nose D, which 
+      seems to have a small hole, and to be the passage through which he sucks 
+      the blood. </font></p>
+    <p>&nbsp;</p>
+    <p><img src="images/Octavo/bug2.jpg" width="537" height="348"></p>
+    <p><font size="4">Now whereas it if be plac'd on its back, with its belly 
+      upwards, as it is in the 35. Scheme, it seems in several Positions to have 
+      a resemblance of chaps, or jaws, as is represented in the Figure by E E, 
+      yet in other postures those dark strokes disappear; and having kept several 
+      of them in a box for two or three dayes, so that for all that time they had 
+      nothing to feed on, I found, upon letting onecreep on my hand, that it immediately 
+      fell to sucking, and did neither seem to thrust its nose very deep into the 
+      skin, nor to open any kind of mouth, but I could plainly perceive a small 
+      current of blood, which came directly from its snout, and past into its belly; 
+      and about A there seem'd a contrivance, somewhat resembling a Pump, pair 
+      of Bellows, or Heart, for by a very swift systole and diastole the blood 
+      seem'd drawn from the nose, and forced into the body. </font></p>
+    <p><font size="4">It did not seem at all, though I viewed it a good while as 
+      it was sucking, to thrust more of its nose into the skin then the very snout 
+      D, nor did it cause the least discernable pain, and yet the blood seem'd 
+      to run through its head very quick and freely, so that it seems there is 
+      no part of the skin but the blood is dispers'd into, nay, even into the 
+      cuticula; for had it thrust its whole nose in from D to C C, it would not 
+      have amounted to the supposed thickness of that tegument, the length of 
+      the nose being not more then a three hundredth part of an inch. </font></p>
+    <p><font size="4">It has six legs, covered with a very transparent shell, 
+      and joynted exactly like a Crab's, or Lobster's; each leg is divided into 
+      six parts by these joynts, and those have here and there several small hairs; 
+      and at the end of each leg it has two claws, very properly adapted for its 
+      peculiar use, being thereby inabled to walk very securely both on the skin 
+      and hair; and indeed this contrivance of the feet is very curious, and could 
+      not be made more commodiously and compendiously, for performing both these 
+      requisite motions, of walking and climbing up the hair of a mans head, then 
+      it is : for, by having the lesser claw (a) set so much short of the bigger 
+      (b) when it walks on the skin the shorter touches not, and then the feet 
+      are the same with those of a Mite, and several other small Insects, but by 
+      means of the small joynts of the longer claw it can bend it round, and so 
+      with both claws take hold of a hair, in the manner represented in the Figure, 
+      the long transparent Cylinder F F F, being a Man's hair held by it. </font></p>
+    <p><font size="4">The Thorax seem'd cas'd with another kind of substance then 
+      the belly, namely, with a thin transparent horny substance, which upon the fasting 
+      of the Creature did not grow flaccid; through this I could plainly see the 
+      blood, suck'd from my hand, to be variously distributed, and mov'd to and 
+      fro; and about G there seem'd a pretty big white substance, which seem'd 
+      to be moved within its thorax; besides, there appear'd very many small milk-white 
+      vessels, which crost over the breast between the legs, out of which, on 
+      either side, are many small branchings, these seem'd to be the veins and 
+      arteries, for that which is analogus to blood in all Insects is milk-white. 
+      </font></p>
+    <p><font size="4">The belly is covered with a transparent substance likewise, 
+      but more resembling a skin then a shell, for 'tis grain'd all over the belly 
+      just like the skin in the palms of a man's hand, and when the belly is empty, 
+      grows very flaccid and wrinkled ; at the upper end of this is placed the 
+      stomach H H, and perhaps also the white spot I I may be the liver, or pancreas, 
+      which by the peristaltick motion of the guts, is a little mov'd to and fro, 
+      not with a systole and diastole, but rather with a thronging or justling 
+      motion. </font></p>
+    <p><font size="4">Viewing one of these Creatures, after it had fasted two 
+      dayes, all the hinder part was lank and flaccid, and the white spot I I 
+      hardly mov'd, most of the white branchings disappear'd, and most also of 
+      the redness or sucked blood in the guts, the peristaltick motion of which 
+      was scarce discernable; but upon the suffering it to suck, it presently 
+      fill'd the skin of the belly, and of the six scolop'd embosments on either side, 
+      as full as it could be stuft ; the stomach and guts were as full as they 
+      could hold; the peristaltick motion of the gut grew quick, and the justling 
+      motion of I I accordingly ; multitudes of milk-white vessels seem'd quickly 
+      filled, and turgid, which were perhaps the veins and arteries, and the Creature 
+      was so greedy, that though it could not contain more, yet it continued sucking 
+      as fast as ever, and as fast emptying it self behind : the digestion of this 
+      Creature must needs be very quick, for though I perceiv'd the blood thicker 
+      and blacker when suck'd, yet, when in the guts, it was of a very lovely 
+      ruby colour, and that part of it, which was digested into the veins, seemed 
+      white; whence it appears, that a further digestion of blood may make it 
+      milk, at least of a resembling colour : What is else observable in the figure 
+      of this Creature, maybe seen by the 35. Scheme.</font></p>
+    </blockquote>
+  <p>&nbsp;</p>
+  <p><a href="ant.html"><img src="images/htmldemo/back.jpg" width="146" height="40" align="left" border="0"></a><a href="index.html"><img src="images/htmldemo/forward.jpg" width="196" height="40" align="right" border="0"></a></p>
+  <p>&nbsp;</p>
+  <p>&nbsp;</p>
+</blockquote>
+</body>
+</html>
Binary file src/demo/share/jfc/SwingSet2/resources/images/About.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/SwingSet2/resources/images/Octavo/CREDITS	Fri Mar 23 13:43:39 2018 -0700
@@ -0,0 +1,2 @@
+Images and text in the SwingSet html demo are used by permission of Octavo
+Corporation and are sourced from Rare Book Room (rarebookroom.org).
Binary file src/demo/share/jfc/SwingSet2/resources/images/Octavo/ant.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/Octavo/book.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/Octavo/bug.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/Octavo/bug2.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/Octavo/crest.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/Octavo/king.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/Octavo/micro.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/Octavo/seaweed.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b1.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b1d.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b1p.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b1r.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b2.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b2d.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b2p.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b2r.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b3.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b3d.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b3p.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/b3r.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/bl.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/bldn.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/bm.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/bmdn.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/br.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/brdn.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/c.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/cb.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/cbr.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/cbrs.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/cbs.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/cdn.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/ml.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/mldn.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/mr.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/mrdn.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/rb.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/rbp.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/rbr.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/rbrs.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/rbs.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/tl.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/tldn.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/tm.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/tmdn.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/toggle.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/toggledn.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/tr.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/buttons/trdn.gif has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/combobox/brenteyes.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/combobox/brenthair.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/combobox/brentmouth.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/combobox/georgeseyes.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/combobox/georgeshair.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/combobox/georgesmouth.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/combobox/hanseyes.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/combobox/hanshair.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/combobox/hansmouth.jpg has changed
Binary file src/demo/share/jfc/SwingSet2/resources/images/combobox/howardeyes.jpg