diff --git a/jdk/make/javax/sound/Makefile b/jdk/make/javax/sound/Makefile index 5572e637b7c..d2d1e736aea 100644 --- a/jdk/make/javax/sound/Makefile +++ b/jdk/make/javax/sound/Makefile @@ -108,22 +108,14 @@ ifeq ($(PLATFORM), linux) 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 diff --git a/jdk/src/share/classes/com/sun/beans/WeakCache.java b/jdk/src/share/classes/com/sun/beans/WeakCache.java index 461c48e1fd3..3aa6373dc46 100644 --- a/jdk/src/share/classes/com/sun/beans/WeakCache.java +++ b/jdk/src/share/classes/com/sun/beans/WeakCache.java @@ -81,4 +81,11 @@ public final class WeakCache { this.map.remove(key); } } + + /** + * Removes all of the mappings from this cache. + */ + public void clear() { + this.map.clear(); + } } diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java index 58d61dc909a..c29f69a1765 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java @@ -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.*; diff --git a/jdk/src/share/classes/com/sun/media/sound/MidiDeviceReceiver.java b/jdk/src/share/classes/com/sun/media/sound/MidiDeviceReceiver.java new file mode 100644 index 00000000000..60bca739318 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/MidiDeviceReceiver.java @@ -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(); + +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java b/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java index ccc94899f61..fc3bb4c7322 100644 --- a/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java +++ b/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java @@ -48,6 +48,30 @@ public class SoftAudioBuffer { 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; } diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java b/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java index 96a575f2c8e..dcd04ed54ac 100644 --- a/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java +++ b/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java @@ -218,6 +218,15 @@ public class SoftChannel implements MidiChannel, ModelDirectedPlayer { } 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 @@ public class SoftChannel implements MidiChannel, ModelDirectedPlayer { } 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 @@ public class SoftChannel implements MidiChannel, ModelDirectedPlayer { 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 class SoftChannel implements MidiChannel, ModelDirectedPlayer { } 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 @@ public class SoftChannel implements MidiChannel, ModelDirectedPlayer { 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 @@ public class SoftChannel implements MidiChannel, ModelDirectedPlayer { play_noteNumber = noteNumber; play_velocity = lastVelocity[noteNumber]; play_releasetriggered = true; + play_delay = 0; current_director.noteOff(tunedKey, velocity); } @@ -604,12 +622,14 @@ public class SoftChannel implements MidiChannel, ModelDirectedPlayer { 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 @@ public class SoftChannel implements MidiChannel, ModelDirectedPlayer { if (voiceNo == -1) return; - initVoice(voices[voiceNo], p, prevVoiceID, noteNumber, velocity, + initVoice(voices[voiceNo], p, prevVoiceID, noteNumber, velocity, delay, connectionBlocks, current_mixer, releasetriggered); } diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java b/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java index 7ba0ac66002..cad04ecfd44 100644 --- a/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java @@ -79,7 +79,7 @@ public class SoftLimiter implements SoftAudioProcessor { if (silentcounter > 60) { if (!mix) { bufferLout.clear(); - bufferRout.clear(); + if (bufferRout != null) bufferRout.clear(); } return; } diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java b/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java index b62d1d480af..2d627674fa8 100644 --- a/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java @@ -26,7 +26,6 @@ package com.sun.media.sound; 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 @@ import javax.sound.sampled.AudioSystem; */ 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 @@ public class SoftMainMixer { private SoftAudioProcessor chorus; private SoftAudioProcessor agc; private long msec_buffer_len = 0; + private int buffer_len = 0; protected TreeMap midimessages = new TreeMap(); + 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 @@ public class SoftMainMixer { private double[] co_master_coarse_tuning = new double[1]; private double[] co_master_fine_tuning = new double[1]; private AudioInputStream ais; - private Set registeredMixers = null; + private Set registeredMixers = null; private Set 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 @@ public class SoftMainMixer { Iterator> iter = midimessages.entrySet().iterator(); while (iter.hasNext()) { Entry 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 @@ public class SoftMainMixer { 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 @@ public class SoftMainMixer { 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 @@ public class SoftMainMixer { 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 @@ public class SoftMainMixer { } } + 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 @@ public class SoftMainMixer { if (stoppedMixers != null) { if (stoppedMixers.contains(cmixer)) { stoppedMixers.remove(cmixer); - cmixer.stop(); + cmixer.mixer.stop(); } } } @@ -565,6 +642,9 @@ public class SoftMainMixer { 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 @@ public class SoftMainMixer { 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 @@ public class SoftMainMixer { // 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 class SoftMainMixer { public void registerMixer(ModelChannelMixer mixer) { if (registeredMixers == null) - registeredMixers = new HashSet(); - registeredMixers.add(mixer); + registeredMixers = new HashSet(); + 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 @@ public class SoftMainMixer { 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 @@ public class SoftMainMixer { 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 class SoftMainMixer { } 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() { diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java b/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java index e7f1edcfae6..fa533836c7b 100644 --- a/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java +++ b/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java @@ -26,8 +26,8 @@ package com.sun.media.sound; 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 @@ import javax.sound.midi.ShortMessage; * * @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 @@ public class SoftReceiver implements Receiver { this.midimessages = mainmixer.midimessages; } + public MidiDevice getMidiDevice() { + return synth; + } + public void send(MidiMessage message, long timeStamp) { synchronized (control_mutex) { @@ -60,6 +64,7 @@ public class SoftReceiver implements Receiver { if (timeStamp != -1) { synchronized (control_mutex) { + mainmixer.activity(); while (midimessages.get(timeStamp) != null) timeStamp++; if (message instanceof ShortMessage diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java b/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java index ab46b2dc9a9..6f867f7ebab 100644 --- a/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java +++ b/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java @@ -66,6 +66,8 @@ public class SoftSynthesizer implements AudioSynthesizer, 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 weak_stream_link; private AudioFloatConverter converter; private float[] silentbuffer = null; @@ -101,6 +103,8 @@ public class SoftSynthesizer implements AudioSynthesizer, 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 @@ public class SoftSynthesizer implements AudioSynthesizer, weak_stream_link = new WeakReference(stream); converter = AudioFloatConverter.getConverter(stream.getFormat()); samplesize = stream.getFormat().getFrameSize() / stream.getFormat().getChannels(); + framesize = stream.getFormat().getFrameSize(); } public AudioInputStream getAudioInputStream() diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java b/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java index cec2e3047ac..13f9d366947 100644 --- a/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java +++ b/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java @@ -43,6 +43,7 @@ public class SoftVoice extends VoiceStatus { 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 @@ public class SoftVoice extends VoiceStatus { 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 @@ public class SoftVoice extends VoiceStatus { noteOn_noteNumber = noteNumber; noteOn_velocity = velocity; + this.delay = delay; lastMuteValue = 0; lastSoloMuteValue = 0; @@ -562,7 +564,7 @@ public class SoftVoice extends VoiceStatus { 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 @@ public class SoftVoice extends VoiceStatus { } 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 @@ public class SoftVoice extends VoiceStatus { 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 @@ public class SoftVoice extends VoiceStatus { 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); } diff --git a/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java b/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java index e0d2bb4bb4f..4290dc77297 100644 --- a/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java +++ b/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java @@ -313,11 +313,14 @@ perty. } /** - * Gets the Class object of the indexed properties' type. - * The returned Class may describe a primitive type such as int. + * 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 Class for the indexed properties' type; may return null - * 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(); diff --git a/jdk/src/share/classes/java/beans/Introspector.java b/jdk/src/share/classes/java/beans/Introspector.java index 3d56599576d..9001d3516cc 100644 --- a/jdk/src/share/classes/java/beans/Introspector.java +++ b/jdk/src/share/classes/java/beans/Introspector.java @@ -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 @@ import sun.reflect.misc.ReflectUtil; * 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). - * *

- * 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 ClassLoader - * that has been used to introspect classes, - * you should use the - * {@link #flushCaches Introspector.flushCaches} - * or - * {@link #flushFromCaches Introspector.flushFromCaches} method - * to flush all of the introspected classes out of the cache. - * - *

* For more information about introspection and design patterns, please * consult the * JavaBeans specification. @@ -112,8 +92,8 @@ public class Introspector { 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, Method[]> declaredMethodCache = + new WeakCache, Method[]>(); private static final Object BEANINFO_CACHE = new Object(); @@ -174,20 +154,21 @@ public class Introspector { if (!ReflectUtil.isPackageAccessible(beanClass)) { return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); } - Map, BeanInfo> map; synchronized (BEANINFO_CACHE) { - map = (Map, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE); - if (map == null) { - map = Collections.synchronizedMap(new WeakHashMap, BeanInfo>()); - AppContext.getAppContext().put(BEANINFO_CACHE, map); + WeakCache, BeanInfo> beanInfoCache = + (WeakCache, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE); + + if (beanInfoCache == null) { + beanInfoCache = new WeakCache, 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 class Introspector { */ 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 @@ public class Introspector { 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 @@ public class Introspector { /* * 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; } //====================================================================== diff --git a/jdk/src/share/classes/java/beans/PropertyDescriptor.java b/jdk/src/share/classes/java/beans/PropertyDescriptor.java index 70a539c81fd..8158922497e 100644 --- a/jdk/src/share/classes/java/beans/PropertyDescriptor.java +++ b/jdk/src/share/classes/java/beans/PropertyDescriptor.java @@ -164,14 +164,16 @@ public class PropertyDescriptor extends FeatureDescriptor { } /** - * 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. - *

- * 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(); diff --git a/jdk/src/share/classes/javax/swing/AbstractListModel.java b/jdk/src/share/classes/javax/swing/AbstractListModel.java index b0c67b7f795..8aa6b24c2a7 100644 --- a/jdk/src/share/classes/javax/swing/AbstractListModel.java +++ b/jdk/src/share/classes/javax/swing/AbstractListModel.java @@ -42,9 +42,11 @@ import java.util.EventListener; * has been added to the java.beans package. * Please see {@link java.beans.XMLEncoder}. * + * @param the type of the elements of this model + * * @author Hans Muller */ -public abstract class AbstractListModel implements ListModel, Serializable +public abstract class AbstractListModel implements ListModel, Serializable { protected EventListenerList listenerList = new EventListenerList(); diff --git a/jdk/src/share/classes/javax/swing/DefaultListCellRenderer.java b/jdk/src/share/classes/javax/swing/DefaultListCellRenderer.java index 2cb42272ae8..e5242520ff0 100644 --- a/jdk/src/share/classes/javax/swing/DefaultListCellRenderer.java +++ b/jdk/src/share/classes/javax/swing/DefaultListCellRenderer.java @@ -71,7 +71,7 @@ import sun.swing.DefaultLookup; * @author Hans Muller */ public class DefaultListCellRenderer extends JLabel - implements ListCellRenderer, Serializable + implements ListCellRenderer, Serializable { /** @@ -111,7 +111,7 @@ public class DefaultListCellRenderer extends JLabel } public Component getListCellRendererComponent( - JList list, + JList list, Object value, int index, boolean isSelected, diff --git a/jdk/src/share/classes/javax/swing/DefaultListModel.java b/jdk/src/share/classes/javax/swing/DefaultListModel.java index 01a9f206604..af460a8918d 100644 --- a/jdk/src/share/classes/javax/swing/DefaultListModel.java +++ b/jdk/src/share/classes/javax/swing/DefaultListModel.java @@ -48,11 +48,13 @@ import javax.swing.event.*; * has been added to the java.beans package. * Please see {@link java.beans.XMLEncoder}. * + * @param the type of the elements of this model + * * @author Hans Muller */ -public class DefaultListModel extends AbstractListModel +public class DefaultListModel extends AbstractListModel { - private Vector delegate = new Vector(); + private Vector delegate = new Vector(); /** * Returns the number of components in this list. @@ -83,7 +85,7 @@ public class DefaultListModel extends AbstractListModel * list * @see #get(int) */ - public Object getElementAt(int index) { + public E getElementAt(int index) { return delegate.elementAt(index); } @@ -175,7 +177,7 @@ public class DefaultListModel extends AbstractListModel * @return an enumeration of the components of this list * @see Vector#elements() */ - public Enumeration elements() { + public Enumeration elements() { return delegate.elements(); } @@ -260,7 +262,7 @@ public class DefaultListModel extends AbstractListModel * @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 @@ public class DefaultListModel extends AbstractListModel * @return the first component of this list * @see Vector#firstElement() */ - public Object firstElement() { + public E firstElement() { return delegate.firstElement(); } @@ -283,13 +285,13 @@ public class DefaultListModel extends AbstractListModel * @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 index 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. *

* Throws an ArrayIndexOutOfBoundsException if the index @@ -300,13 +302,13 @@ public class DefaultListModel extends AbstractListModel * List interface defined in the 1.2 Collections framework. * * - * @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 @@ public class DefaultListModel extends AbstractListModel } /** - * 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 index. *

* Throws an ArrayIndexOutOfBoundsException if the index @@ -342,26 +344,26 @@ public class DefaultListModel extends AbstractListModel * List interface defined in the 1.2 Collections framework. * * - * @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 @@ public class DefaultListModel extends AbstractListModel * * @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 @@ public class DefaultListModel extends AbstractListModel * @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 @@ public class DefaultListModel extends AbstractListModel * @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 @@ public class DefaultListModel extends AbstractListModel * (index < 0 || index >= size()). * * @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; diff --git a/jdk/src/share/classes/javax/swing/JList.java b/jdk/src/share/classes/javax/swing/JList.java index 6c06c5ea682..8a86bda547d 100644 --- a/jdk/src/share/classes/javax/swing/JList.java +++ b/jdk/src/share/classes/javax/swing/JList.java @@ -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 @@ import static sun.swing.SwingUtilities2.Section.*; * constructor that automatically builds a read-only {@code ListModel} instance * for you: *

+ * {@code
  * // Create a JList that displays strings from an array
  *
  * String[] data = {"one", "two", "three", "four"};
- * JList myList = new JList(data);
+ * JList myList = new JList(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> superClasses = new Vector>();
+ * Class rootClass = javax.swing.JList.class;
+ * for(Class cls = rootClass; cls != null; cls = cls.getSuperclass()) {
  *     superClasses.addElement(cls);
  * }
- * JList myList = new JList(superClasses);
+ * JList> myList = new JList>(superClasses);
  *
  * // The automatically created model is stored in JList's "model"
  * // property, which you can retrieve
  *
- * ListModel model = myList.getModel();
+ * ListModel> model = myList.getModel();
  * for(int i = 0; i < model.getSize(); i++) {
  *     System.out.println(model.getElementAt(i));
  * }
+ * }
  * 
*

* A {@code ListModel} can be supplied directly to a {@code JList} by way of a @@ -103,12 +118,14 @@ import static sun.swing.SwingUtilities2.Section.*; * notifying listeners. For example, a read-only implementation of * {@code AbstractListModel}: *

+ * {@code
  * // This list model has about 2^16 elements.  Enjoy scrolling.
  *
- * ListModel bigData = new AbstractListModel() {
+ * ListModel bigData = new AbstractListModel() {
  *     public int getSize() { return Short.MAX_VALUE; }
- *     public Object getElementAt(int index) { return "Index " + index; }
+ *     public String getElementAt(int index) { return "Index " + index; }
  * };
+ * }
  * 
*

* The selection state of a {@code JList} is managed by another separate @@ -150,9 +167,10 @@ import static sun.swing.SwingUtilities2.Section.*; * component to render, is installed by the lists's {@code ListUI}. You can * substitute your own renderer using code like this: *

+ * {@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 {
  *     final static ImageIcon longIcon = new ImageIcon("long.gif");
  *     final static ImageIcon shortIcon = new ImageIcon("short.gif");
  *
@@ -160,7 +178,7 @@ import static sun.swing.SwingUtilities2.Section.*;
  *     // 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 @@ import static sun.swing.SwingUtilities2.Section.*;
  * }
  *
  * myList.setCellRenderer(new MyCellRenderer());
+ * }
  * 
  * 

* Another job for the cell renderer is in helping to determine sizing @@ -195,7 +214,8 @@ import static sun.swing.SwingUtilities2.Section.*; * automatically based on a single prototype value: * *

- * JList bigDataList = new JList(bigData);
+ * {@code
+ * JList bigDataList = new JList(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 @@ import static sun.swing.SwingUtilities2.Section.*;
  * // properties.
  *
  * bigDataList.setPrototypeCellValue("Index 1234567890");
+ * }
  * 
*

* {@code JList} doesn't implement scrolling directly. To create a list that @@ -260,13 +281,15 @@ import static sun.swing.SwingUtilities2.Section.*; * @see ListCellRenderer * @see DefaultListCellRenderer * + * @param 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 extends JComponent implements Scrollable, Accessible { /** * @see #getUIClassID @@ -301,15 +324,15 @@ public class JList extends JComponent implements Scrollable, Accessible 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 dataModel; + private ListCellRenderer cellRenderer; private ListSelectionListener selectionListener; /** @@ -402,7 +425,7 @@ public class JList extends JComponent implements Scrollable, Accessible * @param dataModel the model for the list * @exception IllegalArgumentException if the model is {@code null} */ - public JList(ListModel dataModel) + public JList(ListModel dataModel) { if (dataModel == null) { throw new IllegalArgumentException("dataModel must be non null"); @@ -437,12 +460,12 @@ public class JList extends JComponent implements Scrollable, Accessible * @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() { 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 @@ public class JList extends JComponent implements Scrollable, Accessible * @param listData the Vector to be loaded into the * data model, {@code non-null} */ - public JList(final Vector listData) { + public JList(final Vector listData) { this ( - new AbstractListModel() { + new AbstractListModel() { 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 class JList extends JComponent implements Scrollable, Accessible */ public JList() { this ( - new AbstractListModel() { + new AbstractListModel() { 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 class JList extends JComponent implements Scrollable, Accessible public void updateUI() { setUI((ListUI)UIManager.getUI(this)); - ListCellRenderer renderer = getCellRenderer(); + ListCellRenderer renderer = getCellRenderer(); if (renderer instanceof Component) { SwingUtilities.updateComponentTreeUI((Component)renderer); } @@ -560,8 +583,8 @@ public class JList extends JComponent implements Scrollable, Accessible */ private void updateFixedCellSize() { - ListCellRenderer cr = getCellRenderer(); - Object value = getPrototypeCellValue(); + ListCellRenderer cr = getCellRenderer(); + E value = getPrototypeCellValue(); if ((cr != null) && (value != null)) { Component c = cr.getListCellRendererComponent(this, value, 0, false, false); @@ -592,7 +615,7 @@ public class JList extends JComponent implements Scrollable, Accessible * @return the value of the {@code prototypeCellValue} property * @see #setPrototypeCellValue */ - public Object getPrototypeCellValue() { + public E getPrototypeCellValue() { return prototypeCellValue; } @@ -632,8 +655,8 @@ public class JList extends JComponent implements Scrollable, Accessible * 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 @@ public class JList extends JComponent implements Scrollable, Accessible * @see #setCellRenderer */ @Transient - public ListCellRenderer getCellRenderer() { + public ListCellRenderer getCellRenderer() { return cellRenderer; } @@ -755,8 +778,8 @@ public class JList extends JComponent implements Scrollable, Accessible * attribute: visualUpdate true * description: The component used to draw the cells. */ - public void setCellRenderer(ListCellRenderer cellRenderer) { - ListCellRenderer oldValue = this.cellRenderer; + public void setCellRenderer(ListCellRenderer cellRenderer) { + ListCellRenderer oldValue = this.cellRenderer; this.cellRenderer = cellRenderer; /* If the cellRenderer has changed and prototypeCellValue @@ -1455,7 +1478,7 @@ public class JList extends JComponent implements Scrollable, Accessible * @since 1.4 */ public int getNextMatch(String prefix, int startIndex, Position.Bias bias) { - ListModel model = getModel(); + ListModel model = getModel(); int max = model.getSize(); if (prefix == null) { throw new IllegalArgumentException(); @@ -1469,16 +1492,16 @@ public class JList extends JComponent implements Scrollable, Accessible int increment = (bias == Position.Bias.Forward) ? 1 : -1; int index = startIndex; do { - Object o = model.getElementAt(index); + E element = model.getElementAt(index); - if (o != null) { + 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 @@ public class JList extends JComponent implements Scrollable, Accessible if(event != null) { Point p = event.getPoint(); int index = locationToIndex(p); - ListCellRenderer r = getCellRenderer(); + ListCellRenderer r = getCellRenderer(); Rectangle cellBounds; if (index != -1 && r != null && (cellBounds = @@ -1634,7 +1657,7 @@ public class JList extends JComponent implements Scrollable, Accessible * list of items * @see #setModel */ - public ListModel getModel() { + public ListModel getModel() { return dataModel; } @@ -1656,11 +1679,11 @@ public class JList extends JComponent implements Scrollable, Accessible * 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 model) { if (model == null) { throw new IllegalArgumentException("model must be non null"); } - ListModel oldValue = dataModel; + ListModel oldValue = dataModel; dataModel = model; firePropertyChange("model", oldValue, dataModel); clearSelection(); @@ -1668,7 +1691,7 @@ public class JList extends JComponent implements Scrollable, Accessible /** - * Constructs a read-only ListModel from an array of objects, + * Constructs a read-only ListModel from an array of items, * and calls {@code setModel} with this model. *

* Attempts to pass a {@code null} value to this method results in @@ -1676,15 +1699,15 @@ public class JList extends JComponent implements Scrollable, Accessible * 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() { 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 @@ public class JList extends JComponent implements Scrollable, Accessible * display in the list * @see #setModel */ - public void setListData(final Vector listData) { + public void setListData(final Vector listData) { setModel ( - new AbstractListModel() { + new AbstractListModel() { 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 @@ public class JList extends JComponent implements Scrollable, Accessible * @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 dm = getModel(); int iMin = sm.getMinSelectionIndex(); int iMax = sm.getMaxSelectionIndex(); @@ -2259,6 +2285,37 @@ public class JList extends JComponent implements Scrollable, Accessible 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 getSelectedValuesList() { + ListSelectionModel sm = getSelectionModel(); + ListModel dm = getModel(); + + int iMin = sm.getMinSelectionIndex(); + int iMax = sm.getMaxSelectionIndex(); + + if ((iMin < 0) || (iMax < 0)) { + return Collections.emptyList(); + } + + List selectedItems = new ArrayList(); + for(int i = iMin; i <= iMax; i++) { + if (sm.isSelectedIndex(i)) { + selectedItems.add(dm.getElementAt(i)); + } + } + return selectedItems; + } + /** * Returns the smallest selected cell index; the selection when only @@ -2291,7 +2348,7 @@ public class JList extends JComponent implements Scrollable, Accessible * @see #getModel * @see #addListSelectionListener */ - public Object getSelectedValue() { + public E getSelectedValue() { int i = getMinSelectionIndex(); return (i == -1) ? null : getModel().getElementAt(i); } @@ -2309,7 +2366,7 @@ public class JList extends JComponent implements Scrollable, Accessible setSelectedIndex(-1); else if(!anObject.equals(getSelectedValue())) { int i,c; - ListModel dm = getModel(); + ListModel dm = getModel(); for(i=0,c=dm.getSize();i parent = null; private int indexInParent; private Component component = null; private AccessibleContext accessibleContext = null; - private ListModel listModel; - private ListCellRenderer cellRenderer = null; + private ListModel listModel; + private ListCellRenderer cellRenderer = null; - public AccessibleJListChild(JList parent, int indexInParent) { + public AccessibleJListChild(JList parent, int indexInParent) { this.parent = parent; this.setAccessibleParent(parent); this.indexInParent = indexInParent; @@ -3175,7 +3232,7 @@ public class JList extends JComponent implements Scrollable, Accessible 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()); diff --git a/jdk/src/share/classes/javax/swing/JTable.java b/jdk/src/share/classes/javax/swing/JTable.java index 5489c380f1a..16ffec41a54 100644 --- a/jdk/src/share/classes/javax/swing/JTable.java +++ b/jdk/src/share/classes/javax/swing/JTable.java @@ -1337,7 +1337,11 @@ public class JTable extends JComponent implements TableModelListener, Scrollable return (TableCellRenderer)renderer; } else { - return getDefaultRenderer(columnClass.getSuperclass()); + Class c = columnClass.getSuperclass(); + if (c == null && columnClass != Object.class) { + c = Object.class; + } + return getDefaultRenderer(c); } } } diff --git a/jdk/src/share/classes/javax/swing/ListCellRenderer.java b/jdk/src/share/classes/javax/swing/ListCellRenderer.java index 6abd53fe7c8..de195b08b68 100644 --- a/jdk/src/share/classes/javax/swing/ListCellRenderer.java +++ b/jdk/src/share/classes/javax/swing/ListCellRenderer.java @@ -33,12 +33,13 @@ import java.awt.Component; * the cells in a JList. For example, to use a JLabel as a * ListCellRenderer, you would write something like this: *

- * class MyCellRenderer extends JLabel implements ListCellRenderer {
+ * {@code
+ * class MyCellRenderer extends JLabel implements ListCellRenderer {
  *     public MyCellRenderer() {
  *         setOpaque(true);
  *     }
  *
- *     public Component getListCellRendererComponent(JList list,
+ *     public Component getListCellRendererComponent(JList list,
  *                                                   Object value,
  *                                                   int index,
  *                                                   boolean isSelected,
@@ -75,14 +76,17 @@ import java.awt.Component;
  *         return this;
  *     }
  * }
+ * }
  * 
  *
+ * @param  the type of values this renderer can be used for
+ *
  * @see JList
  * @see DefaultListCellRenderer
  *
  * @author Hans Muller
  */
-public interface ListCellRenderer
+public interface ListCellRenderer
 {
     /**
      * Return a component that has been configured to display the specified
@@ -104,8 +108,8 @@ public interface ListCellRenderer
      * @see ListModel
      */
     Component getListCellRendererComponent(
-        JList list,
-        Object value,
+        JList list,
+        E value,
         int index,
         boolean isSelected,
         boolean cellHasFocus);
diff --git a/jdk/src/share/classes/javax/swing/ListModel.java b/jdk/src/share/classes/javax/swing/ListModel.java
index e5bb5d03cbf..1d064734917 100644
--- a/jdk/src/share/classes/javax/swing/ListModel.java
+++ b/jdk/src/share/classes/javax/swing/ListModel.java
@@ -35,10 +35,12 @@ import javax.swing.event.ListDataListener;
  * length of the data model must be reported to all of the
  * ListDataListeners.
  *
+ * @param  the type of the elements of this model
+ *
  * @author Hans Muller
  * @see JList
  */
-public interface ListModel
+public interface ListModel
 {
   /**
    * Returns the length of the list.
@@ -51,7 +53,7 @@ public interface ListModel
    * @param index the requested index
    * @return the value at index
    */
-  Object getElementAt(int index);
+  E getElementAt(int index);
 
   /**
    * Adds a listener to the list that's notified each time a change
diff --git a/jdk/src/share/classes/javax/swing/plaf/ComponentUI.java b/jdk/src/share/classes/javax/swing/plaf/ComponentUI.java
index 6bcf7e6966c..087e9760177 100644
--- a/jdk/src/share/classes/javax/swing/plaf/ComponentUI.java
+++ b/jdk/src/share/classes/javax/swing/plaf/ComponentUI.java
@@ -60,13 +60,13 @@ public abstract class ComponentUI {
     }
 
     /**
-     * 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 ComponentUI 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:
      * 
    - *
  1. Install any default property values for color, fonts, borders, + *
  2. Install default property values for color, fonts, borders, * icons, opacity, etc. on the component. Whenever possible, * property values initialized by the client program should not * be overridden. @@ -116,7 +116,7 @@ public abstract class ComponentUI { } /** - * 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 ComponentUI.update method when * the specified component is being painted. Subclasses should override * this method and use the specified Graphics object to @@ -134,15 +134,15 @@ public abstract class ComponentUI { } /** - * 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 JComponent * when the specified component is being painted. - * By default this method will fill the specified component with - * its background color (if its opaque property is - * true) and then immediately call paint. - * In general this method need not be overridden by subclasses; - * all look-and-feel rendering code should reside in the paint - * method. + * + *

    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 Graphics context in which to paint * @param c the component being painted; diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxEditor.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxEditor.java index ded1d6a017d..22949be0580 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxEditor.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxEditor.java @@ -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 @@ public class BasicComboBoxEditor implements ComboBoxEditor,FocusListener { * @param anObject the displayed value of the editor */ public void setItem(Object anObject) { - if ( anObject != null ) { - editor.setText(anObject.toString()); + String text; + if ( anObject != null ) { + text = anObject.toString(); oldValue = anObject; } else { - editor.setText(""); + text = ""; + } + // workaround for 4530952 + if (! text.equals(editor.getText())) { + editor.setText(text); } } diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java index 3b2fa972e64..06de6fe44ea 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java @@ -30,7 +30,6 @@ import java.awt.event.*; 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 @@ public class BasicComboBoxUI extends ComboBoxUI { /** * 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 @@ public class BasicComboBoxUI extends ComboBoxUI { } /** - * 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 @@ public class BasicComboBoxUI extends ComboBoxUI { } /** - * 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 @@ public class BasicComboBoxUI extends ComboBoxUI { } /** - * 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 installListeners */ @@ -839,7 +839,7 @@ public class BasicComboBoxUI extends ComboBoxUI { } /** - * 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 @@ public class BasicComboBoxUI extends ComboBoxUI { } /** - * 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(); diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java index 2e663fb8449..c7a6bc33ce1 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java @@ -141,11 +141,10 @@ public class BasicLabelUI extends LabelUI implements PropertyChangeListener } /** - * 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 diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java index 1d3ee7b3509..f28ff0445a8 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java @@ -685,7 +685,7 @@ public class BasicListUI extends ListUI /** - * 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 @@ public class BasicListUI extends ListUI /** - * 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 @@ public class BasicListUI extends ListUI /** - * 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 @@ public class BasicListUI extends ListUI /** - * 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 diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java index 61c70c9bb0b..899c88bd428 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java @@ -32,7 +32,6 @@ import java.beans.PropertyChangeListener; import javax.swing.*; import javax.swing.event.*; -import javax.swing.border.*; import javax.swing.plaf.*; import javax.swing.text.View; @@ -54,7 +53,12 @@ public class BasicMenuItemUI extends MenuItemUI 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; diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java index b22a58795e6..2b006568f73 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java @@ -93,10 +93,13 @@ public class BasicScrollBarUI * 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 @@ public class BasicScrollBarUI * 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 @@ public class BasicScrollBarUI /** - * 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. *

    @@ -601,7 +604,7 @@ public class BasicScrollBarUI } /** - * 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 getMinimumThumbSize * return the same value. *

    diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java index 02bb547d318..8189567a855 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java @@ -1409,9 +1409,10 @@ public class BasicSliderUI extends SliderUI{ } /** - * 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 @@ public class BasicSliderUI extends SliderUI{ } /** - * 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; diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java index 3a522317741..201c9e9313d 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java @@ -268,7 +268,7 @@ public class BasicSpinnerUI extends SpinnerUI } /** - * Create a LayoutManager that manages the editor, + * Creates a LayoutManager that manages the editor, * nextButton, and previousButton * children of the JSpinner. These three children must be * added with a constraint that identifies their role: @@ -286,7 +286,7 @@ public class BasicSpinnerUI extends SpinnerUI /** - * Create a PropertyChangeListener that can be + * Creates a PropertyChangeListener that can be * added to the JSpinner itself. Typically, this listener * will call replaceEditor when the "editor" property changes, * since it's the SpinnerUI's responsibility to @@ -302,16 +302,13 @@ public class BasicSpinnerUI extends SpinnerUI /** - * Create a component that will replace the spinner models value - * with the object returned by spinner.getPreviousValue. - * By default the previousButton is a JButton. This - * method invokes installPreviousButtonListeners to - * install the necessary listeners to update the JSpinner'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 spinner.getPreviousValue. + * By default the previousButton 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 @@ public class BasicSpinnerUI extends SpinnerUI /** - * Create a component that will replace the spinner models value - * with the object returned by spinner.getNextValue. - * By default the nextButton is a JButton - * who's ActionListener updates it's JSpinner - * 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 spinner.getNextValue. + * By default the nextButton 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 diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java index 0be46948712..9d15ba91850 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java @@ -829,7 +829,7 @@ public class BasicSplitPaneUI extends SplitPaneUI /** * 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 @@ public class BasicSplitPaneUI extends SplitPaneUI /** - * 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 @@ public class BasicSplitPaneUI extends SplitPaneUI /** - * Messaged to paint the look and feel. + * @inheritDoc */ public void paint(Graphics g, JComponent jc) { if (!painted && splitPane.getDividerLocation()<0) { diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java index de4700faf06..a29a7fb1314 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java @@ -306,7 +306,7 @@ public class BasicTableHeaderUI extends TableHeaderUI { } /** - * 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 @@ public class BasicTableHeaderUI extends TableHeaderUI { } /** - * 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 @@ public class BasicTableHeaderUI extends TableHeaderUI { } 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; diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java index cef9166355f..0a035fc4636 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java @@ -37,6 +37,7 @@ import javax.swing.text.*; 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 @@ public abstract class BasicTextUI extends TextUI implements ViewFactory { // 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 @@ public abstract class BasicTextUI extends TextUI implements ViewFactory { 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 @@ public abstract class BasicTextUI extends TextUI implements ViewFactory { } /** - * 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 @@ public abstract class BasicTextUI extends TextUI implements ViewFactory { * things. *

      *
    1. - * 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. *
    2. - * Install the default caret and highlighter into the + * Installs the default caret and highlighter into the * associated component. *
    3. - * 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. *
    4. - * create the view factory and the view hierarchy used + * Creates the view factory and the view hierarchy used * to represent the model. *
    * @@ -784,7 +784,7 @@ public abstract class BasicTextUI extends TextUI implements ViewFactory { // 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 @@ public abstract class BasicTextUI extends TextUI implements ViewFactory { * To prevent this from happening twice, this method is * reimplemented to simply paint. *

    - * NOTE: Superclass is also not thread-safe in - * it's rendering of the background, although that's not - * an issue with the default rendering. + * NOTE: 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); diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java index 0eafa7e3b6b..dd29df81b68 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java @@ -669,7 +669,7 @@ public class BasicToolBarUI extends ToolBarUI implements SwingConstants /** * Sets the border of the component to have a rollover border which - * was created by createRolloverBorder. + * was created by the {@link #createRolloverBorder} method. * * @param c component which will have a rollover border installed * @see #createRolloverBorder @@ -709,7 +709,7 @@ public class BasicToolBarUI extends ToolBarUI implements SwingConstants /** * Sets the border of the component to have a non-rollover border which - * was created by createNonRolloverBorder. + * was created by the {@link #createNonRolloverBorder} method. * * @param c component which will have a non-rollover border installed * @see #createNonRolloverBorder diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java index 22fa61f00dc..0679db798f7 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java @@ -30,16 +30,12 @@ import javax.swing.event.*; 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 @@ public class BasicTreeUI extends TreeUI 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 @@ public class BasicTreeUI extends TreeUI } } - 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 @@ public class BasicTreeUI extends TreeUI treeState.setExpandedState(path, true); } } - updateLeadRow(); + updateLeadSelectionRow(); updateSize(); } } @@ -2425,11 +2443,21 @@ public class BasicTreeUI extends TreeUI 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 @@ public class BasicTreeUI extends TreeUI if (changeName == JTree.LEAD_SELECTION_PATH_PROPERTY) { if (!ignoreLAChange) { - updateLeadRow(); + updateLeadSelectionRow(); repaintPath((TreePath)event.getOldValue()); repaintPath((TreePath)event.getNewValue()); } @@ -3763,7 +3791,7 @@ public class BasicTreeUI extends TreeUI completeEditing(); if(path != null && tree.isVisible(path)) { treeState.setExpandedState(path, false); - updateLeadRow(); + updateLeadSelectionRow(); updateSize(); } } @@ -3823,7 +3851,7 @@ public class BasicTreeUI extends TreeUI if(treeState != null && e != null) { treeState.treeNodesInserted(e); - updateLeadRow(); + updateLeadSelectionRow(); TreePath path = e.getTreePath(); @@ -3848,7 +3876,7 @@ public class BasicTreeUI extends TreeUI if(treeState != null && e != null) { treeState.treeNodesRemoved(e); - updateLeadRow(); + updateLeadSelectionRow(); TreePath path = e.getTreePath(); @@ -3862,7 +3890,7 @@ public class BasicTreeUI extends TreeUI if(treeState != null && e != null) { treeState.treeStructureChanged(e); - updateLeadRow(); + updateLeadSelectionRow(); TreePath pPath = e.getTreePath(); diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java b/jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java index 5acae97eded..f0e925876e2 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java @@ -34,7 +34,7 @@ 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 + * so that pluggable L&Fs can distinguish it from user-installed * layout managers on menus. * * @author Georges Saab diff --git a/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java b/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java index 3f100bc811b..4062678fb67 100644 --- a/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java +++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java @@ -257,12 +257,40 @@ public class NimbusLookAndFeel extends SynthLookAndFeel { /** * @inheritDoc - * @return true + * @return {@code true} */ @Override public boolean shouldUpdateStyleOnAncestorChanged() { return true; } + /** + * @inheritDoc + * + *

    Overridden to return {@code true} when one of the following + * properties change: + *

      + *
    • {@code "Nimbus.Overrides"} + *
    • {@code "Nimbus.Overrides.InheritDefaults"} + *
    • {@code "JComponent.sizeVariant"} + *
    + * + * @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); + } + /** *

    Registers a third party component with the NimbusLookAndFeel.

    * diff --git a/jdk/src/share/classes/javax/swing/plaf/nimbus/package.html b/jdk/src/share/classes/javax/swing/plaf/nimbus/package.html index 4453cc163fe..bac256c2667 100644 --- a/jdk/src/share/classes/javax/swing/plaf/nimbus/package.html +++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/package.html @@ -88,12 +88,11 @@ encouraged.

    Note: Most of the Swing API is not thread safe. For details, see -Threads and Swing, +Concurrency in Swing, a section in The Java Tutorial. + target="_top">The Java Tutorial. @since 1.7 @serial exclude diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthBorder.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthBorder.java index 0d3fc851f05..96b7c23c02c 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthBorder.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthBorder.java @@ -29,7 +29,6 @@ import javax.swing.*; 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 diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java index c395f54eb41..99372a9e28d 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java @@ -25,40 +25,49 @@ package javax.swing.plaf.synth; -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 @@ class SynthButtonUI extends BasicButtonUI implements 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 @@ class SynthButtonUI extends BasicButtonUI implements 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 AbstractButton. */ @@ -164,6 +181,10 @@ class SynthButtonUI extends BasicButtonUI implements 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 @@ class SynthButtonUI extends BasicButtonUI implements // Paint Methods // ******************************** + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -224,6 +249,10 @@ class SynthButtonUI extends BasicButtonUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -231,6 +260,12 @@ class SynthButtonUI extends BasicButtonUI implements 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 @@ class SynthButtonUI extends BasicButtonUI implements } } + /** + * @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 @@ class SynthButtonUI extends BasicButtonUI implements } /** - * 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 @@ class SynthButtonUI extends BasicButtonUI implements /** * 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 @@ class SynthButtonUI extends BasicButtonUI implements // ******************************** // Layout Methods // ******************************** + + /** + * @inheritDoc + */ + @Override public Dimension getMinimumSize(JComponent c) { if (c.getComponentCount() > 0 && c.getLayout() != null) { return null; @@ -406,6 +453,10 @@ class SynthButtonUI extends BasicButtonUI implements return size; } + /** + * @inheritDoc + */ + @Override public Dimension getPreferredSize(JComponent c) { if (c.getComponentCount() > 0 && c.getLayout() != null) { return null; @@ -423,6 +474,10 @@ class SynthButtonUI extends BasicButtonUI implements return size; } + /** + * @inheritDoc + */ + @Override public Dimension getMaximumSize(JComponent c) { if (c.getComponentCount() > 0 && c.getLayout() != null) { return null; @@ -442,7 +497,8 @@ class SynthButtonUI extends BasicButtonUI implements } /** - * 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 @@ class SynthButtonUI extends BasicButtonUI implements return icon; } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((AbstractButton)e.getSource()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java index c440bfcd0b1..6601adfaeb9 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java @@ -27,56 +27,50 @@ package javax.swing.plaf.synth; 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); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java index 15fae42629f..7794fd601f7 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java @@ -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); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java index 8a8dbf63220..0b240d1ff0c 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java @@ -28,34 +28,39 @@ package javax.swing.plaf.synth; 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 @@ class SynthColorChooserUI extends BasicColorChooserUI implements return panels; } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { super.installDefaults(); updateStyle(chooser); @@ -79,6 +88,10 @@ class SynthColorChooserUI extends BasicColorChooserUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(chooser, ENABLED); @@ -88,16 +101,28 @@ class SynthColorChooserUI extends BasicColorChooserUI implements 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 @@ class SynthColorChooserUI extends BasicColorChooserUI implements 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 @@ class SynthColorChooserUI extends BasicColorChooserUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -132,14 +161,29 @@ class SynthColorChooserUI extends BasicColorChooserUI implements 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()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java index 7687a0d7bcb..0acd15594e9 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java @@ -27,21 +27,21 @@ package javax.swing.plaf.synth; 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 @@ class SynthComboBoxUI extends BasicComboBoxUI implements 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 @@ class SynthComboBoxUI extends BasicComboBoxUI implements @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 @@ class SynthComboBoxUI extends BasicComboBoxUI implements 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 @@ class SynthComboBoxUI extends BasicComboBoxUI implements "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 @@ class SynthComboBoxUI extends BasicComboBoxUI implements } } + /** + * @inheritDoc + */ @Override protected void installListeners() { comboBox.addPropertyChangeListener(this); @@ -172,6 +162,9 @@ class SynthComboBoxUI extends BasicComboBoxUI implements super.installListeners(); } + /** + * @inheritDoc + */ @Override public void uninstallUI(JComponent c) { if (popup instanceof SynthComboPopup) { @@ -181,6 +174,9 @@ class SynthComboBoxUI extends BasicComboBoxUI implements buttonHandler = null; } + /** + * @inheritDoc + */ @Override protected void uninstallDefaults() { SynthContext context = getContext(comboBox, ENABLED); @@ -190,6 +186,9 @@ class SynthComboBoxUI extends BasicComboBoxUI implements style = null; } + /** + * @inheritDoc + */ @Override protected void uninstallListeners() { editorFocusHandler.unregister(); @@ -200,6 +199,9 @@ class SynthComboBoxUI extends BasicComboBoxUI implements super.uninstallListeners(); } + /** + * @inheritDoc + */ @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); @@ -210,10 +212,6 @@ class SynthComboBoxUI extends BasicComboBoxUI implements 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 @@ class SynthComboBoxUI extends BasicComboBoxUI implements } } + /** + * @inheritDoc + */ @Override protected ComboPopup createPopup() { SynthComboPopup p = new SynthComboPopup(comboBox); @@ -259,11 +260,17 @@ class SynthComboBoxUI extends BasicComboBoxUI implements return p; } + /** + * @inheritDoc + */ @Override protected ListCellRenderer createRenderer() { return new SynthComboBoxRenderer(); } + /** + * @inheritDoc + */ @Override protected ComboBoxEditor createEditor() { return new SynthComboBoxEditor(); @@ -273,6 +280,9 @@ class SynthComboBoxUI extends BasicComboBoxUI implements // end UI Initialization //====================== + /** + * @inheritDoc + */ @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { @@ -280,6 +290,9 @@ class SynthComboBoxUI extends BasicComboBoxUI implements } } + /** + * @inheritDoc + */ @Override protected JButton createArrowButton() { SynthArrowButton button = new SynthArrowButton(SwingConstants.SOUTH); @@ -291,6 +304,9 @@ class SynthComboBoxUI extends BasicComboBoxUI implements //================================= // begin ComponentUI Implementation + /** + * @inheritDoc + */ @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -302,6 +318,9 @@ class SynthComboBoxUI extends BasicComboBoxUI implements context.dispose(); } + /** + * @inheritDoc + */ @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -310,6 +329,12 @@ class SynthComboBoxUI extends BasicComboBoxUI implements 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 @@ class SynthComboBoxUI extends BasicComboBoxUI implements } } + /** + * @inheritDoc + */ @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { @@ -375,7 +403,7 @@ class SynthComboBoxUI extends BasicComboBoxUI implements } /** - * 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 @@ -393,23 +421,6 @@ class SynthComboBoxUI extends BasicComboBoxUI implements return new Dimension(d.width, d.height); } - /** - * 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. * @@ -478,85 +489,17 @@ class SynthComboBoxUI extends BasicComboBoxUI implements } - /** - * From BasicCombBoxEditor v 1.24. - */ - private static class SynthComboBoxEditor implements - ComboBoxEditor, UIResource { - protected JTextField editor; - private Object oldValue; + private static class SynthComboBoxEditor + extends BasicComboBoxEditor.UIResource { - 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; - - 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 @@ class SynthComboBoxUI extends BasicComboBoxUI implements //------------------------------------------------------------------ /** - * {@inheritDoc} + * @inheritDoc * * Ensures that isPressed() will return true if the combo is pressed, * or the arrowButton is pressed, or if the combo popup is @@ -634,7 +577,7 @@ class SynthComboBoxUI extends BasicComboBoxUI implements } /** - * {@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 @@ class SynthComboBoxUI extends BasicComboBoxUI implements } /** - * {@inheritDoc} + * @inheritDoc * * Ensures that isRollover() will return true if the combo is * rolled over, or the arrowButton is rolled over. @@ -660,7 +603,7 @@ class SynthComboBoxUI extends BasicComboBoxUI implements } /** - * {@inheritDoc} + * @inheritDoc * * Forwards pressed states to the internal "pressed" field */ @@ -671,7 +614,7 @@ class SynthComboBoxUI extends BasicComboBoxUI implements } /** - * {@inheritDoc} + * @inheritDoc * * Forwards rollover states to the internal "over" field */ diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDefaultLookup.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDefaultLookup.java index 34ad3f0049d..e87f70efcce 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDefaultLookup.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDefaultLookup.java @@ -27,7 +27,6 @@ package javax.swing.plaf.synth; 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. diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java index 333a68ae76a..09c2bb52bcc 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java @@ -28,36 +28,44 @@ package javax.swing.plaf.synth; 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 @@ class SynthDesktopIconUI extends BasicDesktopIconUI implements SynthUI, 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 @@ class SynthDesktopIconUI extends BasicDesktopIconUI implements SynthUI, context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(desktopIcon, ENABLED); style.uninstallDefaults(context); @@ -108,12 +133,16 @@ class SynthDesktopIconUI extends BasicDesktopIconUI implements SynthUI, 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 @@ class SynthDesktopIconUI extends BasicDesktopIconUI implements SynthUI, 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 @@ class SynthDesktopIconUI extends BasicDesktopIconUI implements SynthUI, context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -143,33 +176,24 @@ class SynthDesktopIconUI extends BasicDesktopIconUI implements SynthUI, 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 @@ class SynthDesktopIconUI extends BasicDesktopIconUI implements SynthUI, } } } + + 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) { + } + } + } + } } diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java index b793f2b380f..0f90f57854f 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java @@ -29,34 +29,38 @@ import javax.swing.*; 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 @@ class SynthDesktopPaneUI extends BasicDesktopPaneUI implements } } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { updateStyle(desktop); @@ -114,6 +122,10 @@ class SynthDesktopPaneUI extends BasicDesktopPaneUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { if (taskBar != null) { desktop.removeComponentListener(taskBar); @@ -123,6 +135,10 @@ class SynthDesktopPaneUI extends BasicDesktopPaneUI implements super.uninstallListeners(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(desktop, ENABLED); @@ -147,6 +163,10 @@ class SynthDesktopPaneUI extends BasicDesktopPaneUI implements } } + /** + * @inheritDoc + */ + @Override protected void installDesktopManager() { if (UIManager.getBoolean("InternalFrame.useTaskBar")) { desktopManager = oldDesktopManager = desktop.getDesktopManager(); @@ -159,6 +179,10 @@ class SynthDesktopPaneUI extends BasicDesktopPaneUI implements } } + /** + * @inheritDoc + */ + @Override protected void uninstallDesktopManager() { if (oldDesktopManager != null && !(oldDesktopManager instanceof UIResource)) { desktopManager = desktop.getDesktopManager(); @@ -397,7 +421,10 @@ class SynthDesktopPaneUI extends BasicDesktopPaneUI implements } } - + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -407,14 +434,14 @@ class SynthDesktopPaneUI extends BasicDesktopPaneUI implements 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 @@ class SynthDesktopPaneUI extends BasicDesktopPaneUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -432,14 +463,28 @@ class SynthDesktopPaneUI extends BasicDesktopPaneUI implements 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()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java index e864944fad5..9fdf1c6b265 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java @@ -31,47 +31,52 @@ import javax.swing.text.*; 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 @@ class SynthEditorPaneUI extends BasicEditorPaneUI implements SynthUI { 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 @@ class SynthEditorPaneUI extends BasicEditorPaneUI implements SynthUI { * * @param evt the property change event */ + @Override protected void propertyChange(PropertyChangeEvent evt) { if (SynthLookAndFeel.shouldUpdateStyle(evt)) { updateStyle((JTextComponent)evt.getSource()); @@ -124,6 +130,10 @@ class SynthEditorPaneUI extends BasicEditorPaneUI implements SynthUI { context.dispose(); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -137,6 +147,10 @@ class SynthEditorPaneUI extends BasicEditorPaneUI implements SynthUI { return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -146,10 +160,20 @@ class SynthEditorPaneUI extends BasicEditorPaneUI implements SynthUI { 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 @@ class SynthEditorPaneUI extends BasicEditorPaneUI implements SynthUI { 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); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java index 6d0204d27ad..6ea91e7bf3c 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java @@ -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 - * JFormattedTextField. + * 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 @@ class SynthFormattedTextFieldUI extends SynthTextFieldUI { * * @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, diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameTitlePane.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameTitlePane.java index 51e9d1497d6..d0fe4acb764 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameTitlePane.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameTitlePane.java @@ -30,14 +30,9 @@ import java.awt.event.*; 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; /** diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java index a89fba5e8eb..9ffc3ca36be 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java @@ -27,52 +27,61 @@ package javax.swing.plaf.synth; 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 @@ class SynthInternalFrameUI extends BasicInternalFrameUI implements SynthUI, super.uninstallComponents(); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { frame.removePropertyChangeListener(this); super.uninstallListeners(); @@ -104,6 +117,10 @@ class SynthInternalFrameUI extends BasicInternalFrameUI implements SynthUI, context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(frame, ENABLED); style.uninstallDefaults(context); @@ -115,6 +132,10 @@ class SynthInternalFrameUI extends BasicInternalFrameUI implements SynthUI, } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -124,24 +145,28 @@ class SynthInternalFrameUI extends BasicInternalFrameUI implements SynthUI, 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 @@ class SynthInternalFrameUI extends BasicInternalFrameUI implements SynthUI, } } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -178,6 +207,10 @@ class SynthInternalFrameUI extends BasicInternalFrameUI implements SynthUI, context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -185,15 +218,29 @@ class SynthInternalFrameUI extends BasicInternalFrameUI implements SynthUI, 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(); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java index f46f4d261f1..456d5bf218b 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java @@ -29,38 +29,37 @@ import javax.swing.*; 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 @@ class SynthLabelUI extends BasicLabelUI implements SynthUI { context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults(JLabel c){ SynthContext context = getContext(c, ENABLED); @@ -79,6 +82,10 @@ class SynthLabelUI extends BasicLabelUI implements SynthUI { style = null; } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -88,10 +95,6 @@ class SynthLabelUI extends BasicLabelUI implements SynthUI { 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 @@ class SynthLabelUI extends BasicLabelUI implements SynthUI { 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 @@ class SynthLabelUI extends BasicLabelUI implements SynthUI { * component. This method is invoked by JComponent * when the specified component is being painted. */ + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -163,6 +174,10 @@ class SynthLabelUI extends BasicLabelUI implements SynthUI { context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -170,6 +185,12 @@ class SynthLabelUI extends BasicLabelUI implements SynthUI { 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 @@ class SynthLabelUI extends BasicLabelUI implements SynthUI { 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 @@ class SynthLabelUI extends BasicLabelUI implements SynthUI { return size; } - + /** + * @inheritDoc + */ + @Override public Dimension getMinimumSize(JComponent c) { JLabel label = (JLabel)c; Icon icon = (label.isEnabled()) ? label.getIcon() : @@ -225,6 +257,10 @@ class SynthLabelUI extends BasicLabelUI implements SynthUI { return size; } + /** + * @inheritDoc + */ + @Override public Dimension getMaximumSize(JComponent c) { JLabel label = (JLabel)c; Icon icon = (label.isEnabled()) ? label.getIcon() : @@ -242,7 +278,10 @@ class SynthLabelUI extends BasicLabelUI implements SynthUI { return size; } - + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { super.propertyChange(e); if (SynthLookAndFeel.shouldUpdateStyle(e)) { diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java index 09907613f3f..909ab69b1d9 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java @@ -27,38 +27,39 @@ package javax.swing.plaf.synth; 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 @@ class SynthListUI extends BasicListUI implements PropertyChangeListener, 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 @@ class SynthListUI extends BasicListUI implements PropertyChangeListener, context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { super.uninstallDefaults(); @@ -145,6 +170,10 @@ class SynthListUI extends BasicListUI implements PropertyChangeListener, style = null; } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -154,27 +183,23 @@ class SynthListUI extends BasicListUI implements PropertyChangeListener, 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 @@ class SynthListUI extends BasicListUI implements PropertyChangeListener, return this; } - public void paint(Graphics g) { + @Override public void paint(Graphics g) { super.paint(g); SynthLookAndFeel.resetSelectedUI(); } diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java index 976ec0adc66..1db09641cc9 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java @@ -234,44 +234,9 @@ public class SynthLookAndFeel extends BasicLookAndFeel { * shouldUpdateStyleOnAncestorChanged 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 @@ public class SynthLookAndFeel extends BasicLookAndFeel { * @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 @@ public class SynthLookAndFeel extends BasicLookAndFeel { updateStyles(child); } } + c.repaint(); } /** @@ -788,6 +748,27 @@ public class SynthLookAndFeel extends BasicLookAndFeel { return false; } + /** + * 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 diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java index c7be3f7f445..613d3723181 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java @@ -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 @@ class SynthMenuBarUI extends BasicMenuBarUI implements PropertyChangeListener, context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(menuBar, ENABLED); @@ -90,11 +98,19 @@ class SynthMenuBarUI extends BasicMenuBarUI implements PropertyChangeListener, 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 @@ class SynthMenuBarUI extends BasicMenuBarUI implements PropertyChangeListener, 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 @@ class SynthMenuBarUI extends BasicMenuBarUI implements PropertyChangeListener, context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -129,14 +149,28 @@ class SynthMenuBarUI extends BasicMenuBarUI implements PropertyChangeListener, 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()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java index 3bcc044a12e..668e4878a7e 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java @@ -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 @@ class SynthMenuItemUI extends BasicMenuItemUI implements } } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { updateStyle(menuItem); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); menuItem.addPropertyChangeListener(this); @@ -122,6 +133,10 @@ class SynthMenuItemUI extends BasicMenuItemUI implements accContext.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(menuItem, ENABLED); style.uninstallDefaults(context); @@ -137,11 +152,19 @@ class SynthMenuItemUI extends BasicMenuItemUI implements 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 @@ class SynthMenuItemUI extends BasicMenuItemUI implements 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 @@ class SynthMenuItemUI extends BasicMenuItemUI implements region, accStyle, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { int state; @@ -186,6 +205,10 @@ class SynthMenuItemUI extends BasicMenuItemUI implements return getComponentState(c); } + /** + * @inheritDoc + */ + @Override protected Dimension getPreferredMenuItemSize(JComponent c, Icon checkIcon, Icon arrowIcon, @@ -203,6 +226,10 @@ class SynthMenuItemUI extends BasicMenuItemUI implements } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -212,6 +239,10 @@ class SynthMenuItemUI extends BasicMenuItemUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -219,6 +250,12 @@ class SynthMenuItemUI extends BasicMenuItemUI implements 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 @@ class SynthMenuItemUI extends BasicMenuItemUI implements 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()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/DefaultMenuLayout.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuLayout.java similarity index 69% rename from jdk/src/share/classes/javax/swing/plaf/synth/DefaultMenuLayout.java rename to jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuLayout.java index 1757a2e661a..f821c22f4f8 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/DefaultMenuLayout.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuLayout.java @@ -25,44 +25,29 @@ package javax.swing.plaf.synth; -import javax.swing.*; -import javax.swing.plaf.UIResource; - +import javax.swing.plaf.basic.DefaultMenuLayout; +import javax.swing.JPopupMenu; 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 + * @inheritDoc * * @author Georges Saab */ -class DefaultMenuLayout extends BoxLayout implements UIResource { - public DefaultMenuLayout(Container target, int axis) { +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); - 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); } } diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java index 78835abf141..ccee8b42c1f 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java @@ -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 @@ class SynthMenuUI extends BasicMenuUI implements PropertyChangeListener, accContext.dispose(); } + /** + * @inheritDoc + */ + @Override public void uninstallUI(JComponent c) { super.uninstallUI(c); // Remove values from the parent's Client Properties. @@ -121,6 +133,10 @@ class SynthMenuUI extends BasicMenuUI implements PropertyChangeListener, } } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(menuItem, ENABLED); style.uninstallDefaults(context); @@ -136,22 +152,30 @@ class SynthMenuUI extends BasicMenuUI implements PropertyChangeListener, 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 @@ class SynthMenuUI extends BasicMenuUI implements PropertyChangeListener, region, accStyle, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { int state; @@ -186,6 +206,10 @@ class SynthMenuUI extends BasicMenuUI implements PropertyChangeListener, return getComponentState(c); } + /** + * @inheritDoc + */ + @Override protected Dimension getPreferredMenuItemSize(JComponent c, Icon checkIcon, Icon arrowIcon, @@ -202,7 +226,10 @@ class SynthMenuUI extends BasicMenuUI implements PropertyChangeListener, return value; } - + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -213,6 +240,10 @@ class SynthMenuUI extends BasicMenuUI implements PropertyChangeListener, context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -220,6 +251,12 @@ class SynthMenuUI extends BasicMenuUI implements PropertyChangeListener, 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 @@ class SynthMenuUI extends BasicMenuUI implements PropertyChangeListener, 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()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java index eb0512a95ab..4a7e97b83a9 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java @@ -28,34 +28,45 @@ package javax.swing.plaf.synth; 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 @@ class SynthOptionPaneUI extends BasicOptionPaneUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(optionPane, ENABLED); @@ -88,11 +103,19 @@ class SynthOptionPaneUI extends BasicOptionPaneUI implements style = null; } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { super.uninstallListeners(); optionPane.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void installComponents() { optionPane.add(createMessageArea()); @@ -108,6 +131,10 @@ class SynthOptionPaneUI extends BasicOptionPaneUI implements optionPane.applyComponentOrientation(optionPane.getComponentOrientation()); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -117,14 +144,14 @@ class SynthOptionPaneUI extends BasicOptionPaneUI implements 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 @@ class SynthOptionPaneUI extends BasicOptionPaneUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -142,30 +173,49 @@ class SynthOptionPaneUI extends BasicOptionPaneUI implements 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 - * addIcon. + * 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 @@ class SynthOptionPaneUI extends BasicOptionPaneUI implements return top; } + /** + * @inheritDoc + */ + @Override protected Container createSeparator() { JSeparator separator = new JSeparator(SwingConstants.HORIZONTAL); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java index 1646bdad62d..aee3979cb55 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java @@ -25,7 +25,6 @@ package javax.swing.plaf.synth; import java.awt.*; -import javax.swing.*; /** * SynthPainter is used for painting portions of diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java index 6979b9be048..c1e30e2a376 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java @@ -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 @@ class SynthPanelUI extends BasicPanelUI implements PropertyChangeListener, installListeners(p); } + /** + * @inheritDoc + */ + @Override public void uninstallUI(JComponent c) { JPanel p = (JPanel)c; @@ -62,18 +74,36 @@ class SynthPanelUI extends BasicPanelUI implements PropertyChangeListener, 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 @@ class SynthPanelUI extends BasicPanelUI implements PropertyChangeListener, context.dispose(); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -97,14 +131,14 @@ class SynthPanelUI extends BasicPanelUI implements PropertyChangeListener, 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 @@ class SynthPanelUI extends BasicPanelUI implements PropertyChangeListener, context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -122,15 +160,29 @@ class SynthPanelUI extends BasicPanelUI implements PropertyChangeListener, 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()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java index 52c7a4d7435..a25457df798 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java @@ -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 @@ class SynthPasswordFieldUI extends SynthTextFieldUI { * * @return the name ("PasswordField") */ + @Override protected String getPropertyPrefix() { return "PasswordField"; } @@ -68,20 +67,33 @@ class SynthPasswordFieldUI extends SynthTextFieldUI { * @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()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java index 50d1c2781ac..e09150b4288 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java @@ -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 @@ class SynthPopupMenuUI extends BasicPopupMenuUI implements 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 @@ class SynthPopupMenuUI extends BasicPopupMenuUI implements } } + /** + * @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 @@ class SynthPopupMenuUI extends BasicPopupMenuUI implements 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 @@ class SynthPopupMenuUI extends BasicPopupMenuUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -142,14 +156,28 @@ class SynthPopupMenuUI extends BasicPopupMenuUI implements 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); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java index c6a75375bf7..87cbb4606ad 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java @@ -32,16 +32,17 @@ import javax.swing.plaf.*; 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 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, 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 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, context.dispose(); } + /** + * @inheritDoc + */ @Override protected void uninstallDefaults() { SynthContext context = getContext(progressBar, ENABLED); @@ -110,6 +129,10 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, style = null; } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -119,14 +142,13 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, 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 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, return -1; } + /** + * @inheritDoc + */ @Override protected Rectangle getBox(Rectangle r) { if (tileWhenIndeterminate) { @@ -151,6 +176,9 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, } } + /** + * @inheritDoc + */ @Override protected void setAnimationIndex(int newValue) { if (paintOutsideClip) { @@ -164,6 +192,9 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, } } + /** + * @inheritDoc + */ @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -176,6 +207,9 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, context.dispose(); } + /** + * @inheritDoc + */ @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -184,6 +218,12 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, 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 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, } } - 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 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, } } + /** + * @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 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, } } + /** + * @inheritDoc + */ @Override public Dimension getPreferredSize(JComponent c) { Dimension size = null; @@ -398,5 +455,5 @@ class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, size.height += border.top + border.bottom; return size; - } + } } diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java index fd814acf1a9..8fb7c39da41 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java @@ -27,49 +27,46 @@ package javax.swing.plaf.synth; 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;idefaultButton has changed, this will * reinstall the keyboard actions. */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JRootPane)e.getSource()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java index 6a4b2d7da83..63e423e8dd4 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java @@ -30,41 +30,33 @@ import java.beans.*; 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 @@ class SynthScrollBarUI extends BasicScrollBarUI implements updateStyle(scrollbar); } + /** + * @inheritDoc + */ + @Override protected void configureScrollBarColors() { } @@ -137,16 +133,28 @@ class SynthScrollBarUI extends BasicScrollBarUI implements 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 @@ class SynthScrollBarUI extends BasicScrollBarUI implements 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 @@ class SynthScrollBarUI extends BasicScrollBarUI implements 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 @@ class SynthScrollBarUI extends BasicScrollBarUI implements return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public boolean getSupportsAbsolutePositioning() { SynthContext context = getContext(scrollbar); boolean value = style.getBoolean(context, @@ -214,6 +221,10 @@ class SynthScrollBarUI extends BasicScrollBarUI implements return value; } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -225,6 +236,10 @@ class SynthScrollBarUI extends BasicScrollBarUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -232,6 +247,12 @@ class SynthScrollBarUI extends BasicScrollBarUI implements 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 @@ class SynthScrollBarUI extends BasicScrollBarUI implements 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 @@ class SynthScrollBarUI extends BasicScrollBarUI implements * @see #getMaximumSize * @see #getMinimumSize */ + @Override public Dimension getPreferredSize(JComponent c) { Insets insets = c.getInsets(); return (scrollbar.getOrientation() == JScrollBar.VERTICAL) @@ -295,6 +335,10 @@ class SynthScrollBarUI extends BasicScrollBarUI implements : new Dimension(48, scrollBarWidth + insets.top + insets.bottom); } + /** + * @inheritDoc + */ + @Override protected Dimension getMinimumThumbSize() { if (!validMinimumThumbSize) { if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { @@ -308,6 +352,10 @@ class SynthScrollBarUI extends BasicScrollBarUI implements return minimumThumbSize; } + /** + * @inheritDoc + */ + @Override protected JButton createDecreaseButton(int orientation) { SynthArrowButton synthArrowButton = new SynthArrowButton(orientation) { @Override @@ -333,6 +381,10 @@ class SynthScrollBarUI extends BasicScrollBarUI implements return synthArrowButton; } + /** + * @inheritDoc + */ + @Override protected JButton createIncreaseButton(int orientation) { SynthArrowButton synthArrowButton = new SynthArrowButton(orientation) { @Override @@ -360,6 +412,10 @@ class SynthScrollBarUI extends BasicScrollBarUI implements return synthArrowButton; } + /** + * @inheritDoc + */ + @Override protected void setThumbRollover(boolean active) { if (isThumbRollover() != active) { scrollbar.repaint(getThumbBounds()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java index 1dfdad63cd8..16f0054b70b 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java @@ -40,24 +40,32 @@ import java.awt.event.ContainerEvent; 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 @@ class SynthScrollPaneUI extends BasicScrollPaneUI implements context.dispose(); } + /** + * @inheritDoc + */ @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -77,6 +88,12 @@ class SynthScrollPaneUI extends BasicScrollPaneUI implements 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 @@ class SynthScrollPaneUI extends BasicScrollPaneUI implements } } - + /** + * @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 @@ class SynthScrollPaneUI extends BasicScrollPaneUI implements context.dispose(); } - + /** + * @inheritDoc + */ @Override protected void installListeners(JScrollPane c) { super.installListeners(c); @@ -129,6 +154,9 @@ class SynthScrollPaneUI extends BasicScrollPaneUI implements } } + /** + * @inheritDoc + */ @Override protected void uninstallDefaults(JScrollPane c) { SynthContext context = getContext(c, ENABLED); @@ -141,7 +169,9 @@ class SynthScrollPaneUI extends BasicScrollPaneUI implements } } - + /** + * @inheritDoc + */ @Override protected void uninstallListeners(JComponent c) { super.uninstallListeners(c); @@ -156,7 +186,10 @@ class SynthScrollPaneUI extends BasicScrollPaneUI implements } } - + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -166,12 +199,6 @@ class SynthScrollPaneUI extends BasicScrollPaneUI implements 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){ diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java index 39828f919db..391a63658f0 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java @@ -34,33 +34,51 @@ import javax.swing.plaf.ComponentUI; 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 @@ class SynthSeparatorUI extends SeparatorUI implements PropertyChangeListener, 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 @@ class SynthSeparatorUI extends SeparatorUI implements PropertyChangeListener, 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 @@ class SynthSeparatorUI extends SeparatorUI implements PropertyChangeListener, context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -123,6 +161,12 @@ class SynthSeparatorUI extends SeparatorUI implements PropertyChangeListener, 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 @@ class SynthSeparatorUI extends SeparatorUI implements PropertyChangeListener, 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 @@ class SynthSeparatorUI extends SeparatorUI implements PropertyChangeListener, separator.getOrientation()); } + /** + * @inheritDoc + */ + @Override public Dimension getPreferredSize(JComponent c) { SynthContext context = getContext(c); @@ -155,16 +207,28 @@ class SynthSeparatorUI extends SeparatorUI implements PropertyChangeListener, 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 @@ class SynthSeparatorUI extends SeparatorUI implements PropertyChangeListener, 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()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java index 78d0bb1aaed..5a07443f2ff 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java @@ -38,20 +38,20 @@ import java.util.Enumeration; 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, /////////////////////////////////////////////////// // 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, context.dispose(); } + /** + * @inheritDoc + */ + @Override protected TrackListener createTrackListener(JSlider s) { return new SynthTrackListener(); } @@ -204,6 +230,10 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, } } + /** + * @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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, // 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, return pad; } + /** + * @inheritDoc + */ + @Override protected void calculateThumbLocation() { super.calculateThumbLocation(); if (slider.getOrientation() == JSlider.HORIZONTAL) { @@ -504,6 +553,10 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, } } + /** + * @inheritDoc + */ + @Override protected void calculateTickRect() { if (slider.getOrientation() == JSlider.HORIZONTAL) { tickRect.x = trackRect.x; @@ -533,6 +586,10 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, } } + /** + * @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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, setThumbActive(false); } + /** + * @inheritDoc + */ + @Override protected int xPositionForValue(int value) { int min = slider.getMinimum(); int max = slider.getMaximum(); @@ -567,6 +628,10 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, } /** - * 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, } /** - * 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, return value; } + /** + * @inheritDoc + */ + @Override protected Dimension getThumbSize() { Dimension size = new Dimension(); @@ -665,6 +732,10 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, return size; } + /** + * @inheritDoc + */ + @Override protected void recalculateIfInsetsChanged() { SynthContext context = getContext(slider); Insets newInsets = style.getInsets(context, null); @@ -678,20 +749,20 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, context.dispose(); } - public Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - + /** + * @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) { + private SynthContext getContext(JComponent c, Region subregion) { return getContext(c, subregion, getComponentState(c, subregion)); } @@ -707,10 +778,6 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, // 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, } } + /** + * @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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, trackBounds.height, orientation); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JSlider)e.getSource()); @@ -827,23 +930,23 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, /** * 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 @@ class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, } } - public void mouseMoved(MouseEvent e) { + @Override public void mouseMoved(MouseEvent e) { updateThumbState(e.getX(), e.getY()); } } diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java index d0dd44b8963..f85589fb056 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java @@ -26,22 +26,21 @@ package javax.swing.plaf.synth; 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 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, return new SynthSpinnerUI(); } + /** + * @inheritDoc + */ @Override protected void installListeners() { super.installListeners(); @@ -79,12 +81,7 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, } /** - * Removes the propertyChangeListener added - * by installListeners. - *

    - * This method is called by uninstallUI. - * - * @see #installListeners + * @inheritDoc */ @Override protected void uninstallListeners() { @@ -100,7 +97,7 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, } /** - * Initialize the JSpinner border, + * Initializes the JSpinner border, * foreground, and background, properties * based on the corresponding "Spinner.*" properties from defaults table. * The JSpinners layout is set to the value returned by @@ -112,6 +109,7 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, * @see LookAndFeel#installBorder * @see LookAndFeel#installColors */ + @Override protected void installDefaults() { LayoutManager layout = spinner.getLayout(); @@ -144,6 +142,7 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, * @see #installDefaults * @see #uninstallUI */ + @Override protected void uninstallDefaults() { if (spinner.getLayout() instanceof UIResource) { spinner.setLayout(null); @@ -156,25 +155,19 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, 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 spinner.getPreviousValue. - * By default the previousButton is a JButton - * who's ActionListener updates it's JSpinner - * 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 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, /** - * Create a component that will replace the spinner models value - * with the object returned by spinner.getNextValue. - * By default the nextButton is a JButton - * who's ActionListener updates it's JSpinner - * 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 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, * @see #replaceEditor * @see JSpinner#getEditor */ + @Override protected JComponent createEditor() { JComponent editor = spinner.getEditor(); editor.setName("Spinner.editor"); @@ -250,6 +235,7 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, * @see #createEditor * @see #createPropertyChangeListener */ + @Override protected void replaceEditor(JComponent oldEditor, JComponent newEditor) { spinner.remove(oldEditor); spinner.add(newEditor, "Editor"); @@ -283,8 +269,12 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, } } + /** + * @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 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, 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 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -321,10 +308,19 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, 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 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, } } - + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { - String propertyName = e.getPropertyName(); JSpinner spinner = (JSpinner)(e.getSource()); SpinnerUI spinnerUI = spinner.getUI(); @@ -444,34 +442,13 @@ class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, /** 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(); - } - } - } } diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java index 6cf4da962a2..930e756f3b0 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java @@ -31,19 +31,19 @@ import java.awt.event.*; 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 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements /** * 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 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements /** * Installs the UI defaults. */ + @Override protected void installDefaults() { updateStyle(splitPane); @@ -161,6 +165,7 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements /** * Installs the event listeners for the UI. */ + @Override protected void installListeners() { super.installListeners(); splitPane.addPropertyChangeListener(this); @@ -169,6 +174,7 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements /** * Uninstalls the UI defaults. */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(splitPane, ENABLED); @@ -186,16 +192,20 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements /** - * 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 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements 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 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements return state; } - + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JSplitPane)e.getSource()); @@ -243,6 +248,7 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements /** * Creates the default divider. */ + @Override public BasicSplitPaneDivider createDefaultDivider() { SynthSplitPaneDivider divider = new SynthSplitPaneDivider(this); @@ -250,6 +256,10 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements return divider; } + /** + * @inheritDoc + */ + @Override protected Component createDefaultNonContinuousLayoutDivider() { return new Canvas() { public void paint(Graphics g) { @@ -258,6 +268,10 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements }; } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -268,6 +282,10 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -275,13 +293,22 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements 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 @@ class SynthSplitPaneUI extends BasicSplitPaneUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override public void finishedPaintingChildren(JSplitPane jc, Graphics g) { if(jc == splitPane && getLastDragLocation() != -1 && !isContinuousLayout() && !draggingHW) { diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyle.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyle.java index 52e9ef11b08..521addc21bc 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyle.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyle.java @@ -33,7 +33,6 @@ import javax.swing.text.DefaultEditorKit; import java.util.HashMap; import java.util.Map; import javax.swing.text.JTextComponent; -import sun.swing.plaf.synth.SynthUI; /** * SynthStyle is a set of style properties. diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyleFactory.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyleFactory.java index 562c0286067..8a0f88f3d65 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyleFactory.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyleFactory.java @@ -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 SynthStyles. Each of the diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java index cef94e151d1..3b026d1fc4c 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java @@ -34,19 +34,21 @@ import java.awt.*; 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}. + * + *

    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 { + /** *

    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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh return (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT); } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { updateStyle(tabPane); } @@ -175,16 +187,28 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh return new SynthScrollableTabButton(direction); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle(tabPane); @@ -313,6 +337,9 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh }; } + /** + * @inheritDoc + */ @Override protected int getTabLabelShiftX(int tabPlacement, int tabIndex, boolean isSelected) { if (nudgeSelectedLabel) { @@ -322,6 +349,9 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh } } + /** + * @inheritDoc + */ @Override protected int getTabLabelShiftY(int tabPlacement, int tabIndex, boolean isSelected) { if (nudgeSelectedLabel) { @@ -331,6 +361,10 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh } } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -341,6 +375,10 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh context.dispose(); } + /** + * @inheritDoc + */ + @Override protected int getBaseline(int tab) { if (tabPane.getTabComponentAt(tab) != null || getTextViewForTab(tab) != null) { @@ -361,11 +399,19 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh } + /** + * @inheritDoc + */ + @Override protected void paintTabArea(Graphics g, int tabPlacement, int selectedIndex) { // This can be invoked from ScrollabeTabPanel @@ -439,7 +495,7 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh } } + /** + * @inheritDoc + */ + @Override protected void setRolloverTab(int index) { int oldRolloverTab = getRolloverTab(); super.setRolloverTab(index); @@ -519,7 +579,7 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh } } - 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh } } - 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh } - 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh } } - + /** + * @inheritDoc + */ + @Override protected int calculateMaxTabHeight(int tabPlacement) { FontMetrics metrics = getFontMetrics(tabContext.getStyle().getFont( tabContext)); @@ -696,6 +759,10 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh return result; } + /** + * @inheritDoc + */ + @Override protected int calculateTabWidth(int tabPlacement, int tabIndex, FontMetrics metrics) { Icon icon = getIconForTab(tabIndex); @@ -723,6 +790,10 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh return width; } + /** + * @inheritDoc + */ + @Override protected int calculateMaxTabWidth(int tabPlacement) { FontMetrics metrics = getFontMetrics(tabContext.getStyle().getFont( tabContext)); @@ -735,17 +806,25 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh 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 @@ class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyCh * 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 */ diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java index b37d9f1262d..86b50eb935b 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java @@ -32,19 +32,18 @@ import javax.swing.border.*; 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 @@ class SynthTableHeaderUI extends BasicTableHeaderUI implements 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 @@ class SynthTableHeaderUI extends BasicTableHeaderUI implements 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 @@ class SynthTableHeaderUI extends BasicTableHeaderUI implements 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 @@ class SynthTableHeaderUI extends BasicTableHeaderUI implements context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -118,10 +147,20 @@ class SynthTableHeaderUI extends BasicTableHeaderUI implements 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 @@ class SynthTableHeaderUI extends BasicTableHeaderUI implements // // 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 @@ class SynthTableHeaderUI extends BasicTableHeaderUI implements 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((JTableHeader)evt.getSource()); - } - } - + /** + * @inheritDoc + */ @Override protected void rolloverColumnUpdated(int oldColumn, int newColumn) { header.repaint(header.getHeaderRect(oldColumn)); header.repaint(header.getHeaderRect(newColumn)); } + /** + * @inheritDoc + */ + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (SynthLookAndFeel.shouldUpdateStyle(evt)) { + updateStyle((JTableHeader)evt.getSource()); + } + } + private class HeaderRenderer extends DefaultTableCellHeaderRenderer { HeaderRenderer() { setHorizontalAlignment(JLabel.LEADING); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java index dcd6b6275bf..43e8150dd22 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java @@ -54,15 +54,15 @@ import javax.swing.table.TableCellRenderer; 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 @@ class SynthTableUI extends BasicTableUI implements SynthUI, // 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 @@ class SynthTableUI extends BasicTableUI implements SynthUI, /** * 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 @@ class SynthTableUI extends BasicTableUI implements SynthUI, style = null; } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { table.removePropertyChangeListener(this); super.uninstallListeners(); @@ -221,8 +237,13 @@ class SynthTableUI extends BasicTableUI implements SynthUI, // // 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 @@ class SynthTableUI extends BasicTableUI implements SynthUI, 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 @@ class SynthTableUI extends BasicTableUI implements SynthUI, 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 @@ class SynthTableUI extends BasicTableUI implements SynthUI, 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 @@ class SynthTableUI extends BasicTableUI implements SynthUI, } } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent event) { if (SynthLookAndFeel.shouldUpdateStyle(event)) { updateStyle((JTable)event.getSource()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java index 01947655afe..90c9a7e0553 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java @@ -33,7 +33,6 @@ import java.awt.*; 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 @@ import sun.swing.plaf.synth.SynthUI; * 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 @@ class SynthTextAreaUI extends BasicTextAreaUI implements SynthUI, FocusListener 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 @@ class SynthTextAreaUI extends BasicTextAreaUI implements SynthUI, FocusListener 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 @@ class SynthTextAreaUI extends BasicTextAreaUI implements SynthUI, FocusListener 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 @@ class SynthTextAreaUI extends BasicTextAreaUI implements SynthUI, FocusListener 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 @@ class SynthTextAreaUI extends BasicTextAreaUI implements SynthUI, FocusListener * * @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(); + } + } } diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java index 225a965d874..c86b4a9dcca 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java @@ -27,7 +27,6 @@ package javax.swing.plaf.synth; 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.FocusEvent; 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}. *

    * Warning: * Serialized objects of this class will not be compatible with @@ -51,27 +48,22 @@ import sun.swing.plaf.synth.SynthUI; * 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 @@ class SynthTextFieldUI } } + /** + * @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 @@ class SynthTextFieldUI 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 @@ class SynthTextFieldUI } /** - * 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. + *

    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 @@ class SynthTextFieldUI 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 @@ class SynthTextFieldUI * * @param evt the property change event */ + @Override protected void propertyChange(PropertyChangeEvent evt) { if (SynthLookAndFeel.shouldUpdateStyle(evt)) { updateStyle((JTextComponent)evt.getSource()); @@ -221,26 +230,26 @@ class SynthTextFieldUI 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 @@ class SynthTextFieldUI 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(); + } } } diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java index ad2e51b4d34..0cef82e2e7a 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java @@ -45,14 +45,15 @@ import java.awt.*; * 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 @@ class SynthTextPaneUI extends SynthEditorPaneUI { * * @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 @@ class SynthTextPaneUI extends SynthEditorPaneUI { * * @param evt the property change event */ + @Override protected void propertyChange(PropertyChangeEvent evt) { super.propertyChange(evt); @@ -150,11 +157,16 @@ class SynthTextPaneUI extends SynthEditorPaneUI { } } + @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); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java index d4b22baaf2b..ede8113849d 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java @@ -31,18 +31,30 @@ import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; /** - * Synth's ToggleButtonUI. - *

    + * 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 @@ class SynthToggleButtonUI extends SynthButtonUI { } } + /** + * @inheritDoc + */ @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java index c49536c34e7..66a72b1ee70 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java @@ -42,39 +42,53 @@ import javax.swing.JToolBar; 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. - *

    + * 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 @@ class SynthToolBarUI extends BasicToolBarUI implements PropertyChangeListener, context.dispose(); } + /** + * @inheritDoc + */ @Override protected void uninstallDefaults() { SynthContext context = getContext(toolBar, ENABLED); @@ -131,18 +148,33 @@ class SynthToolBarUI extends BasicToolBarUI implements PropertyChangeListener, 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 @@ class SynthToolBarUI extends BasicToolBarUI implements PropertyChangeListener, 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 @@ class SynthToolBarUI extends BasicToolBarUI implements PropertyChangeListener, context.dispose(); } + /** + * @inheritDoc + */ @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -193,6 +223,10 @@ class SynthToolBarUI extends BasicToolBarUI implements PropertyChangeListener, 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 @@ class SynthToolBarUI extends BasicToolBarUI implements PropertyChangeListener, } // 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 @@ class SynthToolBarUI extends BasicToolBarUI implements PropertyChangeListener, 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 @@ class SynthToolBarUI extends BasicToolBarUI implements PropertyChangeListener, toolBar.getOrientation()); } + /** + * @inheritDoc + */ @Override protected void paintDragWindow(Graphics g) { int w = dragWindow.getWidth(); @@ -258,6 +317,10 @@ class SynthToolBarUI extends BasicToolBarUI implements PropertyChangeListener, // PropertyChangeListener // + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JToolBar)e.getSource()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java index b129f9bedff..df23bac7579 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java @@ -34,23 +34,33 @@ import javax.swing.plaf.basic.BasicHTML; 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 @@ class SynthToolTipUI extends BasicToolTipUI implements PropertyChangeListener, context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults(JComponent c) { SynthContext context = getContext(c, ENABLED); style.uninstallDefaults(context); @@ -68,14 +82,26 @@ class SynthToolTipUI extends BasicToolTipUI implements PropertyChangeListener, 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 @@ class SynthToolTipUI extends BasicToolTipUI implements PropertyChangeListener, 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 @@ class SynthToolTipUI extends BasicToolTipUI implements PropertyChangeListener, return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -108,11 +134,19 @@ class SynthToolTipUI extends BasicToolTipUI implements PropertyChangeListener, 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 @@ class SynthToolTipUI extends BasicToolTipUI implements PropertyChangeListener, 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 @@ class SynthToolTipUI extends BasicToolTipUI implements PropertyChangeListener, } } + /** + * @inheritDoc + */ + @Override public Dimension getPreferredSize(JComponent c) { SynthContext context = getContext(c); Insets insets = c.getInsets(); @@ -164,6 +207,10 @@ class SynthToolTipUI extends BasicToolTipUI implements PropertyChangeListener, return prefSize; } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JToolTip)e.getSource()); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java index 47011a865d3..e81064408b8 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java @@ -48,15 +48,16 @@ import javax.swing.tree.TreeCellRenderer; 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 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, 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 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, 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 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, 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 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, return ENABLED | SELECTED; } + /** + * @inheritDoc + */ @Override protected TreeCellEditor createDefaultCellEditor() { TreeCellRenderer renderer = tree.getCellRenderer(); @@ -202,11 +210,17 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, return editor; } + /** + * @inheritDoc + */ @Override protected TreeCellRenderer createDefaultCellRenderer() { return new SynthTreeCellRenderer(); } + /** + * @inheritDoc + */ @Override protected void uninstallDefaults() { SynthContext context = getContext(tree, ENABLED); @@ -226,12 +240,18 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, } } + /** + * @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 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, 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 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, 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 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, 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 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, 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 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, } } + /** + * @inheritDoc + */ @Override protected void paintHorizontalPartOfLeg(Graphics g, Rectangle clipBounds, Insets insets, Rectangle bounds, @@ -516,6 +470,9 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, } } + /** + * @inheritDoc + */ @Override protected void paintHorizontalLine(Graphics g, JComponent c, int y, int left, int right) { @@ -523,6 +480,9 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, paintContext, "Tree.horizontalLine", g, left, y, right, y, linesStyle); } + /** + * @inheritDoc + */ @Override protected void paintVerticalPartOfLeg(Graphics g, Rectangle clipBounds, Insets insets, @@ -532,6 +492,9 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, } } + /** + * @inheritDoc + */ @Override protected void paintVerticalLine(Graphics g, JComponent c, int x, int top, int bottom) { @@ -539,7 +502,7 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, 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 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, state |= SELECTED; } - if (tree.isFocusOwner() && row == leadRow) { + if (tree.isFocusOwner() && row == getLeadSelectionRow()) { state |= FOCUSED; } @@ -583,7 +546,7 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, int leadIndex; if (tree.hasFocus()) { - leadIndex = leadRow; + leadIndex = getLeadSelectionRow(); } else { leadIndex = -1; @@ -625,6 +588,9 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, paintContext.setComponentState(state); } + /** + * @inheritDoc + */ @Override protected void drawCentered(Component c, Graphics graphics, Icon icon, int x, int y) { @@ -636,6 +602,10 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, y - h/2, w, h); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent event) { if (SynthLookAndFeel.shouldUpdateStyle(event)) { updateStyle((JTree)event.getSource()); @@ -648,6 +618,24 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, } } + /** + * @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 @@ class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, } } + /** + * @inheritDoc + */ @Override protected int getRowX(int row, int depth) { return super.getRowX(row, depth) + padding; diff --git a/jdk/src/share/classes/sun/swing/plaf/synth/SynthUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthUI.java similarity index 86% rename from jdk/src/share/classes/sun/swing/plaf/synth/SynthUI.java rename to jdk/src/share/classes/javax/swing/plaf/synth/SynthUI.java index 0d9875f550d..0c14950ba99 100644 --- a/jdk/src/share/classes/sun/swing/plaf/synth/SynthUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthUI.java @@ -22,18 +22,19 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ -package sun.swing.plaf.synth; +package javax.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 + * @since 1.7 */ public interface SynthUI extends SynthConstants { + /** * Returns the Context for the specified component. * @@ -44,6 +45,13 @@ public interface SynthUI extends SynthConstants { /** * 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); diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java index fcc1bb1b321..1e71e227d9a 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java @@ -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 @@ class SynthViewportUI extends ViewportUI implements 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 @@ class SynthViewportUI extends ViewportUI implements 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 @@ class SynthViewportUI extends ViewportUI implements 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 @@ class SynthViewportUI extends ViewportUI implements 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 @@ class SynthViewportUI extends ViewportUI implements 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()); diff --git a/jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_PCM.c b/jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_PCM.c index e179ab025cb..fd1102dd421 100644 --- a/jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_PCM.c +++ b/jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_PCM.c @@ -143,8 +143,12 @@ void DAUDIO_GetFormats(INT32 mixerIndex, INT32 deviceID, int isSource, void* cre 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); diff --git a/jdk/src/windows/lib/tzmappings b/jdk/src/windows/lib/tzmappings index ec2732f64fb..05309c9aef8 100644 --- a/jdk/src/windows/lib/tzmappings +++ b/jdk/src/windows/lib/tzmappings @@ -92,7 +92,7 @@ Bangkok Standard Time:14,15::Asia/Bangkok: 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 @@ Venezuela Standard Time:915,915::America/Caracas: 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: diff --git a/jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp b/jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp index b60ff058641..12e3f688a95 100644 --- a/jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp +++ b/jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp @@ -485,7 +485,7 @@ DWORD WINAPI __stdcall DS_StartBufferHelper::ThreadProc(void *param) } 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); diff --git a/jdk/test/java/beans/EventHandler/Test6788531.java b/jdk/test/java/beans/EventHandler/Test6788531.java index 1754f5bc552..375c0fbab3a 100644 --- a/jdk/test/java/beans/EventHandler/Test6788531.java +++ b/jdk/test/java/beans/EventHandler/Test6788531.java @@ -36,7 +36,7 @@ public class Test6788531 { 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(); } diff --git a/jdk/test/java/beans/Introspector/Test5102804.java b/jdk/test/java/beans/Introspector/Test5102804.java new file mode 100644 index 00000000000..71f23f92941 --- /dev/null +++ b/jdk/test/java/beans/Introspector/Test5102804.java @@ -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(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; + } + } + } +} diff --git a/jdk/test/java/beans/XMLEncoder/6329581/Test6329581.java b/jdk/test/java/beans/XMLEncoder/6329581/Test6329581.java index c307dab1267..3f51180e4f3 100644 --- a/jdk/test/java/beans/XMLEncoder/6329581/Test6329581.java +++ b/jdk/test/java/beans/XMLEncoder/6329581/Test6329581.java @@ -33,43 +33,70 @@ import java.beans.XMLDecoder; 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 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(); - - if (!object.getClass().getClassLoader().getClass().equals(URLClassLoader.class)) { - throw new Error("bean is loaded with unexpected class loader"); - } +public class Test6329581 extends URLClassLoader implements ExceptionListener { + public static final class Bean { } - 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); + public static void main(String[] args) throws Exception { + new Test6329581().decode(new Test6329581().encode(Bean.class.getName())); + } - URL[] url = { new URL(sb.toString()) }; - return new URLClassLoader(url); + private Test6329581() { + super(new URL[] { + Test6329581.class.getProtectionDomain().getCodeSource().getLocation() + }); + } + + @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; + } } diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOverFlowTest2.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOverFlowTest2.java new file mode 100644 index 00000000000..992b26ea350 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOverFlowTest2.java @@ -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 p = new HashMap(); + 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(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/GetMidiDevice.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/GetMidiDevice.java new file mode 100644 index 00000000000..8839111d8fe --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/GetMidiDevice.java @@ -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 diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/TestPreciseTimestampRendering.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/TestPreciseTimestampRendering.java new file mode 100644 index 00000000000..d4d55bb3f96 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/TestPreciseTimestampRendering.java @@ -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 + ")"); + } + + } + +} diff --git a/jdk/test/javax/swing/JList/6823603/bug6823603.java b/jdk/test/javax/swing/JList/6823603/bug6823603.java new file mode 100644 index 00000000000..75529c5ba8e --- /dev/null +++ b/jdk/test/javax/swing/JList/6823603/bug6823603.java @@ -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 void testGenericSignatures() { + // Test JList + ListModel stringListModel = new DefaultListModel(); + + new JList(); + new JList(stringListModel); + new JList(new String[]{TEST_ELEMENT}); + + JList stringTestList = new JList(new Vector()); + + stringTestList.getPrototypeCellValue(); + stringTestList.setPrototypeCellValue(TEST_ELEMENT); + + ListCellRenderer cellRenderer = stringTestList.getCellRenderer(); + + stringTestList.setCellRenderer(new DefaultListCellRenderer()); + + ListModel model = stringTestList.getModel(); + + stringTestList.setModel(stringListModel); + stringTestList.setListData(new String[]{TEST_ELEMENT}); + stringTestList.setListData(new Vector()); + + @SuppressWarnings("deprecation") + Object[] selectedValues = stringTestList.getSelectedValues(); + + stringTestList.getSelectedValue(); + + // Test ListCellRenderer + ListCellRenderer stringTestCellRenderer = + new DefaultListCellRenderer(); + String testEntry = "Test"; + JList stringJList = new JList(new String[]{testEntry}); + + Component listCellRendererComponent2 = + stringTestCellRenderer.getListCellRendererComponent(stringJList, + testEntry, 0, true, true); + + // Test ListModel + DefaultListModel testModel = new DefaultListModel(); + testModel.addElement(TEST_ELEMENT); + stringListModel = testModel; + + String element1 = stringListModel.getElementAt(0); + + // Test DefaultListModel + DefaultListModel stringTestModel = new DefaultListModel(); + + stringTestModel.addElement(TEST_ELEMENT); + element1 = stringTestModel.getElementAt(0); + Enumeration 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() { + + public int getSize() { + throw new UnsupportedOperationException("Not supported yet."); + } + + public String getElementAt(int index) { + throw new UnsupportedOperationException("Not supported yet."); + } + }; + + @SuppressWarnings("serial") + ListModel genericTestModel = new AbstractListModel() { + + 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(new String[]{testEntry}); + + listCellRendererComponent2 = cellRenderer.getListCellRendererComponent(stringJList, testEntry, 0, true, true); + } + + private static void testGetSelectedValuesList() { + Vector data = new Vector(); + for (int i = 0; i < 10; i++) { + data.add(i); + } + JList list = new JList(data); + list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + list.setSelectedIndices(new int[]{1, 2, 3, 5, 6, 8}); + + @SuppressWarnings("deprecation") + Object[] expectedSelectedValues = list.getSelectedValues(); + List 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)); + } + } +} diff --git a/jdk/test/javax/swing/JTable/Test6888156.java b/jdk/test/javax/swing/JTable/Test6888156.java new file mode 100644 index 00000000000..5d1b1fe2b50 --- /dev/null +++ b/jdk/test/javax/swing/JTable/Test6888156.java @@ -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