From a0ea8550734007723696ff2f3d8ce38f1df6078c Mon Sep 17 00:00:00 2001 From: Michael Koch Date: Tue, 24 Jun 2003 09:48:43 +0000 Subject: [PATCH] Timer.java, [...]: New versions from classpath. 2003-06-24 Michael Koch * javax/swing/Timer.java, javax/swing/plaf/ActionMapUIResource.java, javax/swing/plaf/ButtonUI.java, javax/swing/plaf/ColorChooserUI.java, javax/swing/plaf/ColorUIResource.java, javax/swing/plaf/ComboBoxUI.java, javax/swing/plaf/ComponentInputMapUIResource.java, javax/swing/plaf/basic/BasicBorders.java: New versions from classpath. * javax/swing/plaf/basic/BasicSplitPaneDivider.java. javax/swing/plaf/basic/BasicSplitPaneUI.java: New file from classpath. * javax/swing/plaf/basic/doc-files/BasicBorders-1.png, javax/swing/plaf/basic/doc-files/BasicBorders-2.png, javax/swing/plaf/basic/doc-files/BasicBorders.FieldBorder-1.png, javax/swing/plaf/doc-files/ComponentUI-1.dia, javax/swing/plaf/doc-files/ComponentUI-1.png: New binary files from classpath. From-SVN: r68409 --- libjava/ChangeLog | 21 + libjava/javax/swing/Timer.java | 38 +- .../javax/swing/plaf/ActionMapUIResource.java | 44 +- libjava/javax/swing/plaf/ButtonUI.java | 13 +- libjava/javax/swing/plaf/ColorChooserUI.java | 37 +- libjava/javax/swing/plaf/ColorUIResource.java | 76 +- libjava/javax/swing/plaf/ComboBoxUI.java | 100 ++- .../plaf/ComponentInputMapUIResource.java | 50 +- .../javax/swing/plaf/basic/BasicBorders.java | 823 +++++++++++++++++- .../plaf/basic/BasicSplitPaneDivider.java | 534 ++++++++++++ .../swing/plaf/basic/BasicSplitPaneUI.java | 309 +++++++ .../plaf/basic/doc-files/BasicBorders-1.png | Bin 0 -> 454 bytes .../plaf/basic/doc-files/BasicBorders-2.png | Bin 0 -> 857 bytes .../doc-files/BasicBorders.FieldBorder-1.png | Bin 0 -> 5267 bytes .../swing/plaf/doc-files/ComponentUI-1.dia | Bin 0 -> 3079 bytes .../swing/plaf/doc-files/ComponentUI-1.png | Bin 0 -> 24898 bytes 16 files changed, 1910 insertions(+), 135 deletions(-) create mode 100644 libjava/javax/swing/plaf/basic/BasicSplitPaneDivider.java create mode 100644 libjava/javax/swing/plaf/basic/BasicSplitPaneUI.java create mode 100644 libjava/javax/swing/plaf/basic/doc-files/BasicBorders-1.png create mode 100644 libjava/javax/swing/plaf/basic/doc-files/BasicBorders-2.png create mode 100644 libjava/javax/swing/plaf/basic/doc-files/BasicBorders.FieldBorder-1.png create mode 100644 libjava/javax/swing/plaf/doc-files/ComponentUI-1.dia create mode 100644 libjava/javax/swing/plaf/doc-files/ComponentUI-1.png diff --git a/libjava/ChangeLog b/libjava/ChangeLog index e7d39c1ad36b..7758e70e9206 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,24 @@ +2003-06-24 Michael Koch + + * javax/swing/Timer.java, + javax/swing/plaf/ActionMapUIResource.java, + javax/swing/plaf/ButtonUI.java, + javax/swing/plaf/ColorChooserUI.java, + javax/swing/plaf/ColorUIResource.java, + javax/swing/plaf/ComboBoxUI.java, + javax/swing/plaf/ComponentInputMapUIResource.java, + javax/swing/plaf/basic/BasicBorders.java: + New versions from classpath. + * javax/swing/plaf/basic/BasicSplitPaneDivider.java. + javax/swing/plaf/basic/BasicSplitPaneUI.java: + New file from classpath. + * javax/swing/plaf/basic/doc-files/BasicBorders-1.png, + javax/swing/plaf/basic/doc-files/BasicBorders-2.png, + javax/swing/plaf/basic/doc-files/BasicBorders.FieldBorder-1.png, + javax/swing/plaf/doc-files/ComponentUI-1.dia, + javax/swing/plaf/doc-files/ComponentUI-1.png: + New binary files from classpath. + 2003-06-24 Michael Koch * java/io/LineNumberReader.java diff --git a/libjava/javax/swing/Timer.java b/libjava/javax/swing/Timer.java index 80eb13a1a44b..89df756eee26 100644 --- a/libjava/javax/swing/Timer.java +++ b/libjava/javax/swing/Timer.java @@ -47,12 +47,13 @@ import javax.swing.event.EventListenerList; public class Timer implements Serializable { + protected EventListenerList listenerList = new EventListenerList(); + int ticks; static boolean verbose; boolean running; boolean repeat_ticks = true; long interval, init_delay; - Vector actions = new Vector(); class Waker extends Thread { @@ -86,23 +87,44 @@ public class Timer implements Serializable public void addActionListener(ActionListener listener) { - actions.addElement(listener); + listenerList.add (ActionListener.class, listener); } + public void removeActionListener(ActionListener listener) { - actions.removeElement(listener); + listenerList.remove (ActionListener.class, listener); + } + + /** + * @since 1.3 + */ + public EventListener[] getListeners (Class listenerType) + { + return listenerList.getListeners (listenerType); + } + + /** + * @since 1.4 + */ + public ActionListener[] getActionListeners () + { + return (ActionListener[]) listenerList.getListeners (ActionListener.class); } - void fireActionPerformed() + protected void fireActionPerformed (ActionEvent event) { - for (int i=0;iActionMap that implements the {@link UIResource} + * interface to indicate that it belongs to a pluggable + * LookAndFeel. + * + * @see javax.swing.ActionMap + * + * @author Andrew Selkirk + * @author Sascha Brawer (brawer@dandelis.ch) */ -public class ActionMapUIResource extends ActionMap implements UIResource { - - //------------------------------------------------------------- - // Initialization --------------------------------------------- - //------------------------------------------------------------- - - /** - * Constructor ActionMapUIResource - */ - public ActionMapUIResource() { - // TODO - } // ActionMapUIResource() - - -} // ActionMapUIResource +public class ActionMapUIResource + extends ActionMap + implements UIResource +{ + /** + * Constructs a new ActionMapUIResource. + */ + public ActionMapUIResource() + { + /* The constructor does nothing. */ + } +} diff --git a/libjava/javax/swing/plaf/ButtonUI.java b/libjava/javax/swing/plaf/ButtonUI.java index 56599af77093..ca9dc6d568d5 100644 --- a/libjava/javax/swing/plaf/ButtonUI.java +++ b/libjava/javax/swing/plaf/ButtonUI.java @@ -1,5 +1,5 @@ /* ButtonUI.java - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2003 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,6 +38,15 @@ exception statement from your version. */ package javax.swing.plaf; -public class ButtonUI extends ComponentUI +/** + * An abstract base class for delegates that implement the pluggable + * look and feel for a JButton. + * + * @see javax.swing.JButton + * + * @author Sascha Brawer (brawer@dandelis.ch) + */ +public abstract class ButtonUI + extends ComponentUI { } diff --git a/libjava/javax/swing/plaf/ColorChooserUI.java b/libjava/javax/swing/plaf/ColorChooserUI.java index e2a839ac28d9..f2f563191b79 100644 --- a/libjava/javax/swing/plaf/ColorChooserUI.java +++ b/libjava/javax/swing/plaf/ColorChooserUI.java @@ -1,5 +1,5 @@ /* ColorChooserUI.java -- - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2003 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,22 +38,23 @@ exception statement from your version. */ package javax.swing.plaf; /** - * ColorChooserUI - * @author Andrew Selkirk - * @version 1.0 + * An abstract base class for delegates that implement the pluggable + * look and feel for a JColorChooser. + * + * @see javax.swing.JColorChooser + * + * @author Andrew Selkirk + * @author Sascha Brawer (brawer@dandelis.ch) */ -public abstract class ColorChooserUI extends ComponentUI { +public abstract class ColorChooserUI + extends ComponentUI +{ + /** + * Constructs a ColorChooserUI. + */ + public ColorChooserUI() + { + /* The constructor does not do anything. */ + } +} - //------------------------------------------------------------- - // Initialization --------------------------------------------- - //------------------------------------------------------------- - - /** - * Constructor ColorChooserUI - */ - public ColorChooserUI() { - // TODO - } // ColorChooserUI() - - -} // ColorChooserUI diff --git a/libjava/javax/swing/plaf/ColorUIResource.java b/libjava/javax/swing/plaf/ColorUIResource.java index 18b6b83a3fe1..addc9c99cdb1 100644 --- a/libjava/javax/swing/plaf/ColorUIResource.java +++ b/libjava/javax/swing/plaf/ColorUIResource.java @@ -1,5 +1,5 @@ /* ColorUIResource.java - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2003 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -37,26 +37,78 @@ exception statement from your version. */ package javax.swing.plaf; + import java.awt.Color; + + /** - * STUBBED + * A Color that is marked as UIResource, which indicates that + * the color has been installed by a pluggable LookAndFeel. Such colors + * are replaced when the LookAndFeel changes. + * + * @see java.awt.Color + * + * @author Sascha Brawer (brawer@dandelis.ch) */ -public class ColorUIResource extends Color implements UIResource +public class ColorUIResource + extends Color + implements UIResource { - public ColorUIResource(Color c) + /** + * Constructs a ColorUIResource using the specified + * red, green, and blue values, which must be given as integers in + * the range of 0-255. The alpha channel value will default to 255, + * meaning that the color is fully opaque. + * + * @param r the red intensity, which must be in the range [0 .. 255]. + * @param g the green intensity, which must be in the range [0 .. 255]. + * @param b the blue intensity, which must be in the range [0 .. 255]. + */ + public ColorUIResource(int r, int g, int b) { - super(c.getRGB()); + super(r, g, b); } - public ColorUIResource(float r, float g, float b) + + + /** + * Consructs a ColorUIResource using the specified + * RGB value. The blue value is in bits 0-7, green in bits 8-15, and + * red in bits 16-23. The other bits are ignored. The alpha value is set + * to 255, meaning that the color is fully opaque. + * + * @param rgb the rgb value, as discussed above. + */ + public ColorUIResource(int rgb) { - super(r, g, b, 1.0f); + super(rgb); } - public ColorUIResource(int rgb) + + + /** + * Constructs a ColorUIResource using the specified + * red, green, and blue intensities, which must be given as floats in + * the range of 0-1. The alpha channel value will default to 1.0f, + * meaning that the color is fully opaque. + * + * @param r the red intensity, which must be in the range [0.0 .. 1.0]. + * @param g the green intensity, which must be in the range [0.0 .. 1.0]. + * @param b the blue intensity, which must be in the range [0.0 .. 1.0]. + */ + public ColorUIResource(float r, float g, float b) { - super(rgb, false); + super(r, g, b); } - public ColorUIResource(int r, int g, int b) + + + /** + * Constructs a ColorUIResource, using the intensities + * of another color. + * + * @param c the color whose intensities will be considered when + * constructing this ColorUIResource. + */ + public ColorUIResource(Color c) { - super(r, g, b, 255); + super(c.getRGB()); } -} // class ColorUIResource +} diff --git a/libjava/javax/swing/plaf/ComboBoxUI.java b/libjava/javax/swing/plaf/ComboBoxUI.java index 9c045e6f8c34..30313f44243f 100644 --- a/libjava/javax/swing/plaf/ComboBoxUI.java +++ b/libjava/javax/swing/plaf/ComboBoxUI.java @@ -37,52 +37,60 @@ exception statement from your version. */ package javax.swing.plaf; -// Imports -import javax.swing.*; +import javax.swing.JComboBox; /** - * ComboBoxUI - * @author Andrew Selkirk - * @version 1.0 + * An abstract base class for delegates that implement the pluggable + * look and feel for a JButton. + * + * @see javax.swing.JComboBox + * + * @author Andrew Selkirk + * @author Sascha Brawer (brawer@dandelis.ch) */ -public abstract class ComboBoxUI extends ComponentUI { - - //------------------------------------------------------------- - // Initialization --------------------------------------------- - //------------------------------------------------------------- - - /** - * Constructor ComboBoxUI - */ - public ComboBoxUI() { - // TODO - } // ComboBoxUI() - - - //------------------------------------------------------------- - // Methods ---------------------------------------------------- - //------------------------------------------------------------- - - /** - * setPopupVisible - * @param combobox TODO - * @param visible TODO - */ - public abstract void setPopupVisible(JComboBox combobox, boolean visible); - - /** - * isPopupVisible - * @param combobox TODO - * @returns boolean - */ - public abstract boolean isPopupVisible(JComboBox combobox); - - /** - * isFocusTraversable - * @param combobox TODO - * @returns boolean - */ - public abstract boolean isFocusTraversable(JComboBox combobox); - - -} // ComboBoxUI +public abstract class ComboBoxUI + extends ComponentUI +{ + /** + * Constructs a new ComboBoxUI. + */ + public ComboBoxUI() + { + } + + + /** + * Sets the visibility of the popup button. + * + * @param c the JComboBox whose popup + * is shown or hidden. + * + * @param visible true to show the popup, false + * to hide it. + */ + public abstract void setPopupVisible(JComboBox c, boolean visible); + + + /** + * Determines whether the popup button is currently visible. + * + * @param c the JComboBox whose popup visibility + * is retrieved. + * + * @return true if the popup button is currently + * visible, false otherwise. + */ + public abstract boolean isPopupVisible(JComboBox c); + + + /** + * Determines whether the combo box can receive input focus. + * + * @param c JComboBox whose focus traversability + * is to be retrieved. + * + * @returns true if c can receive + * input focus, false otherwise. + */ + public abstract boolean isFocusTraversable(JComboBox c); +} diff --git a/libjava/javax/swing/plaf/ComponentInputMapUIResource.java b/libjava/javax/swing/plaf/ComponentInputMapUIResource.java index 376da1ada8cd..1b14e8e876c3 100644 --- a/libjava/javax/swing/plaf/ComponentInputMapUIResource.java +++ b/libjava/javax/swing/plaf/ComponentInputMapUIResource.java @@ -1,5 +1,5 @@ /* ComponentInputMapUIResource.java -- - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2003 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -37,28 +37,34 @@ exception statement from your version. */ package javax.swing.plaf; -// Imports -import javax.swing.*; +import javax.swing.ComponentInputMap; +import javax.swing.JComponent; + /** - * ComponentInputMapUIResource - * @author Andrew Selkirk - * @version 1.0 + * A ComponentInputMap that implements the {@link UIResource} + * interface to indicate that it belongs to a pluggable + * LookAndFeel. + * + * @see javax.swing.ComponentInputMap + * @see javax.swing.InputMap + * + * @author Andrew Selkirk + * @author Sascha Brawer (brawer@dandelis.ch) */ -public class ComponentInputMapUIResource extends ComponentInputMap implements UIResource { - - //------------------------------------------------------------- - // Initialization --------------------------------------------- - //------------------------------------------------------------- - - /** - * Constructor ComponentInputMapUIResource - * @param component TODO - */ - public ComponentInputMapUIResource(JComponent component) { - super(component); - // TODO - } // ComponentInputMapUIResource() - +public class ComponentInputMapUIResource + extends ComponentInputMap + implements UIResource +{ + /** + * Constructs a new ComponentInputMapUIResource. + * + * @param component the JComponent associated with + * this InputMap. + */ + public ComponentInputMapUIResource(JComponent component) + { + super(component); + } +} -} // ComponentInputMapUIResource diff --git a/libjava/javax/swing/plaf/basic/BasicBorders.java b/libjava/javax/swing/plaf/basic/BasicBorders.java index a543302d5216..8b8a8513fc3f 100644 --- a/libjava/javax/swing/plaf/basic/BasicBorders.java +++ b/libjava/javax/swing/plaf/basic/BasicBorders.java @@ -42,18 +42,22 @@ import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Insets; +import java.awt.Rectangle; import java.io.Serializable; import javax.swing.AbstractButton; import javax.swing.ButtonModel; import javax.swing.JButton; import javax.swing.JPopupMenu; +import javax.swing.JSplitPane; import javax.swing.JToolBar; import javax.swing.UIDefaults; import javax.swing.UIManager; import javax.swing.border.AbstractBorder; +import javax.swing.border.BevelBorder; import javax.swing.border.Border; import javax.swing.plaf.UIResource; import javax.swing.plaf.BorderUIResource; +import javax.swing.text.JTextComponent; /** @@ -245,12 +249,178 @@ public class BasicBorders { UIDefaults defaults; + /* See comment in methods above for why this border is not shared. */ defaults = UIManager.getLookAndFeelDefaults(); return new MenuBarBorder(defaults.getColor("MenuBar.shadow"), defaults.getColor("MenuBar.highlight")); } + /** + * Returns a border for drawing a one-pixel thick border around + * split panes that are interrupted where the divider joins the + * border. + * + *

The colors of the border are retrieved from the + * UIDefaults of the currently active look and feel + * using the keys “SplitPane.darkShadow” and + * “SplitPane.highlight”. + * + *

[A screen shot for JSplitPane.HORIZONTAL_SPLIT] + * + *

[A screen shot for JSplitPane.VERTICAL_SPLIT] + * + * @return a {@link #SplitPaneBorder}. + * + * @see javax.swing.JSplitPane + * @see #getSplitPaneDividerBorder() + */ + public static Border getSplitPaneBorder() + { + UIDefaults defaults; + + /* See comment in methods above for why this border is not shared. */ + defaults = UIManager.getLookAndFeelDefaults(); + return new SplitPaneBorder(defaults.getColor("SplitPane.highlight"), + defaults.getColor("SplitPane.darkShadow")); + } + + + /** + * Returns a border for drawing a one-pixel thick border around + * the divider of split panes. + * + *

The colors of the edges that are adjacent to the child components + * of the JSplitPane are retrieved from the + * UIDefaults of the currently active look and feel + * using the keys “SplitPane.darkShadow” and + * “SplitPane.highlight”. The color of the + * other two edges is the background color of the divider. + * + *

[A screen shot for JSplitPane.HORIZONTAL_SPLIT] + * + * @return an instance of SplitPaneDividerBorder, which is + * not a public API class of this package. + * + * @see javax.swing.JSplitPane + * @see javax.swing.plaf.basic.BasicSplitPaneDivider + * @see #getSplitPaneBorder() + * + * @since 1.3 + */ + public static Border getSplitPaneDividerBorder() + { + UIDefaults defaults; + + /* See comment in methods above for why this border is not shared. */ + defaults = UIManager.getLookAndFeelDefaults(); + return new SplitPaneDividerBorder( + defaults.getColor("SplitPane.highlight"), + defaults.getColor("SplitPane.darkShadow")); + } + + + /** + * Returns a border for drawing a border around a text field + * that makes the field appear as etched into the surface. + * + *

The colors of the border are retrieved from the + * UIDefaults of the currently active look and feel + * using the keys “TextField.shadow”, + * “TextField.darkShadow”, + * “TextField.light”, and + * “TextField.highlight”. + * + *

[A screen shot of a border returned by
+   * this method] + * + * @return an instance of + * {@link javax.swing.plaf.basic.BasicBorders$FieldBorder}. + * + * @see javax.swing.JTextField + * @see javax.swing.text.JTextComponent + */ + public static Border getTextFieldBorder() + { + UIDefaults defaults; + + /* See comment in methods above for why this border is not shared. */ + defaults = UIManager.getLookAndFeelDefaults(); + return new FieldBorder( + defaults.getColor("TextField.shadow"), + defaults.getColor("TextField.darkShadow"), + defaults.getColor("TextField.light"), + defaults.getColor("TextField.highlight")); + } + + + /** + * Returns a two-pixel thick, green + * LineBorderUIResource. This is so ugly that look and + * feels better use different borders for their progress bars, or + * they will look really terrible. + * + *

[A screen shot of a border returned by this method] + */ + public static Border getProgressBarBorder() + { + /* There does not seem to exist a way to parametrize the color + * or thickness of the border through UIDefaults. + */ + return new BorderUIResource.LineBorderUIResource(Color.green, 2); + } + + + /** + * Returns a border that is composed of a raised bevel border and a + * one-pixel thick line border. + * + *

[A screen shot of a border returned by this method] + * + *

The colors of the border are retrieved from the + * UIDefaults of the currently active look and feel + * using the keys “InternalFrame.borderShadow”, + * “InternalFrame.borderDarkShadow”, + * “InternalFrame.borderLight”, + * “InternalFrame.borderHighlight”, and + * (for the inner one-pixel thick line) + * “InternalFrame.borderColor”. + */ + public static Border getInternalFrameBorder() + { + UIDefaults defaults; + Color shadow, darkShadow, highlight, lightHighlight, line; + + /* See comment in methods above for why this border is not shared. */ + defaults = UIManager.getLookAndFeelDefaults(); + + shadow = defaults.getColor("InternalFrame.borderShadow"); + darkShadow = defaults.getColor("InternalFrame.borderDarkShadow"); + highlight = defaults.getColor("InternalFrame.borderLight"); + lightHighlight = defaults.getColor("InternalFrame.borderHighlight"); + line = defaults.getColor("InternalFrame.borderColor"); + + return new BorderUIResource.CompoundBorderUIResource( + /* outer border */ + new BorderUIResource.BevelBorderUIResource( + BevelBorder.RAISED, + (highlight != null) ? highlight : Color.lightGray, + (lightHighlight != null) ? lightHighlight : Color.white, + (darkShadow != null) ? darkShadow : Color.black, + (shadow != null) ? shadow : Color.gray), + + /* inner border */ + new BorderUIResource.LineBorderUIResource( + (line != null) ? line : Color.lightGray)); + } + + /** * Returns a shared MarginBorder. */ @@ -442,15 +612,172 @@ public class BasicBorders } + /** + * A border that makes its enclosed component appear as lowered + * into the surface. Typically used for text fields. + * + *

[A screen shot of this border] + * + * @see javax.swing.plaf.basic.BasicGraphicsUtils#drawEtchedRect + * + * @author Sascha Brawer (brawer@dandelis.ch) + */ public static class FieldBorder + extends AbstractBorder + implements UIResource { + /** + * Determined using the serialver tool + * of Apple/Sun JDK 1.3.1 on MacOS X 10.1.5. + */ + static final long serialVersionUID = 949220756998454908L; + + + /** + * The color for drawing the outer half of the top and left + * edges. + */ + protected Color shadow; + + + /** + * The color for drawing the inner half of the top and left + * edges. + */ + protected Color darkShadow; + + + /** + * The color for drawing the inner half of the bottom and right + * edges. + */ + protected Color highlight; + + + /** + * The color for drawing the outer half of the bottom and right + * edges. + */ + protected Color lightHighlight; + + + /** + * Constructs a new border for drawing a text field in the Basic + * look and feel. + * + * @param shadow the color for drawing the outer half + * of the top and left edges. + * + * @param darkShadow the color for drawing the inner half + * of the top and left edges. + * + * @param highlight the color for drawing the inner half + * of the bottom and right edges. + * + * @param lightHighlight the color for drawing the outer half + * of the bottom and right edges. + */ public FieldBorder(Color shadow, Color darkShadow, Color highlight, Color lightHighlight) { + /* These colors usually come from the UIDefaults of the current + * look and feel. Use fallback values if the colors are not + * supplied. The API specification is silent about what + * behavior is expected for null colors, so users should not + * rely on this fallback (which is why it is not documented in + * the above Javadoc). + */ + this.shadow = (shadow != null) ? shadow : Color.gray; + this.darkShadow = (darkShadow != null) ? darkShadow : Color.black; + this.highlight = (highlight != null) ? highlight : Color.lightGray; + this.lightHighlight = (lightHighlight != null) + ? lightHighlight : Color.white; + } + + + /** + * Paints the FieldBorder around a given component. + * + * @param c the component whose border is to be painted. + * @param g the graphics for painting. + * @param x the horizontal position for painting the border. + * @param y the vertical position for painting the border. + * @param width the width of the available area for painting the border. + * @param height the height of the available area for painting the border. + * + * @see javax.swing.plaf.basic.BasicGraphicsUtils#drawEtchedRect + */ + public void paintBorder(Component c, Graphics g, + int x, int y, int width, int height) + { + BasicGraphicsUtils.drawEtchedRect(g, x, y, width, height, + shadow, darkShadow, + highlight, lightHighlight); } - } // class FieldBorder + + + /** + * Measures the width of this border. + * + * @param c the component whose border is to be measured. + * If c is an instance of {@link + * javax.swing.text.JTextComponent}, its margin is + * added to the border size. + * + * @return an Insets object whose left, + * right, top and + * bottom fields indicate the width of the + * border at the respective edge. + * + * @see #getBorderInsets(java.awt.Component, java.awt.Insets) + */ + public Insets getBorderInsets(Component c) + { + return getBorderInsets(c, null); + } + + + /** + * Measures the width of this border, storing the results into a + * pre-existing Insets object. + * + * @param c the component whose border is to be measured. + * If c is an instance of {@link + * javax.swing.text.JTextComponent}, its margin is + * added to the border size. + * + * @param insets an Insets object for holding the result values. + * After invoking this method, the left, + * right, top and + * bottom fields indicate the width of the + * border at the respective edge. + * + * @return the same object that was passed for insets. + * + * @see #getBorderInsets() + */ + public Insets getBorderInsets(Component c, Insets insets) + { + if (insets == null) + insets = new Insets(2, 2, 2, 2); + else + insets.top = insets.left = insets.bottom = insets.right = 2; + if (c instanceof JTextComponent) + { + Insets margin = ((JTextComponent) c).getMargin(); + insets.top += margin.top; + insets.left += margin.left; + insets.bottom += margin.bottom; + insets.right += margin.right; + } + return insets; + } + } + + /** * An invisible, but spacing border whose margin is determined * by calling the getMargin() method of the enclosed @@ -512,8 +839,9 @@ public class BasicBorders * determine the existence of this method, this would be slow on * many virtual machines. Therefore, the current implementation * knows about {@link javax.swing.AbstractButton#getMargin()}, - * {@link javax.swing.JPopupMenu#getMargin()}, and {@link - * javax.swing.JToolBar#getMargin()}. If c is an + * {@link javax.swing.JPopupMenu#getMargin()}, {@link + * javax.swing.JToolBar#getMargin()}, and {@link + * javax.swing.text.JTextComponent}. If c is an * instance of a known class, the respective * getMargin() method is called to determine the * correct margin. Otherwise, a zero-width margin is returned. @@ -536,7 +864,9 @@ public class BasicBorders margin = ((JPopupMenu) c).getMargin(); else if (c instanceof JToolBar) margin = ((JToolBar) c).getMargin(); - + else if (c instanceof JTextComponent) + margin = ((JTextComponent) c).getMargin(); + if (margin == null) insets.top = insets.left = insets.bottom = insets.right = 0; else @@ -862,15 +1192,496 @@ public class BasicBorders } + /** + * A one-pixel thick border for rollover buttons, for example in + * tool bars. + * + * @since 1.4 + * @author Sascha Brawer (brawer@dandelis.ch) + */ public static class RolloverButtonBorder + extends ButtonBorder { - } // class RolloverButtonBorder + /** + * Determined using the serialver tool + * of Sun JDK 1.4.1_01 on GNU/Linux 2.4.20 for x86. + */ + static final long serialVersionUID = 1976364864896996846L; + + + /** + * Constructs a new border for drawing a roll-over button + * in the Basic look and feel. + * + * @param shadow the shadow color. + * @param darkShadow a darker variant of the shadow color. + * @param highlight the highlight color. + * @param lightHighlight a brighter variant of the highlight color. + */ + public RolloverButtonBorder(Color shadow, Color darkShadow, + Color highlight, Color lightHighlight) + { + super(shadow, darkShadow, highlight, lightHighlight); + } + + + /** + * Paints the border around a rollover button. If c + * is not an {@link javax.swing.AbstractButton} whose model + * returns true for {@link + * javax.swing.ButtonModel#isRollver}, nothing gets painted at + * all. + * + * @param c the button whose border is to be painted. + * @param g the graphics for painting. + * @param x the horizontal position for painting the border. + * @param y the vertical position for painting the border. + * @param width the width of the available area for painting the border. + * @param height the height of the available area for painting the border. + */ + public void paintBorder(Component c, Graphics g, + int x, int y, int width, int height) + { + ButtonModel bmodel = null; + boolean drawPressed; + Color oldColor = g.getColor(); + int x2, y2; + + if (c instanceof AbstractButton) + bmodel = ((AbstractButton) c).getModel(); + + /* Draw nothing if c is not a rollover button. */ + if ((bmodel == null) || !bmodel.isRollover()) + return; + + /* Draw nothing if the mouse is pressed, but outside the button. */ + if (bmodel.isPressed() && !bmodel.isArmed()) + return; + + drawPressed = bmodel.isSelected() || bmodel.isPressed(); + x2 = x + width - 1; + y2 = y + height - 1; + + try + { + g.setColor(drawPressed ? shadow : lightHighlight); + g.drawLine(x, y, x2 - 1, y); // top edge + g.drawLine(x, y + 1, x, y2 - 1); // left edge + + g.setColor(drawPressed ? lightHighlight : shadow); + g.drawLine(x, y2, x2, y2); // bottom edge + g.drawLine(x2, y, x2, y2 - 1); // right edge + } + finally + { + g.setColor(oldColor); + } + } + } + + + /** + * A border for JSplitPanes in the Basic look and feel. The divider + * in the middle of the JSplitPane has its own border class, of which + * an instance can be obtained with {@link #getSplitPaneDividerBorder()}. + * + *

[A screen shot for JSplitPane.HORIZONTAL_SPLIT] + * + *

[A screen shot for JSplitPane.VERTICAL_SPLIT] + * + *

In contrast to the other borders of the Basic look and feel, + * this class is not serializable. While this might be unintended, + * GNU Classpath follows the specification in order to be fully + * compatible with the Sun reference implementation. + * + *

In the Sun JDK, the bottom edge of the divider also gets + * painted if the orientation of the enclosed JSplitPane is + * JSplitPane.VERTICAL_SPLIT (at least in versions + * 1.3.1 and 1.4.1). GNU Classpath does not replicate this bug. A + * report has been filed with Sun (review ID 188773). + * + *

Note that the bottom left pixel of the border has a different + * color depending on the orientation of the enclosed JSplitPane. + * Although this is visually inconsistent, Classpath replicates the + * appearance of the Sun reference implementation. A bug report has + * been filed with Sun (review ID 188774). + * + * @see {@link #getSplitPaneBorder()} + * @see {@link #getSplitPaneDividerBorder()} + * + * @author Sascha Brawer (brawer@dandelis.ch) + */ public static class SplitPaneBorder + implements Border, UIResource { + /** + * Indicates that the top edge shall be not be painted + * by {@link #paintRect(java.awt.Graphics, int, int, int, int, int)}. + */ + private static final int SUPPRESS_TOP = 1; + + + /** + * Indicates that the left edge shall be not be painted + * by {@link #paintRect(java.awt.Graphics, int, int, int, int, int)}. + */ + private static final int SUPPRESS_LEFT = 2; + + + /** + * Indicates that the bottom edge shall be not be painted + * by {@link #paintRect(java.awt.Graphics, int, int, int, int, int)}. + */ + private static final int SUPPRESS_BOTTOM = 4; + + + /** + * Indicates that the right edge shall be not be painted + * by {@link #paintRect(java.awt.Graphics, int, int, int, int, int)}. + */ + private static final int SUPPRESS_RIGHT = 8; + + + /** + * The color for drawing the bottom and right edges of the border. + */ + protected Color highlight; + + + /** + * The color for drawing the top and left edges of the border. + */ + protected Color shadow; + + + /** + * Constructs a new border for drawing a JSplitPane in the Basic + * look and feel. The divider in the middle of the JSplitPane has + * its own border class, SplitPaneDividerBorder. + * + * @param shadow the shadow color. + * @param highlight the highlight color. + */ public SplitPaneBorder(Color highlight, Color shadow) { + /* These colors usually come from the UIDefaults of the current + * look and feel. Use fallback values if the colors are not + * supplied. The API specification is silent about what + * behavior is expected for null colors, so users should not + * rely on this fallback (which is why it is not documented in + * the above Javadoc). + */ + this.shadow = (shadow != null) ? shadow : Color.black; + this.highlight = (highlight != null) ? highlight : Color.white; + } + + + /** + * Paints the border around a JSplitPane. + * + *

[A screen shot for JSplitPane.HORIZONTAL_SPLIT] + * + *

[A screen shot for JSplitPane.VERTICAL_SPLIT] + * + * @param c the JSplitPane whose border is to be painted. + * @param g the graphics for painting. + * @param x the horizontal position for painting the border. + * @param y the vertical position for painting the border. + * @param width the width of the available area for painting the border. + * @param height the height of the available area for painting the border. + */ + public void paintBorder(Component c, Graphics g, + int x, int y, int width, int height) + { + JSplitPane splitPane; + Component content; + + if (!(c instanceof JSplitPane)) + return; + + splitPane = (JSplitPane) c; + switch (splitPane.getOrientation()) + { + case JSplitPane.HORIZONTAL_SPLIT: + if ((content = splitPane.getLeftComponent()) != null) + paintRect(g, SUPPRESS_RIGHT, true, x, y, content.getBounds()); + if ((content = splitPane.getRightComponent()) != null) + paintRect(g, SUPPRESS_LEFT, true, x, y, content.getBounds()); + break; + + case JSplitPane.VERTICAL_SPLIT: + if ((content = splitPane.getTopComponent()) != null) + paintRect(g, SUPPRESS_BOTTOM, false, x, y, content.getBounds()); + if ((content = splitPane.getBottomComponent()) != null) + paintRect(g, SUPPRESS_TOP, false, x, y, content.getBounds()); + break; + } + } + + + /** + * Paints a border around a child of a JSplitPane, + * omitting some of the edges. + * + * @param g the graphics for painting. + * + * @param suppress a bit mask indicating the set of suppressed + * edges, for example SUPPRESS_TOP | SUPPRESS_RIGHT. + * + * @param x the x coordinate of the SplitPaneBorder. + * + * @param y the y coordinate of the SplitPaneBorder. + * + * @param shadeBottomLeftPixel true to paint the + * bottom left pixel in the shadow color, + * false for the highlight color. The Basic + * look and feel uses the highlight color for the bottom + * left pixel of the border of a JSplitPane whose + * orientation is VERTICAL_SPLIT, and the shadow color + * otherwise. While this might be a strange distinction, + * Classpath tries to look identical to the reference + * implementation. A bug report has been filed with Sun; + * its review ID is 188774. We currently replicate the + * Sun behavior. + * + * @param rect the bounds of the child of JSplitPane whose + * border is to be painted. + */ + private void paintRect(Graphics g, int suppress, + boolean shadeBottomLeftPixel, + int x, int y, + Rectangle rect) + { + if (rect == null) + return; + + /* On each edge, the border exceeds the enclosed child by one + * pixel. See the image "BasicBorders.SplitPaneBorder-1.png" in + * the directory "doc-files". + */ + x += rect.x - 1; + y += rect.y - 1; + int right = x + rect.width + 1; + int bottom = y + rect.height + 1; + + Color oldColor = g.getColor(); + try + { + g.setColor(shadow); + if ((suppress & SUPPRESS_TOP) == 0) + g.drawLine(x, y, right, y); + if ((suppress & SUPPRESS_LEFT) == 0) + g.drawLine(x, y, x, bottom); + else + g.drawLine(x, bottom, x, bottom); // one pixel + + g.setColor(highlight); + if ((suppress & SUPPRESS_BOTTOM) == 0) + g.drawLine(x + (shadeBottomLeftPixel ? 1 : 0), bottom, right, bottom); + else if (!shadeBottomLeftPixel) + g.drawLine(x, bottom, x, bottom); // one pixel + + if ((suppress & SUPPRESS_RIGHT) == 0) + g.drawLine(right, y, right, bottom); + } + finally + { + g.setColor(oldColor); + } + } + + + /** + * Measures the width of this border. + * + * @param c the component whose border is to be measured, usually + * an instance of {@link javax.swing.JSplitPane}. + * + * @return an Insets object whose left, + * right, top and + * bottom fields indicate the width of the + * border at the respective edge. + */ + public Insets getBorderInsets(Component c) + { + return new Insets(1, 1, 1, 1); + } + + + /** + * Determines whether this border fills every pixel in its area + * when painting. + * + * @return false because this border does not + * paint over the pixels where the divider joins + * the border. + */ + public boolean isBorderOpaque() + { + /* Strangely, the Sun implementation (tested with JDK 1.3.1 and + * 1.4.1_01) seems to always return true. It could be a bug, + * but without knowing the details of their implementation, it is + * hard to decide. + */ + return false; + } + } + + + /** + * A border for the divider inside a JSplitPane. + * + *

[A screen shot of this border] + * + * @author Sascha Brawer (brawer@dandelis.ch) + */ + private static class SplitPaneDividerBorder + implements Border, UIResource, Serializable + { + /** + * The highlight color, which is drawn on the left or top edge + * depending on the orientation of the JSplitPanel. + */ + protected Color highlight; + + + /** + * The highlight color, which is drawn on the right or bottom edge + * depending on the orientation of the JSplitPanel. + */ + protected Color shadow; + + + /** + * Constructs a new border for drawing the divider of a JSplitPane + * in the Basic look and feel. The outer parts of the JSplitPane have + * their own border class, SplitPaneBorder. + * + * @param shadow the shadow color. + * @param highlight the highlight color. + */ + public SplitPaneDividerBorder(Color highlight, Color shadow) + { + this.highlight = (highlight != null) ? highlight : Color.white; + this.shadow = (shadow != null) ? shadow : Color.black; + } + + + /** + * Paints the border around the divider of a JSplitPane. + * + *

[A picture that shows which pixels get painted
+     * in what color] + * + * @param c the JSplitPane whose divider’s border + * is to be painted. + * @param g the graphics for painting. + * @param x the horizontal position for painting the border. + * @param y the vertical position for painting the border. + * @param width the width of the available area for painting the border. + * @param height the height of the available area for painting the border. + */ + public void paintBorder(Component c, Graphics g, + int x, int y, int width, int height) + { + Color oldColor, dcol; + int x2, y2; + JSplitPane sp; + + sp = getSplitPane(c); + if (sp == null) + return; + + x2 = x + width - 1; + y2 = y + height - 1; + oldColor = g.getColor(); + dcol = c.getBackground(); + try + { + switch (sp.getOrientation()) + { + case JSplitPane.HORIZONTAL_SPLIT: + g.setColor(dcol); + g.drawLine(x + 1, y, x2 - 1, y); + g.drawLine(x + 1, y2, x2 - 1, y2); + g.setColor(sp.getLeftComponent() != null ? highlight : dcol); + g.drawLine(x, y, x, y2); + g.setColor(sp.getRightComponent() != null ? shadow : dcol); + g.drawLine(x2, y, x2, y2); + break; + + case JSplitPane.VERTICAL_SPLIT: + g.setColor(dcol); + g.drawLine(x, y + 1, x, y2 - 1); + g.drawLine(x2, y + 1, x2, y2 - 1); + g.setColor(sp.getTopComponent() != null ? highlight : dcol); + g.drawLine(x, y, x2, y); + g.setColor(sp.getBottomComponent() != null ? shadow : dcol); + g.drawLine(x, y2, x2, y2); + break; + } + } + finally + { + g.setColor(oldColor); + } } - } // class SplitPaneBorder + + + /** + * Measures the width of this border. + * + * @param c the component whose border is to be measured, usually + * an instance of {@link javax.swing.JSplitPane}. + * + * @return an Insets object whose left, + * right, top and + * bottom fields indicate the width of the + * border at the respective edge. + */ + public Insets getBorderInsets(Component c) + { + return new Insets(1, 1, 1, 1); + } + + + /** + * Determines whether this border fills every pixel in its area + * when painting. + * + * @return true if both highlight and shadow + * color are fully opaque. + */ + public boolean isBorderOpaque() + { + return (highlight.getAlpha() == 255) && (shadow.getAlpha() == 255); + } + + + /** + * Determines the JSplitPane whose divider is being painted. + * + * @param c an instance of BasicSplitPaneDivider. + * + * @return a JSplitPane, or null if + * c is not an instance of {@link + * javax.swing.plaf.basic.BasicSplitPaneDivider}. + */ + private JSplitPane getSplitPane(Component c) + { + if (c instanceof BasicSplitPaneDivider) + return (((BasicSplitPaneDivider) c).getBasicSplitPaneUI()) + .getSplitPane(); + else + return null; + } + } /** diff --git a/libjava/javax/swing/plaf/basic/BasicSplitPaneDivider.java b/libjava/javax/swing/plaf/basic/BasicSplitPaneDivider.java new file mode 100644 index 000000000000..39db7e76bfb0 --- /dev/null +++ b/libjava/javax/swing/plaf/basic/BasicSplitPaneDivider.java @@ -0,0 +1,534 @@ +/* BasicSplitPaneDivider.java + Copyright (C) 2003 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath 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 for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + + +package javax.swing.plaf.basic; + +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.JButton; +import javax.swing.JSplitPane; +import javax.swing.border.Border; + + +/** + * The divider that separates the two parts of a JSplitPane in the + * Basic look and feel. + * + *

Implementation status: We do not have a real implementation yet. + * Currently, it is mostly a stub to allow compiling other parts of + * the javax.swing.plaf.basic package, although some parts are already + * functional. + * + * @author Sascha Brawer (brawer@dandelis.ch) + */ +public class BasicSplitPaneDivider + extends Container + implements PropertyChangeListener +{ + /** + * Determined using the serialver tool + * of Apple/Sun JDK 1.3.1 on MacOS X 10.1.5. + */ + static final long serialVersionUID = 1463404307042803342L; + + + /** + * The width and height of the little buttons for showing and + * hiding parts of a JSplitPane in a single mouse click. + */ + protected static final int ONE_TOUCH_SIZE = 6; + + + // FIXME: Javadoc. + protected static final int ONE_TOUCH_OFFSET = 2; + + + /** + * An object that performs the tasks associated with an ongoing drag + * operation, or null if the user is currently not + * dragging the divider. + */ + protected DragController dragger; + + + /** + * The delegate object that is responsible for the UI of the + * JSplitPane that contains this divider. + */ + protected BasicSplitPaneUI splitPaneUI; + + + /** + * The thickness of the divider in pixels. + */ + protected int dividerSize; + + + /** + * A divider that is used for layout purposes. + */ + protected Component hiddenDivider; + + + /** + * The JSplitPane containing this divider. + */ + protected JSplitPane splitPane; + + + /** + * The listener for handling mouse events from both the divider + * and the containing JSplitPane. + * + *

The reason for also handling MouseEvents from the containing + * JSplitPane is that users should be able to start + * a drag gesture from inside the JSplitPane, but slightly outisde + * the divider. + */ + protected MouseHandler mouseHandler = new MouseHandler(); + + + /** + * The current orientation of the containing JSplitPane, + * which is either {@link javax.swing.JSplitPane#HORIZONTAL_SPLIT} + * or {@link javax.swing.JSplitPane#VERTICAL_SPLIT}. + */ + protected int orientation; + + + /** + * The button for showing and hiding the left (or top) component + * of the JSplitPane. + */ + protected JButton leftButton; + + + /** + * The button for showing and hiding the right (or bottom) component + * of the JSplitPane. + */ + protected JButton rightButton; + + + /** + * The border of this divider. Typically, this will be an instance of + * {@link javax.swing.plaf.basic.BasicBorders.SplitPaneDividerBorder}. + * + * @see #getBorder() + * @see #setBorder(javax.swing.border.Border) + */ + private Border border; + + + /** + * Constructs a new divider. + * + * @param ui the UI delegate of the enclosing + * JSplitPane. + */ + public BasicSplitPaneDivider(BasicSplitPaneUI ui) + { + setBasicSplitPaneUI(ui); + } + + + /** + * Sets the delegate object that is responsible for the UI of the + * {@link javax.swing.JSplitPane} containing this divider. + * + * @param newUI the UI delegate, or null to release + * the connection to the current delegate. + */ + public void setBasicSplitPaneUI(BasicSplitPaneUI newUI) + { + /* Remove the connection to the existing JSplitPane. */ + if (splitPane != null) + { + splitPane.removePropertyChangeListener(this); + splitPane.removeMouseListener(mouseHandler); + splitPane.removeMouseMotionListener(mouseHandler); + splitPane = null; + } + + /* Establish the connection to the new JSplitPane. */ + splitPaneUI = newUI; + if (splitPaneUI != null) + splitPane = newUI.getSplitPane(); + if (splitPane != null) + { + splitPane.addPropertyChangeListener(this); + splitPane.addMouseListener(mouseHandler); + splitPane.addMouseMotionListener(mouseHandler); + orientation = splitPane.getOrientation(); + } + } + + + /** + * Returns the delegate object that is responsible for the UI of the + * {@link javax.swing.JSplitPane} containing this divider. + */ + public BasicSplitPaneUI getBasicSplitPaneUI() + { + return splitPaneUI; + } + + + /** + * Sets the thickness of the divider. + * + * @param newSize the new width or height in pixels. + */ + public void setDividerSize(int newSize) + { + this.dividerSize = newSize; + } + + + /** + * Retrieves the thickness of the divider. + */ + public int getDividerSize() + { + return dividerSize; + } + + + /** + * Sets the border of this divider. + * + * @param border the new border. Typically, this will be an instance of + * {@link javax.swing.plaf.basic.BasicBorders.SplitPaneDividerBorder}. + * + * @since 1.3 + */ + public void setBorder(Border border) + { + Border oldValue = this.border; + this.border = border; + firePropertyChange("border", oldValue, border); + } + + + /** + * Retrieves the border of this divider. + * + * @return the current border, or null if no border + * has been set. + * + * @since 1.3 + */ + public Border getBorder() + { + return border; + } + + + /** + * Retrieves the insets of the divider. If a border has been + * installed on the divider, the result of calling its + * getBorderInsets method is returned. Otherwise, + * the inherited implementation will be invoked. + * + * @see javax.swing.border.Border#getBorderInsets(java.awt.Component) + */ + public Insets getInsets() + { + if (border != null) + return border.getBorderInsets(this); + else + return super.getInsets(); + } + + + /** + * Returns the preferred size of this divider, which is + * dividerSize by dividerSize + * pixels. + */ + public Dimension getPreferredSize() + { + return new Dimension(dividerSize, dividerSize); + } + + + /** + * Returns the minimal size of this divider, which is + * dividerSize by dividerSize + * pixels. + */ + public Dimension getMinimumSize() + { + return getPreferredSize(); + } + + + /** + * Processes events from the JSplitPane that contains + * this divider. + */ + public void propertyChange(PropertyChangeEvent e) + { + // FIXME: Not yet implemented. + } + + + /** + * Paints the divider by painting its border. + */ + public void paint(Graphics g) + { + Dimension dividerSize; + + super.paint(g); + if (border != null) + { + dividerSize = getSize(); + border.paintBorder(this, g, 0, 0, dividerSize.width, dividerSize.height); + //System.out.println(dividerSize); + //g.setColor(java.awt.Color.white); + //g.drawRect(0, 0, 5, 5); + } + } + + + /** + * Reacts to changes of the oneToughExpandable + * property of the containing JSplitPane. + */ + protected void oneTouchExpandableChanged() + { + // FIXME: Not yet implemented. + } + + + /** + * Creates a button for showing and hiding the left (or top) + * part of a JSplitPane. + */ + protected JButton createLeftOneTouchButton() + { + return new OneTouchButton(/* left */ true); + } + + + /** + * Creates a button for showing and hiding the right (or bottom) + * part of a JSplitPane. + */ + protected JButton createRightOneTouchButton() + { + return new OneTouchButton(/* left */ false); + } + + + /** + * Prepares the divider for dragging by calling the + * startDragging method of the UI delegate of the + * enclosing JSplitPane. + * + * @see BasicSplitPaneUI#startDragging() + */ + protected void prepareForDragging() + { + if (splitPaneUI != null) + splitPaneUI.startDragging(); + } + + + /** + * Drags the divider to a given location by calling the + * dragDividerTo method of the UI delegate of the + * enclosing JSplitPane. + * + * @param location the new location of the divider. + * + * @see BasicSplitPaneUI#dragDividerTo(int location) + */ + protected void dragDividerTo(int location) + { + if (splitPaneUI != null) + splitPaneUI.dragDividerTo(location); + } + + + /** + * Finishes a dragging gesture by calling the + * finishDraggingTo method of the UI delegate of the + * enclosing JSplitPane. + * + * @param location the new, final location of the divider. + * + * @see BasicSplitPaneUI#finishDraggingTo(int location) + */ + protected void finishDraggingTo(int location) + { + if (splitPaneUI != null) + splitPaneUI.finishDraggingTo(location); + } + + + /** + * The listener for handling mouse events from both the divider + * and the containing JSplitPane. + * + *

The reason for also handling MouseEvents from the containing + * JSplitPane is that users should be able to start + * a drag gesture from inside the JSplitPane, but slightly outisde + * the divider. + * + * @author Sascha Brawer (brawer@dandelis.ch) + */ + protected class MouseHandler + extends MouseAdapter + implements MouseMotionListener + { + + public void mousePressed(MouseEvent e) + { + // FIXME: Not yet implemented. + } + + + public void mouseReleased(MouseEvent e) + { + // FIXME: Not yet implemented. + } + + + /** + * Repeatedly invoked when the user is dragging the mouse cursor + * while having pressed a mouse button. + */ + public void mouseDragged(MouseEvent e) + { + // FIXME: Not yet implemented. + } + + + /** + * Repeatedly invoked when the user is dragging the mouse cursor + * without having pressed a mouse button. + */ + public void mouseMoved(MouseEvent e) + { + // FIXME: Not yet implemented. + } + } + + + /** + * A small button for showing and hiding parts of a + * JSplitPane with a single mouse click. + * + * @author Sascha Brawer (brawer@dandelis.ch) + */ + private static class OneTouchButton + extends JButton + { + OneTouchButton(boolean left) + { + // FIXME: Set various properties of the button. + // Make sure it looks identical to the small + // buttons of the Sun reference implementation. + // The size should also be the same. + if (left) + setText("<"); + else + setText(">"); + + Dimension butSize = new Dimension(ONE_TOUCH_SIZE, ONE_TOUCH_SIZE); + setMinimumSize(butSize); + setMaximumSize(butSize); + setPreferredSize(butSize); + + setBorderPainted(false); + } + } + + + /** + * Performs the tasks associated with an ongoing drag + * operation. + * + * @author Sascha Brawer (brawer@dandelis.ch) + */ + protected class DragController + { + // FIXME: Not yet implemented. + protected DragController(MouseEvent e) + { + } + + protected boolean isValid() + { + // FIXME: Not yet implemented. + return true; + } + + protected int positionForMouseEvent(MouseEvent e) + { + return 0; + } + + protected int getNeededLocation(int x, int y) + { + return 0; + } + + protected void continueDrag(int newX, int newY) + { + } + + protected void completeDrag(int x, int y) + { + } + + protected void completeDrag(MouseEvent e) + { + } + } +} diff --git a/libjava/javax/swing/plaf/basic/BasicSplitPaneUI.java b/libjava/javax/swing/plaf/basic/BasicSplitPaneUI.java new file mode 100644 index 000000000000..5c1c7f25e4f8 --- /dev/null +++ b/libjava/javax/swing/plaf/basic/BasicSplitPaneUI.java @@ -0,0 +1,309 @@ +/* BasicSplitPaneUI.java + Copyright (C) 2003 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath 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 for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +package javax.swing.plaf.basic; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.event.ActionListener; +import java.awt.event.FocusListener; +import java.beans.PropertyChangeListener; +import javax.swing.JComponent; +import javax.swing.JSplitPane; +import javax.swing.KeyStroke; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.SplitPaneUI; + +/** + * FIXME: Stubbed to allow compiling other classes, + * no real implementation. + */ +public class BasicSplitPaneUI + extends SplitPaneUI +{ + protected static final String NON_CONTINUOUS_DIVIDER + = "nonContinuousDivider"; + + protected static int KEYBOARD_DIVIDER_MOVE_OFFSET; + + protected JSplitPane splitPane; + protected BasicSplitPaneDivider divider; + protected PropertyChangeListener propertyChangeListener; + protected FocusListener focusListener; + protected int dividerSize; + protected Component nonContinuousLayoutDivider; + protected boolean draggingHW; + protected int beginDragDividerLocation; + protected KeyStroke upKey; + protected KeyStroke downKey; + protected KeyStroke leftKey; + protected KeyStroke rightKey; + protected KeyStroke homeKey; + protected KeyStroke endKey; + protected KeyStroke dividerResizeToggleKey; + protected ActionListener keyboardUpLeftListener; + protected ActionListener keyboardDownRightListener; + protected ActionListener keyboardHomeListener; + protected ActionListener keyboardEndListener; + protected ActionListener keyboardResizeToggleListener; + + public static ComponentUI createUI(JComponent c) + { + BasicSplitPaneUI newUI; + + newUI = new BasicSplitPaneUI(); + newUI.installUI(c); + return newUI; + } + + public BasicSplitPaneUI() + { + propertyChangeListener = createPropertyChangeListener(); + focusListener = createFocusListener(); + } + + public void installUI(JComponent c) + { + } + + protected void installDefaults() + { + } + + protected void installListeners() + { + } + + protected void installKeyboardListeners() + { + } + + protected void installKeyboardActions() + { + } + + public void uninstallUI(JComponent c) + { + } + + protected void uninstallDefaults() + { + } + + protected void uninstallListeners() + { + } + + protected void uninstallKeyboardActions() + { + } + + protected PropertyChangeListener createPropertyChangeListener() + { + return null; + } + + protected FocusListener createFocusListener() + { + return null; + } + + protected ActionListener createKeyboardUpLeftListener() + { + return null; + } + + protected ActionListener createKeyboardDownRightListener() + { + return null; + } + + protected ActionListener createKeyboardHomeListener() + { + return null; + } + + protected ActionListener createKeyboardEndListener() + { + return null; + } + + protected ActionListener createKeyboardResizeToggleListener() + { + return null; + } + + public int getOrientation() + { + return splitPane.getOrientation(); + } + + public void setOrientation(int orientation) + { + } + + + public boolean isContinuousLayout() + { + return false; + } + + public void setContinuousLayout(boolean b) + { + } + + public int getLastDragLocation() + { + return 0; + } + + public void setLastDragLocation(int l) + { + } + + + public BasicSplitPaneDivider getDivider() + { + return divider; + } + + + protected Component createDefaultNonContinuousLayoutDivider() + { + return null; + } + + protected void setNonContinuousLayoutDivider(Component newDivider) + { + setNonContinuousLayoutDivider(newDivider, true /* false? */); + } + + protected void setNonContinuousLayoutDivider(Component newDivider, + boolean rememberSizes) + { + nonContinuousLayoutDivider = newDivider; + } + + public Component getNonContinuousLayoutDivider() + { + return nonContinuousLayoutDivider; + } + + public JSplitPane getSplitPane() + { + return splitPane; + } + + public BasicSplitPaneDivider createDefaultDivider() + { + return null; + } + + public void resetToPreferredSizes(JSplitPane jc) + { + } + + public void setDividerLocation(JSplitPane jc, int location) + { + } + + public int getDividerLocation(JSplitPane jc) + { + return 0; + } + + public int getMinimumDividerLocation(JSplitPane jc) + { + return 0; + } + + public int getMaximumDividerLocation(JSplitPane jc) + { + return 0; + } + + public void finishedPaintingChildren(JSplitPane jc, Graphics g) + { + } + + public void paint(Graphics g, JComponent jc) + { + } + + public Dimension getPreferredSize(JComponent jc) + { + return null; + } + + public Dimension getMinimumSize(JComponent jc) + { + return null; + } + + public Dimension getMaximumSize(JComponent jc) + { + return null; + } + + public Insets getInsets(JComponent jc) + { + return new Insets(0, 0, 0, 0); + } + + protected void resetLayoutManager() + { + } + + protected void startDragging() + { + } + + protected void dragDividerTo(int location) + { + } + + protected void finishDraggingTo(int location) + { + } + + protected int getDividerBorderSize() + { + return 0; + } +} diff --git a/libjava/javax/swing/plaf/basic/doc-files/BasicBorders-1.png b/libjava/javax/swing/plaf/basic/doc-files/BasicBorders-1.png new file mode 100644 index 0000000000000000000000000000000000000000..daeb16c78eb2f0aaedd14cb5c83a819f988ed111 GIT binary patch literal 454 zc-rd>@N?(olHy`uVBq!ia0vp^6+j%o!2~2@f2!RBQY`6?zK#qGH<_KT`7Z?WISV`@ ziy0WWg+Z8+Vb&Z8prA^LYeY$Kep*R+Vo@qXU}%+%kMQ>GRV&-yhq* zuG(AnzqPY3XU+@%&pTd!Uw>TC*39T4b~_;goBqx)v2Nc}tY)>Ta8dJfXZ|BDxRing z^e^1Wd#P-~Eo^JQW_^1(xA58W8;fxp|B3CMqS9@(1y13>Fl6v_^>bP0l+XkK{aC7~ literal 0 Hc-jL100001 diff --git a/libjava/javax/swing/plaf/basic/doc-files/BasicBorders-2.png b/libjava/javax/swing/plaf/basic/doc-files/BasicBorders-2.png new file mode 100644 index 0000000000000000000000000000000000000000..60f6a8abe4207fdd7020b25b7131684606099cd8 GIT binary patch literal 857 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 literal 0 Hc-jL100001 diff --git a/libjava/javax/swing/plaf/doc-files/ComponentUI-1.dia b/libjava/javax/swing/plaf/doc-files/ComponentUI-1.dia new file mode 100644 index 0000000000000000000000000000000000000000..a78d97b90e68fbc3229f179fce8721ca07ca5f62 GIT binary patch literal 3079 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 literal 0 Hc-jL100001 diff --git a/libjava/javax/swing/plaf/doc-files/ComponentUI-1.png b/libjava/javax/swing/plaf/doc-files/ComponentUI-1.png new file mode 100644 index 0000000000000000000000000000000000000000..da4a0fc8dc9c7a4ab1bf6360ea773f8faacaa8e8 GIT binary patch literal 24898 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 literal 0 Hc-jL100001 -- 2.47.3