Merge
authorlana
Thu, 10 Dec 2009 09:50:09 -0800
changeset 4395 35a852e373c5
parent 4377 1411f4ebf52e (current diff)
parent 4394 92a8ec883f5d (diff)
child 4396 d78c0cb4baf7
Merge
jdk/src/share/classes/javax/swing/plaf/synth/DefaultMenuLayout.java
jdk/src/share/classes/sun/swing/plaf/synth/SynthUI.java
--- a/jdk/make/javax/sound/Makefile	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/make/javax/sound/Makefile	Thu Dec 10 09:50:09 2009 -0800
@@ -108,22 +108,14 @@
 endif # PLATFORM linux
 
 ifeq ($(PLATFORM), solaris)
-  ifneq ($(ARCH), amd64)
-    # build with ports and direct audio
-    CPPFLAGS += -DUSE_PORTS=TRUE 	\
-                -DUSE_DAUDIO=TRUE
+  # build with ports and direct audio
+  CPPFLAGS += -DUSE_PORTS=TRUE 	\
+              -DUSE_DAUDIO=TRUE
 
-    INCLUDE_PORTS = TRUE
-    INCLUDE_DAUDIO = TRUE
-    INCLUDE_MIDI = TRUE
-  else
-    # build with empty MIDI i/o
-    INCLUDE_MIDI = TRUE
-    # build with empty ports
-    INCLUDE_PORTS = TRUE
-    # build with empty direct audio
-    INCLUDE_DAUDIO = TRUE
-  endif
+  INCLUDE_PORTS = TRUE
+  INCLUDE_DAUDIO = TRUE
+  # build with empty MIDI i/o
+  INCLUDE_MIDI = TRUE
 endif # PLATFORM solaris
 
 # for dynamic inclusion of extra sound libs: these
--- a/jdk/src/share/classes/com/sun/beans/WeakCache.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/com/sun/beans/WeakCache.java	Thu Dec 10 09:50:09 2009 -0800
@@ -81,4 +81,11 @@
             this.map.remove(key);
         }
     }
+
+    /**
+     * Removes all of the mappings from this cache.
+     */
+    public void clear() {
+        this.map.clear();
+    }
 }
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java	Thu Dec 10 09:50:09 2009 -0800
@@ -24,7 +24,6 @@
  */
 package com.sun.java.swing.plaf.gtk;
 
-import sun.swing.plaf.synth.SynthUI;
 import sun.awt.UNIXToolkit;
 
 import javax.swing.plaf.synth.*;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/media/sound/MidiDeviceReceiver.java	Thu Dec 10 09:50:09 2009 -0800
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.media.sound;
+
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.Receiver;
+
+/**
+ * A Receiver with reference to it's MidiDevice object.
+ *
+ * @author Karl Helgason
+ */
+public interface MidiDeviceReceiver extends Receiver {
+
+    /** Obtains the MidiDevice object associated with this Receiver.
+     */
+    public MidiDevice getMidiDevice();
+
+}
--- a/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java	Thu Dec 10 09:50:09 2009 -0800
@@ -48,6 +48,30 @@
         converter = AudioFloatConverter.getConverter(format);
     }
 
+    public void swap(SoftAudioBuffer swap)
+    {
+        int bak_size = size;
+        float[] bak_buffer = buffer;
+        boolean bak_empty = empty;
+        AudioFormat bak_format = format;
+        AudioFloatConverter bak_converter = converter;
+        byte[] bak_converter_buffer = converter_buffer;
+
+        size = swap.size;
+        buffer = swap.buffer;
+        empty = swap.empty;
+        format = swap.format;
+        converter = swap.converter;
+        converter_buffer = swap.converter_buffer;
+
+        swap.size = bak_size;
+        swap.buffer = bak_buffer;
+        swap.empty = bak_empty;
+        swap.format = bak_format;
+        swap.converter = bak_converter;
+        swap.converter_buffer = bak_converter_buffer;
+    }
+
     public AudioFormat getFormat() {
         return format;
     }
--- a/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java	Thu Dec 10 09:50:09 2009 -0800
@@ -218,6 +218,15 @@
     }
 
     private int findFreeVoice(int x) {
+        if(x == -1)
+        {
+            // x = -1 means that there where no available voice
+            // last time we called findFreeVoice
+            // and it hasn't changed because no audio has been
+            // rendered in the meantime.
+            // Therefore we have to return -1.
+            return -1;
+        }
         for (int i = x; i < voices.length; i++)
             if (!voices[i].active)
                 return i;
@@ -328,7 +337,7 @@
     }
 
     protected void initVoice(SoftVoice voice, SoftPerformer p, int voiceID,
-            int noteNumber, int velocity, ModelConnectionBlock[] connectionBlocks,
+            int noteNumber, int velocity, int delay, ModelConnectionBlock[] connectionBlocks,
             ModelChannelMixer channelmixer, boolean releaseTriggered) {
         if (voice.active) {
             // Voice is active , we must steal the voice
@@ -363,7 +372,7 @@
         voice.objects.put("midi_cc", co_midi_cc);
         voice.objects.put("midi_rpn", co_midi_rpn);
         voice.objects.put("midi_nrpn", co_midi_nrpn);
-        voice.noteOn(noteNumber, velocity);
+        voice.noteOn(noteNumber, velocity, delay);
         voice.setMute(mute);
         voice.setSoloMute(solomute);
         if (releaseTriggered)
@@ -399,14 +408,21 @@
     }
 
     public void noteOn(int noteNumber, int velocity) {
+        noteOn(noteNumber, velocity, 0);
+    }
+
+    /* A special noteOn with delay parameter, which is used to
+     * start note within control buffers.
+     */
+    protected void noteOn(int noteNumber, int velocity, int delay) {
         noteNumber = restrict7Bit(noteNumber);
         velocity = restrict7Bit(velocity);
-        noteOn_internal(noteNumber, velocity);
+        noteOn_internal(noteNumber, velocity, delay);
         if (current_mixer != null)
             current_mixer.noteOn(noteNumber, velocity);
     }
 
-    private void noteOn_internal(int noteNumber, int velocity) {
+    private void noteOn_internal(int noteNumber, int velocity, int delay) {
 
         if (velocity == 0) {
             noteOff_internal(noteNumber, 64);
@@ -490,6 +506,7 @@
             int tunedKey = (int)(Math.round(tuning.getTuning()[noteNumber]/100.0));
             play_noteNumber = noteNumber;
             play_velocity = velocity;
+            play_delay = delay;
             play_releasetriggered = false;
             lastVelocity[noteNumber] = velocity;
             current_director.noteOn(tunedKey, velocity);
@@ -594,6 +611,7 @@
             play_noteNumber = noteNumber;
             play_velocity = lastVelocity[noteNumber];
             play_releasetriggered = true;
+            play_delay = 0;
             current_director.noteOff(tunedKey, velocity);
 
         }
@@ -604,12 +622,14 @@
     private int voiceNo = 0;
     private int play_noteNumber = 0;
     private int play_velocity = 0;
+    private int play_delay = 0;
     private boolean play_releasetriggered = false;
 
     public void play(int performerIndex, ModelConnectionBlock[] connectionBlocks) {
 
         int noteNumber = play_noteNumber;
         int velocity = play_velocity;
+        int delay = play_delay;
         boolean releasetriggered = play_releasetriggered;
 
         SoftPerformer p = current_instrument.getPerformers()[performerIndex];
@@ -633,7 +653,7 @@
         if (voiceNo == -1)
             return;
 
-        initVoice(voices[voiceNo], p, prevVoiceID, noteNumber, velocity,
+        initVoice(voices[voiceNo], p, prevVoiceID, noteNumber, velocity, delay,
                 connectionBlocks, current_mixer, releasetriggered);
     }
 
--- a/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java	Thu Dec 10 09:50:09 2009 -0800
@@ -79,7 +79,7 @@
             if (silentcounter > 60) {
                 if (!mix) {
                     bufferLout.clear();
-                    bufferRout.clear();
+                    if (bufferRout != null) bufferRout.clear();
                 }
                 return;
             }
--- a/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java	Thu Dec 10 09:50:09 2009 -0800
@@ -26,7 +26,6 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
@@ -46,28 +45,37 @@
  */
 public class SoftMainMixer {
 
+    // A private class thats contains a ModelChannelMixer and it's private buffers.
+    // This becomes necessary when we want to have separate delay buffers for each channel mixer.
+    private class SoftChannelMixerContainer
+    {
+        ModelChannelMixer mixer;
+        SoftAudioBuffer[] buffers;
+    }
+
     public final static int CHANNEL_LEFT = 0;
     public final static int CHANNEL_RIGHT = 1;
     public final static int CHANNEL_MONO = 2;
-    public final static int CHANNEL_EFFECT1 = 3;
-    public final static int CHANNEL_EFFECT2 = 4;
-    public final static int CHANNEL_EFFECT3 = 5;
-    public final static int CHANNEL_EFFECT4 = 6;
+    public final static int CHANNEL_DELAY_LEFT = 3;
+    public final static int CHANNEL_DELAY_RIGHT = 4;
+    public final static int CHANNEL_DELAY_MONO = 5;
+    public final static int CHANNEL_EFFECT1 = 6;
+    public final static int CHANNEL_EFFECT2 = 7;
+    public final static int CHANNEL_DELAY_EFFECT1 = 8;
+    public final static int CHANNEL_DELAY_EFFECT2 = 9;
     public final static int CHANNEL_LEFT_DRY = 10;
     public final static int CHANNEL_RIGHT_DRY = 11;
     public final static int CHANNEL_SCRATCH1 = 12;
     public final static int CHANNEL_SCRATCH2 = 13;
-    public final static int CHANNEL_CHANNELMIXER_LEFT = 14;
-    public final static int CHANNEL_CHANNELMIXER_RIGHT = 15;
-    public final static int CHANNEL_CHANNELMIXER_MONO = 16;
     protected boolean active_sensing_on = false;
     private long msec_last_activity = -1;
     private boolean pusher_silent = false;
     private int pusher_silent_count = 0;
-    private long msec_pos = 0;
+    private long sample_pos = 0;
     protected boolean readfully = true;
     private Object control_mutex;
     private SoftSynthesizer synth;
+    private float samplerate = 44100;
     private int nrofchannels = 2;
     private SoftVoice[] voicestatus = null;
     private SoftAudioBuffer[] buffers;
@@ -75,7 +83,10 @@
     private SoftAudioProcessor chorus;
     private SoftAudioProcessor agc;
     private long msec_buffer_len = 0;
+    private int buffer_len = 0;
     protected TreeMap<Long, Object> midimessages = new TreeMap<Long, Object>();
+    private int delay_midievent = 0;
+    private int max_delay_midievent = 0;
     double last_volume_left = 1.0;
     double last_volume_right = 1.0;
     private double[] co_master_balance = new double[1];
@@ -83,9 +94,9 @@
     private double[] co_master_coarse_tuning = new double[1];
     private double[] co_master_fine_tuning = new double[1];
     private AudioInputStream ais;
-    private Set<ModelChannelMixer> registeredMixers = null;
+    private Set<SoftChannelMixerContainer> registeredMixers = null;
     private Set<ModelChannelMixer> stoppedMixers = null;
-    private ModelChannelMixer[] cur_registeredMixers = null;
+    private SoftChannelMixerContainer[] cur_registeredMixers = null;
     protected SoftControl co_master = new SoftControl() {
 
         double[] balance = co_master_balance;
@@ -413,26 +424,68 @@
         Iterator<Entry<Long, Object>> iter = midimessages.entrySet().iterator();
         while (iter.hasNext()) {
             Entry<Long, Object> entry = iter.next();
-            if (entry.getKey() > (timeStamp + 100))
+            if (entry.getKey() >= (timeStamp + msec_buffer_len))
                 return;
+            long msec_delay = entry.getKey() - timeStamp;
+            delay_midievent = (int)(msec_delay * (samplerate / 1000000.0) + 0.5);
+            if(delay_midievent > max_delay_midievent)
+                delay_midievent = max_delay_midievent;
+            if(delay_midievent < 0)
+                delay_midievent = 0;
             processMessage(entry.getValue());
             iter.remove();
         }
+        delay_midievent = 0;
     }
 
     protected void processAudioBuffers() {
+
+        if(synth.weakstream != null && synth.weakstream.silent_samples != 0)
+        {
+            sample_pos += synth.weakstream.silent_samples;
+            synth.weakstream.silent_samples = 0;
+        }
+
         for (int i = 0; i < buffers.length; i++) {
-            buffers[i].clear();
+            if(i != CHANNEL_DELAY_LEFT &&
+                    i != CHANNEL_DELAY_RIGHT &&
+                    i != CHANNEL_DELAY_MONO &&
+                    i != CHANNEL_DELAY_EFFECT1 &&
+                    i != CHANNEL_DELAY_EFFECT2)
+                buffers[i].clear();
+        }
+
+        if(!buffers[CHANNEL_DELAY_LEFT].isSilent())
+        {
+            buffers[CHANNEL_LEFT].swap(buffers[CHANNEL_DELAY_LEFT]);
+        }
+        if(!buffers[CHANNEL_DELAY_RIGHT].isSilent())
+        {
+            buffers[CHANNEL_RIGHT].swap(buffers[CHANNEL_DELAY_RIGHT]);
+        }
+        if(!buffers[CHANNEL_DELAY_MONO].isSilent())
+        {
+            buffers[CHANNEL_MONO].swap(buffers[CHANNEL_DELAY_MONO]);
+        }
+        if(!buffers[CHANNEL_DELAY_EFFECT1].isSilent())
+        {
+            buffers[CHANNEL_EFFECT1].swap(buffers[CHANNEL_DELAY_EFFECT1]);
+        }
+        if(!buffers[CHANNEL_DELAY_EFFECT2].isSilent())
+        {
+            buffers[CHANNEL_EFFECT2].swap(buffers[CHANNEL_DELAY_EFFECT2]);
         }
 
         double volume_left;
         double volume_right;
 
-        ModelChannelMixer[] act_registeredMixers;
+        SoftChannelMixerContainer[] act_registeredMixers;
 
         // perform control logic
         synchronized (control_mutex) {
 
+            long msec_pos = (long)(sample_pos * (1000000.0 / samplerate));
+
             processMessages(msec_pos);
 
             if (active_sensing_on) {
@@ -450,7 +503,7 @@
             for (int i = 0; i < voicestatus.length; i++)
                 if (voicestatus[i].active)
                     voicestatus[i].processControlLogic();
-            msec_pos += msec_buffer_len;
+            sample_pos += buffer_len;
 
             double volume = co_master_volume[0];
             volume_left = volume;
@@ -469,7 +522,7 @@
             if (cur_registeredMixers == null) {
                 if (registeredMixers != null) {
                     cur_registeredMixers =
-                            new ModelChannelMixer[registeredMixers.size()];
+                            new SoftChannelMixerContainer[registeredMixers.size()];
                     registeredMixers.toArray(cur_registeredMixers);
                 }
             }
@@ -483,44 +536,61 @@
 
         if (act_registeredMixers != null) {
 
-            // Reroute default left,right output
-            // to channelmixer left,right input/output
+            // Make backup of left,right,mono channels
             SoftAudioBuffer leftbak = buffers[CHANNEL_LEFT];
             SoftAudioBuffer rightbak = buffers[CHANNEL_RIGHT];
             SoftAudioBuffer monobak = buffers[CHANNEL_MONO];
-            buffers[CHANNEL_LEFT] = buffers[CHANNEL_CHANNELMIXER_LEFT];
-            buffers[CHANNEL_RIGHT] = buffers[CHANNEL_CHANNELMIXER_RIGHT];
-            buffers[CHANNEL_MONO] = buffers[CHANNEL_CHANNELMIXER_MONO];
+            SoftAudioBuffer delayleftbak = buffers[CHANNEL_DELAY_LEFT];
+            SoftAudioBuffer delayrightbak = buffers[CHANNEL_DELAY_RIGHT];
+            SoftAudioBuffer delaymonobak = buffers[CHANNEL_DELAY_MONO];
 
             int bufferlen = buffers[CHANNEL_LEFT].getSize();
 
             float[][] cbuffer = new float[nrofchannels][];
-            cbuffer[0] = buffers[CHANNEL_LEFT].array();
-            if (nrofchannels != 1)
-                cbuffer[1] = buffers[CHANNEL_RIGHT].array();
-
             float[][] obuffer = new float[nrofchannels][];
             obuffer[0] = leftbak.array();
             if (nrofchannels != 1)
                 obuffer[1] = rightbak.array();
 
-            for (ModelChannelMixer cmixer : act_registeredMixers) {
-                for (int i = 0; i < cbuffer.length; i++)
-                    Arrays.fill(cbuffer[i], 0);
+            for (SoftChannelMixerContainer cmixer : act_registeredMixers) {
+
+                // Reroute default left,right output
+                // to channelmixer left,right input/output
+                buffers[CHANNEL_LEFT] =  cmixer.buffers[CHANNEL_LEFT];
+                buffers[CHANNEL_RIGHT] = cmixer.buffers[CHANNEL_RIGHT];
+                buffers[CHANNEL_MONO] = cmixer.buffers[CHANNEL_MONO];
+                buffers[CHANNEL_DELAY_LEFT] = cmixer.buffers[CHANNEL_DELAY_LEFT];
+                buffers[CHANNEL_DELAY_RIGHT] = cmixer.buffers[CHANNEL_DELAY_RIGHT];
+                buffers[CHANNEL_DELAY_MONO] = cmixer.buffers[CHANNEL_DELAY_MONO];
+
+                buffers[CHANNEL_LEFT].clear();
+                buffers[CHANNEL_RIGHT].clear();
                 buffers[CHANNEL_MONO].clear();
+
+                if(!buffers[CHANNEL_DELAY_LEFT].isSilent())
+                {
+                    buffers[CHANNEL_LEFT].swap(buffers[CHANNEL_DELAY_LEFT]);
+                }
+                if(!buffers[CHANNEL_DELAY_RIGHT].isSilent())
+                {
+                    buffers[CHANNEL_RIGHT].swap(buffers[CHANNEL_DELAY_RIGHT]);
+                }
+                if(!buffers[CHANNEL_DELAY_MONO].isSilent())
+                {
+                    buffers[CHANNEL_MONO].swap(buffers[CHANNEL_DELAY_MONO]);
+                }
+
+                cbuffer[0] = buffers[CHANNEL_LEFT].array();
+                if (nrofchannels != 1)
+                    cbuffer[1] = buffers[CHANNEL_RIGHT].array();
+
                 boolean hasactivevoices = false;
                 for (int i = 0; i < voicestatus.length; i++)
                     if (voicestatus[i].active)
-                        if (voicestatus[i].channelmixer == cmixer) {
+                        if (voicestatus[i].channelmixer == cmixer.mixer) {
                             voicestatus[i].processAudioLogic(buffers);
                             hasactivevoices = true;
                         }
-                if (!cmixer.process(cbuffer, 0, bufferlen)) {
-                    synchronized (control_mutex) {
-                        registeredMixers.remove(cmixer);
-                        cur_registeredMixers = null;
-                    }
-                }
 
                 if(!buffers[CHANNEL_MONO].isSilent())
                 {
@@ -542,6 +612,13 @@
                     }
                 }
 
+                if (!cmixer.mixer.process(cbuffer, 0, bufferlen)) {
+                    synchronized (control_mutex) {
+                        registeredMixers.remove(cmixer);
+                        cur_registeredMixers = null;
+                    }
+                }
+
                 for (int i = 0; i < cbuffer.length; i++) {
                     float[] cbuff = cbuffer[i];
                     float[] obuff = obuffer[i];
@@ -554,7 +631,7 @@
                         if (stoppedMixers != null) {
                             if (stoppedMixers.contains(cmixer)) {
                                 stoppedMixers.remove(cmixer);
-                                cmixer.stop();
+                                cmixer.mixer.stop();
                             }
                         }
                     }
@@ -565,6 +642,9 @@
             buffers[CHANNEL_LEFT] = leftbak;
             buffers[CHANNEL_RIGHT] = rightbak;
             buffers[CHANNEL_MONO] = monobak;
+            buffers[CHANNEL_DELAY_LEFT] = delayleftbak;
+            buffers[CHANNEL_DELAY_RIGHT] = delayrightbak;
+            buffers[CHANNEL_DELAY_MONO] = delaymonobak;
 
         }
 
@@ -650,14 +730,23 @@
         if(buffers[CHANNEL_LEFT].isSilent()
             && buffers[CHANNEL_RIGHT].isSilent())
         {
-            pusher_silent_count++;
-            if(pusher_silent_count > 5)
+
+            int midimessages_size;
+            synchronized (control_mutex) {
+                midimessages_size = midimessages.size();
+            }
+
+            if(midimessages_size == 0)
             {
-                pusher_silent_count = 0;
-                synchronized (control_mutex) {
-                    pusher_silent = true;
-                    if(synth.weakstream != null)
-                        synth.weakstream.setInputStream(null);
+                pusher_silent_count++;
+                if(pusher_silent_count > 5)
+                {
+                    pusher_silent_count = 0;
+                    synchronized (control_mutex) {
+                        pusher_silent = true;
+                        if(synth.weakstream != null)
+                            synth.weakstream.setInputStream(null);
+                    }
                 }
             }
         }
@@ -672,13 +761,18 @@
     // Must only we called within control_mutex synchronization
     public void activity()
     {
-        msec_last_activity = msec_pos;
+        long silent_samples = 0;
         if(pusher_silent)
         {
             pusher_silent = false;
             if(synth.weakstream != null)
+            {
                 synth.weakstream.setInputStream(ais);
+                silent_samples = synth.weakstream.silent_samples;
+            }
         }
+        msec_last_activity = (long)((sample_pos + silent_samples)
+                * (1000000.0 / samplerate));
     }
 
     public void stopMixer(ModelChannelMixer mixer) {
@@ -689,15 +783,22 @@
 
     public void registerMixer(ModelChannelMixer mixer) {
         if (registeredMixers == null)
-            registeredMixers = new HashSet<ModelChannelMixer>();
-        registeredMixers.add(mixer);
+            registeredMixers = new HashSet<SoftChannelMixerContainer>();
+        SoftChannelMixerContainer mixercontainer = new SoftChannelMixerContainer();
+        mixercontainer.buffers = new SoftAudioBuffer[6];
+        for (int i = 0; i < mixercontainer.buffers.length; i++) {
+            mixercontainer.buffers[i] =
+                new SoftAudioBuffer(buffer_len, synth.getFormat());
+        }
+        mixercontainer.mixer = mixer;
+        registeredMixers.add(mixercontainer);
         cur_registeredMixers = null;
     }
 
     public SoftMainMixer(SoftSynthesizer synth) {
         this.synth = synth;
 
-        msec_pos = 0;
+        sample_pos = 0;
 
         co_master_balance[0] = 0.5;
         co_master_volume[0] = 1;
@@ -705,14 +806,18 @@
         co_master_fine_tuning[0] = 0.5;
 
         msec_buffer_len = (long) (1000000.0 / synth.getControlRate());
-
+        samplerate = synth.getFormat().getSampleRate();
         nrofchannels = synth.getFormat().getChannels();
 
         int buffersize = (int) (synth.getFormat().getSampleRate()
                                 / synth.getControlRate());
 
+        buffer_len = buffersize;
+
+        max_delay_midievent = buffersize;
+
         control_mutex = synth.control_mutex;
-        buffers = new SoftAudioBuffer[17];
+        buffers = new SoftAudioBuffer[14];
         for (int i = 0; i < buffers.length; i++) {
             buffers[i] = new SoftAudioBuffer(buffersize, synth.getFormat());
         }
@@ -994,7 +1099,10 @@
 
         switch (cmd) {
         case ShortMessage.NOTE_ON:
-            softchannel.noteOn(data1, data2);
+            if(delay_midievent != 0)
+                softchannel.noteOn(data1, data2, delay_midievent);
+            else
+                softchannel.noteOn(data1, data2);
             break;
         case ShortMessage.NOTE_OFF:
             softchannel.noteOff(data1, data2);
@@ -1021,7 +1129,15 @@
     }
 
     public long getMicrosecondPosition() {
-        return msec_pos;
+        if(pusher_silent)
+        {
+            if(synth.weakstream != null)
+            {
+                return (long)((sample_pos  + synth.weakstream.silent_samples)
+                        * (1000000.0 / samplerate));
+            }
+        }
+        return (long)(sample_pos * (1000000.0 / samplerate));
     }
 
     public void close() {
--- a/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java	Thu Dec 10 09:50:09 2009 -0800
@@ -26,8 +26,8 @@
 
 import java.util.TreeMap;
 
+import javax.sound.midi.MidiDevice;
 import javax.sound.midi.MidiMessage;
-import javax.sound.midi.Receiver;
 import javax.sound.midi.ShortMessage;
 
 /**
@@ -35,7 +35,7 @@
  *
  * @author Karl Helgason
  */
-public class SoftReceiver implements Receiver {
+public class SoftReceiver implements MidiDeviceReceiver {
 
     protected boolean open = true;
     private Object control_mutex;
@@ -51,6 +51,10 @@
             this.midimessages = mainmixer.midimessages;
     }
 
+    public MidiDevice getMidiDevice() {
+        return synth;
+    }
+
     public void send(MidiMessage message, long timeStamp) {
 
         synchronized (control_mutex) {
@@ -60,6 +64,7 @@
 
         if (timeStamp != -1) {
             synchronized (control_mutex) {
+                mainmixer.activity();
                 while (midimessages.get(timeStamp) != null)
                     timeStamp++;
                 if (message instanceof ShortMessage
--- a/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java	Thu Dec 10 09:50:09 2009 -0800
@@ -66,6 +66,8 @@
         public SoftAudioPusher pusher = null;
         public AudioInputStream jitter_stream = null;
         public SourceDataLine sourceDataLine = null;
+        public volatile long silent_samples = 0;
+        private int framesize = 0;
         private WeakReference<AudioInputStream> weak_stream_link;
         private AudioFloatConverter converter;
         private float[] silentbuffer = null;
@@ -101,6 +103,8 @@
                      silentbuffer = new float[flen];
                  converter.toByteArray(silentbuffer, flen, b, off);
 
+                 silent_samples += (long)((len / framesize));
+
                  if(pusher != null)
                  if(weak_stream_link.get() == null)
                  {
@@ -136,6 +140,7 @@
             weak_stream_link = new WeakReference<AudioInputStream>(stream);
             converter = AudioFloatConverter.getConverter(stream.getFormat());
             samplesize = stream.getFormat().getFrameSize() / stream.getFormat().getChannels();
+            framesize = stream.getFormat().getFrameSize();
         }
 
         public AudioInputStream getAudioInputStream()
--- a/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java	Thu Dec 10 09:50:09 2009 -0800
@@ -43,6 +43,7 @@
     private int noteOn_noteNumber = 0;
     private int noteOn_velocity = 0;
     private int noteOff_velocity = 0;
+    private int delay = 0;
     protected ModelChannelMixer channelmixer = null;
     protected double tunedKey = 0;
     protected SoftTuning tuning = null;
@@ -294,7 +295,7 @@
         tunedKey = tuning.getTuning(noteNumber) / 100.0;
     }
 
-    protected void noteOn(int noteNumber, int velocity) {
+    protected void noteOn(int noteNumber, int velocity, int delay) {
 
         sustain = false;
         sostenuto = false;
@@ -308,6 +309,7 @@
 
         noteOn_noteNumber = noteNumber;
         noteOn_velocity = velocity;
+        this.delay = delay;
 
         lastMuteValue = 0;
         lastSoloMuteValue = 0;
@@ -562,7 +564,7 @@
 
             if (stealer_channel != null) {
                 stealer_channel.initVoice(this, stealer_performer,
-                        stealer_voiceID, stealer_noteNumber, stealer_velocity,
+                        stealer_voiceID, stealer_noteNumber, stealer_velocity, 0,
                         stealer_extendedConnectionBlocks, stealer_channelmixer,
                         stealer_releaseTriggered);
                 stealer_releaseTriggered = false;
@@ -733,23 +735,55 @@
     }
 
     protected void mixAudioStream(SoftAudioBuffer in, SoftAudioBuffer out,
+            SoftAudioBuffer dout,
             float amp_from, float amp_to) {
         int bufferlen = in.getSize();
         if (amp_from < 0.000000001 && amp_to < 0.000000001)
             return;
-        if (amp_from == amp_to) {
-            float[] fout = out.array();
-            float[] fin = in.array();
-            for (int i = 0; i < bufferlen; i++)
-                fout[i] += fin[i] * amp_to;
-        } else {
-            float amp = amp_from;
-            float amp_delta = (amp_to - amp_from) / bufferlen;
-            float[] fout = out.array();
-            float[] fin = in.array();
-            for (int i = 0; i < bufferlen; i++) {
-                amp += amp_delta;
-                fout[i] += fin[i] * amp;
+        if(dout != null && delay != 0)
+        {
+            if (amp_from == amp_to) {
+                float[] fout = out.array();
+                float[] fin = in.array();
+                int j = 0;
+                for (int i = delay; i < bufferlen; i++)
+                    fout[i] += fin[j++] * amp_to;
+                fout = dout.array();
+                for (int i = 0; i < delay; i++)
+                    fout[i] += fin[j++] * amp_to;
+            } else {
+                float amp = amp_from;
+                float amp_delta = (amp_to - amp_from) / bufferlen;
+                float[] fout = out.array();
+                float[] fin = in.array();
+                int j = 0;
+                for (int i = delay; i < bufferlen; i++) {
+                    amp += amp_delta;
+                    fout[i] += fin[j++] * amp;
+                }
+                fout = dout.array();
+                for (int i = 0; i < delay; i++) {
+                    amp += amp_delta;
+                    fout[i] += fin[j++] * amp;
+                }
+            }
+        }
+        else
+        {
+            if (amp_from == amp_to) {
+                float[] fout = out.array();
+                float[] fin = in.array();
+                for (int i = 0; i < bufferlen; i++)
+                    fout[i] += fin[i] * amp_to;
+            } else {
+                float amp = amp_from;
+                float amp_delta = (amp_to - amp_from) / bufferlen;
+                float[] fout = out.array();
+                float[] fin = in.array();
+                for (int i = 0; i < bufferlen; i++) {
+                    amp += amp_delta;
+                    fout[i] += fin[i] * amp;
+                }
             }
         }
 
@@ -785,6 +819,13 @@
         SoftAudioBuffer mono = buffer[SoftMainMixer.CHANNEL_MONO];
         SoftAudioBuffer eff1 = buffer[SoftMainMixer.CHANNEL_EFFECT1];
         SoftAudioBuffer eff2 = buffer[SoftMainMixer.CHANNEL_EFFECT2];
+
+        SoftAudioBuffer dleft = buffer[SoftMainMixer.CHANNEL_DELAY_LEFT];
+        SoftAudioBuffer dright = buffer[SoftMainMixer.CHANNEL_DELAY_RIGHT];
+        SoftAudioBuffer dmono = buffer[SoftMainMixer.CHANNEL_DELAY_MONO];
+        SoftAudioBuffer deff1 = buffer[SoftMainMixer.CHANNEL_DELAY_EFFECT1];
+        SoftAudioBuffer deff2 = buffer[SoftMainMixer.CHANNEL_DELAY_EFFECT2];
+
         SoftAudioBuffer leftdry = buffer[SoftMainMixer.CHANNEL_LEFT_DRY];
         SoftAudioBuffer rightdry = buffer[SoftMainMixer.CHANNEL_RIGHT_DRY];
 
@@ -799,42 +840,42 @@
 
         if (nrofchannels == 1) {
             out_mixer_left = (out_mixer_left + out_mixer_right) / 2;
-            mixAudioStream(leftdry, left, last_out_mixer_left, out_mixer_left);
+            mixAudioStream(leftdry, left, dleft, last_out_mixer_left, out_mixer_left);
             if (rightdry != null)
-                mixAudioStream(rightdry, left, last_out_mixer_left,
+                mixAudioStream(rightdry, left, dleft, last_out_mixer_left,
                         out_mixer_left);
         } else {
             if(rightdry == null &&
                     last_out_mixer_left == last_out_mixer_right &&
                     out_mixer_left == out_mixer_right)
             {
-                mixAudioStream(leftdry, mono, last_out_mixer_left, out_mixer_left);
+                mixAudioStream(leftdry, mono, dmono, last_out_mixer_left, out_mixer_left);
             }
             else
             {
-                mixAudioStream(leftdry, left, last_out_mixer_left, out_mixer_left);
+                mixAudioStream(leftdry, left, dleft, last_out_mixer_left, out_mixer_left);
                 if (rightdry != null)
-                    mixAudioStream(rightdry, right, last_out_mixer_right,
+                    mixAudioStream(rightdry, right, dright, last_out_mixer_right,
                         out_mixer_right);
                 else
-                    mixAudioStream(leftdry, right, last_out_mixer_right,
+                    mixAudioStream(leftdry, right, dright, last_out_mixer_right,
                         out_mixer_right);
             }
         }
 
         if (rightdry == null) {
-            mixAudioStream(leftdry, eff1, last_out_mixer_effect1,
+            mixAudioStream(leftdry, eff1, deff1, last_out_mixer_effect1,
                     out_mixer_effect1);
-            mixAudioStream(leftdry, eff2, last_out_mixer_effect2,
+            mixAudioStream(leftdry, eff2, deff2, last_out_mixer_effect2,
                     out_mixer_effect2);
         } else {
-            mixAudioStream(leftdry, eff1, last_out_mixer_effect1 * 0.5f,
+            mixAudioStream(leftdry, eff1, deff1, last_out_mixer_effect1 * 0.5f,
                     out_mixer_effect1 * 0.5f);
-            mixAudioStream(leftdry, eff2, last_out_mixer_effect2 * 0.5f,
+            mixAudioStream(leftdry, eff2, deff2, last_out_mixer_effect2 * 0.5f,
                     out_mixer_effect2 * 0.5f);
-            mixAudioStream(rightdry, eff1, last_out_mixer_effect1 * 0.5f,
+            mixAudioStream(rightdry, eff1, deff1, last_out_mixer_effect1 * 0.5f,
                     out_mixer_effect1 * 0.5f);
-            mixAudioStream(rightdry, eff2, last_out_mixer_effect2 * 0.5f,
+            mixAudioStream(rightdry, eff2, deff2, last_out_mixer_effect2 * 0.5f,
                     out_mixer_effect2 * 0.5f);
         }
 
--- a/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java	Thu Dec 10 09:50:09 2009 -0800
@@ -313,11 +313,14 @@
     }
 
     /**
-     * Gets the <code>Class</code> object of the indexed properties' type.
-     * The returned <code>Class</code> may describe a primitive type such as <code>int</code>.
+     * Returns the Java type info for the indexed property.
+     * Note that the {@code Class} object may describe
+     * primitive Java types such as {@code int}.
+     * This type is returned by the indexed read method
+     * or is used as the parameter type of the indexed write method.
      *
-     * @return The <code>Class</code> for the indexed properties' type; may return <code>null</code>
-     *         if the type cannot be determined.
+     * @return the {@code Class} object that represents the Java type info,
+     *         or {@code null} if the type cannot be determined
      */
     public synchronized Class<?> getIndexedPropertyType() {
         Class type = getIndexedPropertyType0();
--- a/jdk/src/share/classes/java/beans/Introspector.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/java/beans/Introspector.java	Thu Dec 10 09:50:09 2009 -0800
@@ -25,26 +25,19 @@
 
 package java.beans;
 
+import com.sun.beans.WeakCache;
 import com.sun.beans.finder.BeanInfoFinder;
 import com.sun.beans.finder.ClassFinder;
 
-import java.lang.ref.Reference;
-import java.lang.ref.SoftReference;
-
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-import java.util.Collections;
 import java.util.Map;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.EventListener;
 import java.util.List;
-import java.util.WeakHashMap;
 import java.util.TreeMap;
 
 import sun.awt.AppContext;
@@ -85,20 +78,7 @@
  * patterns to identify property accessors, event sources, or public
  * methods.  We then proceed to analyze the class's superclass and add
  * in the information from it (and possibly on up the superclass chain).
- *
  * <p>
- * Because the Introspector caches BeanInfo classes for better performance,
- * take care if you use it in an application that uses
- * multiple class loaders.
- * In general, when you destroy a <code>ClassLoader</code>
- * that has been used to introspect classes,
- * you should use the
- * {@link #flushCaches <code>Introspector.flushCaches</code>}
- * or
- * {@link #flushFromCaches <code>Introspector.flushFromCaches</code>} method
- * to flush all of the introspected classes out of the cache.
- *
- * <P>
  * For more information about introspection and design patterns, please
  * consult the
  *  <a href="http://java.sun.com/products/javabeans/docs/index.html">JavaBeans specification</a>.
@@ -112,8 +92,8 @@
     public final static int IGNORE_ALL_BEANINFO        = 3;
 
     // Static Caches to speed up introspection.
-    private static Map declaredMethodCache =
-        Collections.synchronizedMap(new WeakHashMap());
+    private static WeakCache<Class<?>, Method[]> declaredMethodCache =
+            new WeakCache<Class<?>, Method[]>();
 
     private static final Object BEANINFO_CACHE = new Object();
 
@@ -174,20 +154,21 @@
         if (!ReflectUtil.isPackageAccessible(beanClass)) {
             return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
         }
-        Map<Class<?>, BeanInfo> map;
         synchronized (BEANINFO_CACHE) {
-            map = (Map<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE);
-            if (map == null) {
-                map = Collections.synchronizedMap(new WeakHashMap<Class<?>, BeanInfo>());
-                AppContext.getAppContext().put(BEANINFO_CACHE, map);
+            WeakCache<Class<?>, BeanInfo> beanInfoCache =
+                    (WeakCache<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE);
+
+            if (beanInfoCache == null) {
+                beanInfoCache = new WeakCache<Class<?>, BeanInfo>();
+                AppContext.getAppContext().put(BEANINFO_CACHE, beanInfoCache);
             }
+            BeanInfo beanInfo = beanInfoCache.get(beanClass);
+            if (beanInfo == null) {
+                beanInfo = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
+                beanInfoCache.put(beanClass, beanInfo);
+            }
+            return beanInfo;
         }
-        BeanInfo bi = map.get(beanClass);
-        if (bi == null) {
-            bi = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
-            map.put(beanClass, bi);
-        }
-        return bi;
     }
 
     /**
@@ -359,11 +340,13 @@
      */
 
     public static void flushCaches() {
-        Map map = (Map) AppContext.getAppContext().get(BEANINFO_CACHE);
-        if (map != null) {
-            map.clear();
+        synchronized (BEANINFO_CACHE) {
+            WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE);
+            if (beanInfoCache != null) {
+                beanInfoCache.clear();
+            }
+            declaredMethodCache.clear();
         }
-        declaredMethodCache.clear();
     }
 
     /**
@@ -385,11 +368,13 @@
         if (clz == null) {
             throw new NullPointerException();
         }
-        Map map = (Map) AppContext.getAppContext().get(BEANINFO_CACHE);
-        if (map != null) {
-            map.remove(clz);
+        synchronized (BEANINFO_CACHE) {
+            WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE);
+            if (beanInfoCache != null) {
+                beanInfoCache.put(clz, null);
+            }
+            declaredMethodCache.put(clz, null);
         }
-        declaredMethodCache.remove(clz);
     }
 
     //======================================================================
@@ -1272,41 +1257,26 @@
     /*
      * Internal method to return *public* methods within a class.
      */
-    private static synchronized Method[] getPublicDeclaredMethods(Class clz) {
+    private static Method[] getPublicDeclaredMethods(Class clz) {
         // Looking up Class.getDeclaredMethods is relatively expensive,
         // so we cache the results.
-        Method[] result = null;
         if (!ReflectUtil.isPackageAccessible(clz)) {
             return new Method[0];
         }
-        final Class fclz = clz;
-        Reference ref = (Reference)declaredMethodCache.get(fclz);
-        if (ref != null) {
-            result = (Method[])ref.get();
-            if (result != null) {
-                return result;
-            }
-        }
-
-        // We have to raise privilege for getDeclaredMethods
-        result = (Method[]) AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return fclz.getDeclaredMethods();
+        synchronized (BEANINFO_CACHE) {
+            Method[] result = declaredMethodCache.get(clz);
+            if (result == null) {
+                result = clz.getMethods();
+                for (int i = 0; i < result.length; i++) {
+                    Method method = result[i];
+                    if (!method.getDeclaringClass().equals(clz)) {
+                        result[i] = null;
+                    }
                 }
-            });
-
-
-        // Null out any non-public methods.
-        for (int i = 0; i < result.length; i++) {
-            Method method = result[i];
-            int mods = method.getModifiers();
-            if (!Modifier.isPublic(mods)) {
-                result[i] = null;
+                declaredMethodCache.put(clz, result);
             }
+            return result;
         }
-        // Add it to the cache.
-        declaredMethodCache.put(fclz, new SoftReference(result));
-        return result;
     }
 
     //======================================================================
--- a/jdk/src/share/classes/java/beans/PropertyDescriptor.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/java/beans/PropertyDescriptor.java	Thu Dec 10 09:50:09 2009 -0800
@@ -164,14 +164,16 @@
     }
 
     /**
-     * Gets the Class object for the property.
+     * Returns the Java type info for the property.
+     * Note that the {@code Class} object may describe
+     * primitive Java types such as {@code int}.
+     * This type is returned by the read method
+     * or is used as the parameter type of the write method.
+     * Returns {@code null} if the type is an indexed property
+     * that does not support non-indexed access.
      *
-     * @return The Java type info for the property.  Note that
-     * the "Class" object may describe a built-in Java type such as "int".
-     * The result may be "null" if this is an indexed property that
-     * does not support non-indexed access.
-     * <p>
-     * This is the type that will be returned by the ReadMethod.
+     * @return the {@code Class} object that represents the Java type info,
+     *         or {@code null} if the type cannot be determined
      */
     public synchronized Class<?> getPropertyType() {
         Class type = getPropertyType0();
--- a/jdk/src/share/classes/javax/swing/AbstractListModel.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/AbstractListModel.java	Thu Dec 10 09:50:09 2009 -0800
@@ -42,9 +42,11 @@
  * has been added to the <code>java.beans</code> package.
  * Please see {@link java.beans.XMLEncoder}.
  *
+ * @param <E> the type of the elements of this model
+ *
  * @author Hans Muller
  */
-public abstract class AbstractListModel implements ListModel, Serializable
+public abstract class AbstractListModel<E> implements ListModel<E>, Serializable
 {
     protected EventListenerList listenerList = new EventListenerList();
 
--- a/jdk/src/share/classes/javax/swing/DefaultListCellRenderer.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/DefaultListCellRenderer.java	Thu Dec 10 09:50:09 2009 -0800
@@ -71,7 +71,7 @@
  * @author Hans Muller
  */
 public class DefaultListCellRenderer extends JLabel
-    implements ListCellRenderer, Serializable
+    implements ListCellRenderer<Object>, Serializable
 {
 
    /**
@@ -111,7 +111,7 @@
     }
 
     public Component getListCellRendererComponent(
-        JList list,
+        JList<?> list,
         Object value,
         int index,
         boolean isSelected,
--- a/jdk/src/share/classes/javax/swing/DefaultListModel.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/DefaultListModel.java	Thu Dec 10 09:50:09 2009 -0800
@@ -48,11 +48,13 @@
  * has been added to the <code>java.beans</code> package.
  * Please see {@link java.beans.XMLEncoder}.
  *
+ * @param <E> the type of the elements of this model
+ *
  * @author Hans Muller
  */
-public class DefaultListModel extends AbstractListModel
+public class DefaultListModel<E> extends AbstractListModel<E>
 {
-    private Vector delegate = new Vector();
+    private Vector<E> delegate = new Vector<E>();
 
     /**
      * Returns the number of components in this list.
@@ -83,7 +85,7 @@
      *             list
      * @see #get(int)
      */
-    public Object getElementAt(int index) {
+    public E getElementAt(int index) {
         return delegate.elementAt(index);
     }
 
@@ -175,7 +177,7 @@
      * @return  an enumeration of the components of this list
      * @see Vector#elements()
      */
-    public Enumeration<?> elements() {
+    public Enumeration<E> elements() {
         return delegate.elements();
     }
 
@@ -260,7 +262,7 @@
      * @see #get(int)
      * @see Vector#elementAt(int)
      */
-    public Object elementAt(int index) {
+    public E elementAt(int index) {
         return delegate.elementAt(index);
     }
 
@@ -271,7 +273,7 @@
      * @return     the first component of this list
      * @see Vector#firstElement()
      */
-    public Object firstElement() {
+    public E firstElement() {
         return delegate.firstElement();
     }
 
@@ -283,13 +285,13 @@
      * @return  the last component of the list
      * @see Vector#lastElement()
      */
-    public Object lastElement() {
+    public E lastElement() {
         return delegate.lastElement();
     }
 
     /**
      * Sets the component at the specified <code>index</code> of this
-     * list to be the specified object. The previous component at that
+     * list to be the specified element. The previous component at that
      * position is discarded.
      * <p>
      * Throws an <code>ArrayIndexOutOfBoundsException</code> if the index
@@ -300,13 +302,13 @@
      *    <code>List</code> interface defined in the 1.2 Collections framework.
      * </blockquote>
      *
-     * @param      obj     what the component is to be set to
+     * @param      element what the component is to be set to
      * @param      index   the specified index
      * @see #set(int,Object)
      * @see Vector#setElementAt(Object,int)
      */
-    public void setElementAt(Object obj, int index) {
-        delegate.setElementAt(obj, index);
+    public void setElementAt(E element, int index) {
+        delegate.setElementAt(element, index);
         fireContentsChanged(this, index, index);
     }
 
@@ -331,7 +333,7 @@
     }
 
     /**
-     * Inserts the specified object as a component in this list at the
+     * Inserts the specified element as a component in this list at the
      * specified <code>index</code>.
      * <p>
      * Throws an <code>ArrayIndexOutOfBoundsException</code> if the index
@@ -342,26 +344,26 @@
      *    <code>List</code> interface defined in the 1.2 Collections framework.
      * </blockquote>
      *
-     * @param      obj     the component to insert
+     * @param      element the component to insert
      * @param      index   where to insert the new component
      * @exception  ArrayIndexOutOfBoundsException  if the index was invalid
      * @see #add(int,Object)
      * @see Vector#insertElementAt(Object,int)
      */
-    public void insertElementAt(Object obj, int index) {
-        delegate.insertElementAt(obj, index);
+    public void insertElementAt(E element, int index) {
+        delegate.insertElementAt(element, index);
         fireIntervalAdded(this, index, index);
     }
 
     /**
      * Adds the specified component to the end of this list.
      *
-     * @param   obj   the component to be added
+     * @param   element   the component to be added
      * @see Vector#addElement(Object)
      */
-    public void addElement(Object obj) {
+    public void addElement(E element) {
         int index = delegate.size();
-        delegate.addElement(obj);
+        delegate.addElement(element);
         fireIntervalAdded(this, index, index);
     }
 
@@ -441,7 +443,7 @@
      *
      * @param index index of element to return
      */
-    public Object get(int index) {
+    public E get(int index) {
         return delegate.elementAt(index);
     }
 
@@ -457,8 +459,8 @@
      * @param element element to be stored at the specified position
      * @return the element previously at the specified position
      */
-    public Object set(int index, Object element) {
-        Object rv = delegate.elementAt(index);
+    public E set(int index, E element) {
+        E rv = delegate.elementAt(index);
         delegate.setElementAt(element, index);
         fireContentsChanged(this, index, index);
         return rv;
@@ -474,7 +476,7 @@
      * @param index index at which the specified element is to be inserted
      * @param element element to be inserted
      */
-    public void add(int index, Object element) {
+    public void add(int index, E element) {
         delegate.insertElementAt(element, index);
         fireIntervalAdded(this, index, index);
     }
@@ -488,9 +490,10 @@
      * (<code>index &lt; 0 || index &gt;= size()</code>).
      *
      * @param index the index of the element to removed
+     * @return the element previously at the specified position
      */
-    public Object remove(int index) {
-        Object rv = delegate.elementAt(index);
+    public E remove(int index) {
+        E rv = delegate.elementAt(index);
         delegate.removeElementAt(index);
         fireIntervalRemoved(this, index, index);
         return rv;
--- a/jdk/src/share/classes/javax/swing/JList.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/JList.java	Thu Dec 10 09:50:09 2009 -0800
@@ -25,11 +25,24 @@
 
 package javax.swing;
 
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.GraphicsEnvironment;
+import java.awt.HeadlessException;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
 import java.awt.event.*;
-import java.awt.*;
 
 import java.util.Vector;
 import java.util.Locale;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
@@ -59,28 +72,30 @@
  * constructor that automatically builds a read-only {@code ListModel} instance
  * for you:
  * <pre>
+ * {@code
  * // Create a JList that displays strings from an array
  *
  * String[] data = {"one", "two", "three", "four"};
- * JList myList = new JList(data);
+ * JList<String> myList = new JList<String>(data);
  *
  * // Create a JList that displays the superclasses of JList.class, by
  * // creating it with a Vector populated with this data
  *
- * Vector superClasses = new Vector();
- * Class rootClass = javax.swing.JList.class;
- * for(Class cls = rootClass; cls != null; cls = cls.getSuperclass()) {
+ * Vector<Class<?>> superClasses = new Vector<Class<?>>();
+ * Class<JList> rootClass = javax.swing.JList.class;
+ * for(Class<?> cls = rootClass; cls != null; cls = cls.getSuperclass()) {
  *     superClasses.addElement(cls);
  * }
- * JList myList = new JList(superClasses);
+ * JList<Class<?>> myList = new JList<Class<?>>(superClasses);
  *
  * // The automatically created model is stored in JList's "model"
  * // property, which you can retrieve
  *
- * ListModel model = myList.getModel();
+ * ListModel<Class<?>> model = myList.getModel();
  * for(int i = 0; i < model.getSize(); i++) {
  *     System.out.println(model.getElementAt(i));
  * }
+ * }
  * </pre>
  * <p>
  * A {@code ListModel} can be supplied directly to a {@code JList} by way of a
@@ -103,12 +118,14 @@
  * notifying listeners. For example, a read-only implementation of
  * {@code AbstractListModel}:
  * <pre>
+ * {@code
  * // This list model has about 2^16 elements.  Enjoy scrolling.
  *
- * ListModel bigData = new AbstractListModel() {
+ * ListModel<String> bigData = new AbstractListModel<String>() {
  *     public int getSize() { return Short.MAX_VALUE; }
- *     public Object getElementAt(int index) { return "Index " + index; }
+ *     public String getElementAt(int index) { return "Index " + index; }
  * };
+ * }
  * </pre>
  * <p>
  * The selection state of a {@code JList} is managed by another separate
@@ -150,9 +167,10 @@
  * component to render, is installed by the lists's {@code ListUI}. You can
  * substitute your own renderer using code like this:
  * <pre>
+ * {@code
  *  // Display an icon and a string for each object in the list.
  *
- * class MyCellRenderer extends JLabel implements ListCellRenderer {
+ * class MyCellRenderer extends JLabel implements ListCellRenderer<Object> {
  *     final static ImageIcon longIcon = new ImageIcon("long.gif");
  *     final static ImageIcon shortIcon = new ImageIcon("short.gif");
  *
@@ -160,7 +178,7 @@
  *     // We just reconfigure the JLabel each time we're called.
  *
  *     public Component getListCellRendererComponent(
- *       JList list,              // the list
+ *       JList<?> list,           // the list
  *       Object value,            // value to display
  *       int index,               // cell index
  *       boolean isSelected,      // is the cell selected
@@ -184,6 +202,7 @@
  * }
  *
  * myList.setCellRenderer(new MyCellRenderer());
+ * }
  * </pre>
  * <p>
  * Another job for the cell renderer is in helping to determine sizing
@@ -195,7 +214,8 @@
  * automatically based on a single prototype value:
  * <a name="prototype_example">
  * <pre>
- * JList bigDataList = new JList(bigData);
+ * {@code
+ * JList<String> bigDataList = new JList<String>(bigData);
  *
  * // We don't want the JList implementation to compute the width
  * // or height of all of the list cells, so we give it a string
@@ -204,6 +224,7 @@
  * // properties.
  *
  * bigDataList.setPrototypeCellValue("Index 1234567890");
+ * }
  * </pre>
  * <p>
  * {@code JList} doesn't implement scrolling directly. To create a list that
@@ -260,13 +281,15 @@
  * @see ListCellRenderer
  * @see DefaultListCellRenderer
  *
+ * @param <E> the type of the elements of this list
+ *
  * @beaninfo
  *   attribute: isContainer false
  * description: A component which allows for the selection of one or more objects from a list.
  *
  * @author Hans Muller
  */
-public class JList extends JComponent implements Scrollable, Accessible
+public class JList<E> extends JComponent implements Scrollable, Accessible
 {
     /**
      * @see #getUIClassID
@@ -301,15 +324,15 @@
     private int fixedCellWidth = -1;
     private int fixedCellHeight = -1;
     private int horizontalScrollIncrement = -1;
-    private Object prototypeCellValue;
+    private E prototypeCellValue;
     private int visibleRowCount = 8;
     private Color selectionForeground;
     private Color selectionBackground;
     private boolean dragEnabled;
 
     private ListSelectionModel selectionModel;
-    private ListModel dataModel;
-    private ListCellRenderer cellRenderer;
+    private ListModel<E> dataModel;
+    private ListCellRenderer<? super E> cellRenderer;
     private ListSelectionListener selectionListener;
 
     /**
@@ -402,7 +425,7 @@
      * @param dataModel the model for the list
      * @exception IllegalArgumentException if the model is {@code null}
      */
-    public JList(ListModel dataModel)
+    public JList(ListModel<E> dataModel)
     {
         if (dataModel == null) {
             throw new IllegalArgumentException("dataModel must be non null");
@@ -437,12 +460,12 @@
      * @param  listData  the array of Objects to be loaded into the data model,
      *                   {@code non-null}
      */
-    public JList(final Object[] listData)
+    public JList(final E[] listData)
     {
         this (
-            new AbstractListModel() {
+            new AbstractListModel<E>() {
                 public int getSize() { return listData.length; }
-                public Object getElementAt(int i) { return listData[i]; }
+                public E getElementAt(int i) { return listData[i]; }
             }
         );
     }
@@ -462,11 +485,11 @@
      * @param  listData  the <code>Vector</code> to be loaded into the
      *                   data model, {@code non-null}
      */
-    public JList(final Vector<?> listData) {
+    public JList(final Vector<? extends E> listData) {
         this (
-            new AbstractListModel() {
+            new AbstractListModel<E>() {
                 public int getSize() { return listData.size(); }
-                public Object getElementAt(int i) { return listData.elementAt(i); }
+                public E getElementAt(int i) { return listData.elementAt(i); }
             }
         );
     }
@@ -477,9 +500,9 @@
      */
     public JList() {
         this (
-            new AbstractListModel() {
+            new AbstractListModel<E>() {
               public int getSize() { return 0; }
-              public Object getElementAt(int i) { return "No Data Model"; }
+              public E getElementAt(int i) { throw new IndexOutOfBoundsException("No Data Model"); }
             }
         );
     }
@@ -526,7 +549,7 @@
     public void updateUI() {
         setUI((ListUI)UIManager.getUI(this));
 
-        ListCellRenderer renderer = getCellRenderer();
+        ListCellRenderer<? super E> renderer = getCellRenderer();
         if (renderer instanceof Component) {
             SwingUtilities.updateComponentTreeUI((Component)renderer);
         }
@@ -560,8 +583,8 @@
      */
     private void updateFixedCellSize()
     {
-        ListCellRenderer cr = getCellRenderer();
-        Object value = getPrototypeCellValue();
+        ListCellRenderer<? super E> cr = getCellRenderer();
+        E value = getPrototypeCellValue();
 
         if ((cr != null) && (value != null)) {
             Component c = cr.getListCellRendererComponent(this, value, 0, false, false);
@@ -592,7 +615,7 @@
      * @return the value of the {@code prototypeCellValue} property
      * @see #setPrototypeCellValue
      */
-    public Object getPrototypeCellValue() {
+    public E getPrototypeCellValue() {
         return prototypeCellValue;
     }
 
@@ -632,8 +655,8 @@
      *   attribute: visualUpdate true
      * description: The cell prototype value, used to compute cell width and height.
      */
-    public void setPrototypeCellValue(Object prototypeCellValue) {
-        Object oldValue = this.prototypeCellValue;
+    public void setPrototypeCellValue(E prototypeCellValue) {
+        E oldValue = this.prototypeCellValue;
         this.prototypeCellValue = prototypeCellValue;
 
         /* If the prototypeCellValue has changed and is non-null,
@@ -727,7 +750,7 @@
      * @see #setCellRenderer
      */
     @Transient
-    public ListCellRenderer getCellRenderer() {
+    public ListCellRenderer<? super E> getCellRenderer() {
         return cellRenderer;
     }
 
@@ -755,8 +778,8 @@
      *   attribute: visualUpdate true
      * description: The component used to draw the cells.
      */
-    public void setCellRenderer(ListCellRenderer cellRenderer) {
-        ListCellRenderer oldValue = this.cellRenderer;
+    public void setCellRenderer(ListCellRenderer<? super E> cellRenderer) {
+        ListCellRenderer<? super E> oldValue = this.cellRenderer;
         this.cellRenderer = cellRenderer;
 
         /* If the cellRenderer has changed and prototypeCellValue
@@ -1455,7 +1478,7 @@
      * @since 1.4
      */
     public int getNextMatch(String prefix, int startIndex, Position.Bias bias) {
-        ListModel model = getModel();
+        ListModel<E> model = getModel();
         int max = model.getSize();
         if (prefix == null) {
             throw new IllegalArgumentException();
@@ -1469,16 +1492,16 @@
         int increment = (bias == Position.Bias.Forward) ? 1 : -1;
         int index = startIndex;
         do {
-            Object o = model.getElementAt(index);
-
-            if (o != null) {
+            E element = model.getElementAt(index);
+
+            if (element != null) {
                 String string;
 
-                if (o instanceof String) {
-                    string = ((String)o).toUpperCase();
+                if (element instanceof String) {
+                    string = ((String)element).toUpperCase();
                 }
                 else {
-                    string = o.toString();
+                    string = element.toString();
                     if (string != null) {
                         string = string.toUpperCase();
                     }
@@ -1516,7 +1539,7 @@
         if(event != null) {
             Point p = event.getPoint();
             int index = locationToIndex(p);
-            ListCellRenderer r = getCellRenderer();
+            ListCellRenderer<? super E> r = getCellRenderer();
             Rectangle cellBounds;
 
             if (index != -1 && r != null && (cellBounds =
@@ -1634,7 +1657,7 @@
      *                          list of items
      * @see #setModel
      */
-    public ListModel getModel() {
+    public ListModel<E> getModel() {
         return dataModel;
     }
 
@@ -1656,11 +1679,11 @@
      *   attribute: visualUpdate true
      * description: The object that contains the data to be drawn by this JList.
      */
-    public void setModel(ListModel model) {
+    public void setModel(ListModel<E> model) {
         if (model == null) {
             throw new IllegalArgumentException("model must be non null");
         }
-        ListModel oldValue = dataModel;
+        ListModel<E> oldValue = dataModel;
         dataModel = model;
         firePropertyChange("model", oldValue, dataModel);
         clearSelection();
@@ -1668,7 +1691,7 @@
 
 
     /**
-     * Constructs a read-only <code>ListModel</code> from an array of objects,
+     * Constructs a read-only <code>ListModel</code> from an array of items,
      * and calls {@code setModel} with this model.
      * <p>
      * Attempts to pass a {@code null} value to this method results in
@@ -1676,15 +1699,15 @@
      * references the given array directly. Attempts to modify the array
      * after invoking this method results in undefined behavior.
      *
-     * @param listData an array of {@code Objects} containing the items to
+     * @param listData an array of {@code E} containing the items to
      *        display in the list
      * @see #setModel
      */
-    public void setListData(final Object[] listData) {
+    public void setListData(final E[] listData) {
         setModel (
-            new AbstractListModel() {
+            new AbstractListModel<E>() {
                 public int getSize() { return listData.length; }
-                public Object getElementAt(int i) { return listData[i]; }
+                public E getElementAt(int i) { return listData[i]; }
             }
         );
     }
@@ -1703,11 +1726,11 @@
      *                                          display in the list
      * @see #setModel
      */
-    public void setListData(final Vector<?> listData) {
+    public void setListData(final Vector<? extends E> listData) {
         setModel (
-            new AbstractListModel() {
+            new AbstractListModel<E>() {
                 public int getSize() { return listData.size(); }
-                public Object getElementAt(int i) { return listData.elementAt(i); }
+                public E getElementAt(int i) { return listData.elementAt(i); }
             }
         );
     }
@@ -2235,10 +2258,13 @@
      * @see #isSelectedIndex
      * @see #getModel
      * @see #addListSelectionListener
+     *
+     * @deprecated As of JDK 1.7, replaced by {@link #getSelectedValuesList()}
      */
+    @Deprecated
     public Object[] getSelectedValues() {
         ListSelectionModel sm = getSelectionModel();
-        ListModel dm = getModel();
+        ListModel<E> dm = getModel();
 
         int iMin = sm.getMinSelectionIndex();
         int iMax = sm.getMaxSelectionIndex();
@@ -2259,6 +2285,37 @@
         return rv;
     }
 
+    /**
+     * Returns a list of all the selected items, in increasing order based
+     * on their indices in the list.
+     *
+     * @return the selected items, or an empty list if nothing is selected
+     * @see #isSelectedIndex
+     * @see #getModel
+     * @see #addListSelectionListener
+     *
+     * @since 1.7
+     */
+    public List<E> getSelectedValuesList() {
+        ListSelectionModel sm = getSelectionModel();
+        ListModel<E> dm = getModel();
+
+        int iMin = sm.getMinSelectionIndex();
+        int iMax = sm.getMaxSelectionIndex();
+
+        if ((iMin < 0) || (iMax < 0)) {
+            return Collections.emptyList();
+        }
+
+        List<E> selectedItems = new ArrayList<E>();
+        for(int i = iMin; i <= iMax; i++) {
+            if (sm.isSelectedIndex(i)) {
+                selectedItems.add(dm.getElementAt(i));
+            }
+        }
+        return selectedItems;
+    }
+
 
     /**
      * Returns the smallest selected cell index; <i>the selection</i> when only
@@ -2291,7 +2348,7 @@
      * @see #getModel
      * @see #addListSelectionListener
      */
-    public Object getSelectedValue() {
+    public E getSelectedValue() {
         int i = getMinSelectionIndex();
         return (i == -1) ? null : getModel().getElementAt(i);
     }
@@ -2309,7 +2366,7 @@
             setSelectedIndex(-1);
         else if(!anObject.equals(getSelectedValue())) {
             int i,c;
-            ListModel dm = getModel();
+            ListModel<E> dm = getModel();
             for(i=0,c=dm.getSize();i<c;i++)
                 if(anObject.equals(dm.getElementAt(i))){
                     setSelectedIndex(i);
@@ -3138,14 +3195,14 @@
            */
         protected class AccessibleJListChild extends AccessibleContext
                 implements Accessible, AccessibleComponent {
-            private JList     parent = null;
+            private JList<E>     parent = null;
             private int       indexInParent;
             private Component component = null;
             private AccessibleContext accessibleContext = null;
-            private ListModel listModel;
-            private ListCellRenderer cellRenderer = null;
-
-            public AccessibleJListChild(JList parent, int indexInParent) {
+            private ListModel<E> listModel;
+            private ListCellRenderer<? super E> cellRenderer = null;
+
+            public AccessibleJListChild(JList<E> parent, int indexInParent) {
                 this.parent = parent;
                 this.setAccessibleParent(parent);
                 this.indexInParent = indexInParent;
@@ -3175,7 +3232,7 @@
                 if ((parent != null)
                         && (listModel != null)
                         && cellRenderer != null) {
-                    Object value = listModel.getElementAt(index);
+                    E value = listModel.getElementAt(index);
                     boolean isSelected = parent.isSelectedIndex(index);
                     boolean isFocussed = parent.isFocusOwner()
                             && (index == parent.getLeadSelectionIndex());
--- a/jdk/src/share/classes/javax/swing/JTable.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/JTable.java	Thu Dec 10 09:50:09 2009 -0800
@@ -1337,7 +1337,11 @@
                 return (TableCellRenderer)renderer;
             }
             else {
-                return getDefaultRenderer(columnClass.getSuperclass());
+                Class c = columnClass.getSuperclass();
+                if (c == null && columnClass != Object.class) {
+                    c = Object.class;
+                }
+                return getDefaultRenderer(c);
             }
         }
     }
--- a/jdk/src/share/classes/javax/swing/ListCellRenderer.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/ListCellRenderer.java	Thu Dec 10 09:50:09 2009 -0800
@@ -33,12 +33,13 @@
  * the cells in a JList.  For example, to use a JLabel as a
  * ListCellRenderer, you would write something like this:
  * <pre>
- * class MyCellRenderer extends JLabel implements ListCellRenderer {
+ * {@code
+ * class MyCellRenderer extends JLabel implements ListCellRenderer<Object> {
  *     public MyCellRenderer() {
  *         setOpaque(true);
  *     }
  *
- *     public Component getListCellRendererComponent(JList list,
+ *     public Component getListCellRendererComponent(JList<?> list,
  *                                                   Object value,
  *                                                   int index,
  *                                                   boolean isSelected,
@@ -75,14 +76,17 @@
  *         return this;
  *     }
  * }
+ * }
  * </pre>
  *
+ * @param <E> the type of values this renderer can be used for
+ *
  * @see JList
  * @see DefaultListCellRenderer
  *
  * @author Hans Muller
  */
-public interface ListCellRenderer
+public interface ListCellRenderer<E>
 {
     /**
      * Return a component that has been configured to display the specified
@@ -104,8 +108,8 @@
      * @see ListModel
      */
     Component getListCellRendererComponent(
-        JList list,
-        Object value,
+        JList<? extends E> list,
+        E value,
         int index,
         boolean isSelected,
         boolean cellHasFocus);
--- a/jdk/src/share/classes/javax/swing/ListModel.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/ListModel.java	Thu Dec 10 09:50:09 2009 -0800
@@ -35,10 +35,12 @@
  * length of the data model must be reported to all of the
  * ListDataListeners.
  *
+ * @param <E> the type of the elements of this model
+ *
  * @author Hans Muller
  * @see JList
  */
-public interface ListModel
+public interface ListModel<E>
 {
   /**
    * Returns the length of the list.
@@ -51,7 +53,7 @@
    * @param index the requested index
    * @return the value at <code>index</code>
    */
-  Object getElementAt(int index);
+  E getElementAt(int index);
 
   /**
    * Adds a listener to the list that's notified each time a change
--- a/jdk/src/share/classes/javax/swing/plaf/ComponentUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/ComponentUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -60,13 +60,13 @@
     }
 
     /**
-     * Configures the specified component appropriate for the look and feel.
+     * Configures the specified component appropriately for the look and feel.
      * This method is invoked when the <code>ComponentUI</code> instance is being installed
      * as the UI delegate on the specified component.  This method should
      * completely configure the component for the look and feel,
      * including the following:
      * <ol>
-     * <li>Install any default property values for color, fonts, borders,
+     * <li>Install default property values for color, fonts, borders,
      *     icons, opacity, etc. on the component.  Whenever possible,
      *     property values initialized by the client program should <i>not</i>
      *     be overridden.
@@ -116,7 +116,7 @@
     }
 
     /**
-     * Paints the specified component appropriate for the look and feel.
+     * Paints the specified component appropriately for the look and feel.
      * This method is invoked from the <code>ComponentUI.update</code> method when
      * the specified component is being painted.  Subclasses should override
      * this method and use the specified <code>Graphics</code> object to
@@ -134,15 +134,15 @@
     }
 
     /**
-     * Notifies this UI delegate that it's time to paint the specified
+     * Notifies this UI delegate that it is time to paint the specified
      * component.  This method is invoked by <code>JComponent</code>
      * when the specified component is being painted.
-     * By default this method will fill the specified component with
-     * its background color (if its <code>opaque</code> property is
-     * <code>true</code>) and then immediately call <code>paint</code>.
-     * In general this method need not be overridden by subclasses;
-     * all look-and-feel rendering code should reside in the <code>paint</code>
-     * method.
+     *
+     * <p>By default this method fills the specified component with
+     * its background color if its {@code opaque} property is {@code true},
+     * and then immediately calls {@code paint}. In general this method need
+     * not be overridden by subclasses; all look-and-feel rendering code should
+     * reside in the {@code paint} method.
      *
      * @param g the <code>Graphics</code> context in which to paint
      * @param c the component being painted;
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxEditor.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxEditor.java	Thu Dec 10 09:50:09 2009 -0800
@@ -24,14 +24,10 @@
  */
 package javax.swing.plaf.basic;
 
-import javax.swing.*;
+import javax.swing.ComboBoxEditor;
+import javax.swing.JTextField;
 import javax.swing.border.Border;
-
-import javax.swing.text.AttributeSet;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.PlainDocument;
-
-import java.awt.*;
+import java.awt.Component;
 import java.awt.event.*;
 
 import java.lang.reflect.Method;
@@ -73,12 +69,17 @@
      * @param anObject the displayed value of the editor
      */
     public void setItem(Object anObject) {
+        String text;
+
         if ( anObject != null )  {
-            editor.setText(anObject.toString());
-
+            text = anObject.toString();
             oldValue = anObject;
         } else {
-            editor.setText("");
+            text = "";
+        }
+        // workaround for 4530952
+        if (! text.equals(editor.getText())) {
+            editor.setText(text);
         }
     }
 
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -30,7 +30,6 @@
 import javax.swing.*;
 import javax.accessibility.*;
 import javax.swing.plaf.*;
-import javax.swing.border.*;
 import javax.swing.text.*;
 import javax.swing.event.*;
 import java.beans.PropertyChangeListener;
@@ -189,19 +188,20 @@
     /**
      * Indicates whether or not the combo box button should be square.
      * If square, then the width and height are equal, and are both set to
-     * the height of the combo (minus appropriate insets).
+     * the height of the combo minus appropriate insets.
+     *
+     * @since 1.7
      */
-    private boolean squareButton = true;
+    protected boolean squareButton = true;
 
     /**
-     * Optional: if specified, these insets act as padding around the cell
-     * renderer when laying out and painting the "selected" item in the
-     * combo box. BasicComboBoxUI uses a single combo box renderer for rendering
-     * both the main combo box item and also all the items in the dropdown
-     * for the combo box. padding allows you to specify addition insets in
-     * addition to those specified by the cell renderer.
+     * If specified, these insets act as padding around the cell renderer when
+     * laying out and painting the "selected" item in the combo box. These
+     * insets add to those specified by the cell renderer.
+     *
+     * @since 1.7
      */
-    private Insets padding;
+    protected Insets padding;
 
     // Used for calculating the default size.
     private static ListCellRenderer getDefaultListCellRenderer() {
@@ -345,7 +345,7 @@
     }
 
     /**
-     * Create and install the listeners for the combo box and its model.
+     * Creates and installs listeners for the combo box and its model.
      * This method is called when the UI is installed.
      */
     protected void installListeners() {
@@ -379,8 +379,8 @@
     }
 
     /**
-     * Uninstalls the default colors, default font, default renderer, and default
-     * editor into the JComboBox.
+     * Uninstalls the default colors, default font, default renderer,
+     * and default editor from the combo box.
      */
     protected void uninstallDefaults() {
         LookAndFeel.installColorsAndFont( comboBox,
@@ -391,7 +391,7 @@
     }
 
     /**
-     * Remove the installed listeners from the combo box and its model.
+     * Removes the installed listeners from the combo box and its model.
      * The number and types of listeners removed and in this method should be
      * the same that was added in <code>installListeners</code>
      */
@@ -839,7 +839,7 @@
     }
 
     /**
-     * Creates an button which will be used as the control to show or hide
+     * Creates a button which will be used as the control to show or hide
      * the popup portion of the combo box.
      *
      * @return a button which represents the popup control
@@ -1392,12 +1392,17 @@
     }
 
     /**
-     * This has been refactored out in hopes that it may be investigated and
-     * simplified for the next major release. adding/removing
-     * the component to the currentValuePane and changing the font may be
-     * redundant operations.
+     * Returns the size a component would have if used as a cell renderer.
+     *
+     * @param comp a {@code Component} to check
+     * @return size of the component
+     * @since 1.7
      */
-    private Dimension getSizeForComponent(Component comp) {
+    protected Dimension getSizeForComponent(Component comp) {
+        // This has been refactored out in hopes that it may be investigated and
+        // simplified for the next major release. adding/removing
+        // the component to the currentValuePane and changing the font may be
+        // redundant operations.
         currentValuePane.add(comp);
         comp.setFont(comboBox.getFont());
         Dimension d = comp.getPreferredSize();
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -141,11 +141,10 @@
     }
 
     /**
-     * Paint the label text in the foreground color, if the label
-     * is opaque then paint the entire background with the background
-     * color.  The Label text is drawn by paintEnabledText() or
-     * paintDisabledText().  The locations of the label parts are computed
-     * by layoutCL.
+     * Paints the label text with the foreground color, if the label is opaque
+     * then paints the entire background with the background color. The Label
+     * text is drawn by {@link #paintEnabledText} or {@link #paintDisabledText}.
+     * The locations of the label parts are computed by {@link #layoutCL}.
      *
      * @see #paintEnabledText
      * @see #paintDisabledText
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -685,7 +685,7 @@
 
 
     /**
-     * Create and install the listeners for the JList, its model, and its
+     * Creates and installs the listeners for the JList, its model, and its
      * selectionModel.  This method is called at installUI() time.
      *
      * @see #installUI
@@ -728,7 +728,7 @@
 
 
     /**
-     * Remove the listeners for the JList, its model, and its
+     * Removes the listeners from the JList, its model, and its
      * selectionModel.  All of the listener fields, are reset to
      * null here.  This method is called at uninstallUI() time,
      * it should be kept in sync with installListeners.
@@ -764,8 +764,8 @@
 
 
     /**
-     * Initialize JList properties, e.g. font, foreground, and background,
-     * and add the CellRendererPane.  The font, foreground, and background
+     * Initializes list properties such as font, foreground, and background,
+     * and adds the CellRendererPane. The font, foreground, and background
      * properties are only set if their current value is either null
      * or a UIResource, other properties are set if the current
      * value is null.
@@ -820,9 +820,9 @@
 
 
     /**
-     * Set the JList properties that haven't been explicitly overridden to
-     * null.  A property is considered overridden if its current value
-     * is not a UIResource.
+     * Sets the list properties that have not been explicitly overridden to
+     * {@code null}. A property is considered overridden if its current value
+     * is not a {@code UIResource}.
      *
      * @see #installDefaults
      * @see #uninstallUI
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -32,7 +32,6 @@
 
 import javax.swing.*;
 import javax.swing.event.*;
-import javax.swing.border.*;
 import javax.swing.plaf.*;
 import javax.swing.text.View;
 
@@ -54,7 +53,12 @@
     protected Color disabledForeground;
     protected Color acceleratorForeground;
     protected Color acceleratorSelectionForeground;
-    private   String acceleratorDelimiter;
+
+    /**
+     * Accelerator delimiter string, such as {@code '+'} in {@code 'Ctrl+C'}.
+     * @since 1.7
+     */
+    protected String acceleratorDelimiter;
 
     protected int defaultTextIconGap;
     protected Font acceleratorFont;
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -93,10 +93,13 @@
      * scrollbar. */
     private boolean supportsAbsolutePositioning;
 
-    /** Hint as to what width (when vertical) or height (when horizontal)
+    /**
+     * Hint as to what width (when vertical) or height (when horizontal)
      * should be.
+     *
+     * @since 1.7
      */
-    private int scrollBarWidth;
+    protected int scrollBarWidth;
 
     private Handler handler;
 
@@ -117,18 +120,18 @@
      * number. If negative, then an overlap between the button and track will occur,
      * which is useful for shaped buttons.
      *
-     * TODO This should be made protected in a feature release
+     * @since 1.7
      */
-    private int incrGap;
+    protected int incrGap;
 
     /**
      * Distance between the decrement button and the track. This may be a negative
      * number. If negative, then an overlap between the button and track will occur,
      * which is useful for shaped buttons.
      *
-     * TODO This should be made protected in a feature release
+     * @since 1.7
      */
-    private int decrGap;
+    protected int decrGap;
 
     static void loadActionMap(LazyActionMap map) {
         map.put(new Actions(Actions.POSITIVE_UNIT_INCREMENT));
@@ -586,7 +589,7 @@
 
 
     /**
-     * Return the smallest acceptable size for the thumb.  If the scrollbar
+     * Returns the smallest acceptable size for the thumb.  If the scrollbar
      * becomes so small that this size isn't available, the thumb will be
      * hidden.
      * <p>
@@ -601,7 +604,7 @@
     }
 
     /**
-     * Return the largest acceptable size for the thumb.  To create a fixed
+     * Returns the largest acceptable size for the thumb.  To create a fixed
      * size thumb one make this method and <code>getMinimumThumbSize</code>
      * return the same value.
      * <p>
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -1409,9 +1409,10 @@
     }
 
     /**
-     * Returns a value give a y position.  If yPos is past the track at the top or the
-     * bottom it will set the value to the min or max of the slider, depending if the
-     * slider is inverted or not.
+     * Returns the value at the y position. If {@code yPos} is beyond the
+     * track at the the bottom or the top, this method sets the value to either
+     * the minimum or maximum value of the slider, depending on if the slider
+     * is inverted or not.
      */
     public int valueForYPosition( int yPos ) {
         int value;
@@ -1440,9 +1441,10 @@
     }
 
     /**
-     * Returns a value give an x position.  If xPos is past the track at the left or the
-     * right it will set the value to the min or max of the slider, depending if the
-     * slider is inverted or not.
+     * Returns the value at the x position.  If {@code xPos} is beyond the
+     * track at the left or the right, this method sets the value to either the
+     * minimum or maximum value of the slider, depending on if the slider is
+     * inverted or not.
      */
     public int valueForXPosition( int xPos ) {
         int value;
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -268,7 +268,7 @@
     }
 
     /**
-     * Create a <code>LayoutManager</code> that manages the <code>editor</code>,
+     * Creates a <code>LayoutManager</code> that manages the <code>editor</code>,
      * <code>nextButton</code>, and <code>previousButton</code>
      * children of the JSpinner.  These three children must be
      * added with a constraint that identifies their role:
@@ -286,7 +286,7 @@
 
 
     /**
-     * Create a <code>PropertyChangeListener</code> that can be
+     * Creates a <code>PropertyChangeListener</code> that can be
      * added to the JSpinner itself.  Typically, this listener
      * will call replaceEditor when the "editor" property changes,
      * since it's the <code>SpinnerUI's</code> responsibility to
@@ -302,16 +302,13 @@
 
 
     /**
-     * Create a component that will replace the spinner models value
-     * with the object returned by <code>spinner.getPreviousValue</code>.
-     * By default the <code>previousButton</code> is a JButton. This
-     * method invokes <code>installPreviousButtonListeners</code> to
-     * install the necessary listeners to update the <code>JSpinner</code>'s
-     * model in response to a user gesture. If a previousButton isn't needed
-     * (in a subclass) then override this method to return null.
+     * Creates a decrement button, i.e. component that replaces the spinner
+     * value with the object returned by <code>spinner.getPreviousValue</code>.
+     * By default the <code>previousButton</code> is a {@code JButton}. If the
+     * decrement button is not needed this method should return {@code null}.
      *
-     * @return a component that will replace the spinners model with the
-     *     next value in the sequence, or null
+     * @return a component that will replace the spinner's value with the
+     *     previous value in the sequence, or {@code null}
      * @see #installUI
      * @see #createNextButton
      * @see #installPreviousButtonListeners
@@ -325,15 +322,13 @@
 
 
     /**
-     * Create a component that will replace the spinner models value
-     * with the object returned by <code>spinner.getNextValue</code>.
-     * By default the <code>nextButton</code> is a JButton
-     * who's <code>ActionListener</code> updates it's <code>JSpinner</code>
-     * ancestors model.  If a nextButton isn't needed (in a subclass)
-     * then override this method to return null.
+     * Creates an increment button, i.e. component that replaces the spinner
+     * value with the object returned by <code>spinner.getNextValue</code>.
+     * By default the <code>nextButton</code> is a {@code JButton}. If the
+     * increment button is not needed this method should return {@code null}.
      *
-     * @return a component that will replace the spinners model with the
-     *     next value in the sequence, or null
+     * @return a component that will replace the spinner's value with the
+     *     next value in the sequence, or {@code null}
      * @see #installUI
      * @see #createPreviousButton
      * @see #installNextButtonListeners
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -829,7 +829,7 @@
 
     /**
      * Returns the default non continuous layout divider, which is an
-     * instanceof Canvas that fills the background in dark gray.
+     * instance of {@code Canvas} that fills in the background with dark gray.
      */
     protected Component createDefaultNonContinuousLayoutDivider() {
         return new Canvas() {
@@ -1041,11 +1041,11 @@
 
 
     /**
-     * Messaged after the JSplitPane the receiver is providing the look
-     * and feel for paints its children.
+     * Called when the specified split pane has finished painting
+     * its children.
      */
-    public void finishedPaintingChildren(JSplitPane jc, Graphics g) {
-        if(jc == splitPane && getLastDragLocation() != -1 &&
+    public void finishedPaintingChildren(JSplitPane sp, Graphics g) {
+        if(sp == splitPane && getLastDragLocation() != -1 &&
            !isContinuousLayout() && !draggingHW) {
             Dimension      size = splitPane.getSize();
 
@@ -1062,7 +1062,7 @@
 
 
     /**
-     * Messaged to paint the look and feel.
+     * @inheritDoc
      */
     public void paint(Graphics g, JComponent jc) {
         if (!painted && splitPane.getDividerLocation()<0) {
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -306,7 +306,7 @@
     }
 
     /**
-     * Initialize JTableHeader properties, e.g. font, foreground, and background.
+     * Initializes JTableHeader properties such as font, foreground, and background.
      * The font, foreground, and background properties are only set if their
      * current value is either null or a UIResource, other properties are set
      * if the current value is null.
@@ -403,9 +403,9 @@
     }
 
     /**
-     * This method gets called every time the rollover column in the table
-     * header is updated. Every look and feel supporting rollover effect
-     * in table header should override this method and repaint the header.
+     * This method gets called every time when a rollover column in the table
+     * header is updated. Every look and feel that supports a rollover effect
+     * in a table header should override this method and repaint the header.
      *
      * @param oldColumn the index of the previous rollover column or -1 if the
      * mouse was not over a column
@@ -736,7 +736,6 @@
     }
 
     private Dimension createHeaderSize(long width) {
-        TableColumnModel columnModel = header.getColumnModel();
         // None of the callers include the intercell spacing, do it here.
         if (width > Integer.MAX_VALUE) {
             width = Integer.MAX_VALUE;
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -37,6 +37,7 @@
 import javax.swing.event.*;
 import javax.swing.border.Border;
 import javax.swing.plaf.UIResource;
+import javax.swing.plaf.synth.SynthUI;
 import sun.swing.DefaultLookup;
 import sun.awt.AppContext;
 import javax.swing.plaf.basic.DragRecognitionSupport.BeforeDrag;
@@ -221,8 +222,7 @@
         // is ==, which is the case for the windows look and feel.
         // Until an appropriate solution is found, the code is being
         // reverted to what it was before the original fix.
-        if (this instanceof sun.swing.plaf.synth.SynthUI ||
-                (c instanceof JTextArea)) {
+        if (this instanceof SynthUI || (c instanceof JTextArea)) {
             return;
         }
         Color background = c.getBackground();
@@ -289,7 +289,7 @@
     protected abstract String getPropertyPrefix();
 
     /**
-     * Initializes component properties, e.g. font, foreground,
+     * Initializes component properties, such as font, foreground,
      * background, caret color, selection color, selected text color,
      * disabled text color, and border color.  The font, foreground, and
      * background properties are only set if their current value is either null
@@ -377,9 +377,9 @@
     }
 
     /**
-     * Sets the component properties that haven't been explicitly overridden to
-     * null.  A property is considered overridden if its current value
-     * is not a UIResource.
+     * Sets the component properties that have not been explicitly overridden
+     * to {@code null}.  A property is considered overridden if its current
+     * value is not a {@code UIResource}.
      *
      * @see #installDefaults
      * @see #uninstallUI
@@ -756,18 +756,18 @@
      * things.
      * <ol>
      * <li>
-     * Set the associated component to opaque (can be changed
+     * Sets the associated component to opaque (can be changed
      * easily by a subclass or on JTextComponent directly),
      * which is the most common case.  This will cause the
      * component's background color to be painted.
      * <li>
-     * Install the default caret and highlighter into the
+     * Installs the default caret and highlighter into the
      * associated component.
      * <li>
-     * Attach to the editor and model.  If there is no
+     * Attaches to the editor and model.  If there is no
      * model, a default one is created.
      * <li>
-     * create the view factory and the view hierarchy used
+     * Creates the view factory and the view hierarchy used
      * to represent the model.
      * </ol>
      *
@@ -784,7 +784,7 @@
 
             // This is a workaround as these should not override what synth has
             // set them to
-            if (!(this instanceof sun.swing.plaf.synth.SynthUI)){
+            if (! (this instanceof SynthUI)) {
                 // common case is background painted... this can
                 // easily be changed by subclasses or from outside
                 // of the component.
@@ -857,9 +857,9 @@
      * To prevent this from happening twice, this method is
      * reimplemented to simply paint.
      * <p>
-     * <em>NOTE:</em> Superclass is also not thread-safe in
-     * it's rendering of the background, although that's not
-     * an issue with the default rendering.
+     * <em>NOTE:</em> NOTE: Superclass is also not thread-safe in its
+     * rendering of the background, although that is not an issue with the
+     * default rendering.
      */
     public void update(Graphics g, JComponent c) {
         paint(g, c);
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -669,7 +669,7 @@
 
     /**
      * Sets the border of the component to have a rollover border which
-     * was created by <code>createRolloverBorder</code>.
+     * was created by the {@link #createRolloverBorder} method.
      *
      * @param c component which will have a rollover border installed
      * @see #createRolloverBorder
@@ -709,7 +709,7 @@
 
     /**
      * Sets the border of the component to have a non-rollover border which
-     * was created by <code>createNonRolloverBorder</code>.
+     * was created by the {@link #createNonRolloverBorder} method.
      *
      * @param c component which will have a non-rollover border installed
      * @see #createNonRolloverBorder
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -30,16 +30,12 @@
 import java.awt.*;
 import java.awt.event.*;
 import java.awt.datatransfer.*;
-import java.awt.dnd.*;
 import java.beans.*;
-import java.io.*;
 import java.util.Enumeration;
 import java.util.Hashtable;
-import java.util.TooManyListenersException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
-import javax.swing.plaf.ActionMapUIResource;
 import javax.swing.plaf.ComponentUI;
 import javax.swing.plaf.UIResource;
 import javax.swing.plaf.TreeUI;
@@ -1244,11 +1240,26 @@
         drawingCache.clear();
     }
 
-    private boolean isDropLine(JTree.DropLocation loc) {
+    /**
+     * Tells if a {@code DropLocation} should be indicated by a line between
+     * nodes. This is meant for {@code javax.swing.DropMode.INSERT} and
+     * {@code javax.swing.DropMode.ON_OR_INSERT} drop modes.
+     *
+     * @param loc a {@code DropLocation}
+     * @return {@code true} if the drop location should be shown as a line
+     * @since 1.7
+     */
+    protected boolean isDropLine(JTree.DropLocation loc) {
         return loc != null && loc.getPath() != null && loc.getChildIndex() != -1;
     }
 
-    private void paintDropLine(Graphics g) {
+    /**
+     * Paints the drop line.
+     *
+     * @param g {@code Graphics} object to draw on
+     * @since 1.7
+     */
+    protected void paintDropLine(Graphics g) {
         JTree.DropLocation loc = tree.getDropLocation();
         if (!isDropLine(loc)) {
             return;
@@ -1262,7 +1273,14 @@
         }
     }
 
-    private Rectangle getDropLineRect(JTree.DropLocation loc) {
+    /**
+     * Returns a ubounding box for the drop line.
+     *
+     * @param loc a {@code DropLocation}
+     * @return bounding box for the drop line
+     * @since 1.7
+     */
+    protected Rectangle getDropLineRect(JTree.DropLocation loc) {
         Rectangle rect;
         TreePath path = loc.getPath();
         int index = loc.getChildIndex();
@@ -1684,7 +1702,7 @@
                     treeState.setExpandedState(path, true);
                 }
             }
-            updateLeadRow();
+            updateLeadSelectionRow();
             updateSize();
         }
     }
@@ -2425,11 +2443,21 @@
         return tree.getLeadSelectionPath();
     }
 
-    private void updateLeadRow() {
+    /**
+     * Updates the lead row of the selection.
+     * @since 1.7
+     */
+    protected void updateLeadSelectionRow() {
         leadRow = getRowForPath(tree, getLeadSelectionPath());
     }
 
-    private int getLeadSelectionRow() {
+    /**
+     * Returns the lead row of the selection.
+     *
+     * @return selection lead row
+     * @since 1.7
+     */
+    protected int getLeadSelectionRow() {
         return leadRow;
     }
 
@@ -3345,7 +3373,7 @@
 
                 if (changeName == JTree.LEAD_SELECTION_PATH_PROPERTY) {
                     if (!ignoreLAChange) {
-                        updateLeadRow();
+                        updateLeadSelectionRow();
                         repaintPath((TreePath)event.getOldValue());
                         repaintPath((TreePath)event.getNewValue());
                     }
@@ -3763,7 +3791,7 @@
                 completeEditing();
                 if(path != null && tree.isVisible(path)) {
                     treeState.setExpandedState(path, false);
-                    updateLeadRow();
+                    updateLeadSelectionRow();
                     updateSize();
                 }
             }
@@ -3823,7 +3851,7 @@
             if(treeState != null && e != null) {
                 treeState.treeNodesInserted(e);
 
-                updateLeadRow();
+                updateLeadSelectionRow();
 
                 TreePath       path = e.getTreePath();
 
@@ -3848,7 +3876,7 @@
             if(treeState != null && e != null) {
                 treeState.treeNodesRemoved(e);
 
-                updateLeadRow();
+                updateLeadSelectionRow();
 
                 TreePath       path = e.getTreePath();
 
@@ -3862,7 +3890,7 @@
             if(treeState != null && e != null) {
                 treeState.treeStructureChanged(e);
 
-                updateLeadRow();
+                updateLeadSelectionRow();
 
                 TreePath       pPath = e.getTreePath();
 
--- a/jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java	Thu Dec 10 09:50:09 2009 -0800
@@ -34,7 +34,7 @@
 /**
  * The default layout manager for Popup menus and menubars.  This
  * class is an extension of BoxLayout which adds the UIResource tag
- * so that plauggable L&Fs can distinguish it from user-installed
+ * so that pluggable L&Fs can distinguish it from user-installed
  * layout managers on menus.
  *
  * @author Georges Saab
--- a/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java	Thu Dec 10 09:50:09 2009 -0800
@@ -257,13 +257,41 @@
 
     /**
      * @inheritDoc
-     * @return true
+     * @return {@code true}
      */
     @Override public boolean shouldUpdateStyleOnAncestorChanged() {
         return true;
     }
 
     /**
+     * @inheritDoc
+     *
+     * <p>Overridden to return {@code true} when one of the following
+     * properties change:
+     * <ul>
+     *   <li>{@code "Nimbus.Overrides"}
+     *   <li>{@code "Nimbus.Overrides.InheritDefaults"}
+     *   <li>{@code "JComponent.sizeVariant"}
+     * </ul>
+     *
+     * @since 1.7
+     */
+    @Override
+    protected boolean shouldUpdateStyleOnEvent(PropertyChangeEvent ev) {
+        String eName = ev.getPropertyName();
+
+        // Always update when overrides or size variant change
+        if ("Nimbus.Overrides" == eName ||
+            "Nimbus.Overrides.InheritDefaults" == eName ||
+            "JComponent.sizeVariant" == eName) {
+
+            return true;
+        }
+
+        return super.shouldUpdateStyleOnEvent(ev);
+    }
+
+    /**
      * <p>Registers a third party component with the NimbusLookAndFeel.</p>
      *
      * <p>Regions represent Components and areas within Components that act as
--- a/jdk/src/share/classes/javax/swing/plaf/nimbus/package.html	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/package.html	Thu Dec 10 09:50:09 2009 -0800
@@ -88,12 +88,11 @@
 <p><strong>Note:</strong>
 Most of the Swing API is <em>not</em> thread safe.
 For details, see
-<a
-href="http://java.sun.com/docs/books/tutorial/uiswing/overview/threads.html"
-target="_top">Threads and Swing</a>,
+<a href="http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html"
+   target="_top">Concurrency in Swing</a>,
 a section in
 <em><a href="http://java.sun.com/docs/books/tutorial/"
-target="_top">The Java Tutorial</a></em>.
+       target="_top">The Java Tutorial</a></em>.
 
 @since 1.7
 @serial exclude
--- a/jdk/src/share/classes/javax/swing/plaf/synth/DefaultMenuLayout.java	Thu Dec 10 09:46:13 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/*
- * Copyright 2002-2008 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package javax.swing.plaf.synth;
-
-import javax.swing.*;
-import javax.swing.plaf.UIResource;
-
-import java.awt.Container;
-import java.awt.Dimension;
-
-/**
- * The default layout manager for Popup menus and menubars.  This
- * class is an extension of BoxLayout which adds the UIResource tag
- * so that plauggable L&Fs can distinguish it from user-installed
- * layout managers on menus.
- *
- * Derived from javax.swing.plaf.basic.DefaultMenuLayout
- *
- * @author Georges Saab
- */
-
-class DefaultMenuLayout extends BoxLayout implements UIResource {
-    public DefaultMenuLayout(Container target, int axis) {
-        super(target, axis);
-    }
-
-    public Dimension preferredLayoutSize(Container target) {
-        if (target instanceof JPopupMenu) {
-            JPopupMenu popupMenu = (JPopupMenu) target;
-
-            popupMenu.putClientProperty(
-                    SynthMenuItemLayoutHelper.MAX_ACC_OR_ARROW_WIDTH, null);
-            sun.swing.MenuItemLayoutHelper.clearUsedClientProperties(popupMenu);
-
-            if (popupMenu.getComponentCount() == 0) {
-                return new Dimension(0, 0);
-            }
-        }
-
-        // Make BoxLayout recalculate cached preferred sizes
-        super.invalidateLayout(target);
-
-        return super.preferredLayoutSize(target);
-    }
-}
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthBorder.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthBorder.java	Thu Dec 10 09:50:09 2009 -0800
@@ -29,7 +29,6 @@
 import javax.swing.text.JTextComponent;
 import javax.swing.border.*;
 import javax.swing.plaf.UIResource;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
  * SynthBorder is a border that delegates to a Painter. The Insets
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -25,40 +25,49 @@
 
 package javax.swing.plaf.synth;
 
+import javax.swing.*;
 import java.awt.*;
-import java.awt.event.*;
-import java.io.Serializable;
-import javax.swing.*;
-import javax.swing.border.*;
-import java.awt.*;
-import java.awt.event.*;
 import java.beans.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicButtonUI;
 import javax.swing.plaf.basic.BasicHTML;
 import javax.swing.text.View;
-import sun.swing.plaf.synth.SynthUI;
-import sun.swing.plaf.synth.DefaultSynthStyle;
 
 /**
- * Synth's ButtonUI implementation.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JButton}.
  *
  * @author Scott Violet
+ * @since 1.7
  */
-class SynthButtonUI extends BasicButtonUI implements
+public class SynthButtonUI extends BasicButtonUI implements
                                  PropertyChangeListener, SynthUI {
     private SynthStyle style;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthButtonUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults(AbstractButton b) {
         updateStyle(b);
 
         LookAndFeel.installProperty(b, "rolloverEnabled", Boolean.TRUE);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners(AbstractButton b) {
         super.installListeners(b);
         b.addPropertyChangeListener(this);
@@ -99,11 +108,19 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners(AbstractButton b) {
         super.uninstallListeners(b);
         b.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults(AbstractButton b) {
         SynthContext context = getContext(b, ENABLED);
 
@@ -112,20 +129,20 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
 
     SynthContext getContext(JComponent c, int state) {
-        Region region = getRegion(c);
+        Region region = SynthLookAndFeel.getRegion(c);
         return SynthContext.getContext(SynthContext.class, c, region,
                                        style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     /**
      * Returns the current state of the passed in <code>AbstractButton</code>.
      */
@@ -164,6 +181,10 @@
         return state;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public int getBaseline(JComponent c, int width, int height) {
         if (c == null) {
             throw new NullPointerException("Component must be non-null");
@@ -215,6 +236,10 @@
     //          Paint Methods
     // ********************************
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -224,6 +249,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -231,6 +260,12 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         AbstractButton b = (AbstractButton)context.getComponent();
 
@@ -253,19 +288,22 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintButtonBorder(context, g, x, y, w, h);
     }
 
     /**
-     * Returns the default icon. This should NOT callback
+     * Returns the default icon. This should not callback
      * to the JComponent.
      *
-     * @param b AbstractButton the icon is associated with
+     * @param b button the icon is associated with
      * @return default icon
      */
-
     protected Icon getDefaultIcon(AbstractButton b) {
         SynthContext context = getContext(b);
         Icon icon = context.getStyle().getIcon(context, getPropertyPrefix() + "icon");
@@ -274,7 +312,11 @@
     }
 
     /**
-     * Returns the Icon to use in painting the button.
+     * Returns the Icon to use for painting the button. The icon is chosen with
+     * respect to the current state of the button.
+     *
+     * @param b button the icon is associated with
+     * @return an icon
      */
     protected Icon getIcon(AbstractButton b) {
         Icon icon = b.getIcon();
@@ -374,7 +416,7 @@
     /**
      * Returns the amount to shift the text/icon when painting.
      */
-    protected int getTextShiftOffset(SynthContext state) {
+    private int getTextShiftOffset(SynthContext state) {
         AbstractButton button = (AbstractButton)state.getComponent();
         ButtonModel model = button.getModel();
 
@@ -389,6 +431,11 @@
     // ********************************
     //          Layout Methods
     // ********************************
+
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getMinimumSize(JComponent c) {
         if (c.getComponentCount() > 0 && c.getLayout() != null) {
             return null;
@@ -406,6 +453,10 @@
         return size;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getPreferredSize(JComponent c) {
         if (c.getComponentCount() > 0 && c.getLayout() != null) {
             return null;
@@ -423,6 +474,10 @@
         return size;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getMaximumSize(JComponent c) {
         if (c.getComponentCount() > 0 && c.getLayout() != null) {
             return null;
@@ -442,7 +497,8 @@
     }
 
     /**
-     * Returns the Icon used in calculating the pref/min/max size.
+     * Returns the Icon used in calculating the
+     * preferred/minimum/maximum size.
      */
     protected Icon getSizingIcon(AbstractButton b) {
         Icon icon = getEnabledIcon(b, b.getIcon());
@@ -452,6 +508,10 @@
         return icon;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((AbstractButton)e.getSource());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -27,56 +27,50 @@
 
 
 import java.awt.*;
-import java.awt.event.*;
 import javax.swing.*;
 import javax.swing.plaf.*;
-import javax.swing.border.*;
-import java.io.Serializable;
 
 
 /**
- * Synth's CheckBoxMenuItemUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JCheckBoxMenuItem}.
  *
  * @author Leif Samuelsson
  * @author Georges Saab
  * @author David Karlton
  * @author Arnaud Weber
+ * @since 1.7
  */
-class SynthCheckBoxMenuItemUI extends SynthMenuItemUI {
+public class SynthCheckBoxMenuItemUI extends SynthMenuItemUI {
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthCheckBoxMenuItemUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected String getPropertyPrefix() {
         return "CheckBoxMenuItem";
     }
 
-    public void processMouseEvent(JMenuItem item, MouseEvent e,
-                                  MenuElement path[], MenuSelectionManager manager) {
-        Point p = e.getPoint();
-        if (p.x >= 0 && p.x < item.getWidth() && p.y >= 0 && p.y < item.getHeight()) {
-            if (e.getID() == MouseEvent.MOUSE_RELEASED) {
-                manager.clearSelectedPath();
-                item.doClick(0);
-            } else {
-                manager.setSelectedPath(path);
-            }
-        } else if (item.getModel().isArmed()) {
-            int c = path.length - 1;
-            MenuElement newPath[] = new MenuElement[c];
-            for (int i = 0; i < c; i++) {
-                newPath[i] = path[i];
-            }
-            manager.setSelectedPath(newPath);
-        }
-    }
-
+    @Override
     void paintBackground(SynthContext context, Graphics g, JComponent c) {
         context.getPainter().paintCheckBoxMenuItemBackground(context, g, 0, 0,
                                                   c.getWidth(), c.getHeight());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintCheckBoxMenuItemBorder(context, g, x, y, w, h);
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -25,36 +25,51 @@
 
 package javax.swing.plaf.synth;
 
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.*;
-import javax.swing.plaf.*;
-import java.io.Serializable;
+import javax.swing.JComponent;
+import java.awt.Graphics;
+import javax.swing.plaf.ComponentUI;
 
 
 /**
- * Synth's CheckBoxUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JCheckBox}.
  *
  * @author Jeff Dinkins
+ * @since 1.7
  */
-class SynthCheckBoxUI extends SynthRadioButtonUI {
+public class SynthCheckBoxUI extends SynthRadioButtonUI {
 
     // ********************************
     //            Create PLAF
     // ********************************
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param b component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent b) {
         return new SynthCheckBoxUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected String getPropertyPrefix() {
         return "CheckBox.";
     }
 
+    @Override
     void paintBackground(SynthContext context, Graphics g, JComponent c) {
         context.getPainter().paintCheckBoxBackground(context, g, 0, 0,
                                                   c.getWidth(), c.getHeight());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintCheckBoxBorder(context, g, x, y, w, h);
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -28,34 +28,39 @@
 
 import javax.swing.*;
 import javax.swing.colorchooser.*;
-import javax.swing.event.*;
-import javax.swing.border.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicColorChooserUI;
-import java.util.*;
 import java.awt.*;
-import java.awt.image.*;
-import java.awt.event.*;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
-import java.io.Serializable;
-import sun.swing.plaf.synth.SynthUI;
 
 
 /**
- * Synth's ColorChooserUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JColorChooser}.
  *
  * @author Tom Santos
  * @author Steve Wilson
+ * @since 1.7
  */
-class SynthColorChooserUI extends BasicColorChooserUI implements
+public class SynthColorChooserUI extends BasicColorChooserUI implements
         PropertyChangeListener, SynthUI {
     private SynthStyle style;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthColorChooserUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected AbstractColorChooserPanel[] createDefaultChoosers() {
         SynthContext context = getContext(chooser, ENABLED);
         AbstractColorChooserPanel[] panels = (AbstractColorChooserPanel[])
@@ -68,6 +73,10 @@
         return panels;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         super.installDefaults();
         updateStyle(chooser);
@@ -79,6 +88,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(chooser, ENABLED);
 
@@ -88,16 +101,28 @@
         super.uninstallDefaults();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         chooser.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         chooser.removePropertyChangeListener(this);
         super.uninstallListeners();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -107,14 +132,14 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -125,6 +150,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -132,14 +161,29 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     * This implementation does not perform any actions.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintColorChooserBorder(context, g, x, y,w,h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JColorChooser)e.getSource());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -27,21 +27,21 @@
 
 import java.awt.*;
 import java.awt.event.*;
-import java.lang.reflect.*;
 import javax.swing.*;
 import javax.swing.plaf.*;
 import javax.swing.event.*;
 import javax.swing.plaf.basic.*;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeEvent;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Synth's ComboBoxUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JComboBox}.
  *
  * @author Scott Violet
+ * @since 1.7
  */
-class SynthComboBoxUI extends BasicComboBoxUI implements
+public class SynthComboBoxUI extends BasicComboBoxUI implements
                               PropertyChangeListener, SynthUI {
     private SynthStyle style;
     private boolean useListColors;
@@ -93,12 +93,11 @@
     private boolean forceOpaque = false;
 
     /**
-     * NOTE: This serves the same purpose as the same field in BasicComboBoxUI.
-     * It is here because I could not give the padding field in
-     * BasicComboBoxUI protected access in an update release.
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
      */
-    private Insets padding;
-
     public static ComponentUI createUI(JComponent c) {
         return new SynthComboBoxUI();
     }
@@ -118,21 +117,6 @@
 
     @Override
     protected void installDefaults() {
-        //NOTE: This next line of code was added because, since squareButton in
-        //BasicComboBoxUI is private, I need to have some way of reading it from UIManager.
-        //This is an incomplete solution (since it implies that squareButons,
-        //once set, cannot be reset per state. Probably ok, but not always ok).
-        //This line of code should be removed at the same time that squareButton
-        //is made protected in the super class.
-        super.installDefaults();
-
-        //This is here instead of in updateStyle because the value for padding
-        //needs to remain consistent with the value for padding in
-        //BasicComboBoxUI. I wouldn't have this value here at all if not
-        //for the fact that I cannot make "padding" protected in any way
-        //for an update release. This *should* be fixed in Java 7
-        padding = UIManager.getInsets("ComboBox.padding");
-
         updateStyle(comboBox);
     }
 
@@ -142,6 +126,7 @@
 
         style = SynthLookAndFeel.updateStyle(context, this);
         if (style != oldStyle) {
+            padding = (Insets) style.get(context, "ComboBox.padding");
             popupInsets = (Insets)style.get(context, "ComboBox.popupInsets");
             useListColors = style.getBoolean(context,
                     "ComboBox.rendererUseListColors", true);
@@ -149,6 +134,8 @@
                     "ComboBox.buttonWhenNotEditable", false);
             pressedWhenPopupVisible = style.getBoolean(context,
                     "ComboBox.pressedWhenPopupVisible", false);
+            squareButton = style.getBoolean(context,
+                    "ComboBox.squareButton", true);
 
             if (oldStyle != null) {
                 uninstallKeyboardActions();
@@ -164,6 +151,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void installListeners() {
         comboBox.addPropertyChangeListener(this);
@@ -172,6 +162,9 @@
         super.installListeners();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void uninstallUI(JComponent c) {
         if (popup instanceof SynthComboPopup) {
@@ -181,6 +174,9 @@
         buttonHandler = null;
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(comboBox, ENABLED);
@@ -190,6 +186,9 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void uninstallListeners() {
         editorFocusHandler.unregister();
@@ -200,6 +199,9 @@
         super.uninstallListeners();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
@@ -210,10 +212,6 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         // currently we have a broken situation where if a developer
         // takes the border from a JComboBox and sets it on a JTextField
@@ -252,6 +250,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected ComboPopup createPopup() {
         SynthComboPopup p = new SynthComboPopup(comboBox);
@@ -259,11 +260,17 @@
         return p;
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected ListCellRenderer createRenderer() {
         return new SynthComboBoxRenderer();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected ComboBoxEditor createEditor() {
         return new SynthComboBoxEditor();
@@ -273,6 +280,9 @@
     // end UI Initialization
     //======================
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
@@ -280,6 +290,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected JButton createArrowButton() {
         SynthArrowButton button = new SynthArrowButton(SwingConstants.SOUTH);
@@ -291,6 +304,9 @@
     //=================================
     // begin ComponentUI Implementation
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
@@ -302,6 +318,9 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
@@ -310,6 +329,12 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         hasFocus = comboBox.hasFocus();
         if ( !comboBox.isEditable() ) {
@@ -318,6 +343,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
@@ -375,7 +403,7 @@
     }
 
     /**
-     * Return the default size of an empty display area of the combo box using
+     * Returns the default size of an empty display area of the combo box using
      * the current renderer and font.
      *
      * This method was overridden to use SynthComboBoxRenderer instead of
@@ -394,23 +422,6 @@
     }
 
     /**
-     * This has been refactored out in hopes that it may be investigated and
-     * simplified for the next major release. adding/removing
-     * the component to the currentValuePane and changing the font may be
-     * redundant operations.
-     *
-     * NOTE: This method was copied in its entirety from BasicComboBoxUI. Might
-     * want to make it protected in BasicComboBoxUI in Java 7
-     */
-    private Dimension getSizeForComponent(Component comp) {
-        currentValuePane.add(comp);
-        comp.setFont(comboBox.getFont());
-        Dimension d = comp.getPreferredSize();
-        currentValuePane.remove(comp);
-        return d;
-    }
-
-    /**
      * From BasicComboBoxRenderer v 1.18.
      *
      * Be aware that SynthFileChooserUIImpl relies on the fact that the default
@@ -478,85 +489,17 @@
     }
 
 
-    /**
-     * From BasicCombBoxEditor v 1.24.
-     */
-    private static class SynthComboBoxEditor implements
-                              ComboBoxEditor, UIResource {
-        protected JTextField editor;
-        private Object oldValue;
-
-        public SynthComboBoxEditor() {
-            editor = new JTextField("",9);
-            editor.setName("ComboBox.textField");
-        }
-
-        @Override
-        public Component getEditorComponent() {
-            return editor;
-        }
-
-        /**
-         * Sets the item that should be edited.
-         *
-         * @param anObject the displayed value of the editor
-         */
-        @Override
-        public void setItem(Object anObject) {
-            String text;
+    private static class SynthComboBoxEditor
+            extends BasicComboBoxEditor.UIResource {
 
-            if ( anObject != null )  {
-                text = anObject.toString();
-                oldValue = anObject;
-            } else {
-                text = "";
-            }
-            // workaround for 4530952
-            if (!text.equals(editor.getText())) {
-                editor.setText(text);
-            }
-        }
-
-        @Override
-        public Object getItem() {
-            Object newValue = editor.getText();
-
-            if (oldValue != null && !(oldValue instanceof String))  {
-                // The original value is not a string. Should return the value in it's
-                // original type.
-                if (newValue.equals(oldValue.toString())) {
-                    return oldValue;
-                } else {
-                    // Must take the value from the editor and get the value and cast it to the new type.
-                    Class<?> cls = oldValue.getClass();
-                    try {
-                        Method method = cls.getMethod("valueOf", new Class[]{String.class});
-                        newValue = method.invoke(oldValue, new Object[] { editor.getText()});
-                    } catch (Exception ex) {
-                        // Fail silently and return the newValue (a String object)
-                    }
-                }
-            }
-            return newValue;
-        }
-
-        @Override
-        public void selectAll() {
-            editor.selectAll();
-            editor.requestFocus();
-        }
-
-        @Override
-        public void addActionListener(ActionListener l) {
-            editor.addActionListener(l);
-        }
-
-        @Override
-        public void removeActionListener(ActionListener l) {
-            editor.removeActionListener(l);
+        @Override public JTextField createEditorComponent() {
+            JTextField f = new JTextField("", 9);
+            f.setName("ComboBox.textField");
+            return f;
         }
     }
 
+
     /**
      * Handles all the logic for treating the combo as a button when it is
      * not editable, and when shouldActLikeButton() is true. This class is a
@@ -620,7 +563,7 @@
         //------------------------------------------------------------------
 
         /**
-         * {@inheritDoc}
+         * @inheritDoc
          *
          * Ensures that isPressed() will return true if the combo is pressed,
          * or the arrowButton is pressed, <em>or</em> if the combo popup is
@@ -634,7 +577,7 @@
         }
 
         /**
-         * {@inheritDoc}
+         * @inheritDoc
          *
          * Ensures that the armed state is in sync with the pressed state
          * if shouldActLikeButton is true. Without this method, the arrow
@@ -649,7 +592,7 @@
         }
 
         /**
-         * {@inheritDoc}
+         * @inheritDoc
          *
          * Ensures that isRollover() will return true if the combo is
          * rolled over, or the arrowButton is rolled over.
@@ -660,7 +603,7 @@
         }
 
         /**
-         * {@inheritDoc}
+         * @inheritDoc
          *
          * Forwards pressed states to the internal "pressed" field
          */
@@ -671,7 +614,7 @@
         }
 
         /**
-         * {@inheritDoc}
+         * @inheritDoc
          *
          * Forwards rollover states to the internal "over" field
          */
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDefaultLookup.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDefaultLookup.java	Thu Dec 10 09:50:09 2009 -0800
@@ -27,7 +27,6 @@
 import sun.swing.DefaultLookup;
 import javax.swing.JComponent;
 import javax.swing.plaf.ComponentUI;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
  * SynthDefaultLookup redirects all lookup calls to the SynthContext.
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -28,36 +28,44 @@
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import javax.swing.event.*;
-import javax.swing.border.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicDesktopIconUI;
 import java.beans.*;
-import java.io.Serializable;
-import sun.swing.plaf.synth.SynthUI;
 
 
 /**
- * Synth L&F for a minimized window on a desktop.
+ * Provides the Synth L&F UI delegate for a minimized internal frame on a desktop.
  *
  * @author Joshua Outwater
+ * @since 1.7
  */
-class SynthDesktopIconUI extends BasicDesktopIconUI implements SynthUI,
-                                        ActionListener, PropertyChangeListener {
+public class SynthDesktopIconUI extends BasicDesktopIconUI
+                                implements SynthUI, PropertyChangeListener {
     private SynthStyle style;
+    private Handler handler = new Handler();
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c)    {
         return new SynthDesktopIconUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installComponents() {
         if (UIManager.getBoolean("InternalFrame.useTaskBar")) {
             iconPane = new JToggleButton(frame.getTitle(), frame.getFrameIcon()) {
-                public String getToolTipText() {
+                @Override public String getToolTipText() {
                     return getText();
                 }
 
-                public JPopupMenu getComponentPopupMenu() {
+                @Override public JPopupMenu getComponentPopupMenu() {
                     return frame.getComponentPopupMenu();
                 }
             };
@@ -73,24 +81,37 @@
         desktopIcon.add(iconPane, BorderLayout.CENTER);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         desktopIcon.addPropertyChangeListener(this);
 
         if (iconPane instanceof JToggleButton) {
             frame.addPropertyChangeListener(this);
-            ((JToggleButton)iconPane).addActionListener(this);
+            ((JToggleButton)iconPane).addActionListener(handler);
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         if (iconPane instanceof JToggleButton) {
+            ((JToggleButton)iconPane).removeActionListener(handler);
             frame.removePropertyChangeListener(this);
         }
         desktopIcon.removePropertyChangeListener(this);
         super.uninstallListeners();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         updateStyle(desktopIcon);
     }
@@ -101,6 +122,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(desktopIcon, ENABLED);
         style.uninstallDefaults(context);
@@ -108,12 +133,16 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
-        Region region = getRegion(c);
+        Region region = SynthLookAndFeel.getRegion(c);
         return SynthContext.getContext(SynthContext.class, c, region,
                                        style, state);
     }
@@ -122,10 +151,10 @@
         return SynthLookAndFeel.getComponentState(c);
     }
 
-    Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -136,6 +165,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -143,33 +176,24 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintDesktopIconBorder(context, g, x, y, w, h);
     }
 
-    public void actionPerformed(ActionEvent evt) {
-        if (evt.getSource() instanceof JToggleButton) {
-            // Either iconify the frame or deiconify and activate it.
-            JToggleButton button = (JToggleButton)evt.getSource();
-            try {
-                boolean selected = button.isSelected();
-                if (!selected && !frame.isIconifiable()) {
-                    button.setSelected(true);
-                } else {
-                    frame.setIcon(!selected);
-                    if (selected) {
-                        frame.setSelected(true);
-                    }
-                }
-            } catch (PropertyVetoException e2) {
-            }
-        }
-    }
-
     public void propertyChange(PropertyChangeEvent evt) {
         if (evt.getSource() instanceof JInternalFrame.JDesktopIcon) {
             if (SynthLookAndFeel.shouldUpdateStyle(evt)) {
@@ -191,4 +215,25 @@
             }
         }
     }
+
+    private final class Handler implements ActionListener {
+        public void actionPerformed(ActionEvent evt) {
+            if (evt.getSource() instanceof JToggleButton) {
+                // Either iconify the frame or deiconify and activate it.
+                JToggleButton button = (JToggleButton)evt.getSource();
+                try {
+                    boolean selected = button.isSelected();
+                    if (!selected && !frame.isIconifiable()) {
+                        button.setSelected(true);
+                    } else {
+                        frame.setIcon(!selected);
+                        if (selected) {
+                            frame.setSelected(true);
+                        }
+                    }
+                } catch (PropertyVetoException e2) {
+                }
+            }
+        }
+    }
 }
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -29,34 +29,38 @@
 import javax.swing.border.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicDesktopPaneUI;
-
 import java.beans.*;
-
 import java.awt.event.*;
-import java.awt.Dimension;
-import java.awt.Insets;
-import java.awt.Graphics;
-import java.awt.KeyboardFocusManager;
 import java.awt.*;
-import java.util.Vector;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Synth L&F for a desktop.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JDesktopPane}.
  *
  * @author Joshua Outwater
  * @author Steve Wilson
+ * @since 1.7
  */
-class SynthDesktopPaneUI extends BasicDesktopPaneUI implements
+public class SynthDesktopPaneUI extends BasicDesktopPaneUI implements
                   PropertyChangeListener, SynthUI {
     private SynthStyle style;
     private TaskBar taskBar;
     private DesktopManager oldDesktopManager;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthDesktopPaneUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         desktop.addPropertyChangeListener(this);
@@ -68,6 +72,10 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         updateStyle(desktop);
 
@@ -114,6 +122,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         if (taskBar != null) {
             desktop.removeComponentListener(taskBar);
@@ -123,6 +135,10 @@
         super.uninstallListeners();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(desktop, ENABLED);
 
@@ -147,6 +163,10 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDesktopManager() {
         if (UIManager.getBoolean("InternalFrame.useTaskBar")) {
             desktopManager = oldDesktopManager = desktop.getDesktopManager();
@@ -159,6 +179,10 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDesktopManager() {
         if (oldDesktopManager != null && !(oldDesktopManager instanceof UIResource)) {
             desktopManager = desktop.getDesktopManager();
@@ -397,7 +421,10 @@
         }
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -407,14 +434,14 @@
                      SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -425,6 +452,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -432,14 +463,28 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintDesktopPaneBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent evt) {
         if (SynthLookAndFeel.shouldUpdateStyle(evt)) {
             updateStyle((JDesktopPane)evt.getSource());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -31,47 +31,52 @@
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicEditorPaneUI;
 import java.beans.PropertyChangeEvent;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Provides the look and feel for a JEditorPane in the
- * Synth look and feel.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JEditorPane}.
  *
  * @author  Shannon Hickey
+ * @since 1.7
  */
-class SynthEditorPaneUI extends BasicEditorPaneUI implements SynthUI {
+public class SynthEditorPaneUI extends BasicEditorPaneUI implements SynthUI {
     private SynthStyle style;
     /*
      * I would prefer to use UIResource instad of this.
      * Unfortunately Boolean is a final class
      */
     private Boolean localTrue = Boolean.TRUE;
-    private Boolean localFalse = Boolean.FALSE;
 
     /**
-     * Creates a UI for the JTextPane.
+     * Creates a new UI object for the given component.
      *
-     * @param c the JTextPane component
-     * @return the UI
+     * @param c component to create UI object for
+     * @return the UI object
      */
     public static ComponentUI createUI(JComponent c) {
         return new SynthEditorPaneUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         // Installs the text cursor on the component
         super.installDefaults();
         JComponent c = getComponent();
         Object clientProperty =
             c.getClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES);
-        if (clientProperty == null
-            || clientProperty == localFalse) {
-            c.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES,
-                                localTrue);
+        if (clientProperty == null) {
+            c.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, localTrue);
         }
         updateStyle(getComponent());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(getComponent(), ENABLED);
         JComponent c = getComponent();
@@ -84,7 +89,7 @@
         Object clientProperty =
             c.getClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES);
         if (clientProperty == localTrue) {
-            getComponent().putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES,
+            c.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES,
                                              Boolean.FALSE);
         }
         super.uninstallDefaults();
@@ -100,6 +105,7 @@
      *
      * @param evt the property change event
      */
+    @Override
     protected void propertyChange(PropertyChangeEvent evt) {
         if (SynthLookAndFeel.shouldUpdateStyle(evt)) {
             updateStyle((JTextComponent)evt.getSource());
@@ -124,6 +130,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -137,6 +147,10 @@
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -146,10 +160,20 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         super.paint(g, getComponent());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void paintBackground(Graphics g) {
         // Overriden to do nothing, all our painting is done from update/paint.
     }
@@ -159,6 +183,10 @@
                                                   c.getWidth(), c.getHeight());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintEditorPaneBorder(context, g, x, y, w, h);
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -24,16 +24,17 @@
  */
 package javax.swing.plaf.synth;
 
-import java.awt.*;
-import javax.swing.*;
+import java.awt.Graphics;
+import javax.swing.JComponent;
 import javax.swing.plaf.ComponentUI;
 
 /**
- * Provides the look and feel implementation for
- * <code>JFormattedTextField</code>.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JFormattedTextField}.
  *
+ * @since 1.7
  */
-class SynthFormattedTextFieldUI extends SynthTextFieldUI {
+public class SynthFormattedTextFieldUI extends SynthTextFieldUI {
     /**
      * Creates a UI for a JFormattedTextField.
      *
@@ -51,15 +52,24 @@
      *
      * @return the name "FormattedTextField"
      */
+    @Override
     protected String getPropertyPrefix() {
         return "FormattedTextField";
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     void paintBackground(SynthContext context, Graphics g, JComponent c) {
         context.getPainter().paintFormattedTextFieldBackground(context, g, 0,
                              0, c.getWidth(), c.getHeight());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintFormattedTextFieldBorder(context, g, x, y,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameTitlePane.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameTitlePane.java	Thu Dec 10 09:50:09 2009 -0800
@@ -30,14 +30,9 @@
 import javax.swing.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicInternalFrameTitlePane;
-import javax.swing.border.*;
-import javax.swing.event.InternalFrameEvent;
-import java.util.EventListener;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeEvent;
-import java.beans.VetoableChangeListener;
 import java.beans.PropertyVetoException;
-import sun.swing.plaf.synth.SynthUI;
 import sun.swing.SwingUtilities2;
 
 /**
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -27,52 +27,61 @@
 
 import java.awt.*;
 import java.awt.event.*;
-import java.awt.peer.LightweightPeer;
-
 import javax.swing.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicInternalFrameUI;
-import javax.swing.event.*;
-
 import java.beans.*;
-import java.io.Serializable;
-import sun.swing.plaf.synth.SynthUI;
 
 
 /**
- * Synth's InternalFrameUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JInternalFrame}.
  *
  * @author David Kloba
  * @author Joshua Outwater
  * @author Rich Schiavi
+ * @since 1.7
  */
-class SynthInternalFrameUI extends BasicInternalFrameUI implements SynthUI,
-        PropertyChangeListener {
+public class SynthInternalFrameUI extends BasicInternalFrameUI
+                                  implements SynthUI, PropertyChangeListener {
     private SynthStyle style;
 
-    private static DesktopManager sharedDesktopManager;
-    private boolean componentListenerAdded = false;
-
-    private Rectangle parentBounds;
-
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param b component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent b) {
         return new SynthInternalFrameUI((JInternalFrame)b);
     }
 
-    public SynthInternalFrameUI(JInternalFrame b) {
+    protected SynthInternalFrameUI(JInternalFrame b) {
         super(b);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void installDefaults() {
         frame.setLayout(internalFrameLayout = createLayoutManager());
         updateStyle(frame);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         frame.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallComponents() {
         if (frame.getComponentPopupMenu() instanceof UIResource) {
             frame.setComponentPopupMenu(null);
@@ -80,6 +89,10 @@
         super.uninstallComponents();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         frame.removePropertyChangeListener(this);
         super.uninstallListeners();
@@ -104,6 +117,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(frame, ENABLED);
         style.uninstallDefaults(context);
@@ -115,6 +132,10 @@
 
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -124,24 +145,28 @@
                             SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
-    public int getComponentState(JComponent c) {
+    private int getComponentState(JComponent c) {
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected JComponent createNorthPane(JInternalFrame w) {
         titlePane = new SynthInternalFrameTitlePane(w);
         titlePane.setName("InternalFrame.northPane");
         return titlePane;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected ComponentListener createComponentListener() {
         if (UIManager.getBoolean("InternalFrame.useTaskBar")) {
             return new ComponentHandler() {
-                public void componentResized(ComponentEvent e) {
+                @Override public void componentResized(ComponentEvent e) {
                     if (frame != null && frame.isMaximum()) {
                         JDesktopPane desktop = (JDesktopPane)e.getSource();
                         for (Component comp : desktop.getComponents()) {
@@ -168,6 +193,10 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -178,6 +207,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -185,15 +218,29 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintInternalFrameBorder(context,
                                                             g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent evt) {
         SynthStyle oldStyle = style;
         JInternalFrame f = (JInternalFrame)evt.getSource();
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -29,38 +29,37 @@
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.*;
 import javax.swing.text.View;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.Component;
-import java.awt.Container;
 import java.awt.Dimension;
 import java.awt.Rectangle;
 import java.awt.Insets;
-import java.awt.Color;
 import java.awt.Graphics;
-import java.awt.Font;
 import java.awt.FontMetrics;
 import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Synth's LabelUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JLabel}.
  *
  * @author Scott Violet
+ * @since 1.7
  */
-class SynthLabelUI extends BasicLabelUI implements SynthUI {
+public class SynthLabelUI extends BasicLabelUI implements SynthUI {
     private SynthStyle style;
 
     /**
      * Returns the LabelUI implementation used for the skins look and feel.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
      */
     public static ComponentUI createUI(JComponent c){
         return new SynthLabelUI();
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults(JLabel c) {
         updateStyle(c);
     }
@@ -71,6 +70,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults(JLabel c){
         SynthContext context = getContext(c, ENABLED);
 
@@ -79,6 +82,10 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -88,10 +95,6 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         int state = SynthLookAndFeel.getComponentState(c);
         if (SynthLookAndFeel.selectedUI == this &&
@@ -101,6 +104,10 @@
         return state;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public int getBaseline(JComponent c, int width, int height) {
         if (c == null) {
             throw new NullPointerException("Component must be non-null");
@@ -153,6 +160,10 @@
      * component.  This method is invoked by <code>JComponent</code>
      * when the specified component is being painted.
      */
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -163,6 +174,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -170,6 +185,12 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         JLabel label = (JLabel)context.getComponent();
         Icon icon = (label.isEnabled()) ? label.getIcon() :
@@ -185,11 +206,19 @@
             label.getIconTextGap(), label.getDisplayedMnemonicIndex(), 0);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintLabelBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getPreferredSize(JComponent c) {
         JLabel label = (JLabel)c;
         Icon icon = (label.isEnabled()) ? label.getIcon() :
@@ -207,7 +236,10 @@
         return size;
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getMinimumSize(JComponent c) {
         JLabel label = (JLabel)c;
         Icon icon = (label.isEnabled()) ? label.getIcon() :
@@ -225,6 +257,10 @@
         return size;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getMaximumSize(JComponent c) {
         JLabel label = (JLabel)c;
         Icon icon = (label.isEnabled()) ? label.getIcon() :
@@ -242,7 +278,10 @@
         return size;
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         super.propertyChange(e);
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -27,38 +27,39 @@
 
 import javax.swing.*;
 import javax.swing.border.*;
-import javax.swing.event.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.*;
-import javax.swing.text.Position;
-
 import java.awt.*;
-import java.awt.event.*;
-import java.awt.datatransfer.Transferable;
-import java.awt.dnd.*;
-
-import java.util.ArrayList;
-import java.util.TooManyListenersException;
-
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeEvent;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Synth's ListUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JList}.
  *
  * @author Scott Violet
+ * @since 1.7
  */
-class SynthListUI extends BasicListUI implements PropertyChangeListener,
-                               SynthUI {
+public class SynthListUI extends BasicListUI
+                         implements PropertyChangeListener, SynthUI {
     private SynthStyle style;
     private boolean useListColors;
     private boolean useUIBorder;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param list component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent list) {
         return new SynthListUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -69,27 +70,47 @@
         paint(g, c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintListBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         list.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JList)e.getSource());
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
         list.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         if (list.getCellRenderer() == null ||
                  (list.getCellRenderer() instanceof UIResource)) {
@@ -135,6 +156,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         super.uninstallDefaults();
 
@@ -145,6 +170,10 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -154,27 +183,23 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         return SynthLookAndFeel.getComponentState(c);
     }
 
 
     private class SynthListCellRenderer extends DefaultListCellRenderer.UIResource {
-        public String getName() {
+        @Override public String getName() {
             return "List.cellRenderer";
         }
 
-        public void setBorder(Border b) {
+        @Override public void setBorder(Border b) {
             if (useUIBorder || b instanceof SynthBorder) {
                 super.setBorder(b);
             }
         }
 
-        public Component getListCellRendererComponent(JList list, Object value,
+        @Override public Component getListCellRendererComponent(JList list, Object value,
                   int index, boolean isSelected, boolean cellHasFocus) {
             if (!useListColors && (isSelected || cellHasFocus)) {
                 SynthLookAndFeel.setSelectedUI((SynthLabelUI)SynthLookAndFeel.
@@ -190,7 +215,7 @@
             return this;
         }
 
-        public void paint(Graphics g) {
+        @Override public void paint(Graphics g) {
             super.paint(g);
             SynthLookAndFeel.resetSelectedUI();
         }
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java	Thu Dec 10 09:50:09 2009 -0800
@@ -234,44 +234,9 @@
      * <code>shouldUpdateStyleOnAncestorChanged</code> as necessary.
      */
     static boolean shouldUpdateStyle(PropertyChangeEvent event) {
-        String eName = event.getPropertyName();
-        if ("name" == eName) {
-            // Always update on a name change
-            return true;
-        }
-        else if ("componentOrientation" == eName) {
-            // Always update on a component orientation change
-            return true;
-        }
-        else if ("ancestor" == eName && event.getNewValue() != null) {
-            // Only update on an ancestor change when getting a valid
-            // parent and the LookAndFeel wants this.
-            LookAndFeel laf = UIManager.getLookAndFeel();
-            return (laf instanceof SynthLookAndFeel &&
-                    ((SynthLookAndFeel)laf).
-                     shouldUpdateStyleOnAncestorChanged());
-        }
-        // Note: The following two nimbus based overrides should be refactored
-        // to be in the Nimbus LAF. Due to constraints in an update release,
-        // we couldn't actually provide the public API necessary to allow
-        // NimbusLookAndFeel (a subclass of SynthLookAndFeel) to provide its
-        // own rules for shouldUpdateStyle.
-        else if ("Nimbus.Overrides" == eName) {
-            // Always update when the Nimbus.Overrides client property has
-            // been changed
-            return true;
-        }
-        else if ("Nimbus.Overrides.InheritDefaults" == eName) {
-            // Always update when the Nimbus.Overrides.InheritDefaults
-            // client property has changed
-            return true;
-        }
-        else if ("JComponent.sizeVariant" == eName) {
-            // Always update when the JComponent.sizeVariant
-            // client property has changed
-            return true;
-        }
-        return false;
+        LookAndFeel laf = UIManager.getLookAndFeel();
+        return (laf instanceof SynthLookAndFeel &&
+                ((SynthLookAndFeel) laf).shouldUpdateStyleOnEvent(event));
     }
 
     /**
@@ -303,12 +268,6 @@
      * @param c Component to update style for.
      */
     public static void updateStyles(Component c) {
-        _updateStyles(c);
-        c.repaint();
-    }
-
-    // Implementation for updateStyles
-    private static void _updateStyles(Component c) {
         if (c instanceof JComponent) {
             // Yes, this is hacky. A better solution is to get the UI
             // and cast, but JComponent doesn't expose a getter for the UI
@@ -332,6 +291,7 @@
                 updateStyles(child);
             }
         }
+        c.repaint();
     }
 
     /**
@@ -789,6 +749,27 @@
     }
 
     /**
+     * Returns whether or not the UIs should update their styles when a
+     * particular event occurs.
+     *
+     * @param ev a {@code PropertyChangeEvent}
+     * @return whether or not the UIs should update their styles
+     * @since 1.7
+     */
+    protected boolean shouldUpdateStyleOnEvent(PropertyChangeEvent ev) {
+        String eName = ev.getPropertyName();
+        if ("name" == eName || "componentOrientation" == eName) {
+            return true;
+        }
+        if ("ancestor" == eName && ev.getNewValue() != null) {
+            // Only update on an ancestor change when getting a valid
+            // parent and the LookAndFeel wants this.
+            return shouldUpdateStyleOnAncestorChanged();
+        }
+        return false;
+    }
+
+    /**
      * Returns the antialiasing information as specified by the host desktop.
      * Antialiasing might be forced off if the desktop is GNOME and the user
      * has set his locale to Chinese, Japanese or Korean. This is consistent
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -25,45 +25,49 @@
 package javax.swing.plaf.synth;
 
 import javax.swing.*;
-import javax.swing.event.*;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
 import java.awt.Graphics;
-import java.awt.Insets;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.event.*;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
-
-import javax.swing.border.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.*;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Synth's MenuBarUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JMenuBar}.
  *
  * @author Scott Violet
+ * @since 1.7
  */
-class SynthMenuBarUI extends BasicMenuBarUI implements PropertyChangeListener,
-                                  SynthUI {
+public class SynthMenuBarUI extends BasicMenuBarUI
+                            implements PropertyChangeListener, SynthUI {
     private SynthStyle style;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param x component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent x) {
         return new SynthMenuBarUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         if (menuBar.getLayout() == null ||
             menuBar.getLayout() instanceof UIResource) {
-            menuBar.setLayout(new DefaultMenuLayout(menuBar,BoxLayout.LINE_AXIS));
+            menuBar.setLayout(new SynthMenuLayout(menuBar,BoxLayout.LINE_AXIS));
         }
         updateStyle(menuBar);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         menuBar.addPropertyChangeListener(this);
@@ -82,6 +86,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(menuBar, ENABLED);
 
@@ -90,11 +98,19 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
         menuBar.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -104,14 +120,14 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -122,6 +138,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -129,14 +149,28 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintMenuBarBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JMenuBar)e.getSource());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -24,41 +24,44 @@
  */
 package javax.swing.plaf.synth;
 
-import javax.swing.plaf.basic.BasicHTML;
 import java.awt.*;
-import java.awt.event.*;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
-
 import javax.swing.*;
-import javax.swing.event.*;
-import javax.swing.border.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.*;
-import javax.swing.text.View;
-import sun.swing.plaf.synth.*;
 import sun.swing.MenuItemLayoutHelper;
 
 
 /**
- * Synth's MenuItemUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JMenuItem}.
  *
  * @author Georges Saab
  * @author David Karlton
  * @author Arnaud Weber
  * @author Fredrik Lagerblad
+ * @since 1.7
  */
-class SynthMenuItemUI extends BasicMenuItemUI implements
+public class SynthMenuItemUI extends BasicMenuItemUI implements
                                    PropertyChangeListener, SynthUI {
     private SynthStyle style;
     private SynthStyle accStyle;
 
-    private String acceleratorDelimiter;
-
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthMenuItemUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void uninstallUI(JComponent c) {
         super.uninstallUI(c);
         // Remove values from the parent's Client Properties.
@@ -69,10 +72,18 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         updateStyle(menuItem);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         menuItem.addPropertyChangeListener(this);
@@ -122,6 +133,10 @@
         accContext.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(menuItem, ENABLED);
         style.uninstallDefaults(context);
@@ -137,11 +152,19 @@
         super.uninstallDefaults();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
         menuItem.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -151,7 +174,7 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    public SynthContext getContext(JComponent c, Region region) {
+    SynthContext getContext(JComponent c, Region region) {
         return getContext(c, region, getComponentState(c, region));
     }
 
@@ -160,10 +183,6 @@
                                        region, accStyle, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         int state;
 
@@ -186,6 +205,10 @@
         return getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected Dimension getPreferredMenuItemSize(JComponent c,
                                                      Icon checkIcon,
                                                      Icon arrowIcon,
@@ -203,6 +226,10 @@
     }
 
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -212,6 +239,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -219,6 +250,12 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         SynthContext accContext = getContext(menuItem,
                                              Region.MENU_ITEM_ACCELERATOR);
@@ -236,11 +273,19 @@
         SynthGraphicsUtils.paintBackground(context, g, c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintMenuItemBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JMenuItem)e.getSource());
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuLayout.java	Thu Dec 10 09:50:09 2009 -0800
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2002-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package javax.swing.plaf.synth;
+
+import javax.swing.plaf.basic.DefaultMenuLayout;
+import javax.swing.JPopupMenu;
+import java.awt.Container;
+import java.awt.Dimension;
+
+/**
+ * @inheritDoc
+ *
+ * @author Georges Saab
+ */
+
+class SynthMenuLayout extends DefaultMenuLayout {
+    public SynthMenuLayout(Container target, int axis) {
+        super(target, axis);
+    }
+
+    public Dimension preferredLayoutSize(Container target) {
+        if (target instanceof JPopupMenu) {
+            JPopupMenu popupMenu = (JPopupMenu) target;
+            popupMenu.putClientProperty(
+                    SynthMenuItemLayoutHelper.MAX_ACC_OR_ARROW_WIDTH, null);
+        }
+
+        return super.preferredLayoutSize(target);
+    }
+}
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -25,40 +25,48 @@
 package javax.swing.plaf.synth;
 
 import java.awt.*;
-import java.awt.event.*;
 import java.beans.*;
 import javax.swing.*;
-import javax.swing.event.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.*;
-import javax.swing.border.*;
-import java.util.Arrays;
-import java.util.ArrayList;
-import sun.swing.plaf.synth.SynthUI;
 import sun.swing.MenuItemLayoutHelper;
 
 /**
- * Synth's MenuUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JMenu}.
  *
  * @author Georges Saab
  * @author David Karlton
  * @author Arnaud Weber
+ * @since 1.7
  */
-class SynthMenuUI extends BasicMenuUI implements PropertyChangeListener,
-                               SynthUI {
+public class SynthMenuUI extends BasicMenuUI
+                         implements PropertyChangeListener, SynthUI {
     private SynthStyle style;
     private SynthStyle accStyle;
 
-    private String acceleratorDelimiter;
-
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param x component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent x) {
         return new SynthMenuUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         updateStyle(menuItem);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         menuItem.addPropertyChangeListener(this);
@@ -111,6 +119,10 @@
         accContext.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void uninstallUI(JComponent c) {
         super.uninstallUI(c);
         // Remove values from the parent's Client Properties.
@@ -121,6 +133,10 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(menuItem, ENABLED);
         style.uninstallDefaults(context);
@@ -136,22 +152,30 @@
         super.uninstallDefaults();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
         menuItem.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
 
     SynthContext getContext(JComponent c, int state) {
-        Region region = getRegion(c);
+        Region region = SynthLookAndFeel.getRegion(c);
         return SynthContext.getContext(SynthContext.class, c, region,
                                        style, state);
     }
 
-    public SynthContext getContext(JComponent c, Region region) {
+    SynthContext getContext(JComponent c, Region region) {
         return getContext(c, region, getComponentState(c, region));
     }
 
@@ -160,10 +184,6 @@
                                        region, accStyle, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         int state;
 
@@ -186,6 +206,10 @@
         return getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected Dimension getPreferredMenuItemSize(JComponent c,
                                                      Icon checkIcon,
                                                      Icon arrowIcon,
@@ -202,7 +226,10 @@
         return value;
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -213,6 +240,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -220,6 +251,12 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         SynthContext accContext = getContext(menuItem,
                                              Region.MENU_ITEM_ACCELERATOR);
@@ -232,11 +269,19 @@
         accContext.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintMenuBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JMenu)e.getSource());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -28,34 +28,45 @@
 import java.awt.*;
 import java.beans.*;
 import javax.swing.*;
-import javax.swing.event.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.*;
 import sun.swing.DefaultLookup;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Synth's OptionPaneUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JOptionPane}.
  *
  * @author James Gosling
  * @author Scott Violet
  * @author Amy Fowler
+ * @since 1.7
  */
-class SynthOptionPaneUI extends BasicOptionPaneUI implements
+public class SynthOptionPaneUI extends BasicOptionPaneUI implements
                                 PropertyChangeListener, SynthUI {
     private SynthStyle style;
 
     /**
-      * Creates a new BasicOptionPaneUI instance.
-      */
+     * Creates a new UI object for the given component.
+     *
+     * @param x component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent x) {
         return new SynthOptionPaneUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         updateStyle(optionPane);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         optionPane.addPropertyChangeListener(this);
@@ -80,6 +91,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(optionPane, ENABLED);
 
@@ -88,11 +103,19 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
         optionPane.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installComponents() {
         optionPane.add(createMessageArea());
 
@@ -108,6 +131,10 @@
         optionPane.applyComponentOrientation(optionPane.getComponentOrientation());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -117,14 +144,14 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -135,6 +162,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -142,30 +173,49 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintOptionPaneBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JOptionPane)e.getSource());
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected boolean getSizeButtonsToSameWidth() {
         return DefaultLookup.getBoolean(optionPane, this,
                                         "OptionPane.sameSizeButtons", true);
     }
 
     /**
-     * Messaged from installComponents to create a Container containing the
-     * body of the message. The icon is the created by calling
-     * <code>addIcon</code>.
+     * Called from {@link #installComponents} to create a {@code Container}
+     * containing the body of the message. The icon is the created by calling
+     * {@link #addIcon}.
      */
+    @Override
     protected Container createMessageArea() {
         JPanel top = new JPanel();
         top.setName("OptionPane.messageArea");
@@ -206,6 +256,10 @@
         return top;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected Container createSeparator() {
         JSeparator separator = new JSeparator(SwingConstants.HORIZONTAL);
 
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java	Thu Dec 10 09:50:09 2009 -0800
@@ -25,7 +25,6 @@
 package javax.swing.plaf.synth;
 
 import java.awt.*;
-import javax.swing.*;
 
 /**
  * <code>SynthPainter</code> is used for painting portions of
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -25,29 +25,37 @@
 
 package javax.swing.plaf.synth;
 
-import java.awt.*;
 import javax.swing.*;
-import javax.swing.border.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicPanelUI;
 import java.awt.*;
-import java.awt.event.*;
 import java.beans.*;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Synth's PanelUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JPanel}.
  *
  * @author Steve Wilson
+ * @since 1.7
  */
-class SynthPanelUI extends BasicPanelUI implements PropertyChangeListener,
-        SynthUI {
+public class SynthPanelUI extends BasicPanelUI
+                          implements PropertyChangeListener, SynthUI {
     private SynthStyle style;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthPanelUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void installUI(JComponent c) {
         JPanel p = (JPanel)c;
 
@@ -55,6 +63,10 @@
         installListeners(p);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void uninstallUI(JComponent c) {
         JPanel p = (JPanel)c;
 
@@ -62,18 +74,36 @@
         super.uninstallUI(c);
     }
 
+    /**
+     * Installs listeners into the panel.
+     *
+     * @param p the {@code JPanel} object
+     */
     protected void installListeners(JPanel p) {
         p.addPropertyChangeListener(this);
     }
 
+    /**
+     * Uninstalls listeners from the panel.
+     *
+     * @param p the {@code JPanel} object
+     */
     protected void uninstallListeners(JPanel p) {
         p.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults(JPanel p) {
         updateStyle(p);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults(JPanel p) {
         SynthContext context = getContext(p, ENABLED);
 
@@ -88,6 +118,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -97,14 +131,14 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -115,6 +149,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -122,15 +160,29 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         // do actual painting
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintPanelBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent pce) {
         if (SynthLookAndFeel.shouldUpdateStyle(pce)) {
             updateStyle((JPanel)pce.getSource());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -25,21 +25,19 @@
 
 package javax.swing.plaf.synth;
 
-import java.awt.*;
+import java.awt.Graphics;
 import javax.swing.*;
 import javax.swing.text.*;
-import javax.swing.plaf.*;
+import javax.swing.plaf.ComponentUI;
 
 /**
- * Provides the Synth look and feel for a password field.
- * The only difference from the standard text field is that
- * the view of the text is simply a string of the echo
- * character as specified in JPasswordField, rather than the
- * real text contained in the field.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JPasswordField}.
  *
  * @author  Shannon Hickey
+ * @since 1.7
  */
-class SynthPasswordFieldUI extends SynthTextFieldUI {
+public class SynthPasswordFieldUI extends SynthTextFieldUI {
 
     /**
      * Creates a UI for a JPasswordField.
@@ -58,6 +56,7 @@
      *
      * @return the name ("PasswordField")
      */
+    @Override
     protected String getPropertyPrefix() {
         return "PasswordField";
     }
@@ -68,20 +67,33 @@
      * @param elem the element
      * @return the view
      */
+    @Override
     public View create(Element elem) {
         return new PasswordView(elem);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     void paintBackground(SynthContext context, Graphics g, JComponent c) {
         context.getPainter().paintPasswordFieldBackground(context, g, 0, 0,
                                                 c.getWidth(), c.getHeight());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintPasswordFieldBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installKeyboardActions() {
         super.installKeyboardActions();
         ActionMap map = SwingUtilities.getUIActionMap(getComponent());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -26,49 +26,43 @@
 package javax.swing.plaf.synth;
 
 import javax.swing.*;
-import javax.swing.event.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.*;
-import javax.swing.border.*;
-
-import java.applet.Applet;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
 import java.awt.Graphics;
-import java.awt.KeyboardFocusManager;
-import java.awt.Window;
-import java.awt.event.*;
-import java.awt.AWTEvent;
-import java.awt.Toolkit;
-
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeEvent;
 
-import java.util.*;
-import sun.swing.plaf.synth.SynthUI;
-
 /**
- * Synth's PopupMenuUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JPopupMenu}.
  *
  * @author Georges Saab
  * @author David Karlton
  * @author Arnaud Weber
+ * @since 1.7
  */
-class SynthPopupMenuUI extends BasicPopupMenuUI implements
-                PropertyChangeListener, SynthUI {
+public class SynthPopupMenuUI extends BasicPopupMenuUI
+                              implements PropertyChangeListener, SynthUI {
     private SynthStyle style;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param x component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent x) {
         return new SynthPopupMenuUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void installDefaults() {
         if (popupMenu.getLayout() == null ||
             popupMenu.getLayout() instanceof UIResource) {
-            popupMenu.setLayout(new DefaultMenuLayout(
-                                    popupMenu, BoxLayout.Y_AXIS));
+            popupMenu.setLayout(new SynthMenuLayout(popupMenu, BoxLayout.Y_AXIS));
         }
         updateStyle(popupMenu);
     }
@@ -86,11 +80,19 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         popupMenu.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(popupMenu, ENABLED);
 
@@ -103,11 +105,19 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
         popupMenu.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -117,14 +127,14 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -135,6 +145,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -142,14 +156,28 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintPopupMenuBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle(popupMenu);
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -32,16 +32,17 @@
 import javax.swing.plaf.basic.BasicProgressBarUI;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeEvent;
-import sun.swing.plaf.synth.SynthUI;
 import sun.swing.SwingUtilities2;
 
 /**
- * Synth's ProgressBarUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JProgressBar}.
  *
  * @author Joshua Outwater
+ * @since 1.7
  */
-class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI,
-        PropertyChangeListener {
+public class SynthProgressBarUI extends BasicProgressBarUI
+                                implements SynthUI, PropertyChangeListener {
     private SynthStyle style;
     private int progressPadding;
     private boolean rotateText; // added for Nimbus LAF
@@ -49,22 +50,37 @@
     private boolean tileWhenIndeterminate; //whether to tile indeterminate painting
     private int tileWidth; //the width of each tile
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param x component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent x) {
         return new SynthProgressBarUI();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void installListeners() {
         super.installListeners();
         progressBar.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
         progressBar.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void installDefaults() {
         updateStyle(progressBar);
@@ -101,6 +117,9 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(progressBar, ENABLED);
@@ -110,6 +129,10 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -119,14 +142,13 @@
                             SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public int getBaseline(JComponent c, int width, int height) {
         super.getBaseline(c, width, height);
@@ -142,6 +164,9 @@
         return -1;
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected Rectangle getBox(Rectangle r) {
         if (tileWhenIndeterminate) {
@@ -151,6 +176,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void setAnimationIndex(int newValue) {
         if (paintOutsideClip) {
@@ -164,6 +192,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
@@ -176,6 +207,9 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
@@ -184,6 +218,12 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         JProgressBar pBar = (JProgressBar)context.getComponent();
         int x = 0, y = 0, width = 0, height = 0;
@@ -261,8 +301,14 @@
         }
     }
 
-    protected void paintText(SynthContext context, Graphics g,
-            String title) {
+    /**
+     * Paints the component's text.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     * @param title the text to paint
+     */
+    protected void paintText(SynthContext context, Graphics g, String title) {
         if (progressBar.isStringPainted()) {
             SynthStyle style = context.getStyle();
             Font font = style.getFont(context);
@@ -323,12 +369,20 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintProgressBarBorder(context, g, x, y, w, h,
                                                     progressBar.getOrientation());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e) ||
                 "indeterminate".equals(e.getPropertyName())) {
@@ -336,6 +390,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public Dimension getPreferredSize(JComponent c) {
         Dimension size = null;
@@ -398,5 +455,5 @@
         size.height += border.top + border.bottom;
 
         return size;
-   }
+    }
 }
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -27,49 +27,46 @@
 
 import javax.swing.*;
 import java.awt.*;
-import java.awt.event.*;
 import javax.swing.plaf.*;
-import javax.swing.border.*;
 
 /**
- * Synth's RadioButtonMenuItemUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JRadioButtonMenuItem}.
  *
  * @author Georges Saab
  * @author David Karlton
+ * @since 1.7
  */
-class SynthRadioButtonMenuItemUI extends SynthMenuItemUI {
+public class SynthRadioButtonMenuItemUI extends SynthMenuItemUI {
+
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param b component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent b) {
         return new SynthRadioButtonMenuItemUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected String getPropertyPrefix() {
         return "RadioButtonMenuItem";
     }
 
-    public void processMouseEvent(JMenuItem item,MouseEvent e,MenuElement path[],MenuSelectionManager manager) {
-        Point p = e.getPoint();
-        if(p.x >= 0 && p.x < item.getWidth() &&
-           p.y >= 0 && p.y < item.getHeight()) {
-            if(e.getID() == MouseEvent.MOUSE_RELEASED) {
-                manager.clearSelectedPath();
-                item.doClick(0);
-                item.setArmed(false);
-            } else
-                manager.setSelectedPath(path);
-        } else if(item.getModel().isArmed()) {
-            MenuElement newPath[] = new MenuElement[path.length-1];
-            int i,c;
-            for(i=0,c=path.length-1;i<c;i++)
-                newPath[i] = path[i];
-            manager.setSelectedPath(newPath);
-        }
-    }
-
+    @Override
     void paintBackground(SynthContext context, Graphics g, JComponent c) {
         context.getPainter().paintRadioButtonMenuItemBackground(context, g, 0,
                              0, c.getWidth(), c.getHeight());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintRadioButtonMenuItemBorder(context, g, x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -26,42 +26,58 @@
 package javax.swing.plaf.synth;
 
 import java.awt.*;
-import java.awt.event.*;
 import javax.swing.*;
-import javax.swing.border.*;
 import javax.swing.plaf.*;
-import javax.swing.text.View;
 
 /**
- * Synth's RadioButtonUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JRadioButton}.
  *
  * @author Jeff Dinkins
+ * @since 1.7
  */
-class SynthRadioButtonUI extends SynthToggleButtonUI {
+public class SynthRadioButtonUI extends SynthToggleButtonUI {
 
     // ********************************
     //        Create PLAF
     // ********************************
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param b component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent b) {
         return new SynthRadioButtonUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected String getPropertyPrefix() {
         return "RadioButton.";
     }
 
     /**
-     * Returns the Icon used in calculating the pref/min/max size.
+     * Returns the Icon used in calculating the
+     * preferred/minimum/maximum size.
      */
+    @Override
     protected Icon getSizingIcon(AbstractButton b) {
         return getIcon(b);
     }
 
+    @Override
     void paintBackground(SynthContext context, Graphics g, JComponent c) {
         context.getPainter().paintRadioButtonBackground(context, g, 0, 0,
                                                 c.getWidth(), c.getHeight());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintRadioButtonBorder(context, g, x, y, w, h);
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthRootPaneUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRootPaneUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -26,30 +26,43 @@
 package javax.swing.plaf.synth;
 
 import java.awt.*;
-import java.awt.event.ActionEvent;
 import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
 import javax.swing.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicRootPaneUI;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Synth's RootPaneUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JRootPane}.
  *
  * @author Scott Violet
+ * @since 1.7
  */
-class SynthRootPaneUI extends BasicRootPaneUI implements SynthUI {
+public class SynthRootPaneUI extends BasicRootPaneUI implements SynthUI {
     private SynthStyle style;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthRootPaneUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults(JRootPane c){
         updateStyle(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults(JRootPane root) {
         SynthContext context = getContext(root, ENABLED);
 
@@ -58,6 +71,10 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -67,10 +84,6 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         return SynthLookAndFeel.getComponentState(c);
     }
@@ -88,6 +101,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -98,6 +115,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -105,9 +126,19 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintRootPaneBorder(context, g, x, y, w, h);
@@ -118,6 +149,7 @@
      * indicates the <code>defaultButton</code> has changed, this will
      * reinstall the keyboard actions.
      */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JRootPane)e.getSource());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -30,41 +30,33 @@
 import javax.swing.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.*;
-import sun.swing.plaf.synth.SynthUI;
 
 
 /**
- * Synth's ScrollBarUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JScrollBar}.
  *
  * @author Scott Violet
+ * @since 1.7
  */
-class SynthScrollBarUI extends BasicScrollBarUI implements
-                                    PropertyChangeListener, SynthUI {
+public class SynthScrollBarUI extends BasicScrollBarUI
+                              implements PropertyChangeListener, SynthUI {
 
     private SynthStyle style;
     private SynthStyle thumbStyle;
     private SynthStyle trackStyle;
 
     private boolean validMinimumThumbSize;
-    private int scrollBarWidth;
-
-    //These two variables should be removed when the corrosponding ones in BasicScrollBarUI are made protected
-    private int incrGap;
-    private int decrGap;
 
     public static ComponentUI createUI(JComponent c)    {
         return new SynthScrollBarUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
-        //NOTE: This next line of code was added because, since incrGap and decrGap in
-        //BasicScrollBarUI are private, I need to have some way of updating them.
-        //This is an incomplete solution (since it implies that the incrGap and decrGap
-        //are set once, and not reset per state. Probably ok, but not always ok).
-        //This line of code should be removed at the same time that incrGap and
-        //decrGap are removed and made protected in the super class.
-        super.installDefaults();
-
         trackHighlight = NO_HIGHLIGHT;
         if (scrollbar.getLayout() == null ||
                      (scrollbar.getLayout() instanceof UIResource)) {
@@ -73,6 +65,10 @@
         updateStyle(scrollbar);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void configureScrollBarColors() {
     }
 
@@ -137,16 +133,28 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         scrollbar.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
         scrollbar.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults(){
         SynthContext context = getContext(scrollbar, ENABLED);
         style.uninstallDefaults(context);
@@ -166,9 +174,12 @@
         super.uninstallDefaults();
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
@@ -176,14 +187,6 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
     private SynthContext getContext(JComponent c, Region region) {
         return getContext(c, region, getComponentState(c, region));
     }
@@ -206,6 +209,10 @@
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public boolean getSupportsAbsolutePositioning() {
         SynthContext context = getContext(scrollbar);
         boolean value = style.getBoolean(context,
@@ -214,6 +221,10 @@
         return value;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -225,6 +236,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -232,6 +247,12 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         SynthContext subcontext = getContext(scrollbar,
                                              Region.SCROLL_BAR_TRACK);
@@ -243,31 +264,49 @@
         subcontext.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintScrollBarBorder(context, g, x, y, w, h,
                                                   scrollbar.getOrientation());
     }
 
-    protected void paintTrack(SynthContext ss, Graphics g,
+    /**
+     * Paints the scrollbar track.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     * @param trackBounds bounding box for the track
+     */
+    protected void paintTrack(SynthContext context, Graphics g,
                               Rectangle trackBounds) {
-        SynthLookAndFeel.updateSubregion(ss, g, trackBounds);
-        ss.getPainter().paintScrollBarTrackBackground(ss, g, trackBounds.x,
+        SynthLookAndFeel.updateSubregion(context, g, trackBounds);
+        context.getPainter().paintScrollBarTrackBackground(context, g, trackBounds.x,
                         trackBounds.y, trackBounds.width, trackBounds.height,
                         scrollbar.getOrientation());
-        ss.getPainter().paintScrollBarTrackBorder(ss, g, trackBounds.x,
+        context.getPainter().paintScrollBarTrackBorder(context, g, trackBounds.x,
                         trackBounds.y, trackBounds.width, trackBounds.height,
                         scrollbar.getOrientation());
     }
 
-    protected void paintThumb(SynthContext ss, Graphics g,
+    /**
+     * Paints the scrollbar thumb.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     * @param thumbBounds bounding box for the thumb
+     */
+    protected void paintThumb(SynthContext context, Graphics g,
                               Rectangle thumbBounds) {
-        SynthLookAndFeel.updateSubregion(ss, g, thumbBounds);
+        SynthLookAndFeel.updateSubregion(context, g, thumbBounds);
         int orientation = scrollbar.getOrientation();
-        ss.getPainter().paintScrollBarThumbBackground(ss, g, thumbBounds.x,
+        context.getPainter().paintScrollBarThumbBackground(context, g, thumbBounds.x,
                         thumbBounds.y, thumbBounds.width, thumbBounds.height,
                         orientation);
-        ss.getPainter().paintScrollBarThumbBorder(ss, g, thumbBounds.x,
+        context.getPainter().paintScrollBarThumbBorder(context, g, thumbBounds.x,
                         thumbBounds.y, thumbBounds.width, thumbBounds.height,
                         orientation);
     }
@@ -288,6 +327,7 @@
      * @see #getMaximumSize
      * @see #getMinimumSize
      */
+    @Override
     public Dimension getPreferredSize(JComponent c) {
         Insets insets = c.getInsets();
         return (scrollbar.getOrientation() == JScrollBar.VERTICAL)
@@ -295,6 +335,10 @@
             : new Dimension(48, scrollBarWidth + insets.top + insets.bottom);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected Dimension getMinimumThumbSize() {
         if (!validMinimumThumbSize) {
             if (scrollbar.getOrientation() == JScrollBar.VERTICAL) {
@@ -308,6 +352,10 @@
         return minimumThumbSize;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected JButton createDecreaseButton(int orientation)  {
         SynthArrowButton synthArrowButton = new SynthArrowButton(orientation) {
             @Override
@@ -333,6 +381,10 @@
         return synthArrowButton;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected JButton createIncreaseButton(int orientation)  {
         SynthArrowButton synthArrowButton = new SynthArrowButton(orientation) {
             @Override
@@ -360,6 +412,10 @@
         return synthArrowButton;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void setThumbRollover(boolean active) {
         if (isThumbRollover() != active) {
             scrollbar.repaint(getThumbBounds());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -40,24 +40,32 @@
 import java.awt.event.FocusListener;
 import java.awt.event.FocusEvent;
 
-import sun.swing.plaf.synth.SynthUI;
-
-
 /**
- * Synth's ScrollPaneUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JScrollPane}.
  *
  * @author Scott Violet
+ * @since 1.7
  */
-class SynthScrollPaneUI extends BasicScrollPaneUI implements
-                 PropertyChangeListener, SynthUI {
+public class SynthScrollPaneUI extends BasicScrollPaneUI
+                               implements PropertyChangeListener, SynthUI {
     private SynthStyle style;
     private boolean viewportViewHasFocus = false;
     private ViewportViewFocusHandler viewportViewFocusHandler;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param x component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent x) {
         return new SynthScrollPaneUI();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
@@ -69,6 +77,9 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
@@ -77,6 +88,12 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         Border vpBorder = scrollpane.getViewportBorder();
         if (vpBorder != null) {
@@ -85,12 +102,18 @@
         }
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintScrollPaneBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void installDefaults(JScrollPane scrollpane) {
         updateStyle(scrollpane);
@@ -114,7 +137,9 @@
         context.dispose();
     }
 
-
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void installListeners(JScrollPane c) {
         super.installListeners(c);
@@ -129,6 +154,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void uninstallDefaults(JScrollPane c) {
         SynthContext context = getContext(c, ENABLED);
@@ -141,7 +169,9 @@
         }
     }
 
-
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void uninstallListeners(JComponent c) {
         super.uninstallListeners(c);
@@ -156,7 +186,10 @@
         }
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -166,12 +199,6 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
-
     private int getComponentState(JComponent c) {
         int baseState = SynthLookAndFeel.getComponentState(c);
         if (viewportViewFocusHandler!=null && viewportViewHasFocus){
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -34,33 +34,51 @@
 import javax.swing.plaf.SeparatorUI;
 import javax.swing.plaf.UIResource;
 import javax.swing.plaf.DimensionUIResource;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * A Synth L&F implementation of SeparatorUI.  This implementation
- * is a "combined" view/controller.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JSeparator}.
  *
  * @author Shannon Hickey
  * @author Joshua Outwater
+ * @since 1.7
  */
-class SynthSeparatorUI extends SeparatorUI implements PropertyChangeListener,
-                                    SynthUI {
+public class SynthSeparatorUI extends SeparatorUI
+                              implements PropertyChangeListener, SynthUI {
     private SynthStyle style;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthSeparatorUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void installUI(JComponent c) {
         installDefaults((JSeparator)c);
         installListeners((JSeparator)c);
     }
 
-    public void uninstallDefaults(JComponent c) {
+    /**
+     * @inheritDoc
+     */
+    @Override
+    public void uninstallUI(JComponent c) {
         uninstallListeners((JSeparator)c);
         uninstallDefaults((JSeparator)c);
     }
 
+    /**
+     * Installs default setting. This method is called when a
+     * {@code LookAndFeel} is installed.
+     */
     public void installDefaults(JSeparator c) {
         updateStyle(c);
     }
@@ -88,6 +106,10 @@
         context.dispose();
     }
 
+    /**
+     * Uninstalls default setting. This method is called when a
+     * {@code LookAndFeel} is uninstalled.
+     */
     public void uninstallDefaults(JSeparator c) {
         SynthContext context = getContext(c, ENABLED);
 
@@ -96,14 +118,26 @@
         style = null;
     }
 
+    /**
+     * Installs listeners. This method is called when a
+     * {@code LookAndFeel} is installed.
+     */
     public void installListeners(JSeparator c) {
         c.addPropertyChangeListener(this);
     }
 
+    /**
+     * Uninstalls listeners. This method is called when a
+     * {@code LookAndFeel} is uninstalled.
+     */
     public void uninstallListeners(JSeparator c) {
         c.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -116,6 +150,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -123,6 +161,12 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         JSeparator separator = (JSeparator)context.getComponent();
         context.getPainter().paintSeparatorForeground(context, g, 0, 0,
@@ -130,6 +174,10 @@
                              separator.getOrientation());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         JSeparator separator = (JSeparator)context.getComponent();
@@ -137,6 +185,10 @@
                                                   separator.getOrientation());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getPreferredSize(JComponent c) {
         SynthContext context = getContext(c);
 
@@ -155,16 +207,28 @@
         return size;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getMinimumSize(JComponent c) {
         return getPreferredSize(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getMaximumSize(JComponent c) {
         return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
@@ -172,14 +236,6 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
     public void propertyChange(PropertyChangeEvent evt) {
         if (SynthLookAndFeel.shouldUpdateStyle(evt)) {
             updateStyle((JSeparator)evt.getSource());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -38,20 +38,20 @@
 import javax.swing.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicSliderUI;
-import sun.swing.plaf.synth.SynthUI;
 import sun.swing.SwingUtilities2;
 
 
 /**
- * Synth's SliderUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JSlider}.
  *
  * @author Joshua Outwater
+ * @since 1.7
  */
-class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener,
-        SynthUI {
-    protected Dimension contentDim = new Dimension();
-    protected Rectangle valueRect = new Rectangle();
-    protected boolean paintValue;
+public class SynthSliderUI extends BasicSliderUI
+                           implements PropertyChangeListener, SynthUI {
+    private Rectangle valueRect = new Rectangle();
+    private boolean paintValue;
 
     /**
      * When a JSlider is used as a renderer in a JTable, its layout is not
@@ -83,18 +83,32 @@
     ///////////////////////////////////////////////////
     // ComponentUI Interface Implementation methods
     ///////////////////////////////////////////////////
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthSliderUI((JSlider)c);
     }
 
-    public SynthSliderUI(JSlider c) {
+    protected SynthSliderUI(JSlider c) {
         super(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults(JSlider slider) {
         updateStyle(slider);
     }
 
+    /**
+     * Uninstalls default setting. This method is called when a
+     * {@code LookAndFeel} is uninstalled.
+     */
     protected void uninstallDefaults() {
         SynthContext context = getContext(slider, ENABLED);
         style.uninstallDefaults(context);
@@ -112,11 +126,19 @@
         sliderThumbStyle = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners(JSlider slider) {
         super.installListeners(slider);
         slider.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners(JSlider slider) {
         slider.removePropertyChangeListener(this);
         super.uninstallListeners(slider);
@@ -177,6 +199,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected TrackListener createTrackListener(JSlider s) {
         return new SynthTrackListener();
     }
@@ -204,6 +230,10 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public int getBaseline(JComponent c, int width, int height) {
         if (c == null) {
             throw new NullPointerException("Component must be non-null");
@@ -271,9 +301,13 @@
         return -1;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getPreferredSize(JComponent c)  {
         recalculateIfInsetsChanged();
-        Dimension d = new Dimension(contentDim);
+        Dimension d = new Dimension(contentRect.width, contentRect.height);
         if (slider.getOrientation() == JSlider.VERTICAL) {
             d.height = 200;
         } else {
@@ -285,9 +319,13 @@
         return d;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getMinimumSize(JComponent c) {
         recalculateIfInsetsChanged();
-        Dimension d = new Dimension(contentDim);
+        Dimension d = new Dimension(contentRect.width, contentRect.height);
         if (slider.getOrientation() == JSlider.VERTICAL) {
             d.height = thumbRect.height + insetCache.top + insetCache.bottom;
         } else {
@@ -296,11 +334,18 @@
         return d;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void calculateGeometry() {
         layout();
         calculateThumbLocation();
     }
 
+    /**
+     * Lays out the slider.
+     */
     protected void layout() {
         SynthContext context = getContext(slider);
         SynthGraphicsUtils synthGraphics = style.getGraphicsUtils(context);
@@ -336,10 +381,10 @@
                 labelRect.height = getHeightOfTallestLabel();
             }
 
-            contentDim.height = valueRect.height + trackRect.height
+            contentRect.height = valueRect.height + trackRect.height
                 + trackInsets.top + trackInsets.bottom
                 + tickRect.height + labelRect.height + 4;
-            contentDim.width = slider.getWidth() - insetCache.left
+            contentRect.width = slider.getWidth() - insetCache.left
                 - insetCache.right;
 
             // Check if any of the labels will paint out of bounds.
@@ -348,7 +393,7 @@
                 // Calculate the track rectangle.  It is necessary for
                 // xPositionForValue to return correct values.
                 trackRect.x = insetCache.left;
-                trackRect.width = contentDim.width;
+                trackRect.width = contentRect.width;
 
                 Dictionary dictionary = slider.getLabelTable();
                 if (dictionary != null) {
@@ -381,9 +426,9 @@
             valueRect.x = trackRect.x = tickRect.x = labelRect.x =
                 (insetCache.left + pad);
             valueRect.width = trackRect.width = tickRect.width =
-                labelRect.width = (contentDim.width - (pad * 2));
+                labelRect.width = (contentRect.width - (pad * 2));
 
-            int centerY = slider.getHeight() / 2 - contentDim.height / 2;
+            int centerY = slider.getHeight() / 2 - contentRect.height / 2;
 
             valueRect.y = centerY;
             centerY += valueRect.height + 2;
@@ -430,18 +475,18 @@
             int w1 = trackInsets.left + trackRect.width / 2;
             int w2 = trackRect.width / 2 + trackInsets.right +
                               tickRect.width + labelRect.width;
-            contentDim.width = Math.max(w1, l) + Math.max(w2, l) +
+            contentRect.width = Math.max(w1, l) + Math.max(w2, l) +
                     2 + insetCache.left + insetCache.right;
-            contentDim.height = slider.getHeight() -
+            contentRect.height = slider.getHeight() -
                                     insetCache.top - insetCache.bottom;
 
             // Layout the components.
             trackRect.y = tickRect.y = labelRect.y =
                 valueRect.y + valueRect.height;
             trackRect.height = tickRect.height = labelRect.height =
-                contentDim.height - valueRect.height;
+                contentRect.height - valueRect.height;
 
-            int startX = slider.getWidth() / 2 - contentDim.width / 2;
+            int startX = slider.getWidth() / 2 - contentRect.width / 2;
             if (SynthLookAndFeel.isLeftToRight(slider)) {
                 if (l > w1) {
                     startX += (l - w1);
@@ -491,6 +536,10 @@
         return pad;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void calculateThumbLocation() {
         super.calculateThumbLocation();
         if (slider.getOrientation() == JSlider.HORIZONTAL) {
@@ -504,6 +553,10 @@
        }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void calculateTickRect() {
         if (slider.getOrientation() == JSlider.HORIZONTAL) {
             tickRect.x = trackRect.x;
@@ -533,6 +586,10 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void setThumbLocation(int x, int y) {
         super.setThumbLocation(x, y);
         // Value rect is tied to the thumb location.  We need to repaint when
@@ -542,6 +599,10 @@
         setThumbActive(false);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected int xPositionForValue(int value) {
         int min = slider.getMinimum();
         int max = slider.getMaximum();
@@ -567,6 +628,10 @@
         return xPosition;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected int yPositionForValue(int value, int trackY, int trackHeight) {
         int min = slider.getMinimum();
         int max = slider.getMaximum();
@@ -593,10 +658,9 @@
     }
 
     /**
-     * Returns a value give a y position.  If yPos is past the track at the
-     * top or the bottom it will set the value to the min or max of the
-     * slider, depending if the slider is inverted or not.
+     * @inheritDoc
      */
+    @Override
     public int valueForYPosition(int yPos) {
         int value;
         int minValue = slider.getMinimum();
@@ -623,10 +687,9 @@
     }
 
     /**
-     * Returns a value give an x position.  If xPos is past the track at the
-     * left or the right it will set the value to the min or max of the
-     * slider, depending if the slider is inverted or not.
+     * @inheritDoc
      */
+    @Override
     public int valueForXPosition(int xPos) {
         int value;
         int minValue = slider.getMinimum();
@@ -652,6 +715,10 @@
         return value;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected Dimension getThumbSize() {
         Dimension size = new Dimension();
 
@@ -665,6 +732,10 @@
         return size;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void recalculateIfInsetsChanged() {
         SynthContext context = getContext(slider);
         Insets newInsets = style.getInsets(context, null);
@@ -678,20 +749,20 @@
         context.dispose();
     }
 
-    public Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
+    /**
+     * @inheritDoc
+     */
+    @Override
+    public SynthContext getContext(JComponent c) {
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
-    public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
-    }
-
-    public SynthContext getContext(JComponent c, int state) {
+    private SynthContext getContext(JComponent c, int state) {
         return SynthContext.getContext(SynthContext.class, c,
                             SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    public SynthContext getContext(JComponent c, Region subregion) {
+    private SynthContext getContext(JComponent c, Region subregion) {
         return getContext(c, subregion, getComponentState(c, subregion));
     }
 
@@ -707,10 +778,6 @@
         return SynthContext.getContext(klass, c, subregion, style, state);
     }
 
-    public int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
     private int getComponentState(JComponent c, Region region) {
         if (region == Region.SLIDER_THUMB && thumbActive &&c.isEnabled()) {
             int state = thumbPressed ? PRESSED : MOUSE_OVER;
@@ -720,6 +787,10 @@
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
         SynthLookAndFeel.update(context, g);
@@ -730,13 +801,23 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
         paint(context, g);
         context.dispose();
     }
 
-    public void paint(SynthContext context, Graphics g) {
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
+    protected void paint(SynthContext context, Graphics g) {
         recalculateIfInsetsChanged();
         recalculateIfOrientationChanged();
         Rectangle clip = g.getClipBounds();
@@ -755,8 +836,8 @@
             // For horizontal sliders, make sure value is not painted
             // outside slider bounds.
             if (slider.getOrientation() == JSlider.HORIZONTAL) {
-                if (valueRect.x + labelWidth > insetCache.left + contentDim.width) {
-                    valueRect.x =  (insetCache.left + contentDim.width) - labelWidth;
+                if (valueRect.x + labelWidth > insetCache.left + contentRect.width) {
+                    valueRect.x =  (insetCache.left + contentRect.width) - labelWidth;
                 }
                 valueRect.x = Math.max(valueRect.x, 0);
             }
@@ -785,13 +866,24 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintSliderBorder(context, g, x, y, w, h,
                                                slider.getOrientation());
     }
 
-    public void paintThumb(SynthContext context, Graphics g,
+    /**
+     * Paints the slider thumb.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     * @param thumbBounds bounding box for the thumb
+     */
+    protected void paintThumb(SynthContext context, Graphics g,
             Rectangle thumbBounds)  {
         int orientation = slider.getOrientation();
         SynthLookAndFeel.updateSubregion(context, g, thumbBounds);
@@ -803,7 +895,14 @@
                              thumbBounds.height, orientation);
     }
 
-    public void paintTrack(SynthContext context, Graphics g,
+    /**
+     * Paints the slider track.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     * @param trackBounds bounding box for the track
+     */
+    protected void paintTrack(SynthContext context, Graphics g,
             Rectangle trackBounds) {
         int orientation = slider.getOrientation();
         SynthLookAndFeel.updateSubregion(context, g, trackBounds);
@@ -815,6 +914,10 @@
                 trackBounds.height, orientation);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JSlider)e.getSource());
@@ -827,23 +930,23 @@
     /**
      * Track mouse movements.
      */
-    protected class SynthTrackListener extends TrackListener {
+    private class SynthTrackListener extends TrackListener {
 
-        public void mouseExited(MouseEvent e) {
+        @Override public void mouseExited(MouseEvent e) {
             setThumbActive(false);
         }
 
-        public void mousePressed(MouseEvent e) {
+        @Override public void mousePressed(MouseEvent e) {
             super.mousePressed(e);
             setThumbPressed(thumbRect.contains(e.getX(), e.getY()));
         }
 
-        public void mouseReleased(MouseEvent e) {
+        @Override public void mouseReleased(MouseEvent e) {
             super.mouseReleased(e);
             updateThumbState(e.getX(), e.getY(), false);
         }
 
-        public void mouseDragged(MouseEvent e) {
+        @Override public void mouseDragged(MouseEvent e) {
             int thumbMiddle;
 
             if (!slider.isEnabled()) {
@@ -914,7 +1017,7 @@
             }
         }
 
-        public void mouseMoved(MouseEvent e) {
+        @Override public void mouseMoved(MouseEvent e) {
             updateThumbState(e.getX(), e.getY());
         }
     }
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -26,22 +26,21 @@
 
 import java.awt.*;
 import java.awt.event.*;
-
 import javax.swing.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicSpinnerUI;
-
 import java.beans.*;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Synth's SpinnerUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JSpinner}.
  *
  * @author Hans Muller
  * @author Joshua Outwater
+ * @since 1.7
  */
-class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener,
-        SynthUI {
+public class SynthSpinnerUI extends BasicSpinnerUI
+                            implements PropertyChangeListener, SynthUI {
     private SynthStyle style;
     /**
      * A FocusListener implementation which causes the entire spinner to be
@@ -65,6 +64,9 @@
         return new SynthSpinnerUI();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void installListeners() {
         super.installListeners();
@@ -79,12 +81,7 @@
     }
 
     /**
-     * Removes the <code>propertyChangeListener</code> added
-     * by installListeners.
-     * <p>
-     * This method is called by <code>uninstallUI</code>.
-     *
-     * @see #installListeners
+     * @inheritDoc
      */
     @Override
     protected void uninstallListeners() {
@@ -100,7 +97,7 @@
     }
 
     /**
-     * Initialize the <code>JSpinner</code> <code>border</code>,
+     * Initializes the <code>JSpinner</code> <code>border</code>,
      * <code>foreground</code>, and <code>background</code>, properties
      * based on the corresponding "Spinner.*" properties from defaults table.
      * The <code>JSpinners</code> layout is set to the value returned by
@@ -112,6 +109,7 @@
      * @see LookAndFeel#installBorder
      * @see LookAndFeel#installColors
      */
+    @Override
     protected void installDefaults() {
         LayoutManager layout = spinner.getLayout();
 
@@ -144,6 +142,7 @@
      * @see #installDefaults
      * @see #uninstallUI
      */
+    @Override
     protected void uninstallDefaults() {
         if (spinner.getLayout() instanceof UIResource) {
             spinner.setLayout(null);
@@ -156,25 +155,19 @@
         style = null;
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected LayoutManager createLayout() {
         return new SpinnerLayout();
     }
 
 
     /**
-     * Create a component that will replace the spinner models value
-     * with the object returned by <code>spinner.getPreviousValue</code>.
-     * By default the <code>previousButton</code> is a JButton
-     * who's <code>ActionListener</code> updates it's <code>JSpinner</code>
-     * ancestors model.  If a previousButton isn't needed (in a subclass)
-     * then override this method to return null.
-     *
-     * @return a component that will replace the spinners model with the
-     *     next value in the sequence, or null
-     * @see #installUI
-     * @see #createNextButton
+     * @inheritDoc
      */
+    @Override
     protected Component createPreviousButton() {
         JButton b = new SynthArrowButton(SwingConstants.SOUTH);
         b.setName("Spinner.previousButton");
@@ -184,18 +177,9 @@
 
 
     /**
-     * Create a component that will replace the spinner models value
-     * with the object returned by <code>spinner.getNextValue</code>.
-     * By default the <code>nextButton</code> is a JButton
-     * who's <code>ActionListener</code> updates it's <code>JSpinner</code>
-     * ancestors model.  If a nextButton isn't needed (in a subclass)
-     * then override this method to return null.
-     *
-     * @return a component that will replace the spinners model with the
-     *     next value in the sequence, or null
-     * @see #installUI
-     * @see #createPreviousButton
+     * @inheritDoc
      */
+    @Override
     protected Component createNextButton() {
         JButton b = new SynthArrowButton(SwingConstants.NORTH);
         b.setName("Spinner.nextButton");
@@ -227,6 +211,7 @@
      * @see #replaceEditor
      * @see JSpinner#getEditor
      */
+    @Override
     protected JComponent createEditor() {
         JComponent editor = spinner.getEditor();
         editor.setName("Spinner.editor");
@@ -250,6 +235,7 @@
      * @see #createEditor
      * @see #createPropertyChangeListener
      */
+    @Override
     protected void replaceEditor(JComponent oldEditor, JComponent newEditor) {
         spinner.remove(oldEditor);
         spinner.add(newEditor, "Editor");
@@ -283,8 +269,12 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
@@ -292,17 +282,10 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
-
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -314,6 +297,10 @@
     }
 
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -321,10 +308,19 @@
         context.dispose();
     }
 
-
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintSpinnerBorder(context, g, x, y, w, h);
@@ -426,9 +422,11 @@
         }
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
-        String propertyName = e.getPropertyName();
         JSpinner spinner = (JSpinner)(e.getSource());
         SpinnerUI spinnerUI = spinner.getUI();
 
@@ -444,34 +442,13 @@
     /** Listen to editor text field focus changes and repaint whole spinner */
     private class EditorFocusHandler implements FocusListener{
         /** Invoked when a editor text field gains the keyboard focus. */
-        public void focusGained(FocusEvent e) {
+        @Override public void focusGained(FocusEvent e) {
             spinner.repaint();
         }
 
         /** Invoked when a editor text field loses the keyboard focus. */
-        public void focusLost(FocusEvent e) {
+        @Override public void focusLost(FocusEvent e) {
             spinner.repaint();
         }
     }
-
-    /** Override the arrowbuttons focus handling to follow the text fields focus */
-    private class SpinnerArrowButton extends SynthArrowButton{
-        public SpinnerArrowButton(int direction) {
-            super(direction);
-        }
-
-        @Override
-        public boolean isFocusOwner() {
-            if (spinner == null){
-                return super.isFocusOwner();
-            } else if (spinner.getEditor() instanceof JSpinner.DefaultEditor){
-                return ((JSpinner.DefaultEditor)spinner.getEditor())
-                        .getTextField().isFocusOwner();
-            } else if (spinner.getEditor()!= null) {
-                return spinner.getEditor().isFocusOwner();
-            } else {
-                return super.isFocusOwner();
-            }
-        }
-    }
 }
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -31,19 +31,19 @@
 import java.beans.*;
 import java.util.*;
 import javax.swing.*;
-import javax.swing.event.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.*;
-import sun.swing.plaf.synth.SynthUI;
 
 
 /**
- * Synth's SplitPaneUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JSplitPane}.
  *
  * @author Scott Violet
+ * @since 1.7
  */
-class SynthSplitPaneUI extends BasicSplitPaneUI implements
-                                    PropertyChangeListener, SynthUI {
+public class SynthSplitPaneUI extends BasicSplitPaneUI
+                              implements PropertyChangeListener, SynthUI {
     /**
      * Keys to use for forward focus traversal when the JComponent is
      * managing focus.
@@ -68,6 +68,9 @@
 
     /**
      * Creates a new SynthSplitPaneUI instance
+     *
+     * @param x component to create UI object for
+     * @return the UI object
      */
     public static ComponentUI createUI(JComponent x) {
         return new SynthSplitPaneUI();
@@ -76,6 +79,7 @@
     /**
      * Installs the UI defaults.
      */
+    @Override
     protected void installDefaults() {
         updateStyle(splitPane);
 
@@ -161,6 +165,7 @@
     /**
      * Installs the event listeners for the UI.
      */
+    @Override
     protected void installListeners() {
         super.installListeners();
         splitPane.addPropertyChangeListener(this);
@@ -169,6 +174,7 @@
     /**
      * Uninstalls the UI defaults.
      */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(splitPane, ENABLED);
 
@@ -186,16 +192,20 @@
 
 
     /**
-     * Uninstalls the event listeners for the UI.
+     * Uninstalls the event listeners from the UI.
      */
+    @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
         splitPane.removePropertyChangeListener(this);
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
@@ -203,14 +213,6 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
     SynthContext getContext(JComponent c, Region region) {
         return getContext(c, region, getComponentState(c, region));
     }
@@ -233,7 +235,10 @@
         return state;
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JSplitPane)e.getSource());
@@ -243,6 +248,7 @@
     /**
      * Creates the default divider.
      */
+    @Override
     public BasicSplitPaneDivider createDefaultDivider() {
         SynthSplitPaneDivider divider = new SynthSplitPaneDivider(this);
 
@@ -250,6 +256,10 @@
         return divider;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected Component createDefaultNonContinuousLayoutDivider() {
         return new Canvas() {
             public void paint(Graphics g) {
@@ -258,6 +268,10 @@
         };
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -268,6 +282,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -275,13 +293,22 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         // This is done to update package private variables in
         // BasicSplitPaneUI
         super.paint(g, splitPane);
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintSplitPaneBorder(context, g, x, y, w, h);
@@ -299,6 +326,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void finishedPaintingChildren(JSplitPane jc, Graphics g) {
         if(jc == splitPane && getLastDragLocation() != -1 &&
                               !isContinuousLayout() && !draggingHW) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyle.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyle.java	Thu Dec 10 09:50:09 2009 -0800
@@ -33,7 +33,6 @@
 import java.util.HashMap;
 import java.util.Map;
 import javax.swing.text.JTextComponent;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
  * <code>SynthStyle</code> is a set of style properties.
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyleFactory.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyleFactory.java	Thu Dec 10 09:50:09 2009 -0800
@@ -24,10 +24,7 @@
  */
 package javax.swing.plaf.synth;
 
-import java.awt.*;
-import java.util.*;
-import javax.swing.plaf.*;
-import javax.swing.*;
+import javax.swing.JComponent;
 
 /**
  * Factory used for obtaining <code>SynthStyle</code>s.  Each of the
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -34,19 +34,21 @@
 import java.awt.event.*;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeEvent;
-import sun.swing.plaf.synth.SynthUI;
 import sun.swing.SwingUtilities2;
 
 /**
- * A Synth L&F implementation of TabbedPaneUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JTabbedPane}.
+ *
+ * <p>Looks up the {@code selectedTabPadInsets} property from the Style,
+ * which represents additional insets for the selected tab.
  *
  * @author Scott Violet
+ * @since 1.7
  */
-/**
- * Looks up 'selectedTabPadInsets' from the Style, which will be additional
- * insets for the selected tab.
- */
-class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyChangeListener  {
+public class SynthTabbedPaneUI extends BasicTabbedPaneUI
+                               implements PropertyChangeListener, SynthUI {
+
     /**
      * <p>If non-zero, tabOverlap indicates the amount that the tab bounds
      * should be altered such that they would overlap with a tab on either the
@@ -103,11 +105,17 @@
 
     private boolean selectedTabIsPressed = false;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthTabbedPaneUI();
     }
 
-    SynthTabbedPaneUI() {
+    private SynthTabbedPaneUI() {
         textRect = new Rectangle();
         iconRect = new Rectangle();
     }
@@ -116,6 +124,10 @@
         return (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         updateStyle(tabPane);
     }
@@ -175,16 +187,28 @@
             tabContentStyle.getInsets(tabContentContext, null);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         tabPane.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
         tabPane.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(tabPane, ENABLED);
         style.uninstallDefaults(context);
@@ -207,19 +231,19 @@
         tabContentStyle = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
-    public SynthContext getContext(JComponent c, int state) {
+    private SynthContext getContext(JComponent c, int state) {
         return SynthContext.getContext(SynthContext.class, c,
                     SynthLookAndFeel.getRegion(c),style, state);
     }
 
-    public SynthContext getContext(JComponent c, Region subregion) {
-        return getContext(c, subregion, getComponentState(c));
-    }
-
     private SynthContext getContext(JComponent c, Region subregion, int state){
         SynthStyle style = null;
         Class klass = SynthContext.class;
@@ -236,14 +260,10 @@
         return SynthContext.getContext(klass, c, subregion, style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected JButton createScrollButton(int direction) {
         // added for Nimbus LAF so that it can use the basic arrow buttons
         // UIManager is queried directly here because this is called before
@@ -256,6 +276,10 @@
         return new SynthScrollableTabButton(direction);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle(tabPane);
@@ -313,6 +337,9 @@
         };
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected int getTabLabelShiftX(int tabPlacement, int tabIndex, boolean isSelected) {
         if (nudgeSelectedLabel) {
@@ -322,6 +349,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected int getTabLabelShiftY(int tabPlacement, int tabIndex, boolean isSelected) {
         if (nudgeSelectedLabel) {
@@ -331,6 +361,10 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -341,6 +375,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected int getBaseline(int tab) {
         if (tabPane.getTabComponentAt(tab) != null ||
                 getTextViewForTab(tab) != null) {
@@ -361,11 +399,19 @@
         return textRect.y + metrics.getAscent() + getBaselineOffset();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintTabbedPaneBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -373,6 +419,12 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         int selectedIndex = tabPane.getSelectedIndex();
         int tabPlacement = tabPane.getTabPlacement();
@@ -426,6 +478,10 @@
     }
 
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void paintTabArea(Graphics g, int tabPlacement,
                                 int selectedIndex) {
         // This can be invoked from ScrollabeTabPanel
@@ -439,7 +495,7 @@
                      new Rectangle(x, y, width, height));
     }
 
-    protected void paintTabArea(SynthContext ss, Graphics g,
+    private void paintTabArea(SynthContext ss, Graphics g,
                                 int tabPlacement, int selectedIndex,
                                 Rectangle tabAreaBounds) {
         Rectangle clipRect = g.getClipBounds();
@@ -493,6 +549,10 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void setRolloverTab(int index) {
         int oldRolloverTab = getRolloverTab();
         super.setRolloverTab(index);
@@ -519,7 +579,7 @@
         }
     }
 
-    protected void paintTab(SynthContext ss, Graphics g,
+    private void paintTab(SynthContext ss, Graphics g,
                             int tabPlacement, Rectangle[] rects, int tabIndex,
                             Rectangle iconRect, Rectangle textRect) {
         Rectangle tabRect = rects[tabIndex];
@@ -587,7 +647,7 @@
         }
     }
 
-    protected void layoutLabel(SynthContext ss, int tabPlacement,
+    private void layoutLabel(SynthContext ss, int tabPlacement,
                                FontMetrics metrics, int tabIndex,
                                String title, Icon icon,
                                Rectangle tabRect, Rectangle iconRect,
@@ -614,7 +674,7 @@
         textRect.y += yNudge;
     }
 
-    protected void paintText(SynthContext ss,
+    private void paintText(SynthContext ss,
                              Graphics g, int tabPlacement,
                              Font font, FontMetrics metrics, int tabIndex,
                              String title, Rectangle textRect,
@@ -636,7 +696,7 @@
     }
 
 
-    protected void paintContentBorder(SynthContext ss, Graphics g,
+    private void paintContentBorder(SynthContext ss, Graphics g,
                                       int tabPlacement, int selectedIndex) {
         int width = tabPane.getWidth();
         int height = tabPane.getHeight();
@@ -683,7 +743,10 @@
         }
     }
 
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected int calculateMaxTabHeight(int tabPlacement) {
         FontMetrics metrics = getFontMetrics(tabContext.getStyle().getFont(
                                              tabContext));
@@ -696,6 +759,10 @@
         return result;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected int calculateTabWidth(int tabPlacement, int tabIndex,
                                     FontMetrics metrics) {
         Icon icon = getIconForTab(tabIndex);
@@ -723,6 +790,10 @@
         return width;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected int calculateMaxTabWidth(int tabPlacement) {
         FontMetrics metrics = getFontMetrics(tabContext.getStyle().getFont(
                                      tabContext));
@@ -735,17 +806,25 @@
         return result;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected Insets getTabInsets(int tabPlacement, int tabIndex) {
         updateTabContext(tabIndex, false, false, false,
                           (getFocusIndex() == tabIndex));
         return tabInsets;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected FontMetrics getFontMetrics() {
         return getFontMetrics(tabContext.getStyle().getFont(tabContext));
     }
 
-    protected FontMetrics getFontMetrics(Font font) {
+    private FontMetrics getFontMetrics(Font font) {
         return tabPane.getFontMetrics(font);
     }
 
@@ -787,7 +866,8 @@
      * Overridden to create a TabbedPaneLayout subclass which takes into
      * account tabOverlap.
      */
-    @Override protected LayoutManager createLayoutManager() {
+    @Override
+    protected LayoutManager createLayoutManager() {
         if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT) {
             return super.createLayoutManager();
         } else { /* WRAP_TAB_LAYOUT */
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -32,19 +32,18 @@
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.*;
 import javax.swing.table.*;
-
-import sun.swing.DefaultLookup;
-import sun.swing.plaf.synth.*;
 import sun.swing.table.*;
 
 /**
- * SynthTableHeaderUI implementation
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.table.JTableHeader}.
  *
  * @author Alan Chung
  * @author Philip Milne
+ * @since 1.7
  */
-class SynthTableHeaderUI extends BasicTableHeaderUI implements
-           PropertyChangeListener, SynthUI {
+public class SynthTableHeaderUI extends BasicTableHeaderUI
+                                implements PropertyChangeListener, SynthUI {
 
 //
 // Instance Variables
@@ -54,10 +53,20 @@
 
     private SynthStyle style;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param h component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent h) {
         return new SynthTableHeaderUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         prevRenderer = header.getDefaultRenderer();
         if (prevRenderer instanceof UIResource) {
@@ -79,11 +88,19 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners() {
         super.installListeners();
         header.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         if (header.getDefaultRenderer() instanceof HeaderRenderer) {
             header.setDefaultRenderer(prevRenderer);
@@ -96,11 +113,19 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         header.removePropertyChangeListener(this);
         super.uninstallListeners();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -111,6 +136,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -118,10 +147,20 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         super.paint(g, context.getComponent());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintTableHeaderBorder(context, g, x, y, w, h);
@@ -129,8 +168,12 @@
 //
 // SynthUI
 //
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
@@ -138,26 +181,25 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
+    /**
+     * @inheritDoc
+     */
+    @Override
+    protected void rolloverColumnUpdated(int oldColumn, int newColumn) {
+        header.repaint(header.getHeaderRect(oldColumn));
+        header.repaint(header.getHeaderRect(newColumn));
     }
 
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent evt) {
         if (SynthLookAndFeel.shouldUpdateStyle(evt)) {
             updateStyle((JTableHeader)evt.getSource());
         }
     }
 
-    @Override
-    protected void rolloverColumnUpdated(int oldColumn, int newColumn) {
-        header.repaint(header.getHeaderRect(oldColumn));
-        header.repaint(header.getHeaderRect(newColumn));
-    }
-
     private class HeaderRenderer extends DefaultTableCellHeaderRenderer {
         HeaderRenderer() {
             setHorizontalAlignment(JLabel.LEADING);
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -54,15 +54,15 @@
 import javax.swing.table.TableColumn;
 import javax.swing.table.TableColumnModel;
 
-import sun.swing.plaf.synth.SynthUI;
-
 /**
- * SynthTableUI implementation
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JTable}.
  *
  * @author Philip Milne
+ * @since 1.7
  */
-class SynthTableUI extends BasicTableUI implements SynthUI,
-        PropertyChangeListener {
+public class SynthTableUI extends BasicTableUI
+                          implements SynthUI, PropertyChangeListener {
 //
 // Instance Variables
 //
@@ -88,18 +88,25 @@
 //  The installation/uninstall procedures and support
 //
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthTableUI();
     }
 
     /**
-     * Initialize JTable properties, e.g. font, foreground, and background.
+     * Initializes JTable properties, such as font, foreground, and background.
      * The font, foreground, and background properties are only set if their
      * current value is either null or a UIResource, other properties are set
      * if the current value is null.
      *
      * @see #installUI
      */
+    @Override
     protected void installDefaults() {
         dateRenderer = installRendererIfPossible(Date.class, null);
         numberRenderer = installRendererIfPossible(Number.class, null);
@@ -189,11 +196,16 @@
     /**
      * Attaches listeners to the JTable.
      */
+    @Override
     protected void installListeners() {
         super.installListeners();
         table.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         table.setDefaultRenderer(Date.class, dateRenderer);
         table.setDefaultRenderer(Number.class, numberRenderer);
@@ -213,6 +225,10 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners() {
         table.removePropertyChangeListener(this);
         super.uninstallListeners();
@@ -221,8 +237,13 @@
     //
     // SynthUI
     //
+
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
@@ -230,18 +251,14 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
 //
 //  Paint methods and support
 //
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -252,11 +269,19 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintTableBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -264,6 +289,12 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         Rectangle clip = g.getClipBounds();
 
@@ -647,6 +678,10 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent event) {
         if (SynthLookAndFeel.shouldUpdateStyle(event)) {
             updateStyle((JTable)event.getSource());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -33,7 +33,6 @@
 import java.awt.event.FocusListener;
 import java.awt.event.FocusEvent;
 import java.beans.PropertyChangeEvent;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
  * Provides the look and feel for a plain text editor in the
@@ -50,40 +49,42 @@
  * Please see {@link java.beans.XMLEncoder}.
  *
  * @author  Shannon Hickey
+ * @since 1.7
  */
-class SynthTextAreaUI extends BasicTextAreaUI implements SynthUI, FocusListener {
+public class SynthTextAreaUI extends BasicTextAreaUI implements SynthUI {
+    private Handler handler = new Handler();
     private SynthStyle style;
 
     /**
-     * Creates a UI for a JTextArea.
+     * Creates a UI object for a JTextArea.
      *
      * @param ta a text area
-     * @return the UI
+     * @return the UI object
      */
     public static ComponentUI createUI(JComponent ta) {
         return new SynthTextAreaUI();
     }
 
-    public void focusGained(FocusEvent e) {
-        getComponent().repaint();
-    }
-
-    public void focusLost(FocusEvent e) {
-        getComponent().repaint();
-    }
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         // Installs the text cursor on the component
         super.installDefaults();
         updateStyle(getComponent());
-        getComponent().addFocusListener(this);
+        getComponent().addFocusListener(handler);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(getComponent(), ENABLED);
 
         getComponent().putClientProperty("caretAspectRatio", null);
-        getComponent().removeFocusListener(this);
+        getComponent().removeFocusListener(handler);
 
         style.uninstallDefaults(context);
         context.dispose();
@@ -91,10 +92,6 @@
         super.uninstallDefaults();
     }
 
-    public void installUI(JComponent c) {
-        super.installUI(c);
-    }
-
     private void updateStyle(JTextComponent comp) {
         SynthContext context = getContext(comp, ENABLED);
         SynthStyle oldStyle = style;
@@ -112,8 +109,12 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
@@ -121,10 +122,10 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -135,14 +136,30 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         super.paint(g, getComponent());
     }
 
+    /**
+     * @inheritDoc
+     *
+     * Overridden to do nothing.
+     */
+    @Override
     protected void paintBackground(Graphics g) {
         // Overriden to do nothing, all our painting is done from update/paint.
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintTextAreaBorder(context, g, x, y, w, h);
@@ -158,10 +175,21 @@
      *
      * @param evt the property change event
      */
+    @Override
     protected void propertyChange(PropertyChangeEvent evt) {
         if (SynthLookAndFeel.shouldUpdateStyle(evt)) {
             updateStyle((JTextComponent)evt.getSource());
         }
         super.propertyChange(evt);
     }
+
+    private final class Handler implements FocusListener {
+        public void focusGained(FocusEvent e) {
+            getComponent().repaint();
+        }
+
+        public void focusLost(FocusEvent e) {
+            getComponent().repaint();
+        }
+    }
 }
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -27,7 +27,6 @@
 
 import javax.swing.*;
 import javax.swing.text.*;
-import javax.swing.event.*;
 import javax.swing.plaf.*;
 import javax.swing.plaf.basic.BasicTextFieldUI;
 import java.awt.*;
@@ -35,11 +34,9 @@
 import java.awt.event.FocusListener;
 import java.beans.PropertyChangeEvent;
 
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Basis of a look and feel for a JTextField in the Synth
- * look and feel.
+ * Provides the Synth L&F UI delegate for {@link javax.swing.JTextField}.
  * <p>
  * <strong>Warning:</strong>
  * Serialized objects of this class will not be compatible with
@@ -51,27 +48,22 @@
  * Please see {@link java.beans.XMLEncoder}.
  *
  * @author  Shannon Hickey
+ * @since 1.7
  */
-class SynthTextFieldUI
-    extends BasicTextFieldUI
-    implements SynthUI, FocusListener
-{
+public class SynthTextFieldUI extends BasicTextFieldUI implements SynthUI {
+    private Handler handler = new Handler();
     private SynthStyle style;
 
     /**
      * Creates a UI for a JTextField.
      *
      * @param c the text field
-     * @return the UI
+     * @return the UI object
      */
     public static ComponentUI createUI(JComponent c) {
         return new SynthTextFieldUI();
     }
 
-    public SynthTextFieldUI() {
-        super();
-    }
-
     private void updateStyle(JTextComponent comp) {
         SynthContext context = getContext(comp, ENABLED);
         SynthStyle oldStyle = style;
@@ -155,8 +147,12 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
@@ -164,10 +160,10 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -178,12 +174,15 @@
     }
 
     /**
-     * Paints the interface.  This is routed to the
-     * paintSafely method under the guarantee that
-     * the model won't change from the view of this thread
-     * while it's rendering (if the associated model is
-     * derived from AbstractDocument).  This enables the
+     * Paints the specified component.
+     * <p>This is routed to the {@link #paintSafely} method under
+     * the guarantee that the model does not change from the view of this
+     * thread while it is rendering (if the associated model is
+     * derived from {@code AbstractDocument}).  This enables the
      * model to potentially be updated asynchronously.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
      */
     protected void paint(SynthContext context, Graphics g) {
         super.paint(g, getComponent());
@@ -194,11 +193,20 @@
                                                 c.getWidth(), c.getHeight());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintTextFieldBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     * Overridden to do nothing.
+     */
+    @Override
     protected void paintBackground(Graphics g) {
         // Overriden to do nothing, all our painting is done from update/paint.
     }
@@ -214,6 +222,7 @@
      *
      * @param evt the property change event
      */
+    @Override
     protected void propertyChange(PropertyChangeEvent evt) {
         if (SynthLookAndFeel.shouldUpdateStyle(evt)) {
             updateStyle((JTextComponent)evt.getSource());
@@ -221,26 +230,26 @@
         super.propertyChange(evt);
     }
 
-    public void focusGained(FocusEvent e) {
-        getComponent().repaint();
-    }
-
-    public void focusLost(FocusEvent e) {
-        getComponent().repaint();
-    }
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults() {
         // Installs the text cursor on the component
         super.installDefaults();
         updateStyle(getComponent());
-        getComponent().addFocusListener(this);
+        getComponent().addFocusListener(handler);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(getComponent(), ENABLED);
 
         getComponent().putClientProperty("caretAspectRatio", null);
-        getComponent().removeFocusListener(this);
+        getComponent().removeFocusListener(handler);
 
         style.uninstallDefaults(context);
         context.dispose();
@@ -248,7 +257,13 @@
         super.uninstallDefaults();
     }
 
-    public void installUI(JComponent c) {
-        super.installUI(c);
+    private final class Handler implements FocusListener {
+        public void focusGained(FocusEvent e) {
+            getComponent().repaint();
+        }
+
+        public void focusLost(FocusEvent e) {
+            getComponent().repaint();
+        }
     }
 }
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -45,14 +45,15 @@
  * Please see {@link java.beans.XMLEncoder}.
  *
  * @author  Shannon Hickey
+ * @since 1.7
  */
-class SynthTextPaneUI extends SynthEditorPaneUI {
+public class SynthTextPaneUI extends SynthEditorPaneUI {
 
     /**
      * Creates a UI for the JTextPane.
      *
      * @param c the JTextPane object
-     * @return the UI
+     * @return the UI object
      */
     public static ComponentUI createUI(JComponent c) {
         return new SynthTextPaneUI();
@@ -65,10 +66,15 @@
      *
      * @return the name ("TextPane")
      */
+    @Override
     protected String getPropertyPrefix() {
         return "TextPane";
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void installUI(JComponent c) {
         super.installUI(c);
         updateForeground(c.getForeground());
@@ -86,6 +92,7 @@
      *
      * @param evt the property change event
      */
+    @Override
     protected void propertyChange(PropertyChangeEvent evt) {
         super.propertyChange(evt);
 
@@ -150,11 +157,16 @@
         }
     }
 
+    @Override
     void paintBackground(SynthContext context, Graphics g, JComponent c) {
         context.getPainter().paintTextPaneBackground(context, g, 0, 0,
                                                   c.getWidth(), c.getHeight());
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintTextPaneBorder(context, g, x, y, w, h);
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -31,18 +31,30 @@
 import javax.swing.plaf.ComponentUI;
 
 /**
- * Synth's ToggleButtonUI.
- * <p>
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JToggleButton}.
+ *
  * @author Jeff Dinkins
+ * @since 1.7
  */
-class SynthToggleButtonUI extends SynthButtonUI {
+public class SynthToggleButtonUI extends SynthButtonUI {
     // ********************************
     //          Create PLAF
     // ********************************
+
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param b component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent b) {
         return new SynthToggleButtonUI();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected String getPropertyPrefix() {
         return "ToggleButton.";
@@ -57,6 +69,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -42,39 +42,53 @@
 import javax.swing.plaf.ComponentUI;
 import javax.swing.plaf.basic.BasicToolBarUI;
 import sun.swing.plaf.synth.SynthIcon;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * A Synth L&F implementation of ToolBarUI.  This implementation
- * is a "combined" view/controller.
- * <p>
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JToolBar}.
  *
+ * @since 1.7
  */
-class SynthToolBarUI extends BasicToolBarUI implements PropertyChangeListener,
-           SynthUI {
-    protected Icon handleIcon = null;
-    protected Rectangle contentRect = new Rectangle();
+public class SynthToolBarUI extends BasicToolBarUI
+                            implements PropertyChangeListener, SynthUI {
+    private Icon handleIcon = null;
+    private Rectangle contentRect = new Rectangle();
 
     private SynthStyle style;
     private SynthStyle contentStyle;
     private SynthStyle dragWindowStyle;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthToolBarUI();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void installDefaults() {
         toolBar.setLayout(createLayout());
         updateStyle(toolBar);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void installListeners() {
         super.installListeners();
         toolBar.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
@@ -106,6 +120,9 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(toolBar, ENABLED);
@@ -131,18 +148,33 @@
         toolBar.setLayout(null);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void installComponents() {}
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void uninstallComponents() {}
 
+    /**
+     * Creates a {@code LayoutManager} to use with the toolbar.
+     *
+     * @return a {@code LayoutManager} instance
+     */
     protected LayoutManager createLayout() {
         return new SynthToolBarLayoutManager();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
@@ -161,18 +193,13 @@
                                        style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
     private int getComponentState(JComponent c, Region region) {
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
@@ -185,6 +212,9 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
@@ -193,6 +223,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintToolBarBorder(context, g, x, y, w, h,
@@ -200,17 +234,32 @@
     }
 
     // Overloaded to do nothing so we can share listeners.
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void setBorderToNonRollover(Component c) {}
 
     // Overloaded to do nothing so we can share listeners.
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void setBorderToRollover(Component c) {}
 
     // Overloaded to do nothing so we can share listeners.
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void setBorderToNormal(Component c) {}
 
+    /**
+     * Paints the toolbar.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         if (handleIcon != null && toolBar.isFloatable()) {
             int startX = toolBar.getComponentOrientation().isLeftToRight() ?
@@ -227,7 +276,14 @@
         subcontext.dispose();
     }
 
-    public void paintContent(SynthContext context, Graphics g,
+    /**
+     * Paints the toolbar content.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     * @param bounds bounding box for the toolbar
+     */
+    protected void paintContent(SynthContext context, Graphics g,
             Rectangle bounds) {
         SynthLookAndFeel.updateSubregion(context, g, bounds);
         context.getPainter().paintToolBarContentBackground(context, g,
@@ -238,6 +294,9 @@
                              toolBar.getOrientation());
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void paintDragWindow(Graphics g) {
         int w = dragWindow.getWidth();
@@ -258,6 +317,10 @@
     // PropertyChangeListener
     //
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JToolBar)e.getSource());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -34,23 +34,33 @@
 import javax.swing.plaf.basic.BasicToolTipUI;
 import javax.swing.plaf.ComponentUI;
 import javax.swing.text.View;
-import sun.swing.plaf.synth.SynthUI;
 
 
 /**
- * Synth's ToolTipUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JToolTip}.
  *
  * @author Joshua Outwater
+ * @since 1.7
  */
-class SynthToolTipUI extends BasicToolTipUI implements PropertyChangeListener,
-               SynthUI {
+public class SynthToolTipUI extends BasicToolTipUI
+                            implements PropertyChangeListener, SynthUI {
     private SynthStyle style;
 
-
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthToolTipUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installDefaults(JComponent c) {
         updateStyle(c);
     }
@@ -61,6 +71,10 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallDefaults(JComponent c) {
         SynthContext context = getContext(c, ENABLED);
         style.uninstallDefaults(context);
@@ -68,14 +82,26 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void installListeners(JComponent c) {
         c.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     protected void uninstallListeners(JComponent c) {
         c.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
         return getContext(c, getComponentState(c));
     }
@@ -85,10 +111,6 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JComponent c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
     private int getComponentState(JComponent c) {
         JComponent comp = ((JToolTip)c).getComponent();
 
@@ -98,6 +120,10 @@
         return SynthLookAndFeel.getComponentState(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -108,11 +134,19 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintToolTipBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -120,9 +154,14 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         JToolTip tip = (JToolTip)context.getComponent();
-        String tipText = tip.getToolTipText();
 
         Insets insets = tip.getInsets();
         View v = (View)tip.getClientProperty(BasicHTML.propertyKey);
@@ -140,6 +179,10 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public Dimension getPreferredSize(JComponent c) {
         SynthContext context = getContext(c);
         Insets insets = c.getInsets();
@@ -164,6 +207,10 @@
         return prefSize;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JToolTip)e.getSource());
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -48,15 +48,16 @@
 import javax.swing.tree.TreeModel;
 import javax.swing.tree.TreePath;
 import sun.swing.plaf.synth.SynthIcon;
-import sun.swing.plaf.synth.SynthUI;
 
 /**
- * Skinnable TreeUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JTree}.
  *
  * @author Scott Violet
+ * @since 1.7
  */
-class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener,
-                               SynthUI {
+public class SynthTreeUI extends BasicTreeUI
+                         implements PropertyChangeListener, SynthUI {
     private SynthStyle style;
     private SynthStyle cellStyle;
 
@@ -67,27 +68,33 @@
 
     private Object linesStyle;
 
-    private int leadRow;
-
     private int padding;
 
     private boolean useTreeColors;
 
-    private Icon expandedIconWrapper;
+    private Icon expandedIconWrapper = new ExpandedIconWrapper();
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param x component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent x) {
         return new SynthTreeUI();
     }
 
-    SynthTreeUI() {
-        expandedIconWrapper = new ExpandedIconWrapper();
-    }
-
+    /**
+     * @inheritDoc
+     */
     @Override
     public Icon getExpandedIcon() {
         return expandedIconWrapper;
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void installDefaults() {
         updateStyle(tree);
@@ -148,15 +155,21 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void installListeners() {
         super.installListeners();
         tree.addPropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
@@ -164,14 +177,6 @@
                     SynthLookAndFeel.getRegion(c), style, state);
     }
 
-    private Region getRegion(JTree c) {
-        return SynthLookAndFeel.getRegion(c);
-    }
-
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
     private SynthContext getContext(JComponent c, Region region) {
         return getContext(c, region, getComponentState(c, region));
     }
@@ -187,6 +192,9 @@
         return ENABLED | SELECTED;
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected TreeCellEditor createDefaultCellEditor() {
         TreeCellRenderer renderer = tree.getCellRenderer();
@@ -202,11 +210,17 @@
         return editor;
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected TreeCellRenderer createDefaultCellRenderer() {
         return new SynthTreeCellRenderer();
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void uninstallDefaults() {
         SynthContext context = getContext(tree, ENABLED);
@@ -226,12 +240,18 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void uninstallListeners() {
         super.uninstallListeners();
         tree.removePropertyChangeListener(this);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
@@ -243,11 +263,18 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         context.getPainter().paintTreeBorder(context, g, x, y, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
@@ -256,14 +283,16 @@
         context.dispose();
     }
 
-    private void updateLeadRow() {
-        leadRow = getRowForPath(tree, tree.getLeadSelectionPath());
-    }
-
+    /**
+     * Paints the specified component.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
         paintContext = context;
 
-        updateLeadRow();
+        updateLeadSelectionRow();
 
         Rectangle paintBounds = g.getClipBounds();
         Insets insets = tree.getInsets();
@@ -288,7 +317,6 @@
             boolean isExpanded;
             boolean hasBeenExpanded;
             boolean isLeaf;
-            Rectangle boundsBuffer = new Rectangle();
             Rectangle rowBounds = new Rectangle(0, 0, tree.getWidth(),0);
             Rectangle bounds;
             TreePath path;
@@ -392,83 +420,6 @@
         rendererPane.removeAll();
     }
 
-    private boolean isDropLine(JTree.DropLocation loc) {
-        return loc != null && loc.getPath() != null && loc.getChildIndex() != -1;
-    }
-
-    private void paintDropLine(Graphics g) {
-        JTree.DropLocation loc = tree.getDropLocation();
-        if (!isDropLine(loc)) {
-            return;
-        }
-
-        Color c = (Color)style.get(paintContext, "Tree.dropLineColor");
-        if (c != null) {
-            g.setColor(c);
-            Rectangle rect = getDropLineRect(loc);
-            g.fillRect(rect.x, rect.y, rect.width, rect.height);
-        }
-    }
-
-    private Rectangle getDropLineRect(JTree.DropLocation loc) {
-        Rectangle rect;
-        TreePath path = loc.getPath();
-        int index = loc.getChildIndex();
-        boolean ltr = tree.getComponentOrientation().isLeftToRight();
-
-        Insets insets = tree.getInsets();
-
-        if (tree.getRowCount() == 0) {
-            rect = new Rectangle(insets.left,
-                                 insets.top,
-                                 tree.getWidth() - insets.left - insets.right,
-                                 0);
-        } else {
-            int row = tree.getRowForPath(path);
-            TreeModel model = getModel();
-            Object root = model.getRoot();
-
-            if (path.getLastPathComponent() == root
-                    && index >= model.getChildCount(root)) {
-
-                rect = tree.getRowBounds(tree.getRowCount() - 1);
-                rect.y = rect.y + rect.height;
-                Rectangle xRect;
-
-                if (!tree.isRootVisible()) {
-                    xRect = tree.getRowBounds(0);
-                } else if (model.getChildCount(root) == 0){
-                    xRect = tree.getRowBounds(0);
-                    xRect.x += totalChildIndent;
-                    xRect.width -= totalChildIndent + totalChildIndent;
-                } else {
-                    TreePath lastChildPath = path.pathByAddingChild(
-                        model.getChild(root, model.getChildCount(root) - 1));
-                    xRect = tree.getPathBounds(lastChildPath);
-                }
-
-                rect.x = xRect.x;
-                rect.width = xRect.width;
-            } else {
-                rect = tree.getPathBounds(path.pathByAddingChild(
-                    model.getChild(path.getLastPathComponent(), index)));
-            }
-        }
-
-        if (rect.y != 0) {
-            rect.y--;
-        }
-
-        if (!ltr) {
-            rect.x = rect.x + rect.width - 100;
-        }
-
-        rect.width = 100;
-        rect.height = 2;
-
-        return rect;
-    }
-
     private void configureRenderer(SynthContext context) {
         TreeCellRenderer renderer = tree.getCellRenderer();
 
@@ -502,6 +453,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void paintHorizontalPartOfLeg(Graphics g, Rectangle clipBounds,
                                             Insets insets, Rectangle bounds,
@@ -516,6 +470,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void paintHorizontalLine(Graphics g, JComponent c, int y,
                                       int left, int right) {
@@ -523,6 +480,9 @@
             paintContext, "Tree.horizontalLine", g, left, y, right, y, linesStyle);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void paintVerticalPartOfLeg(Graphics g,
                                           Rectangle clipBounds, Insets insets,
@@ -532,6 +492,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void paintVerticalLine(Graphics g, JComponent c, int x, int top,
                                     int bottom) {
@@ -539,7 +502,7 @@
             paintContext, "Tree.verticalLine", g, x, top, x, bottom, linesStyle);
     }
 
-    protected void paintRow(TreeCellRenderer renderer,
+    private void paintRow(TreeCellRenderer renderer,
                DefaultTreeCellRenderer dtcr, SynthContext treeContext,
                SynthContext cellContext, Graphics g, Rectangle clipBounds,
                Insets insets, Rectangle bounds, Rectangle rowBounds,
@@ -558,7 +521,7 @@
             state |= SELECTED;
         }
 
-        if (tree.isFocusOwner() && row == leadRow) {
+        if (tree.isFocusOwner() && row == getLeadSelectionRow()) {
             state |= FOCUSED;
         }
 
@@ -583,7 +546,7 @@
         int leadIndex;
 
         if (tree.hasFocus()) {
-            leadIndex = leadRow;
+            leadIndex = getLeadSelectionRow();
         }
         else {
             leadIndex = -1;
@@ -625,6 +588,9 @@
         paintContext.setComponentState(state);
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected void drawCentered(Component c, Graphics graphics, Icon icon,
                                 int x, int y) {
@@ -636,6 +602,10 @@
                             y - h/2, w, h);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent event) {
         if (SynthLookAndFeel.shouldUpdateStyle(event)) {
             updateStyle((JTree)event.getSource());
@@ -648,6 +618,24 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
+    protected void paintDropLine(Graphics g) {
+        JTree.DropLocation loc = tree.getDropLocation();
+        if (!isDropLine(loc)) {
+            return;
+        }
+
+        Color c = (Color)style.get(paintContext, "Tree.dropLineColor");
+        if (c != null) {
+            g.setColor(c);
+            Rectangle rect = getDropLineRect(loc);
+            g.fillRect(rect.x, rect.y, rect.width, rect.height);
+        }
+    }
+
     private void repaintDropLocation(JTree.DropLocation loc) {
         if (loc == null) {
             return;
@@ -670,6 +658,9 @@
         }
     }
 
+    /**
+     * @inheritDoc
+     */
     @Override
     protected int getRowX(int row, int depth) {
         return super.getRowX(row, depth) + padding;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2002-2003 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package javax.swing.plaf.synth;
+
+import java.awt.Graphics;
+import javax.swing.JComponent;
+
+/**
+ * SynthUI is used to fetch the SynthContext for a particular Component.
+ *
+ * @author Scott Violet
+ * @since 1.7
+ */
+public interface SynthUI extends SynthConstants {
+
+    /**
+     * Returns the Context for the specified component.
+     *
+     * @param c Component requesting SynthContext.
+     * @return SynthContext describing component.
+     */
+    public SynthContext getContext(JComponent c);
+
+    /**
+     * Paints the border.
+     *
+     * @param context a component context
+     * @param g {@code Graphics} to paint on
+     * @param x the X coordinate
+     * @param y the Y coordinate
+     * @param w width of the border
+     * @param h height of the border
+     */
+    public void paintBorder(SynthContext context, Graphics g, int x,
+                            int y, int w, int h);
+}
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java	Thu Dec 10 09:50:09 2009 -0800
@@ -25,40 +25,57 @@
 
 package javax.swing.plaf.synth;
 
-import java.awt.*;
 import java.beans.*;
 import javax.swing.*;
-import javax.swing.border.*;
 import javax.swing.plaf.*;
 import java.awt.*;
-import java.awt.event.*;
-import sun.swing.plaf.synth.SynthUI;
 
 
 /**
- * Synth's ViewportUI.
+ * Provides the Synth L&F UI delegate for
+ * {@link javax.swing.JViewport}.
  *
+ * @since 1.7
  */
-class SynthViewportUI extends ViewportUI implements
-           PropertyChangeListener, SynthUI {
+public class SynthViewportUI extends ViewportUI
+                             implements PropertyChangeListener, SynthUI {
     private SynthStyle style;
 
+    /**
+     * Creates a new UI object for the given component.
+     *
+     * @param c component to create UI object for
+     * @return the UI object
+     */
     public static ComponentUI createUI(JComponent c) {
         return new SynthViewportUI();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void installUI(JComponent c) {
         super.installUI(c);
         installDefaults(c);
         installListeners(c);
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void uninstallUI(JComponent c) {
         super.uninstallUI(c);
         uninstallListeners(c);
         uninstallDefaults(c);
     }
 
+    /**
+     * Installs defaults for a viewport.
+     *
+     * @param c a {@code JViewport} object
+     */
     protected void installDefaults(JComponent c) {
         updateStyle(c);
     }
@@ -85,14 +102,29 @@
         context.dispose();
     }
 
+    /**
+     * Installs listeners into the viewport.
+     *
+     * @param c a {@code JViewport} object
+     */
     protected void installListeners(JComponent c) {
         c.addPropertyChangeListener(this);
     }
 
+    /**
+     * Uninstalls listeners from the viewport.
+     *
+     * @param c a {@code JViewport} object
+     */
     protected void uninstallListeners(JComponent c) {
         c.removePropertyChangeListener(this);
     }
 
+    /**
+     * Uninstalls defaults from a viewport.
+     *
+     * @param c a {@code JViewport} object
+     */
     protected void uninstallDefaults(JComponent c) {
         SynthContext context = getContext(c, ENABLED);
         style.uninstallDefaults(context);
@@ -100,8 +132,12 @@
         style = null;
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public SynthContext getContext(JComponent c) {
-        return getContext(c, getComponentState(c));
+        return getContext(c, SynthLookAndFeel.getComponentState(c));
     }
 
     private SynthContext getContext(JComponent c, int state) {
@@ -113,10 +149,10 @@
         return SynthLookAndFeel.getRegion(c);
     }
 
-    private int getComponentState(JComponent c) {
-        return SynthLookAndFeel.getComponentState(c);
-    }
-
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void update(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -127,12 +163,20 @@
         context.dispose();
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paintBorder(SynthContext context, Graphics g, int x,
                             int y, int w, int h) {
         // This does nothing on purpose, JViewport doesn't allow a border
         // and therefor this will NEVER be called.
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void paint(Graphics g, JComponent c) {
         SynthContext context = getContext(c);
 
@@ -140,9 +184,19 @@
         context.dispose();
     }
 
+    /**
+     * Paints the specified component. This implementation does nothing.
+     *
+     * @param context context for the component being painted
+     * @param g {@code Graphics} object used for painting
+     */
     protected void paint(SynthContext context, Graphics g) {
     }
 
+    /**
+     * @inheritDoc
+     */
+    @Override
     public void propertyChange(PropertyChangeEvent e) {
         if (SynthLookAndFeel.shouldUpdateStyle(e)) {
             updateStyle((JComponent)e.getSource());
--- a/jdk/src/share/classes/sun/swing/plaf/synth/SynthUI.java	Thu Dec 10 09:46:13 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright 2002-2003 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-package sun.swing.plaf.synth;
-
-import java.awt.Graphics;
-import javax.swing.JComponent;
-import javax.swing.plaf.synth.*;
-
-/**
- * SynthUI is used to fetch the SynthContext for a particular Component.
- *
- * @author Scott Violet
- */
-public interface SynthUI extends SynthConstants {
-    /**
-     * Returns the Context for the specified component.
-     *
-     * @param c Component requesting SynthContext.
-     * @return SynthContext describing component.
-     */
-    public SynthContext getContext(JComponent c);
-
-    /**
-     * Paints the border.
-     */
-    public void paintBorder(SynthContext context, Graphics g, int x,
-                            int y, int w, int h);
-}
--- a/jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_PCM.c	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_PCM.c	Thu Dec 10 09:50:09 2009 -0800
@@ -143,8 +143,12 @@
             ERROR1("snd_pcm_hw_params_malloc returned error %d\n", ret);
         } else {
             ret = snd_pcm_hw_params_any(handle, hwParams);
-            if (ret != 0) {
-                ERROR1("snd_pcm_hw_params_any returned error %d\n", ret);
+            /* snd_pcm_hw_params_any can return a positive value on success too */
+            if (ret < 0) {
+                 ERROR1("snd_pcm_hw_params_any returned error %d\n", ret);
+            } else {
+                /* for the logic following this code, set ret to 0 to indicate success */
+                ret = 0;
             }
         }
         snd_pcm_hw_params_get_format_mask(hwParams, formatMask);
--- a/jdk/src/windows/lib/tzmappings	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/windows/lib/tzmappings	Thu Dec 10 09:50:09 2009 -0800
@@ -92,7 +92,7 @@
 North Asia Standard Time:14,15::Asia/Krasnoyarsk:
 SE Asia:14,15::Asia/Bangkok:
 SE Asia Standard Time:14,15::Asia/Bangkok:
-North Asia East Standard Time:16,17::Asia/Ulaanbaatar:
+North Asia East Standard Time:16,17:RU:Asia/Irkutsk:
 Singapore:16,17:SG:Asia/Singapore:
 Singapore Standard Time:16,17:SG:Asia/Singapore:
 Taipei:16,17::Asia/Taipei:
@@ -184,4 +184,5 @@
 Kamchatka Standard Time:916,916:RU:Asia/Kamchatka:
 Paraguay Standard Time:917,917:PY:America/Asuncion:
 Western Brazilian Standard Time:918,918:BR:America/Rio_Branco:
-Armenian Standard Time:919,919:AM:Asia/Yerevan:
+Ulaanbaatar Standard Time:919,919::Asia/Ulaanbaatar:
+Armenian Standard Time:920,920:AM:Asia/Yerevan:
--- a/jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp	Thu Dec 10 09:50:09 2009 -0800
@@ -485,7 +485,7 @@
         }
         if (data.line2Start->isSource) {
             data.startResult =
-                data.line2Start->playBuffer->Play(0, 0, DSCBSTART_LOOPING);
+                data.line2Start->playBuffer->Play(0, 0, DSBPLAY_LOOPING);
         } else {
             data.startResult =
                 data.line2Start->captureBuffer->Start(DSCBSTART_LOOPING);
--- a/jdk/test/java/beans/EventHandler/Test6788531.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/test/java/beans/EventHandler/Test6788531.java	Thu Dec 10 09:50:09 2009 -0800
@@ -36,7 +36,7 @@
     public static void main(String[] args) throws Exception {
         JButton button = new JButton("hi");
         button.addActionListener(EventHandler.create(ActionListener.class, new Private(), "run"));
-        button.addActionListener(EventHandler.create(ActionListener.class, new PrivateGeneric(), "run", "generic"));
+        button.addActionListener(EventHandler.create(ActionListener.class, new PrivateGeneric(), "run", "actionCommand"));
         button.doClick();
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/Introspector/Test5102804.java	Thu Dec 10 09:50:09 2009 -0800
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 5102804
+ * @summary Tests memory leak
+ * @author Sergey Malenkov
+ */
+
+import java.beans.BeanInfo;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.beans.SimpleBeanInfo;
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+public class Test5102804 {
+    private static final String BEAN_NAME = "Test5102804$Example";
+    private static final String BEAN_INFO_NAME = BEAN_NAME + "BeanInfo";
+
+    public static void main(String[] args) {
+        if (!isCollectible(getReference()))
+            throw new Error("Reference is not collected");
+    }
+
+    private static Reference getReference() {
+        try {
+            ClassLoader loader = new Loader();
+            Class type = Class.forName(BEAN_NAME, true, loader);
+            if (!type.getClassLoader().equals(loader)) {
+                throw new Error("Wrong class loader");
+            }
+            BeanInfo info = Introspector.getBeanInfo(type);
+            if (0 != info.getDefaultPropertyIndex()) {
+                throw new Error("Wrong bean info found");
+            }
+            return new WeakReference<Class>(type);
+        }
+        catch (IntrospectionException exception) {
+            throw new Error("Introspection Error", exception);
+        }
+        catch (ClassNotFoundException exception) {
+            throw new Error("Class Not Found", exception);
+        }
+    }
+
+    private static boolean isCollectible(Reference reference) {
+        int[] array = new int[10];
+        while (true) {
+            try {
+                array = new int[array.length + array.length / 3];
+            }
+            catch (OutOfMemoryError error) {
+                return null == reference.get();
+            }
+        }
+    }
+
+    /**
+     * Custom class loader to load the Example class by itself.
+     * Could also load it from a different code source, but this is easier to set up.
+     */
+    private static final class Loader extends URLClassLoader {
+        Loader() {
+            super(new URL[] {
+                    Test5102804.class.getProtectionDomain().getCodeSource().getLocation()
+            });
+        }
+
+        @Override
+        protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
+            Class c = findLoadedClass(name);
+            if (c == null) {
+                if (BEAN_NAME.equals(name) || BEAN_INFO_NAME.equals(name)) {
+                    c = findClass(name);
+                }
+                else try {
+                    c = getParent().loadClass(name);
+                }
+                catch (ClassNotFoundException exception) {
+                    c = findClass(name);
+                }
+            }
+            if (resolve) {
+                resolveClass(c);
+            }
+            return c;
+        }
+    }
+
+    /**
+     * A simple bean to load from the Loader class, not main class loader.
+     */
+    public static final class Example {
+        private int value;
+
+        public int getValue() {
+            return value;
+        }
+
+        public void setValue(int value) {
+            this.value = value;
+        }
+    }
+
+    /**
+     * The BeanInfo for the Example class.
+     * It is also loaded from the Loader class.
+     */
+    public static final class ExampleBeanInfo extends SimpleBeanInfo {
+        @Override
+        public int getDefaultPropertyIndex() {
+            return 0;
+        }
+
+        @Override
+        public PropertyDescriptor[] getPropertyDescriptors() {
+            try {
+                return new PropertyDescriptor[] {
+                        new PropertyDescriptor("value", Class.forName(BEAN_NAME))
+                };
+            }
+            catch (ClassNotFoundException exception) {
+                return null;
+            }
+            catch (IntrospectionException exception) {
+                return null;
+            }
+        }
+    }
+}
--- a/jdk/test/java/beans/XMLEncoder/6329581/Test6329581.java	Thu Dec 10 09:46:13 2009 -0800
+++ b/jdk/test/java/beans/XMLEncoder/6329581/Test6329581.java	Thu Dec 10 09:50:09 2009 -0800
@@ -33,43 +33,70 @@
 import java.beans.XMLEncoder;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.File;
 import java.net.URL;
 import java.net.URLClassLoader;
 
-public class Test6329581 implements ExceptionListener {
+public class Test6329581 extends URLClassLoader implements ExceptionListener {
+    public static final class Bean {
+    }
 
     public static void main(String[] args) throws Exception {
-        ExceptionListener listener = new Test6329581();
-        // write bean to byte array
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        XMLEncoder encoder = new XMLEncoder(out);
-        encoder.setExceptionListener(listener);
-        encoder.writeObject(getClassLoader("beans.jar").loadClass("test.Bean").newInstance());
-        encoder.close();
-        // read bean from byte array
-        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
-        XMLDecoder decoder = new XMLDecoder(in, null, listener, getClassLoader("beans.jar"));
-        Object object = decoder.readObject();
-        decoder.close();
+        new Test6329581().decode(new Test6329581().encode(Bean.class.getName()));
+    }
 
-        if (!object.getClass().getClassLoader().getClass().equals(URLClassLoader.class)) {
-            throw new Error("bean is loaded with unexpected class loader");
-        }
+    private Test6329581() {
+        super(new URL[] {
+                Test6329581.class.getProtectionDomain().getCodeSource().getLocation()
+        });
     }
 
-    private static ClassLoader getClassLoader(String name) throws Exception {
-        StringBuilder sb = new StringBuilder(256);
-        sb.append("file:");
-        sb.append(System.getProperty("test.src", "."));
-        sb.append(File.separatorChar);
-        sb.append(name);
-
-        URL[] url = { new URL(sb.toString()) };
-        return new URLClassLoader(url);
+    @Override
+    protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
+        Class c = findLoadedClass(name);
+        if (c == null) {
+            if (Bean.class.getName().equals(name)) {
+                c = findClass(name);
+            }
+            else try {
+                c = getParent().loadClass(name);
+            }
+            catch (ClassNotFoundException exception) {
+                c = findClass(name);
+            }
+        }
+        if (resolve) {
+            resolveClass(c);
+        }
+        return c;
     }
 
     public void exceptionThrown(Exception exception) {
         throw new Error("unexpected exception", exception);
     }
+
+    private void validate(Object object) {
+        if (!object.getClass().getClassLoader().equals(this)) {
+            throw new Error("Bean is loaded with unexpected class loader");
+        }
+    }
+
+    private byte[] encode(String name) throws Exception {
+        Object object = loadClass(name).newInstance();
+        validate(object);
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        XMLEncoder encoder = new XMLEncoder(out);
+        encoder.setExceptionListener(this);
+        encoder.writeObject(object);
+        encoder.close();
+        return out.toByteArray();
+    }
+
+    private Object decode(byte[] array) {
+        ByteArrayInputStream in = new ByteArrayInputStream(array);
+        XMLDecoder decoder = new XMLDecoder(in, null, this, this);
+        Object object = decoder.readObject();
+        validate(object);
+        decoder.close();
+        return object;
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOverFlowTest2.java	Thu Dec 10 09:50:09 2009 -0800
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @summary Test SoftChannel overflow test 2 */
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.sound.midi.MidiChannel;
+import javax.sound.midi.Patch;
+import javax.sound.midi.VoiceStatus;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+
+import com.sun.media.sound.AudioSynthesizer;
+import com.sun.media.sound.SF2Instrument;
+import com.sun.media.sound.SF2InstrumentRegion;
+import com.sun.media.sound.SF2Layer;
+import com.sun.media.sound.SF2LayerRegion;
+import com.sun.media.sound.SF2Region;
+import com.sun.media.sound.SF2Sample;
+import com.sun.media.sound.SF2Soundbank;
+import com.sun.media.sound.SoftSynthesizer;
+
+public class NoteOverFlowTest2 {
+
+    public static void main(String[] args) throws Exception
+    {
+        // Create instance of the synthesizer with very low polyphony
+        AudioSynthesizer synth = new SoftSynthesizer();
+        AudioFormat format = new AudioFormat(44100, 16, 2, true, false);
+        Map<String, Object> p = new HashMap<String, Object>();
+        p.put("max polyphony", new Integer(5));
+        AudioInputStream stream = synth.openStream(format, p);
+
+        // Create instrument with too many regions (more than max polyphony)
+        SF2Soundbank sf2 = new SF2Soundbank();
+
+        SF2Sample sample = new SF2Sample(sf2);
+        sample.setName("test sample");
+        sample.setData(new byte[100]);
+        sample.setSampleRate(44100);
+        sample.setOriginalPitch(20);
+        sf2.addResource(sample);
+
+        SF2Layer layer = new SF2Layer(sf2);
+        layer.setName("test layer");
+        sf2.addResource(layer);
+
+        for (int i = 0; i < 100; i++) {
+            SF2LayerRegion region = new SF2LayerRegion();
+            region.setSample(sample);
+            layer.getRegions().add(region);
+        }
+
+        SF2Instrument ins = new SF2Instrument(sf2);
+        ins.setPatch(new Patch(0,0));
+        ins.setName("test instrument");
+        sf2.addInstrument(ins);
+
+        SF2InstrumentRegion insregion = new SF2InstrumentRegion();
+        insregion.setLayer(layer);
+        ins.getRegions().add(insregion);
+
+        // Load the test soundbank into the synthesizer
+        synth.unloadAllInstruments(synth.getDefaultSoundbank());
+        synth.loadAllInstruments(sf2);
+
+        // Send out one midi on message
+        MidiChannel ch1 = synth.getChannels()[0];
+        ch1.programChange(0);
+        ch1.noteOn(64, 64);
+
+        // Read 1 sec from stream
+        stream.skip(format.getFrameSize() * ((int)(format.getFrameRate() * 2)));
+
+        // Close the synthesizer after use
+        synth.close();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/GetMidiDevice.java	Thu Dec 10 09:50:09 2009 -0800
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ @summary Test SoftReceiver getMidiDevice method */
+
+import javax.sound.midi.Receiver;
+
+import com.sun.media.sound.AudioSynthesizer;
+import com.sun.media.sound.SoftReceiver;
+import com.sun.media.sound.SoftSynthesizer;
+
+public class GetMidiDevice {
+
+    public static void main(String[] args) throws Exception {
+
+        AudioSynthesizer synth = new SoftSynthesizer();
+        synth.openStream(null, null);
+        Receiver recv = synth.getReceiver();
+        if (((SoftReceiver) recv).getMidiDevice() != synth) {
+            throw new Exception("SoftReceiver.getMidiDevice() doesn't return "
+                    + "instance of the synthesizer");
+        }
+        synth.close();
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/TestPreciseTimestampRendering.java	Thu Dec 10 09:50:09 2009 -0800
@@ -0,0 +1,208 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ @summary Test rendering when using precise timestamps */
+
+import java.util.Arrays;
+import java.util.Random;
+
+import javax.sound.midi.MidiChannel;
+import javax.sound.midi.Receiver;
+import javax.sound.midi.ShortMessage;
+import javax.sound.midi.Soundbank;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+
+import com.sun.media.sound.AudioFloatConverter;
+import com.sun.media.sound.AudioSynthesizer;
+import com.sun.media.sound.ModelAbstractChannelMixer;
+import com.sun.media.sound.ModelChannelMixer;
+import com.sun.media.sound.SF2Instrument;
+import com.sun.media.sound.SF2InstrumentRegion;
+import com.sun.media.sound.SF2Layer;
+import com.sun.media.sound.SF2LayerRegion;
+import com.sun.media.sound.SF2Sample;
+import com.sun.media.sound.SF2Soundbank;
+import com.sun.media.sound.SimpleInstrument;
+import com.sun.media.sound.SimpleSoundbank;
+import com.sun.media.sound.SoftSynthesizer;
+
+public class TestPreciseTimestampRendering {
+
+    public static AudioFormat format = new AudioFormat(44100, 16, 1, true,
+            false);
+
+    public static SF2Soundbank createTestSoundbank() {
+        // Create impulse instrument
+        // used to measure timing of note-on playback
+        SF2Soundbank soundbank = new SF2Soundbank();
+        float[] data = new float[100];
+        Arrays.fill(data, 0);
+        data[0] = 1.0f;
+        byte[] bdata = new byte[data.length * format.getFrameSize()];
+        AudioFloatConverter.getConverter(format).toByteArray(data, bdata);
+
+        SF2Sample sample = new SF2Sample(soundbank);
+        sample.setName("Test Sample");
+        sample.setData(bdata);
+        sample.setSampleRate((long) format.getSampleRate());
+        sample.setOriginalPitch(69);
+        soundbank.addResource(sample);
+
+        SF2Layer layer = new SF2Layer(soundbank);
+        layer.setName("Test Layer");
+        soundbank.addResource(layer);
+        SF2LayerRegion region = new SF2LayerRegion();
+        region.setSample(sample);
+        layer.getRegions().add(region);
+
+        SF2Instrument ins = new SF2Instrument(soundbank);
+        ins.setName("Test Instrument");
+        soundbank.addInstrument(ins);
+        SF2InstrumentRegion insregion = new SF2InstrumentRegion();
+        insregion.setLayer(layer);
+        ins.getRegions().add(insregion);
+
+        return soundbank;
+    }
+
+    public static Soundbank createTestSoundbankWithChannelMixer() {
+        SF2Soundbank soundbank = createTestSoundbank();
+
+        SimpleSoundbank simplesoundbank = new SimpleSoundbank();
+        SimpleInstrument simpleinstrument = new SimpleInstrument() {
+
+            public ModelChannelMixer getChannelMixer(MidiChannel channel,
+                    AudioFormat format) {
+                return new ModelAbstractChannelMixer() {
+                    boolean active = true;
+
+                    public boolean process(float[][] buffer, int offset, int len) {
+                        for (int i = 0; i < buffer.length; i++) {
+                            float[] cbuffer = buffer[i];
+                            for (int j = 0; j < cbuffer.length; j++) {
+                                cbuffer[j] = -cbuffer[j];
+                            }
+                        }
+                        return active;
+                    }
+
+                    public void stop() {
+                        active = false;
+                    }
+                };
+            }
+
+        };
+        simpleinstrument.add(soundbank.getInstruments()[0]);
+        simplesoundbank.addInstrument(simpleinstrument);
+
+        return simplesoundbank;
+    }
+
+    public static void main(String[] args) throws Exception {
+        test(createTestSoundbank());
+        test(createTestSoundbankWithChannelMixer());
+    }
+
+    public static void test(Soundbank soundbank) throws Exception {
+
+        // Create instance of synthesizer using the testing soundbank above
+        AudioSynthesizer synth = new SoftSynthesizer();
+        AudioInputStream stream = synth.openStream(format, null);
+        synth.unloadAllInstruments(synth.getDefaultSoundbank());
+        synth.loadAllInstruments(soundbank);
+        Receiver recv = synth.getReceiver();
+
+        // Set volume to max and turn reverb off
+        ShortMessage reverb_off = new ShortMessage();
+        reverb_off.setMessage(ShortMessage.CONTROL_CHANGE, 91, 0);
+        recv.send(reverb_off, -1);
+        ShortMessage full_volume = new ShortMessage();
+        full_volume.setMessage(ShortMessage.CONTROL_CHANGE, 7, 127);
+        recv.send(full_volume, -1);
+
+        Random random = new Random(3485934583945l);
+
+        // Create random timestamps
+        long[] test_timestamps = new long[30];
+        for (int i = 1; i < test_timestamps.length; i++) {
+            test_timestamps[i] = i * 44100
+                    + (int) (random.nextDouble() * 22050.0);
+        }
+
+        // Send midi note on message to synthesizer
+        for (int i = 0; i < test_timestamps.length; i++) {
+            ShortMessage midi_on = new ShortMessage();
+            midi_on.setMessage(ShortMessage.NOTE_ON, 69, 127);
+            recv.send(midi_on,
+                    (long) ((test_timestamps[i] / 44100.0) * 1000000.0));
+        }
+
+        // Measure timing from rendered audio
+        float[] fbuffer = new float[100];
+        byte[] buffer = new byte[fbuffer.length * format.getFrameSize()];
+        long firsts = -1;
+        int counter = 0;
+        long s = 0;
+        long max_jitter = 0;
+        outerloop: for (int k = 0; k < 10000000; k++) {
+            stream.read(buffer);
+            AudioFloatConverter.getConverter(format).toFloatArray(buffer,
+                    fbuffer);
+            for (int i = 0; i < fbuffer.length; i++) {
+                if (fbuffer[i] != 0) {
+                    if (firsts == -1)
+                        firsts = s;
+
+                    long measure_time = (s - firsts);
+                    long predicted_time = test_timestamps[counter];
+
+                    long jitter = Math.abs(measure_time - predicted_time);
+
+                    if (jitter > 10)
+                        max_jitter = jitter;
+
+                    counter++;
+                    if (counter == test_timestamps.length)
+                        break outerloop;
+                }
+                s++;
+            }
+        }
+        synth.close();
+
+        if (counter == 0)
+            throw new Exception("Nothing was measured!");
+
+        if (max_jitter != 0) {
+            throw new Exception("Jitter has occurred! "
+                    + "(max jitter = " + max_jitter + ")");
+        }
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JList/6823603/bug6823603.java	Thu Dec 10 09:50:09 2009 -0800
@@ -0,0 +1,247 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6823603
+   @summary Generics: JList
+   @author Florian Brunner
+   @run main bug6823603
+ */
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Vector;
+import java.util.Enumeration;
+import java.awt.*;
+import javax.swing.*;
+
+public class bug6823603 {
+
+    private static final String TEST_ELEMENT = "Test1";
+
+    /**
+     * @param args the command line arguments
+     */
+    @SuppressWarnings("unchecked")
+    public static void main(String[] args) {
+        testRawSignatures();
+        testGenericSignatures();
+
+        testGetSelectedValuesList(); // new method
+    }
+
+    @SuppressWarnings("unchecked")
+    private static void testRawSignatures() {
+        // Test JList
+        ListModel rawTestModel = new DefaultListModel();
+
+        new JList();
+        new JList(rawTestModel);
+        new JList(new Object[]{TEST_ELEMENT});
+        JList rawTestList = new JList(new Vector());
+        rawTestList.getPrototypeCellValue();
+        rawTestList.setPrototypeCellValue(TEST_ELEMENT);
+        rawTestList.getCellRenderer();
+        rawTestList.setCellRenderer(new DefaultListCellRenderer());
+        rawTestList.getModel();
+        rawTestList.setModel(rawTestModel);
+        rawTestList.setListData(new Object[]{TEST_ELEMENT});
+        rawTestList.setListData(new Vector());
+
+        @SuppressWarnings("deprecation")
+        Object[] selectedValues = rawTestList.getSelectedValues();
+        rawTestList.getSelectedValue();
+
+        // Test ListCellRenderer
+        ListCellRenderer rawTestCellRenderer = new DefaultListCellRenderer();
+        String testEntry = "Test";
+        @SuppressWarnings("unchecked")
+        JList rawJList = new JList(new Object[]{testEntry});
+
+        rawTestCellRenderer.getListCellRendererComponent(rawJList,
+                testEntry, 0, true, true);
+
+        // Test ListModel
+        DefaultListModel testModel = new DefaultListModel();
+        testModel.addElement(TEST_ELEMENT);
+        rawTestModel = testModel;
+        rawTestModel.getElementAt(0);
+
+        // Test DefaultListModel
+        DefaultListModel defaultListModel = new DefaultListModel();
+
+        defaultListModel.addElement(TEST_ELEMENT);
+        defaultListModel.getElementAt(0);
+        defaultListModel.elements();
+        defaultListModel.elementAt(0);
+        defaultListModel.firstElement();
+        defaultListModel.lastElement();
+
+        String testElement2 = "Test2";
+
+        defaultListModel.setElementAt(testElement2, 0);
+        defaultListModel.insertElementAt(TEST_ELEMENT, 0);
+        defaultListModel.get(0);
+        defaultListModel.set(0, testElement2);
+        defaultListModel.add(0, TEST_ELEMENT);
+        defaultListModel.remove(0);
+
+        // Test AbstractListModel
+        @SuppressWarnings("serial")
+        ListModel abstractListModel = new AbstractListModel() {
+            public int getSize() {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+
+            public Object getElementAt(int index) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+        };
+
+        // Test DefaultListCellRenderer
+        DefaultListCellRenderer cellRenderer = new DefaultListCellRenderer();
+
+        @SuppressWarnings("unchecked")
+        JList list = new JList(new Object[]{testEntry});
+
+        cellRenderer.getListCellRendererComponent(rawJList, testEntry, 0, true, true);
+    }
+
+    private static <E> void testGenericSignatures() {
+        // Test JList
+        ListModel<String> stringListModel = new DefaultListModel<String>();
+
+        new JList<String>();
+        new JList<String>(stringListModel);
+        new JList<String>(new String[]{TEST_ELEMENT});
+
+        JList<String> stringTestList = new JList<String>(new Vector<String>());
+
+        stringTestList.getPrototypeCellValue();
+        stringTestList.setPrototypeCellValue(TEST_ELEMENT);
+
+        ListCellRenderer<? super String> cellRenderer = stringTestList.getCellRenderer();
+
+        stringTestList.setCellRenderer(new DefaultListCellRenderer());
+
+        ListModel<String> model = stringTestList.getModel();
+
+        stringTestList.setModel(stringListModel);
+        stringTestList.setListData(new String[]{TEST_ELEMENT});
+        stringTestList.setListData(new Vector<String>());
+
+        @SuppressWarnings("deprecation")
+        Object[] selectedValues = stringTestList.getSelectedValues();
+
+        stringTestList.getSelectedValue();
+
+        // Test ListCellRenderer
+        ListCellRenderer<Object> stringTestCellRenderer =
+                new DefaultListCellRenderer();
+        String testEntry = "Test";
+        JList<String> stringJList = new JList<String>(new String[]{testEntry});
+
+        Component listCellRendererComponent2 =
+                stringTestCellRenderer.getListCellRendererComponent(stringJList,
+                testEntry, 0, true, true);
+
+        // Test ListModel
+        DefaultListModel<String> testModel = new DefaultListModel<String>();
+        testModel.addElement(TEST_ELEMENT);
+        stringListModel = testModel;
+
+        String element1 = stringListModel.getElementAt(0);
+
+        // Test DefaultListModel
+        DefaultListModel<String> stringTestModel = new DefaultListModel<String>();
+
+        stringTestModel.addElement(TEST_ELEMENT);
+        element1 = stringTestModel.getElementAt(0);
+        Enumeration<String> elements = stringTestModel.elements();
+        String element2 = stringTestModel.elementAt(0);
+        String firstElement = stringTestModel.firstElement();
+        String lastElement = stringTestModel.lastElement();
+
+        String testElement2 = "Test2";
+        stringTestModel.setElementAt(testElement2, 0);
+        stringTestModel.insertElementAt(TEST_ELEMENT, 0);
+        String element3 = stringTestModel.get(0);
+        String element4 = stringTestModel.set(0, testElement2);
+        stringTestModel.add(0, TEST_ELEMENT);
+        String removedElement = stringTestModel.remove(0);
+
+        // Test AbstractListModel
+        stringListModel = new AbstractListModel<String>() {
+
+            public int getSize() {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+
+            public String getElementAt(int index) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+        };
+
+        @SuppressWarnings("serial")
+        ListModel<E> genericTestModel = new AbstractListModel<E>() {
+
+            public int getSize() {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+
+            public E getElementAt(int index) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+        };
+
+        // Test DefaultListCellRenderer
+        cellRenderer = new DefaultListCellRenderer();
+
+        stringJList = new JList<String>(new String[]{testEntry});
+
+        listCellRendererComponent2 = cellRenderer.getListCellRendererComponent(stringJList, testEntry, 0, true, true);
+    }
+
+    private static void testGetSelectedValuesList() {
+        Vector<Integer> data = new Vector<Integer>();
+        for (int i = 0; i < 10; i++) {
+            data.add(i);
+        }
+        JList<Integer> list = new JList<Integer>(data);
+        list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+        list.setSelectedIndices(new int[]{1, 2, 3, 5, 6, 8});
+
+        @SuppressWarnings("deprecation")
+        Object[] expectedSelectedValues = list.getSelectedValues();
+        List<Integer> selectedValuesList = list.getSelectedValuesList();
+        assertEquals(expectedSelectedValues, selectedValuesList.toArray());
+    }
+
+    private static void assertEquals(Object[] expectedArray,
+            Object[] actualArray) {
+        if (!Arrays.equals(expectedArray, actualArray)) {
+            throw new RuntimeException("Expected: " + Arrays.toString(
+                    expectedArray) + " but was: " + Arrays.toString(actualArray));
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JTable/Test6888156.java	Thu Dec 10 09:50:09 2009 -0800
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6888156
+   @summary Tests table column of class Icon.class with Synth LAF
+   @author Peter Zhelezniakov
+   @run main Test6888156
+*/
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.image.BufferedImage;
+import javax.swing.*;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableModel;
+
+public class Test6888156 {
+    private JTable table;
+    private Icon ICON = new Icon() {
+        @Override public int getIconWidth() {
+            return 24;
+        }
+
+        @Override public int getIconHeight() {
+            return 24;
+        }
+
+        @Override public void paintIcon(Component c, Graphics g, int w, int h) {
+        }
+    };
+
+    public Test6888156() {
+        TableModel model = new AbstractTableModel() {
+            @Override public int getRowCount() {
+                return 3;
+            }
+
+            @Override public int getColumnCount() {
+                return 2;
+            }
+
+            @Override public Object getValueAt(int rowIndex, int columnIndex) {
+                return (columnIndex == 1 ? ICON : 4);
+            }
+
+            @Override public Class<?> getColumnClass(int columnIndex) {
+                return (columnIndex == 1 ? Icon.class : int.class);
+            }
+        };
+        table = new JTable(model);
+    }
+
+    public void test(final LookAndFeel laf) throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override public void run() {
+                try {
+                    UIManager.setLookAndFeel(laf);
+                } catch (UnsupportedLookAndFeelException e) {
+                    System.err.println(laf.getDescription() +
+                                       " is unsupported; continuing");
+                    return;
+                }
+                SwingUtilities.updateComponentTreeUI(table);
+                table.setSize(100, 100);
+                table.paint(
+                        new BufferedImage(100, 100, BufferedImage.OPAQUE).
+                            getGraphics());
+            }
+        });
+    }
+
+    public static void main(String[] args) throws Exception {
+        Test6888156 t = new Test6888156();
+        t.test(new javax.swing.plaf.nimbus.NimbusLookAndFeel());
+        t.test(new com.sun.java.swing.plaf.gtk.GTKLookAndFeel());
+    }
+}
\ No newline at end of file