提交 ced0b23e 编写于 作者: X xdono

Merge

...@@ -44,3 +44,4 @@ bd31b30a5b21f20e42965b1633f18a5c7946d398 jdk7-b66 ...@@ -44,3 +44,4 @@ bd31b30a5b21f20e42965b1633f18a5c7946d398 jdk7-b66
a952aafd5181af953b0ef3010dbd2fcc28460e8a jdk7-b67 a952aafd5181af953b0ef3010dbd2fcc28460e8a jdk7-b67
b23d905cb5d3b382295240d28ab0bfb266b4503c jdk7-b68 b23d905cb5d3b382295240d28ab0bfb266b4503c jdk7-b68
226b20019b1f020c09ea97d137d98e011ce65d76 jdk7-b69 226b20019b1f020c09ea97d137d98e011ce65d76 jdk7-b69
893bcca951b747ddcf6986362b877f0e1dbb835b jdk7-b70
...@@ -48,7 +48,7 @@ public final class BeanInfoFinder ...@@ -48,7 +48,7 @@ public final class BeanInfoFinder
} }
private static boolean isValid(Class<?> type, Method method) { private static boolean isValid(Class<?> type, Method method) {
return (method != null) && type.equals(method.getDeclaringClass()); return (method != null) && method.getDeclaringClass().isAssignableFrom(type);
} }
@Override @Override
......
...@@ -38,7 +38,7 @@ import java.util.Locale; ...@@ -38,7 +38,7 @@ import java.util.Locale;
* a character's category (lowercase letter, digit, etc.) and for converting * a character's category (lowercase letter, digit, etc.) and for converting
* characters from uppercase to lowercase and vice versa. * characters from uppercase to lowercase and vice versa.
* <p> * <p>
* Character information is based on the Unicode Standard, version 4.0. * Character information is based on the Unicode Standard, version 5.1.0.
* <p> * <p>
* The methods and data of class <code>Character</code> are defined by * The methods and data of class <code>Character</code> are defined by
* the information in the <i>UnicodeData</i> file that is part of the * the information in the <i>UnicodeData</i> file that is part of the
......
此差异已折叠。
...@@ -37,6 +37,8 @@ import java.util.Vector; ...@@ -37,6 +37,8 @@ import java.util.Vector;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.shell.*; import sun.awt.shell.*;
...@@ -718,8 +720,13 @@ class WindowsFileSystemView extends FileSystemView { ...@@ -718,8 +720,13 @@ class WindowsFileSystemView extends FileSystemView {
return isFileSystemRoot(dir); return isFileSystemRoot(dir);
} }
public boolean isFloppyDrive(File dir) { public boolean isFloppyDrive(final File dir) {
String path = dir.getAbsolutePath(); String path = AccessController.doPrivileged(new PrivilegedAction<String>() {
public String run() {
return dir.getAbsolutePath();
}
});
return (path != null && (path.equals("A:\\") || path.equals("B:\\"))); return (path != null && (path.equals("A:\\") || path.equals("B:\\")));
} }
......
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package javax.swing.plaf;
import javax.accessibility.Accessible;
import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
/**
* The base class for all {@link javax.swing.JLayer}'s UI delegates.
* <p/>
* {@link #paint(java.awt.Graphics, javax.swing.JComponent)} method performes the
* painting of the {@code JLayer}
* and {@link #eventDispatched(AWTEvent, JLayer)} method is notified
* about any {@code AWTEvent}s which have been generated by a {@code JLayer}
* or any of its subcomponents.
* <p/>
* The {@code LayerUI} differs from the UI delegates of the other components,
* because it is LookAndFeel independent and is not updated by default when
* the system LookAndFeel is changed.
* <p/>
* The subclasses of {@code LayerUI} can either be stateless and shareable
* by multiple {@code JLayer}s or not shareable.
*
* @param <V> one of the super types of {@code JLayer}'s view component
*
* @see JLayer#setUI(LayerUI)
* @see JLayer#setView(Component)
* @see JLayer#getView()
* @since 1.7
*
* @author Alexander Potochkin
*/
public class LayerUI<V extends Component>
extends ComponentUI implements Serializable {
private final PropertyChangeSupport propertyChangeSupport =
new PropertyChangeSupport(this);
/**
* Paints the specified component.
* Subclasses should override this method and use
* the specified {@code Graphics} object to
* render the content of the component.
*
* @param g the {@code Graphics} context in which to paint;
* @param c the component being painted;
* it can be safely cast to the {@code JLayer<V>}
*/
@Override
public void paint(Graphics g, JComponent c) {
c.paint(g);
}
/**
* Dispatches {@code AWTEvent}s for {@code JLayer}
* and <b>all it subcomponents</b> to this {@code LayerUI} instance.
* <p>
* To enable the {@code AWTEvent} of the particular type,
* you call {@link javax.swing.JLayer#setLayerEventMask}
* in {@link #installUI(javax.swing.JComponent)}
* and set the layer event mask to {@code 0}
* in {@link #uninstallUI(javax.swing.JComponent)} after that
*
* @param e the event to be dispatched
* @param l the layer this LayerUI is set to
*
* @see JLayer#setLayerEventMask(long)
* @see javax.swing.JLayer#getLayerEventMask()
*/
public void eventDispatched(AWTEvent e, JLayer<? extends V> l){
}
/**
* Invoked when {@link javax.swing.JLayer#updateUI()} is called
* by the {@code JLayer} this {@code LayerUI} is set to.
*
* @param l the {@code JLayer} which UI is updated
*/
public void updateUI(JLayer<? extends V> l){
}
/**
* Configures the {@code JLayer} this {@code LayerUI} is set to.
* The default implementation registers the {@code LayerUI}
* as a property change listener for the passed {@code JLayer} component.
*
* @param c the {@code JLayer} component where this UI delegate is being installed
*/
public void installUI(JComponent c) {
addPropertyChangeListener((JLayer) c);
}
/**
* Reverses the configuration which was previously set
* in the {@link #installUI(JComponent)} method.
* The default implementation unregisters the property change listener
* for the passed JLayer component.
*
* @param c the component from which this UI delegate is being removed.
*/
public void uninstallUI(JComponent c) {
removePropertyChangeListener((JLayer) c);
}
/**
* Adds a PropertyChangeListener to the listener list. The listener is
* registered for all bound properties of this class.
* <p/>
* If {@code listener} is {@code null},
* no exception is thrown and no action is performed.
*
* @param listener the property change listener to be added
* @see #removePropertyChangeListener
* @see #getPropertyChangeListeners
* @see #addPropertyChangeListener(String, java.beans.PropertyChangeListener)
*/
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
/**
* Removes a PropertyChangeListener from the listener list. This method
* should be used to remove PropertyChangeListeners that were registered
* for all bound properties of this class.
* <p/>
* If {@code listener} is {@code null},
* no exception is thrown and no action is performed.
*
* @param listener the PropertyChangeListener to be removed
* @see #addPropertyChangeListener
* @see #getPropertyChangeListeners
* @see #removePropertyChangeListener(String, PropertyChangeListener)
*/
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
/**
* Returns an array of all the property change listeners
* registered on this component.
*
* @return all of this ui's {@code PropertyChangeListener}s
* or an empty array if no property change
* listeners are currently registered
* @see #addPropertyChangeListener
* @see #removePropertyChangeListener
* @see #getPropertyChangeListeners(String)
*/
public PropertyChangeListener[] getPropertyChangeListeners() {
return propertyChangeSupport.getPropertyChangeListeners();
}
/**
* Adds a PropertyChangeListener to the listener list for a specific
* property.
* <p/>
* If {@code propertyName} or {@code listener} is {@code null},
* no exception is thrown and no action is taken.
*
* @param propertyName one of the property names listed above
* @param listener the property change listener to be added
* @see #removePropertyChangeListener(String, PropertyChangeListener)
* @see #getPropertyChangeListeners(String)
* @see #addPropertyChangeListener(String, PropertyChangeListener)
*/
public void addPropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
}
/**
* Removes a {@code PropertyChangeListener} from the listener
* list for a specific property. This method should be used to remove
* {@code PropertyChangeListener}s
* that were registered for a specific bound property.
* <p/>
* If {@code propertyName} or {@code listener} is {@code null},
* no exception is thrown and no action is taken.
*
* @param propertyName a valid property name
* @param listener the PropertyChangeListener to be removed
* @see #addPropertyChangeListener(String, PropertyChangeListener)
* @see #getPropertyChangeListeners(String)
* @see #removePropertyChangeListener(PropertyChangeListener)
*/
public void removePropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(propertyName, listener);
}
/**
* Returns an array of all the listeners which have been associated
* with the named property.
*
* @return all of the {@code PropertyChangeListener}s associated with
* the named property; if no such listeners have been added or
* if {@code propertyName} is {@code null}, an empty
* array is returned
* @see #addPropertyChangeListener(String, PropertyChangeListener)
* @see #removePropertyChangeListener(String, PropertyChangeListener)
* @see #getPropertyChangeListeners
*/
public PropertyChangeListener[] getPropertyChangeListeners(String propertyName) {
return propertyChangeSupport.getPropertyChangeListeners(propertyName);
}
/**
* Support for reporting bound property changes for Object properties.
* This method can be called when a bound property has changed and it will
* send the appropriate PropertyChangeEvent to any registered
* PropertyChangeListeners.
*
* @param propertyName the property whose value has changed
* @param oldValue the property's previous value
* @param newValue the property's new value
*/
protected void firePropertyChange(String propertyName,
Object oldValue, Object newValue) {
propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
}
/**
* Notifies the {@code LayerUI} when any of its property are changed
* and enables updating every {@code JLayer} this {@code LayerUI} instance is set to.
*
* @param evt the PropertyChangeEvent generated by this {@code LayerUI}
* @param l the {@code JLayer} this LayerUI is set to
*/
public void applyPropertyChange(PropertyChangeEvent evt, JLayer<? extends V> l) {
}
/**
* Returns the preferred size of the viewport for a view component.
*
* @return the preferred size of the viewport for a view component
* @see Scrollable#getPreferredScrollableViewportSize()
*/
public Dimension getPreferredScrollableViewportSize(JLayer<? extends V> l) {
if (l.getView() instanceof Scrollable) {
return ((Scrollable)l.getView()).getPreferredScrollableViewportSize();
}
return l.getPreferredSize();
}
/**
* Returns a scroll increment, which is required for components
* that display logical rows or columns in order to completely expose
* one block of rows or columns, depending on the value of orientation.
*
* @return the "block" increment for scrolling in the specified direction
* @see Scrollable#getScrollableBlockIncrement(Rectangle, int, int)
*/
public int getScrollableBlockIncrement(JLayer<? extends V> l,
Rectangle visibleRect,
int orientation, int direction) {
if (l.getView() instanceof Scrollable) {
return ((Scrollable)l.getView()).getScrollableBlockIncrement(
visibleRect,orientation, direction);
}
return (orientation == SwingConstants.VERTICAL) ? visibleRect.height :
visibleRect.width;
}
/**
* Returns {@code false} to indicate that the height of the viewport does not
* determine the height of the layer, unless the preferred height
* of the layer is smaller than the height of the viewport.
*
* @return whether the layer should track the height of the viewport
* @see Scrollable#getScrollableTracksViewportHeight()
*/
public boolean getScrollableTracksViewportHeight(JLayer<? extends V> l) {
if (l.getView() instanceof Scrollable) {
return ((Scrollable)l.getView()).getScrollableTracksViewportHeight();
}
if (l.getParent() instanceof JViewport) {
return (((JViewport)l.getParent()).getHeight() > l.getPreferredSize().height);
}
return false;
}
/**
* Returns {@code false} to indicate that the width of the viewport does not
* determine the width of the layer, unless the preferred width
* of the layer is smaller than the width of the viewport.
*
* @return whether the layer should track the width of the viewport
* @see Scrollable
* @see LayerUI#getScrollableTracksViewportWidth(JLayer)
*/
public boolean getScrollableTracksViewportWidth(JLayer<? extends V> l) {
if (l.getView() instanceof Scrollable) {
return ((Scrollable)l.getView()).getScrollableTracksViewportWidth();
}
if (l.getParent() instanceof JViewport) {
return (((JViewport)l.getParent()).getWidth() > l.getPreferredSize().width);
}
return false;
}
/**
* Returns a scroll increment, which is required for components
* that display logical rows or columns in order to completely expose
* one new row or column, depending on the value of orientation.
* Ideally, components should handle a partially exposed row or column
* by returning the distance required to completely expose the item.
* <p>
* Scrolling containers, like JScrollPane, will use this method
* each time the user requests a unit scroll.
*
* @return The "unit" increment for scrolling in the specified direction.
* This value should always be positive.
* @see Scrollable#getScrollableUnitIncrement(Rectangle, int, int)
*/
public int getScrollableUnitIncrement(JLayer<? extends V> l,
Rectangle visibleRect,
int orientation, int direction) {
if (l.getView() instanceof Scrollable) {
return ((Scrollable)l.getView()).getScrollableUnitIncrement(
visibleRect, orientation, direction);
}
return 1;
}
/**
* If the {@code JLayer}'s view component is not {@code null},
* this calls the view's {@code getBaseline()} method.
* Otherwise, the default implementation is called.
*
* @param c {@code JLayer} to return baseline resize behavior for
* @param width the width to get the baseline for
* @param height the height to get the baseline for
* @return baseline or a value &lt; 0 indicating there is no reasonable
* baseline
*/
public int getBaseline(JComponent c, int width, int height) {
JLayer l = (JLayer) c;
if (l.getView() != null) {
return l.getView().getBaseline(width, height);
}
return super.getBaseline(c, width, height);
}
/**
* If the {@code JLayer}'s view component is not {@code null},
* this calls the view's {@code getBaselineResizeBehavior()} method.
* Otherwise, the default implementation is called.
*
* @param c {@code JLayer} to return baseline resize behavior for
* @return an enum indicating how the baseline changes as the component
* size changes
*/
public Component.BaselineResizeBehavior getBaselineResizeBehavior(JComponent c) {
JLayer l = (JLayer) c;
if (l.getView() != null) {
return l.getView().getBaselineResizeBehavior();
}
return super.getBaselineResizeBehavior(c);
}
}
\ No newline at end of file
...@@ -540,30 +540,7 @@ public class GlyphView extends View implements TabableView, Cloneable { ...@@ -540,30 +540,7 @@ public class GlyphView extends View implements TabableView, Cloneable {
*/ */
@Override @Override
public float getMinimumSpan(int axis) { public float getMinimumSpan(int axis) {
switch (axis) { return super.getMinimumSpan(axis);
case View.X_AXIS:
if (minimumSpan < 0) {
minimumSpan = 0;
int p0 = getStartOffset();
int p1 = getEndOffset();
while (p1 > p0) {
int breakSpot = getBreakSpot(p0, p1);
if (breakSpot == BreakIterator.DONE) {
// the rest of the view is non-breakable
breakSpot = p0;
}
minimumSpan = Math.max(minimumSpan,
getPartialSpan(breakSpot, p1));
// Note: getBreakSpot returns the *last* breakspot
p1 = breakSpot - 1;
}
}
return minimumSpan;
case View.Y_AXIS:
return super.getMinimumSpan(axis);
default:
throw new IllegalArgumentException("Invalid axis: " + axis);
}
} }
/** /**
......
...@@ -721,35 +721,7 @@ public class ParagraphView extends FlowView implements TabExpander { ...@@ -721,35 +721,7 @@ public class ParagraphView extends FlowView implements TabExpander {
@Override @Override
protected SizeRequirements calculateMinorAxisRequirements(int axis, protected SizeRequirements calculateMinorAxisRequirements(int axis,
SizeRequirements r) { SizeRequirements r) {
r = super.calculateMinorAxisRequirements(axis, r); return super.calculateMinorAxisRequirements(axis, r);
float min = 0;
float glue = 0;
int n = getLayoutViewCount();
for (int i = 0; i < n; i++) {
View v = getLayoutView(i);
float span = v.getMinimumSpan(axis);
if (v.getBreakWeight(axis, 0, v.getMaximumSpan(axis))
> View.BadBreakWeight) {
// find the longest non-breakable fragments at the view edges
int p0 = v.getStartOffset();
int p1 = v.getEndOffset();
float start = findEdgeSpan(v, axis, p0, p0, p1);
float end = findEdgeSpan(v, axis, p1, p0, p1);
glue += start;
min = Math.max(min, Math.max(span, glue));
glue = end;
} else {
// non-breakable view
glue += span;
min = Math.max(min, glue);
}
}
r.minimum = Math.max(r.minimum, (int) min);
r.preferred = Math.max(r.minimum, r.preferred);
r.maximum = Math.max(r.preferred, r.maximum);
return r;
} }
/** /**
......
...@@ -327,13 +327,45 @@ public class WrappedPlainView extends BoxView implements TabExpander { ...@@ -327,13 +327,45 @@ public class WrappedPlainView extends BoxView implements TabExpander {
/** /**
* Return reasonable default values for the view dimensions. The standard * Return reasonable default values for the view dimensions. The standard
* text terminal size 80x24 is pretty suitable for the wrapped plain view. * text terminal size 80x24 is pretty suitable for the wrapped plain view.
*
* The size should not be larger than the component housing the view's
* container.
*/ */
private float getDefaultSpan(int axis) { private float getDefaultSpan(int axis) {
Container host = getContainer();
Component parent = null;
if (host != null) {
parent = host.getParent();
}
switch (axis) { switch (axis) {
case View.X_AXIS: case View.X_AXIS:
return 80 * metrics.getWidths()['M']; int defaultWidth = 80 * metrics.getWidths()['M'];
int parentWidth = 0;
if (parent != null) {
parentWidth = parent.getWidth();
}
if (defaultWidth > parentWidth) {
return parentWidth;
}
return defaultWidth;
case View.Y_AXIS: case View.Y_AXIS:
return 24 * metrics.getHeight(); int defaultHeight = 24 * metrics.getHeight();
int parentHeight = 0;
if (parent != null) {
parentHeight = parent.getHeight();
}
if (defaultHeight > parentHeight) {
return parentHeight;
}
return defaultHeight;
default: default:
throw new IllegalArgumentException("Invalid axis: " + axis); throw new IllegalArgumentException("Invalid axis: " + axis);
} }
......
...@@ -73,12 +73,7 @@ final class Win32ShellFolder2 extends ShellFolder { ...@@ -73,12 +73,7 @@ final class Win32ShellFolder2 extends ShellFolder {
private static native void initIDs(); private static native void initIDs();
private static final boolean is98;
static { static {
String osName = System.getProperty("os.name");
is98 = (osName != null && osName.startsWith("Windows 98"));
initIDs(); initIDs();
} }
...@@ -305,7 +300,6 @@ final class Win32ShellFolder2 extends ShellFolder { ...@@ -305,7 +300,6 @@ final class Win32ShellFolder2 extends ShellFolder {
}, RuntimeException.class) }, RuntimeException.class)
); );
this.disposer.relativePIDL = relativePIDL; this.disposer.relativePIDL = relativePIDL;
getAbsolutePath();
sun.java2d.Disposer.addRecord(this, disposer); sun.java2d.Disposer.addRecord(this, disposer);
} }
...@@ -616,11 +610,8 @@ final class Win32ShellFolder2 extends ShellFolder { ...@@ -616,11 +610,8 @@ final class Win32ShellFolder2 extends ShellFolder {
public boolean isDirectory() { public boolean isDirectory() {
if (isDir == null) { if (isDir == null) {
// Folders with SFGAO_BROWSABLE have "shell extension" handlers and are // Folders with SFGAO_BROWSABLE have "shell extension" handlers and are
// not traversable in JFileChooser. An exception is "My Documents" on // not traversable in JFileChooser.
// Windows 98. if (hasAttribute(ATTRIB_FOLDER) && !hasAttribute(ATTRIB_BROWSABLE)) {
if (hasAttribute(ATTRIB_FOLDER)
&& (!hasAttribute(ATTRIB_BROWSABLE) ||
(is98 && equals(Win32ShellFolderManager2.getPersonal())))) {
isDir = Boolean.TRUE; isDir = Boolean.TRUE;
} else if (isLink()) { } else if (isLink()) {
ShellFolder linkLocation = getLinkLocation(false); ShellFolder linkLocation = getLinkLocation(false);
......
...@@ -105,9 +105,11 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { ...@@ -105,9 +105,11 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
private static Win32ShellFolder2 network; private static Win32ShellFolder2 network;
private static Win32ShellFolder2 personal; private static Win32ShellFolder2 personal;
private static String osVersion = System.getProperty("os.version"); private static final boolean USE_SHELL32_ICONS = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
private static final boolean useShell32Icons = public Boolean run() {
(osVersion != null && osVersion.compareTo("5.1") >= 0); return OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP) >= 0;
}
});
static Win32ShellFolder2 getDesktop() { static Win32ShellFolder2 getDesktop() {
if (desktop == null) { if (desktop == null) {
...@@ -307,15 +309,15 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { ...@@ -307,15 +309,15 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
i = Integer.parseInt(name); i = Integer.parseInt(name);
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
if (name.equals("ListView")) { if (name.equals("ListView")) {
i = (useShell32Icons) ? 21 : 2; i = (USE_SHELL32_ICONS) ? 21 : 2;
} else if (name.equals("DetailsView")) { } else if (name.equals("DetailsView")) {
i = (useShell32Icons) ? 23 : 3; i = (USE_SHELL32_ICONS) ? 23 : 3;
} else if (name.equals("UpFolder")) { } else if (name.equals("UpFolder")) {
i = (useShell32Icons) ? 28 : 8; i = (USE_SHELL32_ICONS) ? 28 : 8;
} else if (name.equals("NewFolder")) { } else if (name.equals("NewFolder")) {
i = (useShell32Icons) ? 31 : 11; i = (USE_SHELL32_ICONS) ? 31 : 11;
} else if (name.equals("ViewMenu")) { } else if (name.equals("ViewMenu")) {
i = (useShell32Icons) ? 21 : 2; i = (USE_SHELL32_ICONS) ? 21 : 2;
} }
} }
if (i >= 0) { if (i >= 0) {
...@@ -352,11 +354,16 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { ...@@ -352,11 +354,16 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
* Does <code>dir</code> represent a "computer" such as a node on the network, or * Does <code>dir</code> represent a "computer" such as a node on the network, or
* "My Computer" on the desktop. * "My Computer" on the desktop.
*/ */
public boolean isComputerNode(File dir) { public boolean isComputerNode(final File dir) {
if (dir != null && dir == getDrives()) { if (dir != null && dir == getDrives()) {
return true; return true;
} else { } else {
String path = dir.getAbsolutePath(); String path = AccessController.doPrivileged(new PrivilegedAction<String>() {
public String run() {
return dir.getAbsolutePath();
}
});
return (path.startsWith("\\\\") && path.indexOf("\\", 2) < 0); //Network path return (path.startsWith("\\\\") && path.indexOf("\\", 2) < 0); //Network path
} }
} }
...@@ -501,7 +508,7 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { ...@@ -501,7 +508,7 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
// thread, we don't need to delegate the task // thread, we don't need to delegate the task
return task.call(); return task.call();
} else { } else {
Future<T> future; final Future<T> future;
try { try {
future = submit(task); future = submit(task);
...@@ -512,7 +519,13 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { ...@@ -512,7 +519,13 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
try { try {
return future.get(); return future.get();
} catch (InterruptedException e) { } catch (InterruptedException e) {
future.cancel(true); AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
future.cancel(true);
return null;
}
});
throw e; throw e;
} catch (ExecutionException e) { } catch (ExecutionException e) {
......
...@@ -1596,18 +1596,18 @@ void AwtToolkit::RegisterEmbedderProcessId(HWND embedder) ...@@ -1596,18 +1596,18 @@ void AwtToolkit::RegisterEmbedderProcessId(HWND embedder)
} }
JNIEnv* AwtToolkit::m_env; JNIEnv* AwtToolkit::m_env;
HANDLE AwtToolkit::m_thread; DWORD AwtToolkit::m_threadId;
void AwtToolkit::SetEnv(JNIEnv *env) { void AwtToolkit::SetEnv(JNIEnv *env) {
if (m_env != NULL) { // If already cashed (by means of embeddedInit() call). if (m_env != NULL) { // If already cashed (by means of embeddedInit() call).
return; return;
} }
m_thread = GetCurrentThread(); m_threadId = GetCurrentThreadId();
m_env = env; m_env = env;
} }
JNIEnv* AwtToolkit::GetEnv() { JNIEnv* AwtToolkit::GetEnv() {
return (m_env == NULL || m_thread != GetCurrentThread()) ? return (m_env == NULL || m_threadId != GetCurrentThreadId()) ?
(JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2) : m_env; (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2) : m_env;
} }
......
...@@ -442,7 +442,7 @@ public: ...@@ -442,7 +442,7 @@ public:
private: private:
static JNIEnv *m_env; static JNIEnv *m_env;
static HANDLE m_thread; static DWORD m_threadId;
public: public:
static void SetEnv(JNIEnv *env); static void SetEnv(JNIEnv *env);
static JNIEnv* GetEnv(); static JNIEnv* GetEnv();
......
/*
* 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 6868189
* @summary Tests custom BeanInfo in the same package
* @author Sergey Malenkov
*/
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.beans.SimpleBeanInfo;
public class Test6868189 {
private static final String PROPERTY = "$?"; // NON-NLS: the property name
private static final String GETTER = "name"; // NON-NLS: the method name
private static final String SETTER = null;
public static void main(String[] args) throws IntrospectionException {
PropertyDescriptor[] pds = Introspector.getBeanInfo(Enumeration.class).getPropertyDescriptors();
if ((pds.length != 1)|| !PROPERTY.equals(pds[0].getName())){
throw new Error("unexpected property");
}
}
public enum Enumeration {
FIRST, SECOND
}
public static class EnumerationBeanInfo extends SimpleBeanInfo {
@Override
public PropertyDescriptor[] getPropertyDescriptors() {
try {
return new PropertyDescriptor[] {
new PropertyDescriptor(PROPERTY, Enumeration.class, GETTER, SETTER)
};
}
catch (IntrospectionException exception) {
throw new Error("unexpected exception", exception);
}
}
}
}
/*
* 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 6325652
* @summary Tests keyboard shortcuts
* @author Sergey Malenkov
* @library ..
*/
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.beans.PropertyVetoException;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JTextArea;
public class Test6325652 {
private static final int WIDTH = 300;
private static final int HEIGHT = 300;
public static void main(String[] args) throws Throwable {
SwingTest.start(Test6325652.class);
}
private static Robot robot;
private JInternalFrame internal;
public Test6325652(JFrame frame) {
JDesktopPane desktop = new JDesktopPane();
desktop.add(create(0));
desktop.add(this.internal = create(1));
frame.add(desktop);
}
public void select() throws PropertyVetoException {
this.internal.setSelected(true);
}
public static void stepFirst() throws AWTException {
robot = new Robot(); // initialize shared static field first time
click(KeyEvent.VK_CONTROL, KeyEvent.VK_F9); // iconify internal frame
}
public void stepFirstValidate() {
if (!this.internal.isIcon()) {
throw new Error("frame should be an icon");
}
}
public static void stepSecond() {
click(KeyEvent.VK_CONTROL, KeyEvent.VK_F6); // navigate to the icon
click(KeyEvent.VK_CONTROL, KeyEvent.VK_F5); // restore the icon
}
public void stepSecondValidate() {
if (this.internal.isIcon()) {
throw new Error("frame should not be an icon");
}
}
private static void click(int... keys) {
for (int key : keys) {
robot.keyPress(key);
}
for (int key : keys) {
robot.keyRelease(key);
}
}
private static JInternalFrame create(int index) {
String text = "test" + index; // NON-NLS: frame identification
index = index * 3 + 1;
JInternalFrame internal = new JInternalFrame(text, true, true, true, true);
internal.getContentPane().add(new JTextArea(text));
internal.setBounds(10 * index, 10 * index, WIDTH, HEIGHT);
internal.setVisible(true);
return internal;
}
}
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
* @bug 6505027 * @bug 6505027
* @summary Tests focus problem inside internal frame * @summary Tests focus problem inside internal frame
* @author Sergey Malenkov * @author Sergey Malenkov
* @library ..
*/ */
import java.awt.AWTException; import java.awt.AWTException;
...@@ -45,11 +46,10 @@ import javax.swing.JScrollPane; ...@@ -45,11 +46,10 @@ import javax.swing.JScrollPane;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel; import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn; import javax.swing.table.TableColumn;
public class Test6505027 implements Runnable { public class Test6505027 {
private static final boolean INTERNAL = true; private static final boolean INTERNAL = true;
private static final boolean TERMINATE = true; private static final boolean TERMINATE = true;
...@@ -57,80 +57,53 @@ public class Test6505027 implements Runnable { ...@@ -57,80 +57,53 @@ public class Test6505027 implements Runnable {
private static final int WIDTH = 450; private static final int WIDTH = 450;
private static final int HEIGHT = 200; private static final int HEIGHT = 200;
private static final int OFFSET = 10; private static final int OFFSET = 10;
private static final long PAUSE = 2048L;
private static final String[] COLUMNS = { "Size", "Shape" }; // NON-NLS private static final String[] COLUMNS = { "Size", "Shape" }; // NON-NLS: column names
private static final String[] ITEMS = { "a", "b", "c", "d" }; // NON-NLS private static final String[] ITEMS = { "a", "b", "c", "d" }; // NON-NLS: combobox content
private static final String KEY = "terminateEditOnFocusLost"; // NON-NLS private static final String KEY = "terminateEditOnFocusLost"; // NON-NLS: property name
public static void main(String[] args) { public static void main(String[] args) throws Throwable {
SwingUtilities.invokeLater(new Test6505027()); SwingTest.start(Test6505027.class);
Component component = null;
while (component == null) {
try {
Thread.sleep(PAUSE);
}
catch (InterruptedException exception) {
// ignore interrupted exception
}
component = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
}
if (!component.getClass().equals(JComboBox.class)) {
throw new Error("unexpected focus owner: " + component);
}
SwingUtilities.getWindowAncestor(component).dispose();
} }
private JTable table; private final JTable table = new JTable(new DefaultTableModel(COLUMNS, 2));
private Point point;
public Test6505027(JFrame main) {
Container container = main;
if (INTERNAL) {
JInternalFrame frame = new JInternalFrame();
frame.setBounds(OFFSET, OFFSET, WIDTH, HEIGHT);
frame.setVisible(true);
public void run() { JDesktopPane desktop = new JDesktopPane();
if (this.table == null) { desktop.add(frame, new Integer(1));
JFrame main = new JFrame();
main.setSize(WIDTH + OFFSET * 3, HEIGHT + OFFSET * 5);
main.setLocationRelativeTo(null);
main.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
main.setVisible(true);
Container container = main; container.add(desktop);
if (INTERNAL) { container = frame;
JInternalFrame frame = new JInternalFrame(); }
frame.setBounds(OFFSET, OFFSET, WIDTH, HEIGHT); if (TERMINATE) {
frame.setVisible(true); this.table.putClientProperty(KEY, Boolean.TRUE);
}
TableColumn column = this.table.getColumn(COLUMNS[1]);
column.setCellEditor(new DefaultCellEditor(new JComboBox(ITEMS)));
JDesktopPane desktop = new JDesktopPane(); container.add(BorderLayout.NORTH, new JTextField());
desktop.add(frame, new Integer(1)); container.add(BorderLayout.CENTER, new JScrollPane(this.table));
}
container.add(desktop); public void press() throws AWTException {
container = frame; Point point = this.table.getCellRect(1, 1, false).getLocation();
} SwingUtilities.convertPointToScreen(point, this.table);
this.table = new JTable(new DefaultTableModel(COLUMNS, 2));
if (TERMINATE) {
this.table.putClientProperty(KEY, Boolean.TRUE);
}
TableColumn column = this.table.getColumn(COLUMNS[1]);
column.setCellEditor(new DefaultCellEditor(new JComboBox(ITEMS)));
container.add(BorderLayout.NORTH, new JTextField()); Robot robot = new Robot();
container.add(BorderLayout.CENTER, new JScrollPane(this.table)); robot.mouseMove(point.x + 1, point.y + 1);
robot.mousePress(InputEvent.BUTTON1_MASK);
}
SwingUtilities.invokeLater(this); public static void validate() {
} Component component = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
else if (this.point == null) { if (!component.getClass().equals(JComboBox.class)) {
this.point = this.table.getCellRect(1, 1, false).getLocation(); throw new Error("unexpected focus owner: " + component);
SwingUtilities.convertPointToScreen(this.point, this.table);
SwingUtilities.invokeLater(this);
}
else {
try {
Robot robot = new Robot();
robot.mouseMove(this.point.x + 1, this.point.y + 1);
robot.mousePress(InputEvent.BUTTON1_MASK);
}
catch (AWTException exception) {
throw new Error("unexpected exception", exception);
}
} }
} }
} }
...@@ -26,83 +26,73 @@ ...@@ -26,83 +26,73 @@
* @bug 6802868 * @bug 6802868
* @summary JInternalFrame is not maximized when maximized parent frame * @summary JInternalFrame is not maximized when maximized parent frame
* @author Alexander Potochkin * @author Alexander Potochkin
* @library ..
*/ */
import sun.awt.SunToolkit;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Point; import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import java.beans.PropertyVetoException; import java.beans.PropertyVetoException;
import javax.swing.JDesktopPane; import javax.swing.JDesktopPane;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JInternalFrame; import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;
public class Test6802868 { public class Test6802868 {
static JInternalFrame jif;
static JFrame frame; public static void main(String[] args) throws Throwable {
static Dimension size; SwingTest.start(Test6802868.class);
static Point location; }
public static void main(String[] args) throws Exception { private final JFrame frame;
Robot robot = new Robot(); private final JInternalFrame internal;
robot.setAutoDelay(20); private Dimension size;
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); private Point location;
SwingUtilities.invokeAndWait(new Runnable() { public Test6802868(JFrame frame) {
public void run() { JDesktopPane desktop = new JDesktopPane();
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.frame = frame;
this.frame.add(desktop);
JDesktopPane jdp = new JDesktopPane();
frame.getContentPane().add(jdp); this.internal = new JInternalFrame(getClass().getName(), true, true, true, true);
this.internal.setVisible(true);
jif = new JInternalFrame("Title", true, true, true, true);
jdp.add(jif); desktop.add(this.internal);
jif.setVisible(true); }
frame.setSize(200, 200); public void firstAction() throws PropertyVetoException {
frame.setLocationRelativeTo(null); this.internal.setMaximum(true);
frame.setVisible(true); }
try { public void firstTest() {
jif.setMaximum(true); this.size = this.internal.getSize();
} catch (Exception e) { resizeFrame();
e.printStackTrace(); }
}
} public void firstValidation() {
}); if (this.internal.getSize().equals(this.size)) {
toolkit.realSync(); throw new Error("InternalFrame hasn't changed its size");
SwingUtilities.invokeAndWait(new Runnable() { }
public void run() { }
size = jif.getSize();
frame.setSize(300, 300); public void secondAction() throws PropertyVetoException {
} this.internal.setIcon(true);
}); }
toolkit.realSync();
SwingUtilities.invokeAndWait(new Runnable() { public void secondTest() {
public void run() { this.location = this.internal.getDesktopIcon().getLocation();
if (jif.getSize().equals(size)) { resizeFrame();
throw new RuntimeException("InternalFrame hasn't changed its size"); }
}
try { public void secondValidation() {
jif.setIcon(true); if (this.internal.getDesktopIcon().getLocation().equals(this.location)) {
} catch (PropertyVetoException e) { throw new Error("JDesktopIcon hasn't moved");
e.printStackTrace(); }
} }
location = jif.getDesktopIcon().getLocation();
frame.setSize(400, 400); private void resizeFrame() {
} Dimension size = this.frame.getSize();
}); size.width += 10;
toolkit.realSync(); size.height += 10;
SwingUtilities.invokeAndWait(new Runnable() { this.frame.setSize(size);
public void run() {
if (jif.getDesktopIcon().getLocation().equals(location)) {
throw new RuntimeException("JDesktopIcon hasn't moved");
}
}
});
} }
} }
/*
* @test
* @summary Makes sure that JLayer is synchronizable
* @author Alexander Potochkin
* @run main SerializationTest
*/
import javax.swing.*;
import javax.swing.plaf.LayerUI;
import java.io.ByteArrayInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.ByteArrayOutputStream;
public class SerializationTest {
public static void main(String[] args) throws Exception {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(byteArrayOutputStream);
JLayer<JButton> layer = new JLayer<JButton>(new JButton("Hello"));
layer.setUI(new TestLayerUI<JButton>());
outputStream.writeObject(layer);
outputStream.flush();
ByteArrayInputStream byteArrayInputStream =
new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream);
JLayer newLayer = (JLayer) inputStream.readObject();
if (newLayer.getLayout() == null) {
throw new RuntimeException("JLayer's layout is null");
}
if (newLayer.getGlassPane() == null) {
throw new RuntimeException("JLayer's glassPane is null");
}
if (newLayer.getUI().getClass() != layer.getUI().getClass()) {
throw new RuntimeException("Different UIs");
}
if (newLayer.getView().getClass() != layer.getView().getClass()) {
throw new RuntimeException("Different Views");
}
}
static class TestLayerUI<V extends JComponent> extends LayerUI<V> {
public String toString() {
return "TestLayerUI";
}
}
}
\ No newline at end of file
...@@ -27,10 +27,9 @@ ...@@ -27,10 +27,9 @@
* @summary Resizes right-oriented scroll pane * @summary Resizes right-oriented scroll pane
* @author Sergey Malenkov * @author Sergey Malenkov
* @library .. * @library ..
* @build SwingTest
* @run main Test6526631
*/ */
import java.awt.ComponentOrientation;
import java.awt.Dimension; import java.awt.Dimension;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JScrollBar; import javax.swing.JScrollBar;
...@@ -38,15 +37,13 @@ import javax.swing.JScrollPane; ...@@ -38,15 +37,13 @@ import javax.swing.JScrollPane;
import javax.swing.JTextArea; import javax.swing.JTextArea;
import javax.swing.JViewport; import javax.swing.JViewport;
import static java.awt.ComponentOrientation.RIGHT_TO_LEFT;
public class Test6526631 { public class Test6526631 {
private static final int COLS = 90; private static final int COLS = 90;
private static final int ROWS = 50; private static final int ROWS = 50;
private static final int OFFSET = 10; private static final int OFFSET = 10;
public static void main(String[] args) { public static void main(String[] args) throws Throwable {
SwingTest.start(Test6526631.class); SwingTest.start(Test6526631.class);
} }
...@@ -55,7 +52,7 @@ public class Test6526631 { ...@@ -55,7 +52,7 @@ public class Test6526631 {
public Test6526631(JFrame frame) { public Test6526631(JFrame frame) {
this.pane = new JScrollPane(new JTextArea(ROWS, COLS)); this.pane = new JScrollPane(new JTextArea(ROWS, COLS));
this.pane.setComponentOrientation(RIGHT_TO_LEFT); this.pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
this.frame = frame; this.frame = frame;
this.frame.add(this.pane); this.frame.add(this.pane);
} }
...@@ -79,24 +76,24 @@ public class Test6526631 { ...@@ -79,24 +76,24 @@ public class Test6526631 {
public void validateThird() { public void validateThird() {
JViewport viewport = this.pane.getViewport(); JViewport viewport = this.pane.getViewport();
JScrollBar scroller = this.pane.getHorizontalScrollBar(); JScrollBar scroller = this.pane.getHorizontalScrollBar();
if (!scroller.getComponentOrientation().equals(RIGHT_TO_LEFT)) { if (!scroller.getComponentOrientation().equals(ComponentOrientation.RIGHT_TO_LEFT)) {
throw new IllegalStateException("unexpected component orientation"); throw new Error("unexpected component orientation");
} }
int value = scroller.getValue(); int value = scroller.getValue();
if (value != 0) { if (value != 0) {
throw new IllegalStateException("unexpected scroll value"); throw new Error("unexpected scroll value");
} }
int extent = viewport.getExtentSize().width; int extent = viewport.getExtentSize().width;
if (extent != scroller.getVisibleAmount()) { if (extent != scroller.getVisibleAmount()) {
throw new IllegalStateException("unexpected visible amount"); throw new Error("unexpected visible amount");
} }
int size = viewport.getViewSize().width; int size = viewport.getViewSize().width;
if (size != scroller.getMaximum()) { if (size != scroller.getMaximum()) {
throw new IllegalStateException("unexpected maximum"); throw new Error("unexpected maximum");
} }
int pos = size - extent - value; int pos = size - extent - value;
if (pos != viewport.getViewPosition().x) { if (pos != viewport.getViewPosition().x) {
throw new IllegalStateException("unexpected position"); throw new Error("unexpected position");
} }
} }
} }
/*
* 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 6593649
@summary Word wrap does not work in JTextArea: long lines are not wrapped
@author Lillian Angel
@run main Test6593649
*/
import javax.swing.*;
import java.awt.*;
public class Test6593649 extends JFrame {
static JTextArea txt;
static JPanel innerPanel;
public Test6593649(Dimension d)
{
super("Word Wrap Testcase");
setSize(d);
final Container contentPane = getContentPane();
innerPanel = new JPanel();
innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.LINE_AXIS));
txt = new JTextArea("This is a long line that should wrap, but doesn't...");
txt.setLineWrap(true);
txt.setWrapStyleWord(true);
innerPanel.add(txt);
contentPane.add(innerPanel, BorderLayout.SOUTH);
}
public static void main(String[] args) throws InterruptedException
{
int size = 100;
Dimension d;
Test6593649 cp;
Dimension txtSize;
Dimension innerSize;
Dimension cpSize;
while (size <= 600)
{
d = new Dimension(size, size);
cp = new Test6593649(d);
cp.setVisible(true);
txtSize = txt.getPreferredSize();
innerSize = innerPanel.getPreferredSize();
cpSize = cp.getSize();
if (!(txtSize.getWidth() == innerPanel.getWidth() && txtSize.getHeight() == innerPanel.getHeight() &&
txtSize.getWidth() <= cpSize.getWidth() && txtSize.getHeight() <= cpSize.getHeight()))
{
throw new RuntimeException("Test failed: Text area size does not properly match panel and frame sizes");
}
Thread.sleep(2000);
cp.hide();
size += 50;
}
}
}
...@@ -21,7 +21,8 @@ ...@@ -21,7 +21,8 @@
* have any questions. * have any questions.
*/ */
import java.io.PrintWriter; import sun.awt.SunToolkit;
import java.awt.Toolkit;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
...@@ -30,12 +31,18 @@ import java.util.Iterator; ...@@ -30,12 +31,18 @@ import java.util.Iterator;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import static javax.swing.SwingUtilities.invokeLater;
/** /**
* SwingTestHelper is a utility class for writing regression tests * SwingTest is a utility class for writing regression tests
* that require interacting with the UI. * that require interacting with the UI.
* It uses reflection to invoke all public methods without parameters.
* All static methods are starting on the current thread.
* Other methods including constructor are starting on the EDT.
* Between each method invocation all pending events are processed.
* The methods are sorted by name and invoked in that order.
* Failure of the test is signaled by any method throwing an exception.
* If no methods throw an exception the test is assumed to have passed.
* *
* @author Sergey A. Malenkov * @author Sergey A. Malenkov
*/ */
...@@ -44,99 +51,56 @@ final class SwingTest implements Runnable { ...@@ -44,99 +51,56 @@ final class SwingTest implements Runnable {
private static final int WIDTH = 640; private static final int WIDTH = 640;
private static final int HEIGHT = 480; private static final int HEIGHT = 480;
public static void start(Class<?> type) { public static void start(Class<?> type) throws Throwable {
new SwingTest(type).start(); new SwingTest(type).start();
} }
private final PrintWriter writer = new PrintWriter(System.out, true); private final Class<?> type;
private final Iterator<Method> methods;
private Class<?> type;
private JFrame frame; private JFrame frame;
private Iterator<Method> methods;
private Object object; private Object object;
private Method method; private Method method;
private Throwable error; private Throwable error;
private SwingTest(Class<?> type) { private SwingTest(Class<?> type) {
this.type = type; Set<Method> methods = new TreeSet<Method>(new Comparator<Method>() {
} public int compare(Method first, Method second) {
return first.getName().compareTo(second.getName());
public void run() {
synchronized (this.writer) {
if (this.error != null) {
this.frame.dispose();
this.frame = null;
}
else if (this.object == null) {
invoke();
Set<Method> methods = new TreeSet<Method>(new Comparator<Method>() {
public int compare(Method first, Method second) {
return first.getName().compareTo(second.getName());
}
});
for (Method method : this.type.getMethods()) {
if (method.getDeclaringClass().equals(this.type)) {
if (method.getReturnType().equals(void.class)) {
if (0 == method.getParameterTypes().length) {
methods.add(method);
}
}
}
}
this.methods = methods.iterator();
} }
else if (this.method != null) { });
invoke(); for (Method method : type.getMethods()) {
} if (method.getDeclaringClass().equals(type)) {
else if (this.methods.hasNext()) { if (method.getReturnType().equals(void.class)) {
this.method = this.methods.next(); if (0 == method.getParameterTypes().length) {
} methods.add(method);
else {
this.frame.dispose();
this.frame = null;
this.type = null;
}
this.writer.notifyAll();
}
}
private void start() {
synchronized (this.writer) {
while (this.type != null) {
if ((this.method != null) && Modifier.isStatic(this.method.getModifiers())) {
invoke();
}
else {
invokeLater(this);
try {
this.writer.wait();
} }
catch (InterruptedException exception) {
exception.printStackTrace(this.writer);
}
}
if ((this.frame == null) && (this.error != null)) {
throw new Error("unexpected error", this.error);
} }
} }
} }
this.type = type;
this.methods = methods.iterator();
} }
private void invoke() { public void run() {
try { try {
if (this.method != null) { if (this.object == null) {
this.writer.println(this.method); System.out.println(this.type);
this.method.invoke(this.object);
this.method = null;
}
else {
this.writer.println(this.type);
this.frame = new JFrame(this.type.getSimpleName()); this.frame = new JFrame(this.type.getSimpleName());
this.frame.setSize(WIDTH, HEIGHT); this.frame.setSize(WIDTH, HEIGHT);
this.frame.setLocationRelativeTo(null); this.frame.setLocationRelativeTo(null);
this.object = this.type.getConstructor(JFrame.class).newInstance(this.frame); this.object = this.type.getConstructor(this.frame.getClass()).newInstance(this.frame);
this.frame.setVisible(true); this.frame.setVisible(true);
} }
else if (this.method != null) {
System.out.println(this.method);
this.method.invoke(this.object);
}
else {
System.out.println((this.error == null) ? "PASSED" : "FAILED"); // NON-NLS: debug
this.frame.dispose();
this.frame = null;
}
} }
catch (NoSuchMethodException exception) { catch (NoSuchMethodException exception) {
this.error = exception; this.error = exception;
...@@ -156,5 +120,29 @@ final class SwingTest implements Runnable { ...@@ -156,5 +120,29 @@ final class SwingTest implements Runnable {
catch (InvocationTargetException exception) { catch (InvocationTargetException exception) {
this.error = exception.getTargetException(); this.error = exception.getTargetException();
} }
System.out.flush();
this.method = this.methods.hasNext() && (this.error == null)
? this.methods.next()
: null;
}
private void start() throws Throwable {
do {
if ((this.method != null) && Modifier.isStatic(this.method.getModifiers())) {
run(); // invoke static method on the current thread
}
else {
SwingUtilities.invokeLater(this); // invoke on the event dispatch thread
}
Toolkit tk = Toolkit.getDefaultToolkit();
if (tk instanceof SunToolkit) {
SunToolkit stk = (SunToolkit) tk;
stk.realSync(); // wait until done
}
}
while (this.frame != null);
if (this.error != null) {
throw this.error;
}
} }
} }
/*
* 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 6539700
* @summary test that the long space-less lines are correctly soft-wrapped
* @author Sergey Groznyh
* @run main bug6539700
*/
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.text.ParagraphView;
import javax.swing.text.View;
public class bug6539700 {
static JFrame f;
static JEditorPane ep;
static String text = "AAAAAAAA<b>AAAAAA</b>AAAAAAAA<b>AAAAAAAAA</b>" +
"AA<b>AAA</b>AAAAAAAAA";
static int size = 100;
static Class rowClass = null;
static void createContentPane() {
ep = new JEditorPane();
ep.setContentType("text/html");
ep.setEditable(false);
ep.setText(text);
f = new JFrame();
f.setSize(size, 2 * size);
f.add(ep);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
static void checkRows(View v, boolean last) {
int width = (int) v.getPreferredSpan(View.X_AXIS);
if (v.getClass() == rowClass) {
// Row width shouldn't exceed the container width
if (width > size) {
throw new RuntimeException("too long row: " + width);
}
// Row shouldn't be too short (except for the last one)
if (!last) {
if (width < size * 2 / 3) {
throw new RuntimeException("too short row: " + width);
}
}
}
int n = v.getViewCount();
if (n > 0) {
for (int i = 0; i < n; i++) {
View c = v.getView(i);
checkRows(c, i == n - 1);
}
}
}
public static void main(String[] argv) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createContentPane();
}
});
} catch (Exception ex) {
throw new RuntimeException(ex);
}
Class[] pvchildren = ParagraphView.class.getDeclaredClasses();
for (Class c : pvchildren) {
if (c.getName().equals("javax.swing.text.ParagraphView$Row")) {
rowClass = c;
break;
}
}
if (rowClass == null) {
throw new RuntimeException("can't find ParagraphView.Row class");
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
checkRows(ep.getUI().getRootView(ep), true);
}
});
System.out.println("OK");
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册