# HG changeset patch # User lana # Date 1213819516 25200 # Node ID 3b56e15774b815d6d015d23d7170b475b2e890f5 # Parent bfe4572fd301a6fcd120373cdb2eff5d2da0c72c# Parent b375ecec621f7ba3e2a039329477650ff5f712e5 Merge diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifLookAndFeel.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifLookAndFeel.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifLookAndFeel.java Wed Jun 18 13:05:16 2008 -0700 @@ -1222,9 +1222,7 @@ "FileChooser.enterFileNameLabelMnemonic", new Integer (KeyEvent.VK_N), // 'n' "FileChooser.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[] { - "ESCAPE", "cancelSelection", - "ENTER", "approveSelection", - "ctrl ENTER", "approveSelection" + "ESCAPE", "cancelSelection" }), diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Wed Jun 18 13:05:16 2008 -0700 @@ -825,9 +825,7 @@ "ESCAPE", "cancelSelection", "F2", "editFileName", "F5", "refresh", - "BACK_SPACE", "Go Up", - "ENTER", "approveSelection", - "ctrl ENTER", "approveSelection" + "BACK_SPACE", "Go Up" }), "FileView.directoryIcon", SwingUtilities2.makeIcon(getClass(), diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/java/beans/EventHandler.java --- a/jdk/src/share/classes/java/beans/EventHandler.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/java/beans/EventHandler.java Wed Jun 18 13:05:16 2008 -0700 @@ -636,7 +636,7 @@ * time a mouse button is pressed, one would write: *
*
-     *EventHandler.create(MouseListener.class, "mousePressed", target, "origin", "point");
+     *EventHandler.create(MouseListener.class, target, "origin", "point", "mousePressed");
      *
*
* diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/java/io/File.java --- a/jdk/src/share/classes/java/io/File.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/java/io/File.java Wed Jun 18 13:05:16 2008 -0700 @@ -25,6 +25,7 @@ package java.io; +import java.beans.ConstructorProperties; import java.net.URI; import java.net.URL; import java.net.MalformedURLException; @@ -234,6 +235,7 @@ * @throws NullPointerException * If the pathname argument is null */ + @ConstructorProperties("path") public File(String pathname) { if (pathname == null) { throw new NullPointerException(); diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/javax/swing/JFileChooser.java --- a/jdk/src/share/classes/javax/swing/JFileChooser.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JFileChooser.java Wed Jun 18 13:05:16 2008 -0700 @@ -770,7 +770,8 @@ * @since 1.4 */ protected JDialog createDialog(Component parent) throws HeadlessException { - String title = getUI().getDialogTitle(this); + FileChooserUI ui = getUI(); + String title = ui.getDialogTitle(this); putClientProperty(AccessibleContext.ACCESSIBLE_DESCRIPTION_PROPERTY, title); @@ -794,6 +795,7 @@ dialog.getRootPane().setWindowDecorationStyle(JRootPane.FILE_CHOOSER_DIALOG); } } + dialog.getRootPane().setDefaultButton(ui.getDefaultButton(this)); dialog.pack(); dialog.setLocationRelativeTo(parent); diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/javax/swing/JPopupMenu.java --- a/jdk/src/share/classes/javax/swing/JPopupMenu.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JPopupMenu.java Wed Jun 18 13:05:16 2008 -0700 @@ -41,6 +41,7 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicComboPopup; import javax.swing.event.*; +import sun.security.util.SecurityConstants; import java.applet.Applet; @@ -320,17 +321,67 @@ * This adustment may be cancelled by invoking the application with * -Djavax.swing.adjustPopupLocationToFit=false */ - Point adjustPopupLocationToFitScreen(int xposition, int yposition) { - Point p = new Point(xposition, yposition); + Point adjustPopupLocationToFitScreen(int xPosition, int yPosition) { + Point popupLocation = new Point(xPosition, yPosition); + + if(popupPostionFixDisabled == true || GraphicsEnvironment.isHeadless()) { + return popupLocation; + } - if(popupPostionFixDisabled == true || GraphicsEnvironment.isHeadless()) - return p; + // Get screen bounds + Rectangle scrBounds; + GraphicsConfiguration gc = getCurrentGraphicsConfiguration(popupLocation); + Toolkit toolkit = Toolkit.getDefaultToolkit(); + if(gc != null) { + // If we have GraphicsConfiguration use it to get screen bounds + scrBounds = gc.getBounds(); + } else { + // If we don't have GraphicsConfiguration use primary screen + scrBounds = new Rectangle(toolkit.getScreenSize()); + } - Toolkit toolkit = Toolkit.getDefaultToolkit(); - Rectangle screenBounds; + // Calculate the screen size that popup should fit + Dimension popupSize = JPopupMenu.this.getPreferredSize(); + int popupRightX = popupLocation.x + popupSize.width; + int popupBottomY = popupLocation.y + popupSize.height; + int scrWidth = scrBounds.width; + int scrHeight = scrBounds.height; + if (!canPopupOverlapTaskBar()) { + // Insets include the task bar. Take them into account. + Insets scrInsets = toolkit.getScreenInsets(gc); + scrBounds.x += scrInsets.left; + scrBounds.y += scrInsets.top; + scrWidth -= scrInsets.left + scrInsets.right; + scrHeight -= scrInsets.top + scrInsets.bottom; + } + int scrRightX = scrBounds.x + scrWidth; + int scrBottomY = scrBounds.y + scrHeight; + + // Ensure that popup menu fits the screen + if (popupRightX > scrRightX) { + popupLocation.x = scrRightX - popupSize.width; + if( popupLocation.x < scrBounds.x ) { + popupLocation.x = scrBounds.x ; + } + } + if (popupBottomY > scrBottomY) { + popupLocation.y = scrBottomY - popupSize.height; + if( popupLocation.y < scrBounds.y ) { + popupLocation.y = scrBounds.y; + } + } + + return popupLocation; + } + + /** + * Tries to find GraphicsConfiguration + * that contains the mouse cursor position. + * Can return null. + */ + private GraphicsConfiguration getCurrentGraphicsConfiguration( + Point popupLocation) { GraphicsConfiguration gc = null; - // Try to find GraphicsConfiguration, that includes mouse - // pointer position GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gd = ge.getScreenDevices(); @@ -338,50 +389,36 @@ if(gd[i].getType() == GraphicsDevice.TYPE_RASTER_SCREEN) { GraphicsConfiguration dgc = gd[i].getDefaultConfiguration(); - if(dgc.getBounds().contains(p)) { + if(dgc.getBounds().contains(popupLocation)) { gc = dgc; break; } } } - // If not found and we have invoker, ask invoker about his gc if(gc == null && getInvoker() != null) { gc = getInvoker().getGraphicsConfiguration(); } - - if(gc != null) { - // If we have GraphicsConfiguration use it to get - // screen bounds - screenBounds = gc.getBounds(); - } else { - // If we don't have GraphicsConfiguration use primary screen - screenBounds = new Rectangle(toolkit.getScreenSize()); - } - - Dimension size; - - size = JPopupMenu.this.getPreferredSize(); + return gc; + } - // Use long variables to prevent overflow - long pw = (long) p.x + (long) size.width; - long ph = (long) p.y + (long) size.height; - - if( pw > screenBounds.x + screenBounds.width ) - p.x = screenBounds.x + screenBounds.width - size.width; - - if( ph > screenBounds.y + screenBounds.height) - p.y = screenBounds.y + screenBounds.height - size.height; - - /* Change is made to the desired (X,Y) values, when the - PopupMenu is too tall OR too wide for the screen - */ - if( p.x < screenBounds.x ) - p.x = screenBounds.x ; - if( p.y < screenBounds.y ) - p.y = screenBounds.y; - - return p; + /** + * Checks that there are enough security permissions + * to make popup "always on top", which allows to show it above the task bar. + */ + static boolean canPopupOverlapTaskBar() { + boolean result = true; + try { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + sm.checkPermission( + SecurityConstants.SET_WINDOW_ALWAYS_ON_TOP_PERMISSION); + } + } catch (SecurityException se) { + // There is no permission to show popups over the task bar + result = false; + } + return result; } diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/javax/swing/JSlider.java --- a/jdk/src/share/classes/javax/swing/JSlider.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JSlider.java Wed Jun 18 13:05:16 2008 -0700 @@ -25,18 +25,15 @@ package javax.swing; -import javax.swing.border.*; import javax.swing.event.*; import javax.swing.plaf.*; import javax.accessibility.*; import java.io.Serializable; import java.io.ObjectOutputStream; -import java.io.ObjectInputStream; import java.io.IOException; -import java.awt.Color; -import java.awt.Font; +import java.awt.*; import java.util.*; import java.beans.*; @@ -409,8 +406,7 @@ * @since 1.4 */ public ChangeListener[] getChangeListeners() { - return (ChangeListener[])listenerList.getListeners( - ChangeListener.class); + return listenerList.getListeners(ChangeListener.class); } @@ -642,9 +638,7 @@ /** * Sets the model's {@code valueIsAdjusting} property. Slider look and * feel implementations should set this property to {@code true} when - * a knob drag begins, and to {@code false} when the drag ends. The - * slider model will not generate {@code ChangeEvent}s while - * {@code valueIsAdjusting} is {@code true}. + * a knob drag begins, and to {@code false} when the drag ends. * * @param b the new value for the {@code valueIsAdjusting} property * @see #getValueIsAdjusting @@ -764,6 +758,33 @@ updateLabelSizes(); } + /** + * {@inheritDoc} + * @since 1.7 + */ + public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) { + if (!isShowing()) { + return false; + } + + // Check that there is a label with such image + Enumeration elements = labelTable.elements(); + + while (elements.hasMoreElements()) { + Component component = (Component) elements.nextElement(); + + if (component instanceof JLabel) { + JLabel label = (JLabel) component; + + if (SwingUtilities.doesIconReferenceImage(label.getIcon(), img) || + SwingUtilities.doesIconReferenceImage(label.getDisabledIcon(), img)) { + return super.imageUpdate(img, infoflags, x, y, w, h); + } + } + } + + return false; + } /** * Returns the dictionary of what labels to draw at which values. @@ -826,17 +847,16 @@ * @see JComponent#updateUI */ protected void updateLabelUIs() { - if ( getLabelTable() == null ) { + Dictionary labelTable = getLabelTable(); + + if (labelTable == null) { return; } - Enumeration labels = getLabelTable().keys(); + Enumeration labels = labelTable.keys(); while ( labels.hasMoreElements() ) { - Object value = getLabelTable().get( labels.nextElement() ); - if ( value instanceof JComponent ) { - JComponent component = (JComponent)value; - component.updateUI(); - component.setSize( component.getPreferredSize() ); - } + JComponent component = (JComponent) labelTable.get(labels.nextElement()); + component.updateUI(); + component.setSize(component.getPreferredSize()); } } @@ -845,11 +865,8 @@ if (labelTable != null) { Enumeration labels = labelTable.elements(); while (labels.hasMoreElements()) { - Object value = labels.nextElement(); - if (value instanceof JComponent) { - JComponent component = (JComponent)value; - component.setSize(component.getPreferredSize()); - } + JComponent component = (JComponent) labels.nextElement(); + component.setSize(component.getPreferredSize()); } } } @@ -960,14 +977,14 @@ if ( e.getPropertyName().equals( "minimum" ) || e.getPropertyName().equals( "maximum" ) ) { - Enumeration keys = getLabelTable().keys(); - Object key = null; + Dictionary labelTable = getLabelTable(); + Enumeration keys = labelTable.keys(); Hashtable hashtable = new Hashtable(); // Save the labels that were added by the developer while ( keys.hasMoreElements() ) { - key = keys.nextElement(); - Object value = getLabelTable().get( key ); + Object key = keys.nextElement(); + Object value = labelTable.get(key); if ( !(value instanceof LabelUIResource) ) { hashtable.put( key, value ); } @@ -979,7 +996,7 @@ // Add the saved labels keys = hashtable.keys(); while ( keys.hasMoreElements() ) { - key = keys.nextElement(); + Object key = keys.nextElement(); put( key, hashtable.get( key ) ); } @@ -996,8 +1013,10 @@ SmartHashtable table = new SmartHashtable( increment, start ); - if ( getLabelTable() != null && (getLabelTable() instanceof PropertyChangeListener) ) { - removePropertyChangeListener( (PropertyChangeListener)getLabelTable() ); + Dictionary labelTable = getLabelTable(); + + if (labelTable != null && (labelTable instanceof PropertyChangeListener)) { + removePropertyChangeListener((PropertyChangeListener) labelTable); } addPropertyChangeListener( table ); diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/javax/swing/PopupFactory.java --- a/jdk/src/share/classes/javax/swing/PopupFactory.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/PopupFactory.java Wed Jun 18 13:05:16 2008 -0700 @@ -548,47 +548,46 @@ } /** - * Returns true if the Popup can fit on the screen. + * Returns true if popup can fit the screen and the owner's top parent. + * It determines can popup be lightweight or mediumweight. */ boolean fitsOnScreen() { + boolean result = false; Component component = getComponent(); - if (owner != null && component != null) { - Container parent; - int width = component.getWidth(); - int height = component.getHeight(); - for(parent = owner.getParent(); parent != null ; - parent = parent.getParent()) { - if (parent instanceof JFrame || - parent instanceof JDialog || - parent instanceof JWindow) { + Container parent = (Container) SwingUtilities.getRoot(owner); + int popupWidth = component.getWidth(); + int popupHeight = component.getHeight(); + Rectangle parentBounds = parent.getBounds(); + if (parent instanceof JFrame || + parent instanceof JDialog || + parent instanceof JWindow) { + + Insets i = parent.getInsets(); + parentBounds.x += i.left; + parentBounds.y += i.top; + parentBounds.width -= i.left + i.right; + parentBounds.height -= i.top + i.bottom; - Rectangle r = parent.getBounds(); - Insets i = parent.getInsets(); - r.x += i.left; - r.y += i.top; - r.width -= (i.left + i.right); - r.height -= (i.top + i.bottom); - - GraphicsConfiguration gc = parent.getGraphicsConfiguration(); + if (JPopupMenu.canPopupOverlapTaskBar()) { + GraphicsConfiguration gc = + parent.getGraphicsConfiguration(); Rectangle popupArea = getContainerPopupArea(gc); - return r.intersection(popupArea).contains(x, y, width, height); - - } else if (parent instanceof JApplet) { - Rectangle r = parent.getBounds(); - Point p = parent.getLocationOnScreen(); - - r.x = p.x; - r.y = p.y; - return r.contains(x, y, width, height); - } else if (parent instanceof Window || - parent instanceof Applet) { - // No suitable swing component found - break; + result = parentBounds.intersection(popupArea) + .contains(x, y, popupWidth, popupHeight); + } else { + result = parentBounds + .contains(x, y, popupWidth, popupHeight); } + } else if (parent instanceof JApplet) { + Point p = parent.getLocationOnScreen(); + parentBounds.x = p.x; + parentBounds.y = p.y; + result = parentBounds + .contains(x, y, popupWidth, popupHeight); } } - return false; + return result; } Rectangle getContainerPopupArea(GraphicsConfiguration gc) { diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/javax/swing/plaf/FileChooserUI.java --- a/jdk/src/share/classes/javax/swing/plaf/FileChooserUI.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/FileChooserUI.java Wed Jun 18 13:05:16 2008 -0700 @@ -25,7 +25,7 @@ package javax.swing.plaf; -import javax.swing.JFileChooser; +import javax.swing.*; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileView; import java.io.File; @@ -46,4 +46,15 @@ public abstract void rescanCurrentDirectory(JFileChooser fc); public abstract void ensureFileIsVisible(JFileChooser fc, File f); + + /** + * Returns default button for current LookAndFeel. + * JFileChooser will use this button as default button + * for dialog windows. + * + * @since 1.7 + */ + public JButton getDefaultButton(JFileChooser fc) { + return null; + } } diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicDirectoryModel.java Wed Jun 18 13:05:16 2008 -0700 @@ -196,7 +196,7 @@ } protected void sort(Vector v){ - ShellFolder.sortFiles(v); + ShellFolder.sort(v); } // Obsolete - not used diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java Wed Jun 18 13:05:16 2008 -0700 @@ -384,6 +384,10 @@ return null; } + public JButton getDefaultButton(JFileChooser fc) { + return getApproveButton(fc); + } + public String getApproveButtonToolTipText(JFileChooser fc) { String tooltipText = fc.getApproveButtonToolTipText(); if(tooltipText != null) { diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Wed Jun 18 13:05:16 2008 -0700 @@ -25,25 +25,12 @@ package javax.swing.plaf.basic; -import java.awt.Component; -import java.awt.Container; -import java.awt.Adjustable; import java.awt.event.*; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Dimension; -import java.awt.Rectangle; -import java.awt.Point; -import java.awt.Insets; -import java.awt.Color; -import java.awt.IllegalComponentStateException; -import java.awt.Polygon; +import java.awt.*; import java.beans.*; import java.util.Dictionary; import java.util.Enumeration; -import javax.swing.border.AbstractBorder; - import javax.swing.*; import javax.swing.event.*; import javax.swing.plaf.*; @@ -409,7 +396,7 @@ Enumeration elements = dictionary.elements(); int baseline = -1; while (elements.hasMoreElements()) { - Component label = (Component)elements.nextElement(); + JComponent label = (JComponent) elements.nextElement(); Dimension pref = label.getPreferredSize(); int labelBaseline = label.getBaseline(pref.width, pref.height); @@ -634,7 +621,7 @@ protected void calculateTrackRect() { - int centerSpacing = 0; // used to center sliders added using BorderLayout.CENTER (bug 4275631) + int centerSpacing; // used to center sliders added using BorderLayout.CENTER (bug 4275631) if ( slider.getOrientation() == JSlider.HORIZONTAL ) { centerSpacing = thumbRect.height; if ( slider.getPaintTicks() ) centerSpacing += getTickLength(); @@ -764,7 +751,7 @@ if ( dictionary != null ) { Enumeration keys = dictionary.keys(); while ( keys.hasMoreElements() ) { - Component label = (Component)dictionary.get( keys.nextElement() ); + JComponent label = (JComponent) dictionary.get(keys.nextElement()); widest = Math.max( label.getPreferredSize().width, widest ); } } @@ -777,7 +764,7 @@ if ( dictionary != null ) { Enumeration keys = dictionary.keys(); while ( keys.hasMoreElements() ) { - Component label = (Component)dictionary.get( keys.nextElement() ); + JComponent label = (JComponent) dictionary.get(keys.nextElement()); tallest = Math.max( label.getPreferredSize().height, tallest ); } } @@ -1001,22 +988,14 @@ public void paintTicks(Graphics g) { Rectangle tickBounds = tickRect; - int i; - int maj, min, max; - int w = tickBounds.width; - int h = tickBounds.height; - int centerEffect, tickHeight; g.setColor(DefaultLookup.getColor(slider, this, "Slider.tickColor", Color.black)); - maj = slider.getMajorTickSpacing(); - min = slider.getMinorTickSpacing(); - if ( slider.getOrientation() == JSlider.HORIZONTAL ) { g.translate( 0, tickBounds.y); int value = slider.getMinimum(); - int xPos = 0; + int xPos; if ( slider.getMinorTickSpacing() > 0 ) { while ( value <= slider.getMaximum() ) { @@ -1042,7 +1021,7 @@ g.translate(tickBounds.x, 0); int value = slider.getMinimum(); - int yPos = 0; + int yPos; if ( slider.getMinorTickSpacing() > 0 ) { int offset = 0; @@ -1111,10 +1090,19 @@ Integer key = (Integer)keys.nextElement(); int value = key.intValue(); if (value >= minValue && value <= maxValue) { - Component label = (Component)dictionary.get( key ); - if (label instanceof JComponent) { - ((JComponent)label).setEnabled(enabled); + JComponent label = (JComponent) dictionary.get(key); + label.setEnabled(enabled); + + if (label instanceof JLabel) { + Icon icon = label.isEnabled() ? ((JLabel) label).getIcon() : ((JLabel) label).getDisabledIcon(); + + if (icon instanceof ImageIcon) { + // Register Slider as an image observer. It allows to catch notifications about + // image changes (e.g. gif animation) + Toolkit.getDefaultToolkit().checkImage(((ImageIcon) icon).getImage(), -1, -1, slider); + } } + if ( slider.getOrientation() == JSlider.HORIZONTAL ) { g.translate( 0, labelBounds.y ); paintHorizontalLabel( g, value, label ); @@ -1364,7 +1352,7 @@ int min = slider.getMinimum(); int max = slider.getMaximum(); double valueRange = (double)max - (double)min; - double pixelsPerValue = (double)trackHeight / (double)valueRange; + double pixelsPerValue = (double)trackHeight / valueRange; int trackBottom = trackY + (trackHeight - 1); int yPosition; @@ -1715,7 +1703,7 @@ * of the thumb relative to the origin of the track. */ public void mouseDragged(MouseEvent e) { - int thumbMiddle = 0; + int thumbMiddle; if (!slider.isEnabled()) { return; @@ -1841,7 +1829,7 @@ public void componentResized(ComponentEvent e) { getHandler().componentResized(e); } - }; + } /** * Focus-change listener. @@ -1903,7 +1891,7 @@ return b; } - }; + } /** diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java --- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java Wed Jun 18 13:05:16 2008 -0700 @@ -853,9 +853,7 @@ "ESCAPE", "cancelSelection", "F2", "editFileName", "F5", "refresh", - "BACK_SPACE", "Go Up", - "ENTER", "approveSelection", - "ctrl ENTER", "approveSelection" + "BACK_SPACE", "Go Up" }), diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java Wed Jun 18 13:05:16 2008 -0700 @@ -25,26 +25,17 @@ package javax.swing.plaf.synth; -import java.awt.Component; -import java.awt.Container; -import java.awt.Adjustable; import java.awt.event.*; import java.awt.Graphics; import java.awt.Dimension; -import java.awt.Font; import java.awt.FontMetrics; import java.awt.Rectangle; import java.awt.Point; import java.awt.Insets; -import java.awt.Color; -import java.awt.IllegalComponentStateException; -import java.awt.Polygon; import java.beans.*; import java.util.Dictionary; import java.util.Enumeration; -import javax.swing.border.AbstractBorder; import javax.swing.*; -import javax.swing.event.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicSliderUI; import sun.swing.plaf.synth.SynthUI; @@ -203,8 +194,7 @@ centerY += valueHeight + 2; centerY += trackHeight + trackInsets.top + trackInsets.bottom; centerY += tickHeight + 2; - Component label = (Component)slider.getLabelTable(). - elements().nextElement(); + JComponent label = (JComponent) slider.getLabelTable().elements().nextElement(); Dimension pref = label.getPreferredSize(); return centerY + label.getBaseline(pref.width, pref.height); } @@ -226,8 +216,7 @@ int trackHeight = contentHeight - valueHeight; int yPosition = yPositionForValue(value.intValue(), trackY, trackHeight); - Component label = (Component)slider.getLabelTable(). - get(value); + JComponent label = (JComponent) slider.getLabelTable().get(value); Dimension pref = label.getPreferredSize(); return yPosition - pref.height / 2 + label.getBaseline(pref.width, pref.height); @@ -434,16 +423,14 @@ /** * Calculates the pad for the label at the specified index. * - * @param index index of the label to calculate pad for. + * @param i index of the label to calculate pad for. * @return padding required to keep label visible. */ private int getPadForLabel(int i) { - Dictionary dictionary = slider.getLabelTable(); int pad = 0; - Object o = dictionary.get(i); - if (o != null) { - Component c = (Component)o; + JComponent c = (JComponent) slider.getLabelTable().get(i); + if (c != null) { int centerX = xPositionForValue(i); int cHalfWidth = c.getPreferredSize().width / 2; if (centerX - cHalfWidth < insetCache.left) { @@ -500,8 +487,6 @@ } } - private static Rectangle unionRect = new Rectangle(); - public void setThumbLocation(int x, int y) { super.setThumbLocation(x, y); // Value rect is tied to the thumb location. We need to repaint when @@ -544,7 +529,7 @@ trackBorder; int trackLength = trackBottom - trackTop; double valueRange = (double)max - (double)min; - double pixelsPerValue = (double)trackLength / (double)valueRange; + double pixelsPerValue = (double)trackLength / valueRange; int yPosition; if (!drawInverted()) { @@ -802,8 +787,7 @@ } public void mouseDragged(MouseEvent e) { - SynthScrollBarUI ui; - int thumbMiddle = 0; + int thumbMiddle; if (!slider.isEnabled()) { return; diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/javax/swing/text/FlowView.java --- a/jdk/src/share/classes/javax/swing/text/FlowView.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/text/FlowView.java Wed Jun 18 13:05:16 2008 -0700 @@ -333,17 +333,24 @@ * @since 1.3 */ public static class FlowStrategy { - int damageStart = Integer.MAX_VALUE; + Position damageStart = null; Vector viewBuffer; void addDamage(FlowView fv, int offset) { if (offset >= fv.getStartOffset() && offset < fv.getEndOffset()) { - damageStart = Math.min(damageStart, offset); + if (damageStart == null || offset < damageStart.getOffset()) { + try { + damageStart = fv.getDocument().createPosition(offset); + } catch (BadLocationException e) { + // shouldn't happen since offset is inside view bounds + assert(false); + } + } } } void unsetDamage() { - damageStart = Integer.MAX_VALUE; + damageStart = null; } /** @@ -438,13 +445,14 @@ int p1 = fv.getEndOffset(); if (fv.majorAllocValid) { - if (damageStart == Integer.MAX_VALUE) { + if (damageStart == null) { return; } // In some cases there's no view at position damageStart, so // step back and search again. See 6452106 for details. - while ((rowIndex = fv.getViewIndexAtPosition(damageStart)) < 0) { - damageStart--; + int offset = damageStart.getOffset(); + while ((rowIndex = fv.getViewIndexAtPosition(offset)) < 0) { + offset--; } if (rowIndex > 0) { rowIndex--; diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/sun/awt/shell/ShellFolder.java --- a/jdk/src/share/classes/sun/awt/shell/ShellFolder.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/sun/awt/shell/ShellFolder.java Wed Jun 18 13:05:16 2008 -0700 @@ -25,6 +25,7 @@ package sun.awt.shell; +import javax.swing.*; import java.awt.Image; import java.awt.Toolkit; import java.io.*; @@ -37,6 +38,10 @@ */ public abstract class ShellFolder extends File { + private static final String COLUMN_NAME = "FileChooser.fileNameHeaderText"; + private static final String COLUMN_SIZE = "FileChooser.fileSizeHeaderText"; + private static final String COLUMN_DATE = "FileChooser.fileDateHeaderText"; + protected ShellFolder parent; /** @@ -268,8 +273,45 @@ // Override File methods - public static void sortFiles(List files) { - shellFolderManager.sortFiles(files); + public static void sort(List files) { + if (files == null || files.size() <= 1) { + return; + } + + // Check that we can use the ShellFolder.sortChildren() method: + // 1. All files have the same non-null parent + // 2. All files is ShellFolders + File commonParent = null; + + for (File file : files) { + File parent = file.getParentFile(); + + if (parent == null || !(file instanceof ShellFolder)) { + commonParent = null; + + break; + } + + if (commonParent == null) { + commonParent = parent; + } else { + if (commonParent != parent && !commonParent.equals(parent)) { + commonParent = null; + + break; + } + } + } + + if (commonParent instanceof ShellFolder) { + ((ShellFolder) commonParent).sortChildren(files); + } else { + Collections.sort(files, FILE_COMPARATOR); + } + } + + public void sortChildren(List files) { + Collections.sort(files, FILE_COMPARATOR); } public boolean isAbsolute() { @@ -356,18 +398,131 @@ } public static ShellFolderColumnInfo[] getFolderColumns(File dir) { - return shellFolderManager.getFolderColumns(dir); - } + ShellFolderColumnInfo[] columns = null; + + if (dir instanceof ShellFolder) { + columns = ((ShellFolder) dir).getFolderColumns(); + } - public static Object getFolderColumnValue(File file, int column) { - return shellFolderManager.getFolderColumnValue(file, column); + if (columns == null) { + columns = new ShellFolderColumnInfo[]{ + new ShellFolderColumnInfo(COLUMN_NAME, 150, + SwingConstants.LEADING, true, null, + FILE_COMPARATOR), + new ShellFolderColumnInfo(COLUMN_SIZE, 75, + SwingConstants.RIGHT, true, null, + DEFAULT_COMPARATOR, true), + new ShellFolderColumnInfo(COLUMN_DATE, 130, + SwingConstants.LEADING, true, null, + DEFAULT_COMPARATOR, true) + }; + } + + return columns; } public ShellFolderColumnInfo[] getFolderColumns() { return null; } + public static Object getFolderColumnValue(File file, int column) { + if (file instanceof ShellFolder) { + Object value = ((ShellFolder)file).getFolderColumnValue(column); + if (value != null) { + return value; + } + } + + if (file == null || !file.exists()) { + return null; + } + + switch (column) { + case 0: + // By default, file name will be rendered using getSystemDisplayName() + return file; + + case 1: // size + return file.isDirectory() ? null : Long.valueOf(file.length()); + + case 2: // date + if (isFileSystemRoot(file)) { + return null; + } + long time = file.lastModified(); + return (time == 0L) ? null : new Date(time); + + default: + return null; + } + } + public Object getFolderColumnValue(int column) { return null; } + + /** + * Provides a default comparator for the default column set + */ + private static final Comparator DEFAULT_COMPARATOR = new Comparator() { + public int compare(Object o1, Object o2) { + int gt; + + if (o1 == null && o2 == null) { + gt = 0; + } else if (o1 != null && o2 == null) { + gt = 1; + } else if (o1 == null && o2 != null) { + gt = -1; + } else if (o1 instanceof Comparable) { + gt = ((Comparable) o1).compareTo(o2); + } else { + gt = 0; + } + + return gt; + } + }; + + private static final Comparator FILE_COMPARATOR = new Comparator() { + public int compare(File f1, File f2) { + ShellFolder sf1 = null; + ShellFolder sf2 = null; + + if (f1 instanceof ShellFolder) { + sf1 = (ShellFolder) f1; + if (sf1.isFileSystem()) { + sf1 = null; + } + } + if (f2 instanceof ShellFolder) { + sf2 = (ShellFolder) f2; + if (sf2.isFileSystem()) { + sf2 = null; + } + } + + if (sf1 != null && sf2 != null) { + return sf1.compareTo(sf2); + } else if (sf1 != null) { + // Non-file shellfolders sort before files + return -1; + } else if (sf2 != null) { + return 1; + } else { + String name1 = f1.getName(); + String name2 = f2.getName(); + + // First ignore case when comparing + int diff = name1.compareToIgnoreCase(name2); + if (diff != 0) { + return diff; + } else { + // May differ in case (e.g. "mail" vs. "Mail") + // We need this test for consistent sorting + return name1.compareTo(name2); + } + } + } + }; } diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/share/classes/sun/awt/shell/ShellFolderManager.java --- a/jdk/src/share/classes/sun/awt/shell/ShellFolderManager.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/share/classes/sun/awt/shell/ShellFolderManager.java Wed Jun 18 13:05:16 2008 -0700 @@ -27,8 +27,6 @@ import java.io.File; import java.io.FileNotFoundException; -import java.util.*; -import javax.swing.SwingConstants; /** * @author Michael Martak @@ -36,10 +34,6 @@ */ class ShellFolderManager { - private static final String COLUMN_NAME = "FileChooser.fileNameHeaderText"; - private static final String COLUMN_SIZE = "FileChooser.fileSizeHeaderText"; - private static final String COLUMN_DATE = "FileChooser.fileDateHeaderText"; - /** * Create a shell folder from a file. * Override to return machine-dependent behavior. @@ -107,142 +101,4 @@ } return (dir.getParentFile() == null); } - - public void sortFiles(List files) { - Collections.sort(files, fileComparator); - } - - private Comparator fileComparator = new Comparator() { - public int compare(Object a, Object b) { - return compare((File)a, (File)b); - } - - public int compare(File f1, File f2) { - ShellFolder sf1 = null; - ShellFolder sf2 = null; - - if (f1 instanceof ShellFolder) { - sf1 = (ShellFolder)f1; - if (sf1.isFileSystem()) { - sf1 = null; - } - } - if (f2 instanceof ShellFolder) { - sf2 = (ShellFolder)f2; - if (sf2.isFileSystem()) { - sf2 = null; - } - } - - if (sf1 != null && sf2 != null) { - return sf1.compareTo(sf2); - } else if (sf1 != null) { - return -1; // Non-file shellfolders sort before files - } else if (sf2 != null) { - return 1; - } else { - String name1 = f1.getName(); - String name2 = f2.getName(); - - // First ignore case when comparing - int diff = name1.toLowerCase().compareTo(name2.toLowerCase()); - if (diff != 0) { - return diff; - } else { - // May differ in case (e.g. "mail" vs. "Mail") - // We need this test for consistent sorting - return name1.compareTo(name2); - } - } - } - }; - - public ShellFolderColumnInfo[] getFolderColumns(File dir) { - ShellFolderColumnInfo[] columns = null; - - if (dir instanceof ShellFolder) { - columns = ((ShellFolder)dir).getFolderColumns(); - } - - if (columns == null) { - columns = new ShellFolderColumnInfo[]{ - new ShellFolderColumnInfo(COLUMN_NAME, 150, - SwingConstants.LEADING, true, null, - fileComparator), - new ShellFolderColumnInfo(COLUMN_SIZE, 75, - SwingConstants.RIGHT, true, null, - ComparableComparator.getInstance(), true), - new ShellFolderColumnInfo(COLUMN_DATE, 130, - SwingConstants.LEADING, true, null, - ComparableComparator.getInstance(), true) - }; - } - - return columns; - } - - public Object getFolderColumnValue(File file, int column) { - if (file instanceof ShellFolder) { - Object value = ((ShellFolder)file).getFolderColumnValue(column); - if (value != null) { - return value; - } - } - - if (file == null || !file.exists()) { - return null; - } - - switch (column) { - case 0: - // By default, file name will be rendered using getSystemDisplayName() - return file; - - case 1: // size - return file.isDirectory() ? null : new Long(file.length()); - - case 2: // date - if (isFileSystemRoot(file)) { - return null; - } - long time = file.lastModified(); - return (time == 0L) ? null : new Date(time); - - default: - return null; - } - } - - /** - * This class provides a default comparator for the default column set - */ - private static class ComparableComparator implements Comparator { - private static Comparator instance; - - public static Comparator getInstance() { - if (instance == null) { - instance = new ComparableComparator(); - } - return instance; - } - - public int compare(Object o1, Object o2) { - int gt; - - if (o1 == null && o2 == null) { - gt = 0; - } else if (o1 != null && o2 == null) { - gt = 1; - } else if (o1 == null && o2 != null) { - gt = -1; - } else if (o1 instanceof Comparable) { - gt = ((Comparable) o1).compareTo(o2); - } else { - gt = 0; - } - - return gt; - } - } - } diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java --- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java Wed Jun 18 13:05:16 2008 -0700 @@ -306,7 +306,7 @@ * java.io.File instead. If not, then the object depends * on native PIDL state and should not be serialized. * - * @returns a java.io.File replacement object. If the folder + * @return a java.io.File replacement object. If the folder * is a not a normal directory, then returns the first non-removable * drive (normally "C:\"). */ @@ -605,10 +605,10 @@ // parent so we have an IShellFolder to query. long pIShellFolder = getIShellFolder(); // Now we can enumerate the objects in this folder. - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList(); long pEnumObjects = getEnumObjects(pIShellFolder, includeHiddenFiles); if (pEnumObjects != 0) { - long childPIDL = 0; + long childPIDL; int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR; do { if (Thread.currentThread().isInterrupted()) { @@ -635,7 +635,7 @@ } while (childPIDL != 0); releaseEnumObjects(pEnumObjects); } - return (ShellFolder[])list.toArray(new ShellFolder[list.size()]); + return list.toArray(new ShellFolder[list.size()]); } @@ -648,7 +648,7 @@ long pIShellFolder = getIShellFolder(); long pEnumObjects = getEnumObjects(pIShellFolder, true); Win32ShellFolder2 child = null; - long childPIDL = 0; + long childPIDL; while ((childPIDL = getNextChild(pEnumObjects)) != 0) { if (getAttributes0(pIShellFolder, childPIDL, ATTRIB_FILESYSTEM) != 0) { @@ -983,7 +983,7 @@ ? SwingConstants.CENTER : SwingConstants.LEADING); - column.setComparator(new ColumnComparator(i)); + column.setComparator(new ColumnComparator(getIShellFolder(), i)); notNullColumns.add(column); } @@ -1002,22 +1002,29 @@ private native Object doGetColumnValue(long parentIShellFolder2, long childPIDL, int columnIdx); - private native int compareIDsByColumn(long pParentIShellFolder, long pidl1, long pidl2, int columnIdx); + private static native int compareIDsByColumn(long pParentIShellFolder, long pidl1, long pidl2, int columnIdx); - private class ColumnComparator implements Comparator { + public void sortChildren(List files) { + Collections.sort(files, new ColumnComparator(getIShellFolder(), 0)); + } + + private static class ColumnComparator implements Comparator { + private final long parentIShellFolder; + private final int columnIdx; - public ColumnComparator(int columnIdx) { + public ColumnComparator(long parentIShellFolder, int columnIdx) { + this.parentIShellFolder = parentIShellFolder; this.columnIdx = columnIdx; } // compares 2 objects within this folder by the specified column - public int compare(Object o, Object o1) { + public int compare(File o, File o1) { if (o instanceof Win32ShellFolder2 && o1 instanceof Win32ShellFolder2) { // delegates comparison to native method - return compareIDsByColumn(getIShellFolder(), + return compareIDsByColumn(parentIShellFolder, ((Win32ShellFolder2) o).getRelativePIDL(), ((Win32ShellFolder2) o1).getRelativePIDL(), columnIdx); diff -r bfe4572fd301 -r 3b56e15774b8 jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java --- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Wed Jul 05 16:37:51 2017 +0200 +++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Wed Jun 18 13:05:16 2008 -0700 @@ -234,11 +234,11 @@ // Add third level for "My Computer" if (folder.equals(drives)) { File[] thirdLevelFolders = folder.listFiles(); - if (thirdLevelFolders != null) { - Arrays.sort(thirdLevelFolders, driveComparator); - for (File thirdLevelFolder : thirdLevelFolders) { - folders.add(thirdLevelFolder); - } + if (thirdLevelFolders != null && thirdLevelFolders.length > 0) { + List thirdLevelFoldersList = Arrays.asList(thirdLevelFolders); + + folder.sortChildren(thirdLevelFoldersList); + folders.addAll(thirdLevelFoldersList); } } } @@ -362,27 +362,6 @@ return false; } - private Comparator driveComparator = new Comparator() { - public int compare(Object o1, Object o2) { - Win32ShellFolder2 shellFolder1 = (Win32ShellFolder2) o1; - Win32ShellFolder2 shellFolder2 = (Win32ShellFolder2) o2; - - // Put drives at first - boolean isDrive1 = shellFolder1.getPath().endsWith(":\\"); - - if (isDrive1 ^ shellFolder2.getPath().endsWith(":\\")) { - return isDrive1 ? -1 : 1; - } else { - return shellFolder1.getPath().compareTo(shellFolder2.getPath()); - } - } - }; - - - public void sortFiles(List files) { - Collections.sort(files, fileComparator); - } - private static List topFolderList = null; static int compareShellFolders(Win32ShellFolder2 sf1, Win32ShellFolder2 sf2) { boolean special1 = sf1.isSpecial(); @@ -418,19 +397,9 @@ return compareNames(sf1.getAbsolutePath(), sf2.getAbsolutePath()); } - static int compareFiles(File f1, File f2) { - if (f1 instanceof Win32ShellFolder2) { - return f1.compareTo(f2); - } - if (f2 instanceof Win32ShellFolder2) { - return -1 * f2.compareTo(f1); - } - return compareNames(f1.getName(), f2.getName()); - } - static int compareNames(String name1, String name2) { // First ignore case when comparing - int diff = name1.toLowerCase().compareTo(name2.toLowerCase()); + int diff = name1.compareToIgnoreCase(name2); if (diff != 0) { return diff; } else { @@ -439,14 +408,4 @@ return name1.compareTo(name2); } } - - private Comparator fileComparator = new Comparator() { - public int compare(Object a, Object b) { - return compare((File)a, (File)b); - } - - public int compare(File f1, File f2) { - return compareFiles(f1, f2); - } - }; } diff -r bfe4572fd301 -r 3b56e15774b8 jdk/test/java/beans/XMLEncoder/java_io_File.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLEncoder/java_io_File.java Wed Jun 18 13:05:16 2008 -0700 @@ -0,0 +1,47 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * 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 6708550 + * @summary Tests File encoding + * @author Sergey Malenkov + */ + +import java.io.File; + +public final class java_io_File extends AbstractTest { + public static void main(String[] args) { + new java_io_File().test(true); + } + + @Override + protected File getObject() { + return new File("test.txt"); // NON-NLS: local file + } + + @Override + protected File getAnotherObject() { + return new File("/pub/demo/"); // NON-NLS: path + } +} diff -r bfe4572fd301 -r 3b56e15774b8 jdk/test/javax/swing/JPopupMenu/6694823/bug6694823.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JPopupMenu/6694823/bug6694823.java Wed Jun 18 13:05:16 2008 -0700 @@ -0,0 +1,122 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * 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 6694823 + * @summary Checks that popup menu cannot be partially hidden + * by the task bar in applets. + * @author Mikhail Lapshin + * @run main bug6694823 + */ + +import javax.swing.*; +import java.awt.*; +import sun.awt.SunToolkit; + +public class bug6694823 { + private static JFrame frame; + private static JPopupMenu popup; + private static SunToolkit toolkit; + private static Insets screenInsets; + + public static void main(String[] args) throws Exception { + toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + createGui(); + } + }); + + // Get screen insets + screenInsets = toolkit.getScreenInsets(frame.getGraphicsConfiguration()); + if (screenInsets.bottom == 0) { + // This test is only for configurations with taskbar on the bottom + return; + } + + // Show popup as if from a standalone application + // The popup should be able to overlap the task bar + showPopup(false); + + // Emulate applet security restrictions + toolkit.realSync(); + System.setSecurityManager(new SecurityManager()); + + // Show popup as if from an applet + // The popup shouldn't overlap the task bar. It should be shifted up. + showPopup(true); + + toolkit.realSync(); + System.out.println("Test passed!"); + frame.dispose(); + } + + private static void createGui() { + frame = new JFrame(); + frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + frame.setUndecorated(true); + + popup = new JPopupMenu("Menu"); + for (int i = 0; i < 7; i++) { + popup.add(new JMenuItem("MenuItem")); + } + JPanel panel = new JPanel(); + panel.setComponentPopupMenu(popup); + frame.add(panel); + + frame.setSize(200, 200); + } + + private static void showPopup(final boolean shouldBeShifted) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + // Place frame just above the task bar + Dimension screenSize = toolkit.getScreenSize(); + frame.setLocation(screenSize.width / 2, + screenSize.height - frame.getHeight() - screenInsets.bottom); + frame.setVisible(true); + + // Place popup over the task bar + Point frameLoc = frame.getLocationOnScreen(); + int x = 0; + int y = frame.getHeight() + - popup.getPreferredSize().height + screenInsets.bottom; + popup.show(frame, x, y); + + if (shouldBeShifted) { + if (popup.getLocationOnScreen() + .equals(new Point(frameLoc.x, frameLoc.y + y))) { + throw new RuntimeException("Popup is not shifted"); + } + } else { + if (!popup.getLocationOnScreen() + .equals(new Point(frameLoc.x, frameLoc.y + y))) { + throw new RuntimeException("Popup is unexpectedly shifted"); + } + } + popup.setVisible(false); + } + }); + } +} diff -r bfe4572fd301 -r 3b56e15774b8 jdk/test/javax/swing/JSlider/4987336/box.gif Binary file jdk/test/javax/swing/JSlider/4987336/box.gif has changed diff -r bfe4572fd301 -r 3b56e15774b8 jdk/test/javax/swing/JSlider/4987336/bug4987336.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JSlider/4987336/bug4987336.html Wed Jun 18 13:05:16 2008 -0700 @@ -0,0 +1,9 @@ + + + +There are four Sliders. Each of them has a label with animated gif (a cup of coffee) +and a label with static image. + +Check that for every LAF animation works for all Sliders. + + diff -r bfe4572fd301 -r 3b56e15774b8 jdk/test/javax/swing/JSlider/4987336/bug4987336.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JSlider/4987336/bug4987336.java Wed Jun 18 13:05:16 2008 -0700 @@ -0,0 +1,120 @@ +/* + * 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 4987336 + @summary JSlider doesn't show label's animated icon. + @author Pavel Porvatov + @run applet/manual=done bug4987336.html +*/ + +import javax.swing.*; +import javax.swing.border.TitledBorder; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Hashtable; + +public class bug4987336 extends JApplet { + private static final String IMAGE_RES = "box.gif"; + + private static final String ANIM_IMAGE_RES = "cupanim.gif"; + + public void init() { + JPanel pnLafs = new JPanel(); + pnLafs.setLayout(new BoxLayout(pnLafs, BoxLayout.Y_AXIS)); + + ButtonGroup group = new ButtonGroup(); + + pnLafs.setBorder(new TitledBorder("Available Lafs")); + + for (UIManager.LookAndFeelInfo lafInfo : UIManager.getInstalledLookAndFeels()) { + LafRadioButton comp = new LafRadioButton(lafInfo); + + pnLafs.add(comp); + group.add(comp); + } + + JPanel pnContent = new JPanel(); + + pnContent.setLayout(new BoxLayout(pnContent, BoxLayout.Y_AXIS)); + + pnContent.add(pnLafs); + pnContent.add(createSlider(true, IMAGE_RES, IMAGE_RES, ANIM_IMAGE_RES, ANIM_IMAGE_RES)); + pnContent.add(createSlider(false, IMAGE_RES, IMAGE_RES, ANIM_IMAGE_RES, ANIM_IMAGE_RES)); + pnContent.add(createSlider(true, ANIM_IMAGE_RES, null, IMAGE_RES, IMAGE_RES)); + pnContent.add(createSlider(false, ANIM_IMAGE_RES, null, IMAGE_RES, IMAGE_RES)); + + getContentPane().add(new JScrollPane(pnContent)); + } + + private static JSlider createSlider(boolean enabled, + String firstEnabledImage, String firstDisabledImage, + String secondEnabledImage, String secondDisabledImage) { + Hashtable dictionary = new Hashtable(); + + dictionary.put(0, createLabel(firstEnabledImage, firstDisabledImage)); + dictionary.put(1, createLabel(secondEnabledImage, secondDisabledImage)); + + JSlider result = new JSlider(0, 1); + + result.setLabelTable(dictionary); + result.setPaintLabels(true); + result.setEnabled(enabled); + + return result; + } + + private static JLabel createLabel(String enabledImage, String disabledImage) { + ImageIcon enabledIcon = enabledImage == null ? null : + new ImageIcon(bug4987336.class.getResource(enabledImage)); + + ImageIcon disabledIcon = disabledImage == null ? null : + new ImageIcon(bug4987336.class.getResource(disabledImage)); + + JLabel result = new JLabel(enabledImage == null && disabledImage == null ? "No image" : "Image", + enabledIcon, SwingConstants.LEFT); + + result.setDisabledIcon(disabledIcon); + + return result; + } + + private class LafRadioButton extends JRadioButton { + public LafRadioButton(final UIManager.LookAndFeelInfo lafInfo) { + super(lafInfo.getName(), lafInfo.getName().equals(UIManager.getLookAndFeel().getName())); + + addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + UIManager.setLookAndFeel(lafInfo.getClassName()); + + SwingUtilities.updateComponentTreeUI(bug4987336.this); + } catch (Exception ex) { + // Ignore such errors + System.out.println("Cannot set LAF " + lafInfo.getName()); + } + } + }); + } + } +} diff -r bfe4572fd301 -r 3b56e15774b8 jdk/test/javax/swing/JSlider/4987336/cupanim.gif Binary file jdk/test/javax/swing/JSlider/4987336/cupanim.gif has changed