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 e7d39c1ad36..7758e70e920 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 80eb13a1a44..89df756eee2 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 56599af7709..ca9dc6d568d 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 e2a839ac28d..f2f563191b7 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 18b6b83a3fe..addc9c99cdb 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 9c045e6f8c3..30313f44243 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 376da1ada8c..1b14e8e876c 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 a543302d521..8b8a8513fc3 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 00000000000..39db7e76bfb --- /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 00000000000..5c1c7f25e4f --- /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 zcmeAS@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~_;^Z2CLH#JYV?v6|JU!bQ!`o%xTrU^)+B zS%?0GJ9#gaO}K?^?bobtFXt9MTYh6PHZMW+d}6z&sB~Lxfm1jz3>iFK{an^LB{Ts5 D{aC7~ literal 0 HcmV?d00001 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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

  • 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 literal 0 HcmV?d00001 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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 aB#Qg(aev43!f?D1lFy1Y%P%k@5B&=$?^)IW literal 0 HcmV?d00001 -- 2.30.2